@platox/pivot-table 0.0.95 → 0.0.97
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/dashboard-workbench/components/module-content/chart-module/index.js +5 -5
- package/es/dashboard-workbench/components/module-content/chart-module/index.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/chart-module/utils.js +6 -2
- package/es/dashboard-workbench/components/module-content/chart-module/utils.js.map +1 -1
- package/es/dashboard-workbench/index.js +18 -23
- package/es/dashboard-workbench/index.js.map +1 -1
- package/package.json +2 -2
- package/umd/pivot-table.umd.cjs +45 -45
|
@@ -266,7 +266,7 @@ const ChartModule = ({
|
|
|
266
266
|
});
|
|
267
267
|
}
|
|
268
268
|
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");
|
|
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";
|
|
270
270
|
const label = {
|
|
271
271
|
show: (_b = customData == null ? void 0 : customData.chartOptions) == null ? void 0 : _b.includes("label"),
|
|
272
272
|
position: isStripBar ? "right" : "top",
|
|
@@ -347,7 +347,7 @@ const ChartModule = ({
|
|
|
347
347
|
const isLeftYAxisShow = series.some((item) => (item == null ? void 0 : item.yAxisIndex) == 0);
|
|
348
348
|
const isRightYAxisShow = series.some((item) => (item == null ? void 0 : item.yAxisIndex) == 1);
|
|
349
349
|
const yAxisConfig = {
|
|
350
|
-
...chartConfig.yAxis,
|
|
350
|
+
...chartConfig == null ? void 0 : chartConfig.yAxis,
|
|
351
351
|
axisTick: {
|
|
352
352
|
show: (_f = customData == null ? void 0 : customData.chartOptions) == null ? void 0 : _f.includes("axis"),
|
|
353
353
|
lineStyle: { color: "#e5e6eb" }
|
|
@@ -362,7 +362,7 @@ const ChartModule = ({
|
|
|
362
362
|
fontSize: 12,
|
|
363
363
|
formatter: (value) => value.length > 15 ? `${value.slice(0, 15)}...` : value,
|
|
364
364
|
hideOverlap: true,
|
|
365
|
-
...(_i = chartConfig.yAxis) == null ? void 0 : _i.axisLabel
|
|
365
|
+
...(_i = chartConfig == null ? void 0 : chartConfig.yAxis) == null ? void 0 : _i.axisLabel
|
|
366
366
|
},
|
|
367
367
|
splitLine: {
|
|
368
368
|
show: (_j = customData == null ? void 0 : customData.chartOptions) == null ? void 0 : _j.includes("splitLine"),
|
|
@@ -412,7 +412,7 @@ const ChartModule = ({
|
|
|
412
412
|
]
|
|
413
413
|
},
|
|
414
414
|
xAxis: {
|
|
415
|
-
...chartConfig.xAxis,
|
|
415
|
+
...chartConfig == null ? void 0 : chartConfig.xAxis,
|
|
416
416
|
axisTick: {
|
|
417
417
|
show: (_k = customData == null ? void 0 : customData.chartOptions) == null ? void 0 : _k.includes("axis"),
|
|
418
418
|
lineStyle: { color: "#e5e6eb" }
|
|
@@ -428,7 +428,7 @@ const ChartModule = ({
|
|
|
428
428
|
color: "#86909C",
|
|
429
429
|
fontSize: 12,
|
|
430
430
|
formatter: (value) => value.length > 15 ? `${value.slice(0, 15)}...` : value,
|
|
431
|
-
...((_n = chartConfig.xAxis) == null ? void 0 : _n.axisLabel) ?? {}
|
|
431
|
+
...((_n = chartConfig == null ? void 0 : chartConfig.xAxis) == null ? void 0 : _n.axisLabel) ?? {}
|
|
432
432
|
},
|
|
433
433
|
splitLine: {
|
|
434
434
|
show: (_o = customData == null ? void 0 : customData.chartOptions) == null ? void 0 : _o.includes("splitLine"),
|
|
@@ -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')\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\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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"}
|
|
@@ -94,6 +94,10 @@ const getChartConfig = (props) => {
|
|
|
94
94
|
xAxis: { type: "value" },
|
|
95
95
|
yAxis: { type: "category", data: categories }
|
|
96
96
|
},
|
|
97
|
+
"chart-bar-graph": {
|
|
98
|
+
xAxis: { type: "value" },
|
|
99
|
+
yAxis: { type: "category", data: categories }
|
|
100
|
+
},
|
|
97
101
|
"chart-strip-bar-pile": {
|
|
98
102
|
xAxis: { type: "value" },
|
|
99
103
|
yAxis: { type: "category", data: categories }
|
|
@@ -117,11 +121,11 @@ const getChartConfig = (props) => {
|
|
|
117
121
|
yAxis: { type: "value" }
|
|
118
122
|
}
|
|
119
123
|
};
|
|
120
|
-
return optionsConfig[type];
|
|
124
|
+
return optionsConfig[type] ?? optionsConfig["chart-bar"];
|
|
121
125
|
};
|
|
122
126
|
const getSerie = ({ type, data, label, name, isGroup, groupField, labels, colorIndex = 0 }) => {
|
|
123
127
|
let serie;
|
|
124
|
-
const isStripBar = type === "chart-strip-bar" || type === "chart-strip-bar-pile" || type === "chart-strip-bar-percentage";
|
|
128
|
+
const isStripBar = type === "chart-strip-bar" || type === "chart-strip-bar-pile" || type === "chart-strip-bar-percentage" || type === "chart-bar-graph";
|
|
125
129
|
const themeColor = THEME_COLORS[colorIndex % THEME_COLORS.length];
|
|
126
130
|
const pieLabel = {
|
|
127
131
|
...label,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/chart-module/utils.ts"],"sourcesContent":["import { t } from 'i18next'\nimport { ChartType } from '../../add-module-modal/add-chart-modal/interface'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst THEME_COLORS = [\n '#5B8FF9', '#5AD8A6', '#F6BD16', '#E86452', '#6DC8EC',\n '#945FB9', '#FF9845', '#1E9493', '#FF99C3', '#269A99',\n]\n\nconst PIE_MERGE_THRESHOLD = 2 // 低于 2% 的项合并为\"其他\"\nconst PIE_MAX_SLICES = 10 // 最多显示 10 个扇区(含\"其他\")\n\n/**\n * 饼图数据优化:合并小占比项为\"其他\"\n * 策略:\n * 1. 占比 < 2% 的项合并为\"其他\"\n * 2. 如果合并后仍超过 10 项,只保留 TOP 9 + \"其他\"\n * 3. 如果\"其他\"占比为 0 则不显示\n */\ninterface PieDataItem {\n value: number\n name: string\n _otherDetails?: { name: string; value: number }[]\n}\n\nconst optimizePieData = (\n data: number[],\n labels: string[],\n): { data: PieDataItem[] } => {\n const otherLabel = t('chart.pieOther')\n const total = data.reduce((sum, v) => sum + v, 0)\n if (total === 0) {\n return { data: data.map((v, i) => ({ value: v, name: labels[i] })) }\n }\n\n const items = data.map((value, idx) => ({\n value,\n name: labels[idx],\n percent: (value / total) * 100,\n }))\n\n items.sort((a, b) => b.percent - a.percent)\n\n const mainItems: typeof items = []\n const otherItems: typeof items = []\n\n items.forEach((item) => {\n if (item.percent >= PIE_MERGE_THRESHOLD && mainItems.length < PIE_MAX_SLICES - 1) {\n mainItems.push(item)\n } else {\n otherItems.push(item)\n }\n })\n\n if (otherItems.length === 0) {\n return { data: mainItems.map(i => ({ value: i.value, name: i.name })) }\n }\n\n const otherValue = otherItems.reduce((sum, i) => sum + i.value, 0)\n const result: PieDataItem[] = mainItems.map(i => ({ value: i.value, name: i.name }))\n result.push({\n value: otherValue,\n name: otherLabel,\n _otherDetails: otherItems.map(i => ({ name: i.name, value: i.value })),\n })\n return { data: result }\n}\nexport const getChartConfig = (props: { type: ChartType; categories: unknown[] }) => {\n const { type, categories } = props\n\n const optionsConfig = {\n 'chart-bar': {\n xAxis: {\n type: 'category',\n data: categories,\n },\n yAxis: {\n type: 'value',\n },\n },\n 'chart-bar-pile': {\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n },\n 'chart-bar-percentage': {\n xAxis: { type: 'category', data: categories },\n yAxis: {\n type: 'value',\n max: 100,\n axisLabel: {\n formatter: '{value} %', // 在值后面添加 'kg'\n },\n },\n },\n 'chart-line': {\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n },\n 'chart-line-smooth': {\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n },\n 'chart-pie': {\n xAxis: { show: false },\n yAxis: { show: false },\n },\n 'chart-pie-circular': {\n xAxis: { show: false },\n yAxis: { show: false },\n },\n 'chart-strip-bar': {\n xAxis: { type: 'value' },\n yAxis: { type: 'category', data: categories },\n },\n 'chart-strip-bar-pile': {\n xAxis: { type: 'value' },\n yAxis: { type: 'category', data: categories },\n },\n 'chart-strip-bar-percentage': {\n xAxis: {\n type: 'value',\n max: 100,\n axisLabel: {\n formatter: '{value} %', // 在值后面添加 'kg'\n },\n },\n yAxis: {\n type: 'category',\n data: categories,\n },\n },\n [ChartType['chartCombination']]: {\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n },\n }\n\n return optionsConfig[type]\n}\n\nexport const getSerie = ({ type, data, label, name, isGroup, groupField, labels, colorIndex = 0 }: any) => {\n let serie: any\n const isStripBar = type === 'chart-strip-bar' || type === 'chart-strip-bar-pile' || type === 'chart-strip-bar-percentage'\n const themeColor = THEME_COLORS[colorIndex % THEME_COLORS.length]\n\n const pieLabel = {\n ...label,\n position: 'outside',\n formatter: label?.show\n ? (params: any) => {\n const p = params.percent ?? 0\n if (p < PIE_MERGE_THRESHOLD) return ''\n return `${params.name}: ${p}%`\n }\n : undefined,\n color: '#4E5969',\n fontSize: 12,\n }\n\n const pieLabelLine = {\n show: true,\n length: 12,\n length2: 8,\n lineStyle: { color: '#C9CDD4' },\n }\n\n const pieTooltip = {\n formatter: (params: any) => {\n const details: PieDataItem['_otherDetails'] = params.data?._otherDetails\n if (details && details.length > 0) {\n const header = `<div style=\"margin-bottom:6px;font-weight:500\">${t('chart.pieOtherItems', { count: details.length })} (${params.percent}%)</div>`\n const items = details\n .map(\n (i: any) =>\n `<div style=\"display:flex;justify-content:space-between;gap:12px;line-height:22px\"><span style=\"color:#86909C\">${i.name}</span><span>${i.value}</span></div>`\n )\n .join('')\n return `<div>${header}<div style=\"max-height:200px;overflow-y:auto;padding-right:8px;scrollbar-width:thin;scrollbar-color:#e5e6eb transparent\">${items}</div></div>`\n }\n return `<div style=\"font-weight:500\">${params.name}</div><div style=\"margin-top:4px\">${params.value} (${params.percent}%)</div>`\n },\n }\n\n if (type === 'chart-pie') {\n const optimized = optimizePieData(data, labels)\n serie = {\n data: optimized.data,\n name,\n type: 'pie',\n radius: '50%',\n label: pieLabel,\n labelLine: pieLabelLine,\n tooltip: pieTooltip,\n itemStyle: {\n borderColor: '#fff',\n borderWidth: 2,\n },\n emphasis: {\n scaleSize: 6,\n },\n }\n } else if (type === 'chart-pie-circular') {\n const optimized = optimizePieData(data, labels)\n serie = {\n data: optimized.data,\n type: 'pie',\n name,\n radius: ['40%', '70%'],\n label: pieLabel,\n labelLine: pieLabelLine,\n tooltip: pieTooltip,\n itemStyle: {\n borderColor: '#fff',\n borderWidth: 2,\n },\n emphasis: {\n scaleSize: 6,\n },\n }\n } else if (type === 'chart-line' || type === 'chart-line-smooth') {\n serie = {\n data: data,\n name,\n type: 'line',\n smooth: type === 'chart-line-smooth',\n label,\n symbol: 'circle',\n symbolSize: 6,\n lineStyle: { width: 2.5 },\n areaStyle: {\n color: {\n type: 'linear',\n x: 0, y: 0, x2: 0, y2: 1,\n colorStops: [\n { offset: 0, color: themeColor + '33' },\n { offset: 1, color: themeColor + '05' },\n ],\n },\n },\n }\n } else {\n serie = {\n data: data,\n name,\n type: 'bar',\n label,\n barMaxWidth: 40,\n itemStyle: {\n borderRadius: isStripBar ? [0, 4, 4, 0] : [4, 4, 0, 0],\n color: isStripBar\n ? {\n type: 'linear',\n x: 0, y: 0, x2: 1, y2: 0,\n colorStops: [\n { offset: 0, color: themeColor },\n { offset: 1, color: themeColor + 'B3' },\n ],\n }\n : {\n type: 'linear',\n x: 0, y: 0, x2: 0, y2: 1,\n colorStops: [\n { offset: 0, color: themeColor },\n { offset: 1, color: themeColor + 'B3' },\n ],\n },\n },\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowColor: 'rgba(0, 0, 0, 0.15)',\n },\n },\n }\n }\n\n if (\n type === 'chart-bar-percentage' ||\n type === 'chart-bar-pile' ||\n type === 'chart-strip-bar-pile' ||\n type === 'chart-strip-bar-percentage'\n ) {\n if (isGroup && groupField) {\n serie.stack = groupField\n }\n }\n\n return serie\n}\n\n// see https://github.com/apache/echarts/pull/19348\n// see https://www.visactor.io/vchart/guide/tutorial_docs/Chart_Concepts/Axes\n// 合并后弃用\nexport const getGrid = ({ customeStyle, series, chartConfig, width }: any) => {\n interface SeriesItem {\n name: string\n yAxisIndex: number\n data: number[]\n }\n\n // 获取y轴数据的个数和长度\n type Result = {\n isLeftAxisShow: boolean\n isRightAxisShow: boolean\n maxLeftSeriesDataStrLen: number\n maxRightSeriesDataStrLen: number\n maxSeriesDataLen: number\n }\n const {\n isLeftAxisShow,\n isRightAxisShow,\n maxLeftSeriesDataStrLen,\n maxRightSeriesDataStrLen,\n maxSeriesDataLen,\n } = series.reduce(\n (acc: Result, item: SeriesItem) => {\n let ret = { ...acc }\n\n let pos = item.yAxisIndex == 0 ? 'left' : 'right'\n let strLen = Math.max(...item.data.map(value => String(value).length))\n\n if (pos == 'left') {\n ret['maxLeftSeriesDataStrLen'] = Math.max(ret['maxLeftSeriesDataStrLen'], strLen)\n ret['isLeftAxisShow'] = true\n } else {\n ret['maxRightSeriesDataStrLen'] = Math.max(ret['maxRightSeriesDataStrLen'], strLen)\n ret['isRightAxisShow'] = true\n }\n ret['maxSeriesDataLen'] = Math.max(ret['maxSeriesDataLen'], item?.data?.length)\n return ret\n },\n {\n isLeftAxisShow: false,\n isRightAxisShow: false,\n maxLeftSeriesDataStrLen: 0,\n maxRightSeriesDataStrLen: 0,\n maxSeriesDataLen: 0,\n } as Result\n )\n\n // 获取标签的长度\n let labelAxis = chartConfig?.xAxis?.type === 'category' ? 'xAxis' : 'yAxis'\n let labelData: any[] = labelAxis === 'xAxis' ? chartConfig?.xAxis?.data : chartConfig?.yAxis?.data\n\n const maxLabelLength = (labelData ?? [])?.reduce((maxLength, value) => {\n const length = String(value).length // 转换为字符串并计算长度\n return Math.max(maxLength, length)\n }, 0)\n\n /* ============================== split =============================== */\n const fontSize = 9\n const gap = 12\n\n let top = 45 //固定\n let left = 0\n let right = 0\n let bottom = 0\n let axisRtateX = 0\n\n if (labelAxis == 'xAxis') {\n // 自动旋转\n const labelUnitMapping = {\n ['45']: fontSize * 0.8, // 根号2\n ['90']: fontSize,\n ['0']: fontSize,\n }\n if (maxSeriesDataLen > 3) {\n if (maxLabelLength >= 15) {\n axisRtateX = 90\n }\n if (maxLabelLength > 5) {\n axisRtateX = 45\n }\n if (width < 3) {\n axisRtateX = 90\n }\n }\n\n const labelUnit = labelUnitMapping[`${axisRtateX}` as keyof typeof labelUnitMapping]\n bottom = labelUnit * (axisRtateX == 0 ? 1 : Math.min(maxLabelLength, 18)) + gap\n left = Math.min(maxLeftSeriesDataStrLen, 18) * fontSize + gap\n right = Math.min(maxRightSeriesDataStrLen, 18) * fontSize + gap\n } else {\n bottom = Math.min(maxLeftSeriesDataStrLen, 18) * fontSize + gap //翻转的时候只有一个轴\n left = Math.min(maxLabelLength, 18) * fontSize + gap\n right = gap\n }\n //限制最大值\n left = Math.max(left, 40)\n right = Math.max(right, 40)\n\n // 如果没有轴,就只有gap\n if (!isLeftAxisShow) {\n left = gap\n }\n if (!isRightAxisShow) {\n right = gap\n }\n\n // 有标题\n let titleSize = fontSize\n if (!!customeStyle?.xtitle) {\n if (labelAxis == 'xAxis') {\n bottom = bottom + titleSize\n } else {\n right = right + titleSize\n }\n }\n\n if (!!customeStyle?.ytitle) {\n if (labelAxis == 'xAxis') {\n left = left + titleSize\n } else {\n top = top + titleSize\n }\n }\n\n return {\n top: top + 'px',\n left: left + 'px',\n right: right + 'px',\n bottom: Math.max(bottom, 40) + 'px',\n axisLabelRotate: axisRtateX,\n }\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/chart-module/utils.ts"],"sourcesContent":["import { t } from 'i18next'\nimport { ChartType } from '../../add-module-modal/add-chart-modal/interface'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\nconst THEME_COLORS = [\n '#5B8FF9', '#5AD8A6', '#F6BD16', '#E86452', '#6DC8EC',\n '#945FB9', '#FF9845', '#1E9493', '#FF99C3', '#269A99',\n]\n\nconst PIE_MERGE_THRESHOLD = 2 // 低于 2% 的项合并为\"其他\"\nconst PIE_MAX_SLICES = 10 // 最多显示 10 个扇区(含\"其他\")\n\n/**\n * 饼图数据优化:合并小占比项为\"其他\"\n * 策略:\n * 1. 占比 < 2% 的项合并为\"其他\"\n * 2. 如果合并后仍超过 10 项,只保留 TOP 9 + \"其他\"\n * 3. 如果\"其他\"占比为 0 则不显示\n */\ninterface PieDataItem {\n value: number\n name: string\n _otherDetails?: { name: string; value: number }[]\n}\n\nconst optimizePieData = (\n data: number[],\n labels: string[],\n): { data: PieDataItem[] } => {\n const otherLabel = t('chart.pieOther')\n const total = data.reduce((sum, v) => sum + v, 0)\n if (total === 0) {\n return { data: data.map((v, i) => ({ value: v, name: labels[i] })) }\n }\n\n const items = data.map((value, idx) => ({\n value,\n name: labels[idx],\n percent: (value / total) * 100,\n }))\n\n items.sort((a, b) => b.percent - a.percent)\n\n const mainItems: typeof items = []\n const otherItems: typeof items = []\n\n items.forEach((item) => {\n if (item.percent >= PIE_MERGE_THRESHOLD && mainItems.length < PIE_MAX_SLICES - 1) {\n mainItems.push(item)\n } else {\n otherItems.push(item)\n }\n })\n\n if (otherItems.length === 0) {\n return { data: mainItems.map(i => ({ value: i.value, name: i.name })) }\n }\n\n const otherValue = otherItems.reduce((sum, i) => sum + i.value, 0)\n const result: PieDataItem[] = mainItems.map(i => ({ value: i.value, name: i.name }))\n result.push({\n value: otherValue,\n name: otherLabel,\n _otherDetails: otherItems.map(i => ({ name: i.name, value: i.value })),\n })\n return { data: result }\n}\nexport const getChartConfig = (props: { type: ChartType; categories: unknown[] }) => {\n const { type, categories } = props\n\n const optionsConfig = {\n 'chart-bar': {\n xAxis: {\n type: 'category',\n data: categories,\n },\n yAxis: {\n type: 'value',\n },\n },\n 'chart-bar-pile': {\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n },\n 'chart-bar-percentage': {\n xAxis: { type: 'category', data: categories },\n yAxis: {\n type: 'value',\n max: 100,\n axisLabel: {\n formatter: '{value} %', // 在值后面添加 'kg'\n },\n },\n },\n 'chart-line': {\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n },\n 'chart-line-smooth': {\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n },\n 'chart-pie': {\n xAxis: { show: false },\n yAxis: { show: false },\n },\n 'chart-pie-circular': {\n xAxis: { show: false },\n yAxis: { show: false },\n },\n 'chart-strip-bar': {\n xAxis: { type: 'value' },\n yAxis: { type: 'category', data: categories },\n },\n 'chart-bar-graph': {\n xAxis: { type: 'value' },\n yAxis: { type: 'category', data: categories },\n },\n 'chart-strip-bar-pile': {\n xAxis: { type: 'value' },\n yAxis: { type: 'category', data: categories },\n },\n 'chart-strip-bar-percentage': {\n xAxis: {\n type: 'value',\n max: 100,\n axisLabel: {\n formatter: '{value} %', // 在值后面添加 'kg'\n },\n },\n yAxis: {\n type: 'category',\n data: categories,\n },\n },\n [ChartType['chartCombination']]: {\n xAxis: { type: 'category', data: categories },\n yAxis: { type: 'value' },\n },\n }\n\n return optionsConfig[type] ?? optionsConfig['chart-bar']\n}\n\nexport const getSerie = ({ type, data, label, name, isGroup, groupField, labels, colorIndex = 0 }: any) => {\n let serie: any\n const isStripBar = type === 'chart-strip-bar' || type === 'chart-strip-bar-pile' || type === 'chart-strip-bar-percentage' || type === 'chart-bar-graph'\n const themeColor = THEME_COLORS[colorIndex % THEME_COLORS.length]\n\n const pieLabel = {\n ...label,\n position: 'outside',\n formatter: label?.show\n ? (params: any) => {\n const p = params.percent ?? 0\n if (p < PIE_MERGE_THRESHOLD) return ''\n return `${params.name}: ${p}%`\n }\n : undefined,\n color: '#4E5969',\n fontSize: 12,\n }\n\n const pieLabelLine = {\n show: true,\n length: 12,\n length2: 8,\n lineStyle: { color: '#C9CDD4' },\n }\n\n const pieTooltip = {\n formatter: (params: any) => {\n const details: PieDataItem['_otherDetails'] = params.data?._otherDetails\n if (details && details.length > 0) {\n const header = `<div style=\"margin-bottom:6px;font-weight:500\">${t('chart.pieOtherItems', { count: details.length })} (${params.percent}%)</div>`\n const items = details\n .map(\n (i: any) =>\n `<div style=\"display:flex;justify-content:space-between;gap:12px;line-height:22px\"><span style=\"color:#86909C\">${i.name}</span><span>${i.value}</span></div>`\n )\n .join('')\n return `<div>${header}<div style=\"max-height:200px;overflow-y:auto;padding-right:8px;scrollbar-width:thin;scrollbar-color:#e5e6eb transparent\">${items}</div></div>`\n }\n return `<div style=\"font-weight:500\">${params.name}</div><div style=\"margin-top:4px\">${params.value} (${params.percent}%)</div>`\n },\n }\n\n if (type === 'chart-pie') {\n const optimized = optimizePieData(data, labels)\n serie = {\n data: optimized.data,\n name,\n type: 'pie',\n radius: '50%',\n label: pieLabel,\n labelLine: pieLabelLine,\n tooltip: pieTooltip,\n itemStyle: {\n borderColor: '#fff',\n borderWidth: 2,\n },\n emphasis: {\n scaleSize: 6,\n },\n }\n } else if (type === 'chart-pie-circular') {\n const optimized = optimizePieData(data, labels)\n serie = {\n data: optimized.data,\n type: 'pie',\n name,\n radius: ['40%', '70%'],\n label: pieLabel,\n labelLine: pieLabelLine,\n tooltip: pieTooltip,\n itemStyle: {\n borderColor: '#fff',\n borderWidth: 2,\n },\n emphasis: {\n scaleSize: 6,\n },\n }\n } else if (type === 'chart-line' || type === 'chart-line-smooth') {\n serie = {\n data: data,\n name,\n type: 'line',\n smooth: type === 'chart-line-smooth',\n label,\n symbol: 'circle',\n symbolSize: 6,\n lineStyle: { width: 2.5 },\n areaStyle: {\n color: {\n type: 'linear',\n x: 0, y: 0, x2: 0, y2: 1,\n colorStops: [\n { offset: 0, color: themeColor + '33' },\n { offset: 1, color: themeColor + '05' },\n ],\n },\n },\n }\n } else {\n serie = {\n data: data,\n name,\n type: 'bar',\n label,\n barMaxWidth: 40,\n itemStyle: {\n borderRadius: isStripBar ? [0, 4, 4, 0] : [4, 4, 0, 0],\n color: isStripBar\n ? {\n type: 'linear',\n x: 0, y: 0, x2: 1, y2: 0,\n colorStops: [\n { offset: 0, color: themeColor },\n { offset: 1, color: themeColor + 'B3' },\n ],\n }\n : {\n type: 'linear',\n x: 0, y: 0, x2: 0, y2: 1,\n colorStops: [\n { offset: 0, color: themeColor },\n { offset: 1, color: themeColor + 'B3' },\n ],\n },\n },\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowColor: 'rgba(0, 0, 0, 0.15)',\n },\n },\n }\n }\n\n if (\n type === 'chart-bar-percentage' ||\n type === 'chart-bar-pile' ||\n type === 'chart-strip-bar-pile' ||\n type === 'chart-strip-bar-percentage'\n ) {\n if (isGroup && groupField) {\n serie.stack = groupField\n }\n }\n\n return serie\n}\n\n// see https://github.com/apache/echarts/pull/19348\n// see https://www.visactor.io/vchart/guide/tutorial_docs/Chart_Concepts/Axes\n// 合并后弃用\nexport const getGrid = ({ customeStyle, series, chartConfig, width }: any) => {\n interface SeriesItem {\n name: string\n yAxisIndex: number\n data: number[]\n }\n\n // 获取y轴数据的个数和长度\n type Result = {\n isLeftAxisShow: boolean\n isRightAxisShow: boolean\n maxLeftSeriesDataStrLen: number\n maxRightSeriesDataStrLen: number\n maxSeriesDataLen: number\n }\n const {\n isLeftAxisShow,\n isRightAxisShow,\n maxLeftSeriesDataStrLen,\n maxRightSeriesDataStrLen,\n maxSeriesDataLen,\n } = series.reduce(\n (acc: Result, item: SeriesItem) => {\n let ret = { ...acc }\n\n let pos = item.yAxisIndex == 0 ? 'left' : 'right'\n let strLen = Math.max(...item.data.map(value => String(value).length))\n\n if (pos == 'left') {\n ret['maxLeftSeriesDataStrLen'] = Math.max(ret['maxLeftSeriesDataStrLen'], strLen)\n ret['isLeftAxisShow'] = true\n } else {\n ret['maxRightSeriesDataStrLen'] = Math.max(ret['maxRightSeriesDataStrLen'], strLen)\n ret['isRightAxisShow'] = true\n }\n ret['maxSeriesDataLen'] = Math.max(ret['maxSeriesDataLen'], item?.data?.length)\n return ret\n },\n {\n isLeftAxisShow: false,\n isRightAxisShow: false,\n maxLeftSeriesDataStrLen: 0,\n maxRightSeriesDataStrLen: 0,\n maxSeriesDataLen: 0,\n } as Result\n )\n\n // 获取标签的长度\n let labelAxis = chartConfig?.xAxis?.type === 'category' ? 'xAxis' : 'yAxis'\n let labelData: any[] = labelAxis === 'xAxis' ? chartConfig?.xAxis?.data : chartConfig?.yAxis?.data\n\n const maxLabelLength = (labelData ?? [])?.reduce((maxLength, value) => {\n const length = String(value).length // 转换为字符串并计算长度\n return Math.max(maxLength, length)\n }, 0)\n\n /* ============================== split =============================== */\n const fontSize = 9\n const gap = 12\n\n let top = 45 //固定\n let left = 0\n let right = 0\n let bottom = 0\n let axisRtateX = 0\n\n if (labelAxis == 'xAxis') {\n // 自动旋转\n const labelUnitMapping = {\n ['45']: fontSize * 0.8, // 根号2\n ['90']: fontSize,\n ['0']: fontSize,\n }\n if (maxSeriesDataLen > 3) {\n if (maxLabelLength >= 15) {\n axisRtateX = 90\n }\n if (maxLabelLength > 5) {\n axisRtateX = 45\n }\n if (width < 3) {\n axisRtateX = 90\n }\n }\n\n const labelUnit = labelUnitMapping[`${axisRtateX}` as keyof typeof labelUnitMapping]\n bottom = labelUnit * (axisRtateX == 0 ? 1 : Math.min(maxLabelLength, 18)) + gap\n left = Math.min(maxLeftSeriesDataStrLen, 18) * fontSize + gap\n right = Math.min(maxRightSeriesDataStrLen, 18) * fontSize + gap\n } else {\n bottom = Math.min(maxLeftSeriesDataStrLen, 18) * fontSize + gap //翻转的时候只有一个轴\n left = Math.min(maxLabelLength, 18) * fontSize + gap\n right = gap\n }\n //限制最大值\n left = Math.max(left, 40)\n right = Math.max(right, 40)\n\n // 如果没有轴,就只有gap\n if (!isLeftAxisShow) {\n left = gap\n }\n if (!isRightAxisShow) {\n right = gap\n }\n\n // 有标题\n let titleSize = fontSize\n if (!!customeStyle?.xtitle) {\n if (labelAxis == 'xAxis') {\n bottom = bottom + titleSize\n } else {\n right = right + titleSize\n }\n }\n\n if (!!customeStyle?.ytitle) {\n if (labelAxis == 'xAxis') {\n left = left + titleSize\n } else {\n top = top + titleSize\n }\n }\n\n return {\n top: top + 'px',\n left: left + 'px',\n right: right + 'px',\n bottom: Math.max(bottom, 40) + 'px',\n axisLabelRotate: axisRtateX,\n }\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -211,30 +211,15 @@ const DashboardWorkbench = ({
|
|
|
211
211
|
if (type === "calendar") return 4;
|
|
212
212
|
return 99;
|
|
213
213
|
};
|
|
214
|
-
const
|
|
215
|
-
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
}
|
|
220
|
-
const sortedKeys = [...groups.keys()].sort((a, b) => a - b);
|
|
221
|
-
const allPositions = /* @__PURE__ */ new Map();
|
|
222
|
-
let currentY = 0;
|
|
223
|
-
for (const key of sortedKeys) {
|
|
224
|
-
const group = groups.get(key);
|
|
225
|
-
const items = group.map((m) => {
|
|
226
|
-
const { w, h } = getDefaultSize(m.type || "");
|
|
227
|
-
return { id: m.id, w, h };
|
|
228
|
-
});
|
|
229
|
-
const { positions, height } = binPack(items, currentY);
|
|
230
|
-
for (const [id, pos] of positions) {
|
|
231
|
-
allPositions.set(id, pos);
|
|
232
|
-
}
|
|
233
|
-
currentY += height;
|
|
234
|
-
}
|
|
214
|
+
const sorted = [...modules].sort((a, b) => getOrder(a.type) - getOrder(b.type));
|
|
215
|
+
const items = sorted.map((m) => {
|
|
216
|
+
const { w, h } = getDefaultSize(m.type || "");
|
|
217
|
+
return { id: m.id, w, h };
|
|
218
|
+
});
|
|
219
|
+
const { positions } = binPack(items, 0, true);
|
|
235
220
|
const arranged = modules.map((m) => {
|
|
236
221
|
const { w, h } = getDefaultSize(m.type || "");
|
|
237
|
-
const pos =
|
|
222
|
+
const pos = positions.get(m.id);
|
|
238
223
|
return { ...m, x: (pos == null ? void 0 : pos.x) ?? 0, y: (pos == null ? void 0 : pos.y) ?? 0, w, h };
|
|
239
224
|
});
|
|
240
225
|
await updateModules(arranged);
|
|
@@ -343,7 +328,9 @@ const DashboardWorkbench = ({
|
|
|
343
328
|
const ref = useRef(null);
|
|
344
329
|
const scroll = useScroll(ref);
|
|
345
330
|
const isShadowShow = ((scroll == null ? void 0 : scroll.top) ?? 0) > 0;
|
|
331
|
+
const isInitialMount = useRef(true);
|
|
346
332
|
useEffect(() => {
|
|
333
|
+
isInitialMount.current = true;
|
|
347
334
|
if (ref.current) {
|
|
348
335
|
ref.current.scrollTop = 0;
|
|
349
336
|
}
|
|
@@ -400,7 +387,7 @@ const DashboardWorkbench = ({
|
|
|
400
387
|
alignItems: "center",
|
|
401
388
|
"height": "100%"
|
|
402
389
|
}, children: /* @__PURE__ */ jsx(Empty$1, { image: Empty$1.PRESENTED_IMAGE_SIMPLE }) }),
|
|
403
|
-
/* @__PURE__ */ jsx(
|
|
390
|
+
/* @__PURE__ */ jsx("div", { className: "bitable-block-dashboard__mount", ref, children: /* @__PURE__ */ jsx(Spin, { spinning: isArranging, children: /* @__PURE__ */ jsx("div", { className: "dashboard-container", children: /* @__PURE__ */ jsx(
|
|
404
391
|
"div",
|
|
405
392
|
{
|
|
406
393
|
className: `dashboard-content-container ${isDragOrResize ? "isDragOrResize" : ""} ${isDragOrResizeEnd ? "isDragOrResizeEnd" : ""}`,
|
|
@@ -420,6 +407,14 @@ const DashboardWorkbench = ({
|
|
|
420
407
|
draggableHandle: ".isCanDrag",
|
|
421
408
|
onLayoutChange: (layout) => {
|
|
422
409
|
layoutRef.current = layout;
|
|
410
|
+
if (isInitialMount.current) {
|
|
411
|
+
isInitialMount.current = false;
|
|
412
|
+
requestAnimationFrame(() => {
|
|
413
|
+
if (ref.current) {
|
|
414
|
+
ref.current.scrollTop = 0;
|
|
415
|
+
}
|
|
416
|
+
});
|
|
417
|
+
}
|
|
423
418
|
},
|
|
424
419
|
onWidthChange: (containerWidth, _margin, cols2) => {
|
|
425
420
|
setRowWidth(containerWidth / cols2 - 1);
|