@platox/pivot-table 0.0.93 → 0.0.95
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/InputWrapper/index.js.map +1 -1
- package/es/dashboard-workbench/components/SelectWrapper/index.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-btn/index.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/custome-data.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/index.js +20 -2
- package/es/dashboard-workbench/components/add-module-modal/add-calendar-modal/index.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/components/CombinationChartOptionPicker.js +0 -1
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/components/CombinationChartOptionPicker.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/components/GroupFieldConfigPicker.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/config.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/custome-data.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/custome-styles.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/index.js +31 -2
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/index.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-chart-modal/interface.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/custome-data.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/custome-styles.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/index.js +27 -2
- package/es/dashboard-workbench/components/add-module-modal/add-statistics-modal/index.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/EnumSelect.js +2 -2
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/EnumSelect.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/config.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/components/condition-modal/index.js.map +1 -1
- package/es/dashboard-workbench/components/add-module-modal/components/select-color/index.js.map +1 -1
- package/es/dashboard-workbench/components/global-filter-condition/ConditionRowItem.js.map +1 -1
- package/es/dashboard-workbench/components/global-filter-condition/ConditionSymbolAndValuePicker.js +1 -1
- package/es/dashboard-workbench/components/global-filter-condition/ConditionSymbolAndValuePicker.js.map +1 -1
- package/es/dashboard-workbench/components/global-filter-condition/FieldPicker.js.map +1 -1
- package/es/dashboard-workbench/components/global-filter-condition/index.js +1 -2
- package/es/dashboard-workbench/components/global-filter-condition/index.js.map +1 -1
- package/es/dashboard-workbench/components/global-filter-condition/useContext.js.map +1 -1
- package/es/dashboard-workbench/components/global-filter-condition/util.js.map +1 -1
- package/es/dashboard-workbench/components/modal-editor-header/index.js.map +1 -1
- package/es/dashboard-workbench/components/modal-editor-header/index.module.less.js +3 -3
- package/es/dashboard-workbench/components/module-content/calendar-module/index.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/calendar-module/locales/zh.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/chart-module/Empty.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/chart-module/base-chart/index.js +27 -1
- package/es/dashboard-workbench/components/module-content/chart-module/base-chart/index.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/chart-module/index.js +90 -39
- package/es/dashboard-workbench/components/module-content/chart-module/index.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/chart-module/utils.d.ts +1 -1
- package/es/dashboard-workbench/components/module-content/chart-module/utils.js +153 -35
- package/es/dashboard-workbench/components/module-content/chart-module/utils.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/index.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/statistics-module/index.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/statistics-module/utils.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/text-module/editor/index.js +1 -1
- package/es/dashboard-workbench/components/module-content/text-module/editor/index.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/text-module/editor/useDebounce.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/text-module/index.js.map +1 -1
- package/es/dashboard-workbench/components/module-content/utils.js.map +1 -1
- package/es/dashboard-workbench/components/module-header/index.js.map +1 -1
- package/es/dashboard-workbench/context.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-Filter.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-bar-percentage.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-bar-pile.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-bar.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-calendar.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-chart-combination.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-drag.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-editor.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-empty.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-line-smooth.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-line.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-move.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-pie-circular.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-pie.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-statistics.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-strip-bar-percentage.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-strip-bar-pile.js.map +1 -1
- package/es/dashboard-workbench/icon/icon-strip-bar.js.map +1 -1
- package/es/dashboard-workbench/index.js +215 -43
- package/es/dashboard-workbench/index.js.map +1 -1
- package/es/dashboard-workbench/lang/en-US.d.ts +7 -0
- package/es/dashboard-workbench/lang/en-US.js +9 -2
- package/es/dashboard-workbench/lang/en-US.js.map +1 -1
- package/es/dashboard-workbench/lang/index.js.map +1 -1
- package/es/dashboard-workbench/lang/zh-CN.d.ts +7 -0
- package/es/dashboard-workbench/lang/zh-CN.js +9 -2
- package/es/dashboard-workbench/lang/zh-CN.js.map +1 -1
- package/es/dashboard-workbench/utils/index.js +2 -2
- package/es/dashboard-workbench/utils/index.js.map +1 -1
- package/es/style.css +1 -1
- package/package.json +2 -2
- package/umd/pivot-table.umd.cjs +49 -47
- package/umd/style.css +1 -1
|
@@ -1,4 +1,52 @@
|
|
|
1
|
+
import { t } from "i18next";
|
|
1
2
|
import { ChartType } from "../../add-module-modal/add-chart-modal/interface.js";
|
|
3
|
+
const THEME_COLORS = [
|
|
4
|
+
"#5B8FF9",
|
|
5
|
+
"#5AD8A6",
|
|
6
|
+
"#F6BD16",
|
|
7
|
+
"#E86452",
|
|
8
|
+
"#6DC8EC",
|
|
9
|
+
"#945FB9",
|
|
10
|
+
"#FF9845",
|
|
11
|
+
"#1E9493",
|
|
12
|
+
"#FF99C3",
|
|
13
|
+
"#269A99"
|
|
14
|
+
];
|
|
15
|
+
const PIE_MERGE_THRESHOLD = 2;
|
|
16
|
+
const PIE_MAX_SLICES = 10;
|
|
17
|
+
const optimizePieData = (data, labels) => {
|
|
18
|
+
const otherLabel = t("chart.pieOther");
|
|
19
|
+
const total = data.reduce((sum, v) => sum + v, 0);
|
|
20
|
+
if (total === 0) {
|
|
21
|
+
return { data: data.map((v, i) => ({ value: v, name: labels[i] })) };
|
|
22
|
+
}
|
|
23
|
+
const items = data.map((value, idx) => ({
|
|
24
|
+
value,
|
|
25
|
+
name: labels[idx],
|
|
26
|
+
percent: value / total * 100
|
|
27
|
+
}));
|
|
28
|
+
items.sort((a, b) => b.percent - a.percent);
|
|
29
|
+
const mainItems = [];
|
|
30
|
+
const otherItems = [];
|
|
31
|
+
items.forEach((item) => {
|
|
32
|
+
if (item.percent >= PIE_MERGE_THRESHOLD && mainItems.length < PIE_MAX_SLICES - 1) {
|
|
33
|
+
mainItems.push(item);
|
|
34
|
+
} else {
|
|
35
|
+
otherItems.push(item);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
if (otherItems.length === 0) {
|
|
39
|
+
return { data: mainItems.map((i) => ({ value: i.value, name: i.name })) };
|
|
40
|
+
}
|
|
41
|
+
const otherValue = otherItems.reduce((sum, i) => sum + i.value, 0);
|
|
42
|
+
const result = mainItems.map((i) => ({ value: i.value, name: i.name }));
|
|
43
|
+
result.push({
|
|
44
|
+
value: otherValue,
|
|
45
|
+
name: otherLabel,
|
|
46
|
+
_otherDetails: otherItems.map((i) => ({ name: i.name, value: i.value }))
|
|
47
|
+
});
|
|
48
|
+
return { data: result };
|
|
49
|
+
};
|
|
2
50
|
const getChartConfig = (props) => {
|
|
3
51
|
const { type, categories } = props;
|
|
4
52
|
const optionsConfig = {
|
|
@@ -71,68 +119,138 @@ const getChartConfig = (props) => {
|
|
|
71
119
|
};
|
|
72
120
|
return optionsConfig[type];
|
|
73
121
|
};
|
|
74
|
-
const getSerie = ({ type, data, label, name, isGroup, groupField, labels }) => {
|
|
122
|
+
const getSerie = ({ type, data, label, name, isGroup, groupField, labels, colorIndex = 0 }) => {
|
|
75
123
|
let serie;
|
|
124
|
+
const isStripBar = type === "chart-strip-bar" || type === "chart-strip-bar-pile" || type === "chart-strip-bar-percentage";
|
|
125
|
+
const themeColor = THEME_COLORS[colorIndex % THEME_COLORS.length];
|
|
126
|
+
const pieLabel = {
|
|
127
|
+
...label,
|
|
128
|
+
position: "outside",
|
|
129
|
+
formatter: (label == null ? void 0 : label.show) ? (params) => {
|
|
130
|
+
const p = params.percent ?? 0;
|
|
131
|
+
if (p < PIE_MERGE_THRESHOLD) return "";
|
|
132
|
+
return `${params.name}: ${p}%`;
|
|
133
|
+
} : void 0,
|
|
134
|
+
color: "#4E5969",
|
|
135
|
+
fontSize: 12
|
|
136
|
+
};
|
|
137
|
+
const pieLabelLine = {
|
|
138
|
+
show: true,
|
|
139
|
+
length: 12,
|
|
140
|
+
length2: 8,
|
|
141
|
+
lineStyle: { color: "#C9CDD4" }
|
|
142
|
+
};
|
|
143
|
+
const pieTooltip = {
|
|
144
|
+
formatter: (params) => {
|
|
145
|
+
var _a;
|
|
146
|
+
const details = (_a = params.data) == null ? void 0 : _a._otherDetails;
|
|
147
|
+
if (details && details.length > 0) {
|
|
148
|
+
const header = `<div style="margin-bottom:6px;font-weight:500">${t("chart.pieOtherItems", { count: details.length })} (${params.percent}%)</div>`;
|
|
149
|
+
const items = details.map(
|
|
150
|
+
(i) => `<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>`
|
|
151
|
+
).join("");
|
|
152
|
+
return `<div>${header}<div style="max-height:200px;overflow-y:auto;padding-right:8px;scrollbar-width:thin;scrollbar-color:#e5e6eb transparent">${items}</div></div>`;
|
|
153
|
+
}
|
|
154
|
+
return `<div style="font-weight:500">${params.name}</div><div style="margin-top:4px">${params.value} (${params.percent}%)</div>`;
|
|
155
|
+
}
|
|
156
|
+
};
|
|
76
157
|
if (type === "chart-pie") {
|
|
158
|
+
const optimized = optimizePieData(data, labels);
|
|
77
159
|
serie = {
|
|
78
|
-
data: data
|
|
79
|
-
value: item,
|
|
80
|
-
name: labels[idx]
|
|
81
|
-
})),
|
|
160
|
+
data: optimized.data,
|
|
82
161
|
name,
|
|
83
162
|
type: "pie",
|
|
84
163
|
radius: "50%",
|
|
85
|
-
label:
|
|
86
|
-
|
|
87
|
-
|
|
164
|
+
label: pieLabel,
|
|
165
|
+
labelLine: pieLabelLine,
|
|
166
|
+
tooltip: pieTooltip,
|
|
167
|
+
itemStyle: {
|
|
168
|
+
borderColor: "#fff",
|
|
169
|
+
borderWidth: 2
|
|
88
170
|
},
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
show: true
|
|
92
|
-
}
|
|
171
|
+
emphasis: {
|
|
172
|
+
scaleSize: 6
|
|
93
173
|
}
|
|
94
174
|
};
|
|
95
175
|
} else if (type === "chart-pie-circular") {
|
|
176
|
+
const optimized = optimizePieData(data, labels);
|
|
96
177
|
serie = {
|
|
97
|
-
data: data
|
|
98
|
-
value: item,
|
|
99
|
-
name: labels[idx]
|
|
100
|
-
})),
|
|
178
|
+
data: optimized.data,
|
|
101
179
|
type: "pie",
|
|
102
180
|
name,
|
|
103
181
|
radius: ["40%", "70%"],
|
|
104
|
-
label:
|
|
105
|
-
|
|
106
|
-
|
|
182
|
+
label: pieLabel,
|
|
183
|
+
labelLine: pieLabelLine,
|
|
184
|
+
tooltip: pieTooltip,
|
|
185
|
+
itemStyle: {
|
|
186
|
+
borderColor: "#fff",
|
|
187
|
+
borderWidth: 2
|
|
107
188
|
},
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
show: true
|
|
111
|
-
}
|
|
189
|
+
emphasis: {
|
|
190
|
+
scaleSize: 6
|
|
112
191
|
}
|
|
113
192
|
};
|
|
114
|
-
} else if (type === "chart-line") {
|
|
193
|
+
} else if (type === "chart-line" || type === "chart-line-smooth") {
|
|
115
194
|
serie = {
|
|
116
195
|
data,
|
|
117
196
|
name,
|
|
118
197
|
type: "line",
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
198
|
+
smooth: type === "chart-line-smooth",
|
|
199
|
+
label,
|
|
200
|
+
symbol: "circle",
|
|
201
|
+
symbolSize: 6,
|
|
202
|
+
lineStyle: { width: 2.5 },
|
|
203
|
+
areaStyle: {
|
|
204
|
+
color: {
|
|
205
|
+
type: "linear",
|
|
206
|
+
x: 0,
|
|
207
|
+
y: 0,
|
|
208
|
+
x2: 0,
|
|
209
|
+
y2: 1,
|
|
210
|
+
colorStops: [
|
|
211
|
+
{ offset: 0, color: themeColor + "33" },
|
|
212
|
+
{ offset: 1, color: themeColor + "05" }
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
}
|
|
129
216
|
};
|
|
130
217
|
} else {
|
|
131
218
|
serie = {
|
|
132
219
|
data,
|
|
133
220
|
name,
|
|
134
221
|
type: "bar",
|
|
135
|
-
label
|
|
222
|
+
label,
|
|
223
|
+
barMaxWidth: 40,
|
|
224
|
+
itemStyle: {
|
|
225
|
+
borderRadius: isStripBar ? [0, 4, 4, 0] : [4, 4, 0, 0],
|
|
226
|
+
color: isStripBar ? {
|
|
227
|
+
type: "linear",
|
|
228
|
+
x: 0,
|
|
229
|
+
y: 0,
|
|
230
|
+
x2: 1,
|
|
231
|
+
y2: 0,
|
|
232
|
+
colorStops: [
|
|
233
|
+
{ offset: 0, color: themeColor },
|
|
234
|
+
{ offset: 1, color: themeColor + "B3" }
|
|
235
|
+
]
|
|
236
|
+
} : {
|
|
237
|
+
type: "linear",
|
|
238
|
+
x: 0,
|
|
239
|
+
y: 0,
|
|
240
|
+
x2: 0,
|
|
241
|
+
y2: 1,
|
|
242
|
+
colorStops: [
|
|
243
|
+
{ offset: 0, color: themeColor },
|
|
244
|
+
{ offset: 1, color: themeColor + "B3" }
|
|
245
|
+
]
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
emphasis: {
|
|
249
|
+
itemStyle: {
|
|
250
|
+
shadowBlur: 10,
|
|
251
|
+
shadowColor: "rgba(0, 0, 0, 0.15)"
|
|
252
|
+
}
|
|
253
|
+
}
|
|
136
254
|
};
|
|
137
255
|
}
|
|
138
256
|
if (type === "chart-bar-percentage" || type === "chart-bar-pile" || type === "chart-strip-bar-pile" || type === "chart-strip-bar-percentage") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/chart-module/utils.ts"],"sourcesContent":["import { max, xor } from 'lodash-es'\nimport { ChartType } from '../../add-module-modal/add-chart-modal/interface'\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\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 }: any) => {\n let serie: any\n if (type === 'chart-pie') {\n serie = {\n data: data.map((item: number, idx: number) => ({\n value: item,\n name: labels[idx],\n })),\n name,\n type: 'pie',\n radius: '50%',\n label: {\n ...label,\n position: 'outside',\n },\n labelLine: {\n normal: {\n show: true,\n },\n },\n }\n } else if (type === 'chart-pie-circular') {\n serie = {\n data: data.map((item: number, idx: number) => ({\n value: item,\n name: labels[idx],\n })),\n type: 'pie',\n name,\n radius: ['40%', '70%'],\n label: {\n ...label,\n position: 'outside',\n },\n labelLine: {\n normal: {\n show: true,\n },\n },\n }\n } else if (type === 'chart-line') {\n serie = {\n data: data,\n name,\n type: 'line',\n label,\n }\n } else if (type === 'chart-line-smooth') {\n serie = {\n data: data,\n name,\n type: 'line',\n smooth: true, // 这里设置平滑曲线\n label,\n }\n } else {\n serie = {\n data: data,\n name,\n type: 'bar',\n label,\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":";AAIa,MAAA,iBAAiB,CAAC,UAAsD;AAC7E,QAAA,EAAE,MAAM,WAAA,IAAe;AAE7B,QAAM,gBAAgB;AAAA,IACpB,aAAa;AAAA,MACX,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,MAAA;AAAA,IAEV;AAAA,IACA,kBAAkB;AAAA,MAChB,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,MAC5C,OAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAAA,IACA,wBAAwB;AAAA,MACtB,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,MAC5C,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK;AAAA,QACL,WAAW;AAAA,UACT,WAAW;AAAA;AAAA,QAAA;AAAA,MACb;AAAA,IAEJ;AAAA,IACA,cAAc;AAAA,MACZ,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,MAC5C,OAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAAA,IACA,qBAAqB;AAAA,MACnB,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,MAC5C,OAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAAA,IACA,aAAa;AAAA,MACX,OAAO,EAAE,MAAM,MAAM;AAAA,MACrB,OAAO,EAAE,MAAM,MAAM;AAAA,IACvB;AAAA,IACA,sBAAsB;AAAA,MACpB,OAAO,EAAE,MAAM,MAAM;AAAA,MACrB,OAAO,EAAE,MAAM,MAAM;AAAA,IACvB;AAAA,IACA,mBAAmB;AAAA,MACjB,OAAO,EAAE,MAAM,QAAQ;AAAA,MACvB,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC9C;AAAA,IACA,wBAAwB;AAAA,MACtB,OAAO,EAAE,MAAM,QAAQ;AAAA,MACvB,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC9C;AAAA,IACA,8BAA8B;AAAA,MAC5B,OAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK;AAAA,QACL,WAAW;AAAA,UACT,WAAW;AAAA;AAAA,QAAA;AAAA,MAEf;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,MAAM;AAAA,MAAA;AAAA,IAEV;AAAA,IACA,CAAC,UAAU,kBAAkB,CAAC,GAAG;AAAA,MAC/B,OAAO,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,MAC5C,OAAO,EAAE,MAAM,QAAQ;AAAA,IAAA;AAAA,EAE3B;AAEA,SAAO,cAAc,IAAI;AAC3B;AAEa,MAAA,WAAW,CAAC,EAAE,MAAM,MAAM,OAAO,MAAM,SAAS,YAAY,aAAkB;AACrF,MAAA;AACJ,MAAI,SAAS,aAAa;AAChB,YAAA;AAAA,MACN,MAAM,KAAK,IAAI,CAAC,MAAc,SAAiB;AAAA,QAC7C,OAAO;AAAA,QACP,MAAM,OAAO,GAAG;AAAA,MAAA,EAChB;AAAA,MACF;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,MACA,WAAW;AAAA,QACT,QAAQ;AAAA,UACN,MAAM;AAAA,QAAA;AAAA,MACR;AAAA,IAEJ;AAAA,EAAA,WACS,SAAS,sBAAsB;AAChC,YAAA;AAAA,MACN,MAAM,KAAK,IAAI,CAAC,MAAc,SAAiB;AAAA,QAC7C,OAAO;AAAA,QACP,MAAM,OAAO,GAAG;AAAA,MAAA,EAChB;AAAA,MACF,MAAM;AAAA,MACN;AAAA,MACA,QAAQ,CAAC,OAAO,KAAK;AAAA,MACrB,OAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,MACZ;AAAA,MACA,WAAW;AAAA,QACT,QAAQ;AAAA,UACN,MAAM;AAAA,QAAA;AAAA,MACR;AAAA,IAEJ;AAAA,EAAA,WACS,SAAS,cAAc;AACxB,YAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EAAA,WACS,SAAS,qBAAqB;AAC/B,YAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,QAAQ;AAAA;AAAA,MACR;AAAA,IACF;AAAA,EAAA,OACK;AACG,YAAA;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AAAA,EAAA;AAGF,MACE,SAAS,0BACT,SAAS,oBACT,SAAS,0BACT,SAAS,8BACT;AACA,QAAI,WAAW,YAAY;AACzB,YAAM,QAAQ;AAAA,IAAA;AAAA,EAChB;AAGK,SAAA;AACT;AAKO,MAAM,UAAU,CAAC,EAAE,cAAc,QAAQ,aAAa,YAAiB;;AAetE,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,OAAO;AAAA,IACT,CAAC,KAAa,SAAqB;;AAC7B,UAAA,MAAM,EAAE,GAAG,IAAI;AAEnB,UAAI,MAAM,KAAK,cAAc,IAAI,SAAS;AAC1C,UAAI,SAAS,KAAK,IAAI,GAAG,KAAK,KAAK,IAAI,CAAA,UAAS,OAAO,KAAK,EAAE,MAAM,CAAC;AAErE,UAAI,OAAO,QAAQ;AACjB,YAAI,yBAAyB,IAAI,KAAK,IAAI,IAAI,yBAAyB,GAAG,MAAM;AAChF,YAAI,gBAAgB,IAAI;AAAA,MAAA,OACnB;AACL,YAAI,0BAA0B,IAAI,KAAK,IAAI,IAAI,0BAA0B,GAAG,MAAM;AAClF,YAAI,iBAAiB,IAAI;AAAA,MAAA;AAEvB,UAAA,kBAAkB,IAAI,KAAK,IAAI,IAAI,kBAAkB,IAAGA,MAAA,6BAAM,SAAN,gBAAAA,IAAY,MAAM;AACvE,aAAA;AAAA,IACT;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,yBAAyB;AAAA,MACzB,0BAA0B;AAAA,MAC1B,kBAAkB;AAAA,IAAA;AAAA,EAEtB;AAGA,MAAI,cAAY,gDAAa,UAAb,mBAAoB,UAAS,aAAa,UAAU;AACpE,MAAI,YAAmB,cAAc,WAAU,gDAAa,UAAb,mBAAoB,QAAO,gDAAa,UAAb,mBAAoB;AAE9F,QAAM,kBAAkB,kBAAa,CAAA,MAAb,mBAAkB,OAAO,CAAC,WAAW,UAAU;AAC/D,UAAA,SAAS,OAAO,KAAK,EAAE;AACtB,WAAA,KAAK,IAAI,WAAW,MAAM;AAAA,KAChC;AAGH,QAAM,WAAW;AACjB,QAAM,MAAM;AAEZ,MAAI,MAAM;AACV,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,MAAI,SAAS;AACb,MAAI,aAAa;AAEjB,MAAI,aAAa,SAAS;AAExB,UAAM,mBAAmB;AAAA,MACvB,CAAC,IAAI,GAAG,WAAW;AAAA;AAAA,MACnB,CAAC,IAAI,GAAG;AAAA,MACR,CAAC,GAAG,GAAG;AAAA,IACT;AACA,QAAI,mBAAmB,GAAG;AACxB,UAAI,kBAAkB,IAAI;AACX,qBAAA;AAAA,MAAA;AAEf,UAAI,iBAAiB,GAAG;AACT,qBAAA;AAAA,MAAA;AAEf,UAAI,QAAQ,GAAG;AACA,qBAAA;AAAA,MAAA;AAAA,IACf;AAGF,UAAM,YAAY,iBAAiB,GAAG,UAAU,EAAmC;AAC1E,aAAA,aAAa,cAAc,IAAI,IAAI,KAAK,IAAI,gBAAgB,EAAE,KAAK;AAC5E,WAAO,KAAK,IAAI,yBAAyB,EAAE,IAAI,WAAW;AAC1D,YAAQ,KAAK,IAAI,0BAA0B,EAAE,IAAI,WAAW;AAAA,EAAA,OACvD;AACL,aAAS,KAAK,IAAI,yBAAyB,EAAE,IAAI,WAAW;AAC5D,WAAO,KAAK,IAAI,gBAAgB,EAAE,IAAI,WAAW;AACzC,YAAA;AAAA,EAAA;AAGH,SAAA,KAAK,IAAI,MAAM,EAAE;AAChB,UAAA,KAAK,IAAI,OAAO,EAAE;AAG1B,MAAI,CAAC,gBAAgB;AACZ,WAAA;AAAA,EAAA;AAET,MAAI,CAAC,iBAAiB;AACZ,YAAA;AAAA,EAAA;AAIV,MAAI,YAAY;AACZ,MAAA,CAAC,EAAC,6CAAc,SAAQ;AAC1B,QAAI,aAAa,SAAS;AACxB,eAAS,SAAS;AAAA,IAAA,OACb;AACL,cAAQ,QAAQ;AAAA,IAAA;AAAA,EAClB;AAGE,MAAA,CAAC,EAAC,6CAAc,SAAQ;AAC1B,QAAI,aAAa,SAAS;AACxB,aAAO,OAAO;AAAA,IAAA,OACT;AACL,YAAM,MAAM;AAAA,IAAA;AAAA,EACd;AAGK,SAAA;AAAA,IACL,KAAK,MAAM;AAAA,IACX,MAAM,OAAO;AAAA,IACb,OAAO,QAAQ;AAAA,IACf,QAAQ,KAAK,IAAI,QAAQ,EAAE,IAAI;AAAA,IAC/B,iBAAiB;AAAA,EACnB;AACF;"}
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../packages/dashboard-workbench/components/module-content/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from 'react'\nimport { isEqual } from 'lodash-es'\nimport { ModuleDataApi } from '../../types'\nimport { ModuleValueType } from '../add-module-btn'\nimport CalendarModule from './calendar-module'\nimport ChartModule from './chart-module'\nimport StatisticsModule from './statistics-module'\nimport TextModule from './text-module'\n\nexport interface ModuleData {\n id?: string\n i?: string\n w: number\n h: number\n x: number\n y: number\n title: string\n type: ModuleValueType['type']\n customData?: ModuleValueType['customData']\n customeStyle?: ModuleValueType['customeStyle']\n}\n\ninterface ModuleProps {\n module: ModuleData\n onUpdate: (id: ModuleData['id'], updatedProps: Partial<ModuleData>) => void\n activeId?: ModuleData['id']\n onClick?: () => void\n onEdit?: () => void\n onDelete?: () => void\n onCopy?: () => void\n moduleDataApi?: ModuleDataApi\n onStartDragOrResize?: () => void\n onStopDragOrResize?: () => void\n rowWidth?: number\n rowHeight?: number\n}\n\nfunction areEqual(prevProps: any, nextProps: any) {\n return isEqual(prevProps.module, nextProps.module)\n}\n\nconst ModuleContent: React.FC<ModuleProps> = React.memo(\n ({ module, onUpdate, moduleDataApi, rowWidth, rowHeight }) => {\n return (\n <div\n className=\"module-content isNoCanDrag\"\n style={{\n overflow: module.type?.includes('chart') ? 'inherit' : 'hidden',\n }}\n >\n <div className=\"dashboard-grid-container\">\n {module.type === 'text' ? (\n <TextModule\n defaultValue={module.customData.editor}\n onChange={value => {\n if (module.id) {\n onUpdate(module.id, {\n type: 'text',\n customData: {\n title: module.customData.title,\n editor: value,\n },\n })\n }\n }}\n />\n ) : null}\n {module.type === 'statistics' ? (\n <StatisticsModule\n customData={module.customData}\n customeStyle={module.customeStyle}\n moduleDataApi={moduleDataApi}\n width={module.w}\n height={module.h}\n rowWidth={rowWidth}\n rowHeight={rowHeight}\n />\n ) : null}\n {module.type === 'calendar' ? (\n <CalendarModule\n customData={module.customData}\n moduleDataApi={moduleDataApi}\n width={module.w}\n height={module.h}\n rowWidth={rowWidth}\n rowHeight={rowHeight}\n />\n ) : null}\n {module.type?.includes('chart') ? (\n <ChartModule\n width={module.w}\n height={module.h}\n customData={module.customData}\n customeStyle={module.customeStyle}\n moduleDataApi={moduleDataApi}\n />\n ) : null}\n </div>\n </div>\n )\n },\n areEqual\n)\n\nexport default ModuleContent\n"],"names":[],"mappings":";;;;;;;AAsCA,SAAS,SAAS,WAAgB,WAAgB;AAChD,SAAO,QAAQ,UAAU,QAAQ,UAAU,MAAM;AACnD;AAEA,MAAM,gBAAuC,MAAM;AAAA,EACjD,CAAC,EAAE,QAAQ,UAAU,eAAe,UAAU,gBAAgB;;
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../packages/dashboard-workbench/components/module-content/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React from 'react'\nimport { isEqual } from 'lodash-es'\nimport { ModuleDataApi } from '../../types'\nimport { ModuleValueType } from '../add-module-btn'\nimport CalendarModule from './calendar-module'\nimport ChartModule from './chart-module'\nimport StatisticsModule from './statistics-module'\nimport TextModule from './text-module'\n\nexport interface ModuleData {\n id?: string\n i?: string\n w: number\n h: number\n x: number\n y: number\n title: string\n type: ModuleValueType['type']\n customData?: ModuleValueType['customData']\n customeStyle?: ModuleValueType['customeStyle']\n}\n\ninterface ModuleProps {\n module: ModuleData\n onUpdate: (id: ModuleData['id'], updatedProps: Partial<ModuleData>) => void\n activeId?: ModuleData['id']\n onClick?: () => void\n onEdit?: () => void\n onDelete?: () => void\n onCopy?: () => void\n moduleDataApi?: ModuleDataApi\n onStartDragOrResize?: () => void\n onStopDragOrResize?: () => void\n rowWidth?: number\n rowHeight?: number\n}\n\nfunction areEqual(prevProps: any, nextProps: any) {\n return isEqual(prevProps.module, nextProps.module)\n}\n\nconst ModuleContent: React.FC<ModuleProps> = React.memo(\n ({ module, onUpdate, moduleDataApi, rowWidth, rowHeight }) => {\n return (\n <div\n className=\"module-content isNoCanDrag\"\n style={{\n overflow: module.type?.includes('chart') ? 'inherit' : 'hidden',\n }}\n >\n <div className=\"dashboard-grid-container\">\n {module.type === 'text' ? (\n <TextModule\n defaultValue={module.customData.editor}\n onChange={value => {\n if (module.id) {\n onUpdate(module.id, {\n type: 'text',\n customData: {\n title: module.customData.title,\n editor: value,\n },\n })\n }\n }}\n />\n ) : null}\n {module.type === 'statistics' ? (\n <StatisticsModule\n customData={module.customData}\n customeStyle={module.customeStyle}\n moduleDataApi={moduleDataApi}\n width={module.w}\n height={module.h}\n rowWidth={rowWidth}\n rowHeight={rowHeight}\n />\n ) : null}\n {module.type === 'calendar' ? (\n <CalendarModule\n customData={module.customData}\n moduleDataApi={moduleDataApi}\n width={module.w}\n height={module.h}\n rowWidth={rowWidth}\n rowHeight={rowHeight}\n />\n ) : null}\n {module.type?.includes('chart') ? (\n <ChartModule\n width={module.w}\n height={module.h}\n customData={module.customData}\n customeStyle={module.customeStyle}\n moduleDataApi={moduleDataApi}\n />\n ) : null}\n </div>\n </div>\n )\n },\n areEqual\n)\n\nexport default ModuleContent\n"],"names":[],"mappings":";;;;;;;AAsCA,SAAS,SAAS,WAAgB,WAAgB;AAChD,SAAO,QAAQ,UAAU,QAAQ,UAAU,MAAM;AACnD;AAEA,MAAM,gBAAuC,MAAM;AAAA,EACjD,CAAC,EAAE,QAAQ,UAAU,eAAe,UAAU,gBAAgB;;AAC5D,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO;AAAA,UACL,YAAU,YAAO,SAAP,mBAAa,SAAS,YAAW,YAAY;AAAA,QAAA;AAAA,QAGzD,UAAA,qBAAC,OAAA,EAAI,WAAU,4BACZ,UAAA;AAAA,UAAA,OAAO,SAAS,SACf;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,cAAc,OAAO,WAAW;AAAA,cAChC,UAAU,CAAA,UAAS;AACjB,oBAAI,OAAO,IAAI;AACb,2BAAS,OAAO,IAAI;AAAA,oBAClB,MAAM;AAAA,oBACN,YAAY;AAAA,sBACV,OAAO,OAAO,WAAW;AAAA,sBACzB,QAAQ;AAAA,oBAAA;AAAA,kBACV,CACD;AAAA,gBACH;AAAA,cACF;AAAA,YAAA;AAAA,UAAA,IAEA;AAAA,UACH,OAAO,SAAS,eACf;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,YAAY,OAAO;AAAA,cACnB,cAAc,OAAO;AAAA,cACrB;AAAA,cACA,OAAO,OAAO;AAAA,cACd,QAAQ,OAAO;AAAA,cACf;AAAA,cACA;AAAA,YAAA;AAAA,UAAA,IAEA;AAAA,UACH,OAAO,SAAS,aACf;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,YAAY,OAAO;AAAA,cACnB;AAAA,cACA,OAAO,OAAO;AAAA,cACd,QAAQ,OAAO;AAAA,cACf;AAAA,cACA;AAAA,YAAA;AAAA,UAAA,IAEA;AAAA,YACH,YAAO,SAAP,mBAAa,SAAS,YACrB;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,OAAO,OAAO;AAAA,cACd,QAAQ,OAAO;AAAA,cACf,YAAY,OAAO;AAAA,cACnB,cAAc,OAAO;AAAA,cACrB;AAAA,YAAA;AAAA,UAAA,IAEA;AAAA,QAAA,EAAA,CACN;AAAA,MAAA;AAAA,IAAA;AAAA,EAGN;AAAA,EACA;AACF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/statistics-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 { useMemoizedFn, useSize } from 'ahooks'\nimport { useAppContext } from '@platox/pivot-table/context'\nimport { ModuleDataApi } from '../../../types'\nimport { StatisticsCustomeDataTypes } from '../../add-module-modal/add-statistics-modal/custome-data'\nimport { StatisticsCustomeStylesTypes } from '../../add-module-modal/add-statistics-modal/custome-styles'\nimport { ConditionBlock } from '../../add-module-modal/components/condition-modal/interface'\nimport { mapConditionsToPostgrest } from '../utils'\nimport { calculatePxMultiRange } from './utils'\n\ninterface StatisticsModuleProps {\n customData?: StatisticsCustomeDataTypes\n customeStyle?: StatisticsCustomeStylesTypes\n moduleDataApi?: ModuleDataApi\n width?: number\n height?: number\n rowWidth?: number\n rowHeight?: number\n}\n\nfunction formatToPercentage(value: number, decimalPlaces: number = 0): string {\n if (!Number.isFinite(value)) {\n throw new Error('Value must be a finite number.')\n }\n return new Intl.NumberFormat(undefined, {\n style: 'percent',\n minimumFractionDigits: decimalPlaces,\n maximumFractionDigits: decimalPlaces,\n }).format(value)\n}\n\nfunction formatToThousands(value: number, decimalPlaces: number = 0): string {\n if (!Number.isFinite(value)) {\n return ''\n }\n\n const formattedValue = new Intl.NumberFormat(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimalPlaces,\n }).format(value)\n\n const [integerPart, decimalPart] = formattedValue.split('.')\n const paddedDecimal = (decimalPart || '').padEnd(decimalPlaces, '0')\n\n return `${integerPart}${decimalPlaces > 0 ? '.' : ''}${paddedDecimal}`\n}\n\nconst StatisticsModule: React.FC<StatisticsModuleProps> = ({\n moduleDataApi,\n customData,\n customeStyle,\n}) => {\n /* ============================== split =============================== */\n const [list, setList] = useState<any>()\n const [loading, setLoading] = useState<boolean>(false)\n\n const { globalFilterCondition } = useAppContext()\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 getData = useMemoizedFn(async () => {\n if (customData) {\n // 调用方法\n let queryString = ''\n setLoading(true)\n if (customData.statisticalMethod === 'fieldValue' && customData.field) {\n queryString += `select=${customData.field}.${customData?.statisticalType}()`\n } else if (customData.statisticalMethod === 'recordTotal') {\n queryString += `select=id.count()`\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 setList(res.data)\n })\n .finally(() => {\n setLoading(false)\n })\n }\n } else {\n setList([])\n }\n })\n useEffect(() => {\n if (customData) {\n getData()\n }\n }, [\n customData?.conditionData,\n customData?.statisticalMethod,\n customData?.statisticalType,\n customData?.field,\n customData?.dataSourceId,\n matchGlobalFilterCondition,\n ])\n\n /* ============================== split =============================== */\n const { formatCurrency } = useAppContext()\n const formatCurrencyMemoizedFn = useMemoizedFn(formatCurrency)\n\n const statisticValue = useMemo(() => {\n if (!list) {\n return ''\n }\n\n const newList: any[] = list\n const { statisticalMethod, statisticalType, field } = customData || {}\n\n let val: any = 0\n if (newList.length && statisticalMethod === 'fieldValue' && field) {\n switch (statisticalType) {\n case 'sum':\n val = newList?.[0]?.sum || 0\n break\n case 'max':\n val = newList?.[0]?.max || 0\n break\n case 'min':\n val = newList?.[0]?.min || 0\n break\n case 'avg':\n val = newList?.[0]?.avg || 0\n break\n default:\n val = 0\n }\n } else if (statisticalMethod === 'recordTotal') {\n val = newList?.[0]?.count || 0\n }\n\n // 格式化\n if (customeStyle?.unit) {\n const { unit, precision } = customeStyle\n switch (`${unit}`) {\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n val = formatCurrencyMemoizedFn?.(val, precision) ?? val\n // val = `${unit}${formatToThousands(val, precision)}`\n break\n // case '8':\n // val = `฿${formatToThousands(val, precision)}`\n // break\n // case '7':\n // val = `£${formatToThousands(val, precision)}`\n // break\n // case '6':\n // val = `€${formatToThousands(val, precision)}`\n // break\n // case '5':\n // val = `$${formatToThousands(val, precision)}`\n // break\n // case '4':\n // val = `¥${formatToThousands(val, precision)}`\n // break\n case '1':\n val = formatToThousands(val, precision)\n break\n case '3':\n val = formatToPercentage(val, precision)\n break\n default:\n val = formatToThousands(val, precision)\n }\n } else {\n val = formatToThousands(val, customeStyle?.precision)\n }\n\n return val\n }, [list, customData, customeStyle])\n\n /* ============================== split =============================== */\n\n const boxRef = useRef<any>()\n const size = useSize(boxRef)\n\n const caclSize = useMemo(() => {\n if (!size) {\n return null\n }\n let PX: number = 0\n let PY: number = 32 // 固定\n let fontSize: number = 0\n let subFontSize: number = 0\n // 计算padding x 的值\n {\n const boxWidth1 = 116\n const px1 = 16\n\n const boxWidth2 = 760\n const px2 = 56\n\n PX = calculatePxMultiRange(size.width, {\n ranges: [\n [boxWidth1, px1],\n [boxWidth2, px2],\n ],\n step: 4,\n })\n const min = 16\n const max = 72\n PX = Math.max(min, Math.min(max, PX))\n }\n\n // 计算字体大小\n let innerBoxW = size.width - PX * 2\n let innerBoxH = size.height - PY * 2\n {\n fontSize = calculatePxMultiRange(innerBoxW, {\n ranges: [\n [400, 60],\n [500, 64],\n ],\n step: 0.1,\n })\n const min = 16\n const max = Math.min(72, innerBoxH / 2)\n fontSize = Math.max(min, Math.min(max, fontSize))\n }\n {\n subFontSize = calculatePxMultiRange(innerBoxH, {\n ranges: [\n [140, 12],\n [500, 24],\n [860, 36],\n ],\n step: 0.1,\n })\n const min = 12\n const max = Math.min(36, innerBoxH / 2)\n subFontSize = Math.max(min, Math.min(max, subFontSize))\n }\n\n return {\n PX,\n PY,\n fontSize,\n subFontSize,\n }\n }, [size])\n\n return (\n <div\n ref={boxRef}\n style={{\n display: 'flex',\n height: '100%',\n width: '100%',\n }}\n >\n {loading ? (\n <Spin\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n position: 'absolute',\n background: 'rgba(255,255,255,0.6)',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1000,\n }}\n spinning={loading}\n />\n ) : null}\n <div\n style={{\n overflow: 'hidden',\n position: 'relative',\n flex: 1,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n padding: `${caclSize?.PY}px ${caclSize?.PX}px`,\n }}\n >\n {statisticValue !== '' && (\n <div\n style={{\n width: '100%',\n position: 'relative',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n textAlign: 'center',\n }}\n >\n <span\n style={{\n fontWeight: 'bold',\n lineHeight: `${caclSize?.fontSize}px`,\n fontSize: `${caclSize?.fontSize}px`,\n color: customeStyle?.color,\n }}\n >\n {statisticValue}\n </span>\n </div>\n )}\n\n {customeStyle?.desc !== '' && (\n <div\n style={{\n width: '100%',\n position: 'relative',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n textAlign: 'center',\n }}\n >\n <span\n style={{\n fontSize: `${caclSize?.subFontSize}px`,\n lineHeight: `${caclSize?.subFontSize}px`,\n color: customeStyle?.color,\n textAlign: 'center',\n }}\n >\n {customeStyle?.desc}\n </span>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default React.memo(StatisticsModule)\n"],"names":["matchGlobalFilterCondition"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/statistics-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 { useMemoizedFn, useSize } from 'ahooks'\nimport { useAppContext } from '@platox/pivot-table/context'\nimport { ModuleDataApi } from '../../../types'\nimport { StatisticsCustomeDataTypes } from '../../add-module-modal/add-statistics-modal/custome-data'\nimport { StatisticsCustomeStylesTypes } from '../../add-module-modal/add-statistics-modal/custome-styles'\nimport { ConditionBlock } from '../../add-module-modal/components/condition-modal/interface'\nimport { mapConditionsToPostgrest } from '../utils'\nimport { calculatePxMultiRange } from './utils'\n\ninterface StatisticsModuleProps {\n customData?: StatisticsCustomeDataTypes\n customeStyle?: StatisticsCustomeStylesTypes\n moduleDataApi?: ModuleDataApi\n width?: number\n height?: number\n rowWidth?: number\n rowHeight?: number\n}\n\nfunction formatToPercentage(value: number, decimalPlaces: number = 0): string {\n if (!Number.isFinite(value)) {\n throw new Error('Value must be a finite number.')\n }\n return new Intl.NumberFormat(undefined, {\n style: 'percent',\n minimumFractionDigits: decimalPlaces,\n maximumFractionDigits: decimalPlaces,\n }).format(value)\n}\n\nfunction formatToThousands(value: number, decimalPlaces: number = 0): string {\n if (!Number.isFinite(value)) {\n return ''\n }\n\n const formattedValue = new Intl.NumberFormat(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: decimalPlaces,\n }).format(value)\n\n const [integerPart, decimalPart] = formattedValue.split('.')\n const paddedDecimal = (decimalPart || '').padEnd(decimalPlaces, '0')\n\n return `${integerPart}${decimalPlaces > 0 ? '.' : ''}${paddedDecimal}`\n}\n\nconst StatisticsModule: React.FC<StatisticsModuleProps> = ({\n moduleDataApi,\n customData,\n customeStyle,\n}) => {\n /* ============================== split =============================== */\n const [list, setList] = useState<any>()\n const [loading, setLoading] = useState<boolean>(false)\n\n const { globalFilterCondition } = useAppContext()\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 getData = useMemoizedFn(async () => {\n if (customData) {\n // 调用方法\n let queryString = ''\n setLoading(true)\n if (customData.statisticalMethod === 'fieldValue' && customData.field) {\n queryString += `select=${customData.field}.${customData?.statisticalType}()`\n } else if (customData.statisticalMethod === 'recordTotal') {\n queryString += `select=id.count()`\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 setList(res.data)\n })\n .finally(() => {\n setLoading(false)\n })\n }\n } else {\n setList([])\n }\n })\n useEffect(() => {\n if (customData) {\n getData()\n }\n }, [\n customData?.conditionData,\n customData?.statisticalMethod,\n customData?.statisticalType,\n customData?.field,\n customData?.dataSourceId,\n matchGlobalFilterCondition,\n ])\n\n /* ============================== split =============================== */\n const { formatCurrency } = useAppContext()\n const formatCurrencyMemoizedFn = useMemoizedFn(formatCurrency)\n\n const statisticValue = useMemo(() => {\n if (!list) {\n return ''\n }\n\n const newList: any[] = list\n const { statisticalMethod, statisticalType, field } = customData || {}\n\n let val: any = 0\n if (newList.length && statisticalMethod === 'fieldValue' && field) {\n switch (statisticalType) {\n case 'sum':\n val = newList?.[0]?.sum || 0\n break\n case 'max':\n val = newList?.[0]?.max || 0\n break\n case 'min':\n val = newList?.[0]?.min || 0\n break\n case 'avg':\n val = newList?.[0]?.avg || 0\n break\n default:\n val = 0\n }\n } else if (statisticalMethod === 'recordTotal') {\n val = newList?.[0]?.count || 0\n }\n\n // 格式化\n if (customeStyle?.unit) {\n const { unit, precision } = customeStyle\n switch (`${unit}`) {\n case '4':\n case '5':\n case '6':\n case '7':\n case '8':\n case '9':\n val = formatCurrencyMemoizedFn?.(val, precision) ?? val\n // val = `${unit}${formatToThousands(val, precision)}`\n break\n // case '8':\n // val = `฿${formatToThousands(val, precision)}`\n // break\n // case '7':\n // val = `£${formatToThousands(val, precision)}`\n // break\n // case '6':\n // val = `€${formatToThousands(val, precision)}`\n // break\n // case '5':\n // val = `$${formatToThousands(val, precision)}`\n // break\n // case '4':\n // val = `¥${formatToThousands(val, precision)}`\n // break\n case '1':\n val = formatToThousands(val, precision)\n break\n case '3':\n val = formatToPercentage(val, precision)\n break\n default:\n val = formatToThousands(val, precision)\n }\n } else {\n val = formatToThousands(val, customeStyle?.precision)\n }\n\n return val\n }, [list, customData, customeStyle])\n\n /* ============================== split =============================== */\n\n const boxRef = useRef<any>()\n const size = useSize(boxRef)\n\n const caclSize = useMemo(() => {\n if (!size) {\n return null\n }\n let PX: number = 0\n let PY: number = 32 // 固定\n let fontSize: number = 0\n let subFontSize: number = 0\n // 计算padding x 的值\n {\n const boxWidth1 = 116\n const px1 = 16\n\n const boxWidth2 = 760\n const px2 = 56\n\n PX = calculatePxMultiRange(size.width, {\n ranges: [\n [boxWidth1, px1],\n [boxWidth2, px2],\n ],\n step: 4,\n })\n const min = 16\n const max = 72\n PX = Math.max(min, Math.min(max, PX))\n }\n\n // 计算字体大小\n let innerBoxW = size.width - PX * 2\n let innerBoxH = size.height - PY * 2\n {\n fontSize = calculatePxMultiRange(innerBoxW, {\n ranges: [\n [400, 60],\n [500, 64],\n ],\n step: 0.1,\n })\n const min = 16\n const max = Math.min(72, innerBoxH / 2)\n fontSize = Math.max(min, Math.min(max, fontSize))\n }\n {\n subFontSize = calculatePxMultiRange(innerBoxH, {\n ranges: [\n [140, 12],\n [500, 24],\n [860, 36],\n ],\n step: 0.1,\n })\n const min = 12\n const max = Math.min(36, innerBoxH / 2)\n subFontSize = Math.max(min, Math.min(max, subFontSize))\n }\n\n return {\n PX,\n PY,\n fontSize,\n subFontSize,\n }\n }, [size])\n\n return (\n <div\n ref={boxRef}\n style={{\n display: 'flex',\n height: '100%',\n width: '100%',\n }}\n >\n {loading ? (\n <Spin\n style={{\n width: '100%',\n height: '100%',\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n position: 'absolute',\n background: 'rgba(255,255,255,0.6)',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n zIndex: 1000,\n }}\n spinning={loading}\n />\n ) : null}\n <div\n style={{\n overflow: 'hidden',\n position: 'relative',\n flex: 1,\n display: 'flex',\n justifyContent: 'center',\n alignItems: 'center',\n flexDirection: 'column',\n padding: `${caclSize?.PY}px ${caclSize?.PX}px`,\n }}\n >\n {statisticValue !== '' && (\n <div\n style={{\n width: '100%',\n position: 'relative',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n textAlign: 'center',\n }}\n >\n <span\n style={{\n fontWeight: 'bold',\n lineHeight: `${caclSize?.fontSize}px`,\n fontSize: `${caclSize?.fontSize}px`,\n color: customeStyle?.color,\n }}\n >\n {statisticValue}\n </span>\n </div>\n )}\n\n {customeStyle?.desc !== '' && (\n <div\n style={{\n width: '100%',\n position: 'relative',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n textAlign: 'center',\n }}\n >\n <span\n style={{\n fontSize: `${caclSize?.subFontSize}px`,\n lineHeight: `${caclSize?.subFontSize}px`,\n color: customeStyle?.color,\n textAlign: 'center',\n }}\n >\n {customeStyle?.desc}\n </span>\n </div>\n )}\n </div>\n </div>\n )\n}\n\nexport default React.memo(StatisticsModule)\n"],"names":["matchGlobalFilterCondition"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/statistics-module/utils.tsx"],"sourcesContent":["export function calculatePxMultiRange(\n width: number,\n options: {\n ranges: [number, number][]\n step: number\n }\n): number {\n const { ranges, step } = options\n\n let rang1: [number, number] | null = null\n let rang2: [number, number] | null = null\n\n for (let i = 0; i < ranges.length - 1; i++) {\n const [width1, px1] = ranges[i]\n const [width2, px2] = ranges[i + 1]\n\n // 判断宽度是否在当前区间内\n if (width >= width1 && width <= width2) {\n rang1 = [width1, px1]\n rang2 = [width2, px2]\n break\n }\n }\n\n if (width < ranges[0][0]) {\n rang1 = ranges[0]\n rang2 = ranges[1]\n }\n\n if (width > ranges[ranges.length - 1][0]) {\n rang1 = ranges[ranges.length - 2]\n rang2 = ranges[ranges.length - 1]\n }\n\n if (!!rang1 && !!rang2) {\n let [width1, px1] = rang1\n let [width2, px2] = rang2\n const slope = (px2 - px1) / (width2 - width1)\n const intercept = px1 - slope * width1\n\n const rawPx = slope * width + intercept\n return Math.round(rawPx / step) * step\n }\n\n if (!!rang1 || !!rang2) {\n let rang = !!rang1 ? rang1 : rang2\n let [width1, px1] = rang!\n\n // px1 /width1 = ? / width\n const rawPx = (px1 * width) / width1\n return Math.round(rawPx / step) * step\n }\n // 不允许一个不传\n throw new Error('Unexpected error in range calculation')\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/statistics-module/utils.tsx"],"sourcesContent":["export function calculatePxMultiRange(\n width: number,\n options: {\n ranges: [number, number][]\n step: number\n }\n): number {\n const { ranges, step } = options\n\n let rang1: [number, number] | null = null\n let rang2: [number, number] | null = null\n\n for (let i = 0; i < ranges.length - 1; i++) {\n const [width1, px1] = ranges[i]\n const [width2, px2] = ranges[i + 1]\n\n // 判断宽度是否在当前区间内\n if (width >= width1 && width <= width2) {\n rang1 = [width1, px1]\n rang2 = [width2, px2]\n break\n }\n }\n\n if (width < ranges[0][0]) {\n rang1 = ranges[0]\n rang2 = ranges[1]\n }\n\n if (width > ranges[ranges.length - 1][0]) {\n rang1 = ranges[ranges.length - 2]\n rang2 = ranges[ranges.length - 1]\n }\n\n if (!!rang1 && !!rang2) {\n let [width1, px1] = rang1\n let [width2, px2] = rang2\n const slope = (px2 - px1) / (width2 - width1)\n const intercept = px1 - slope * width1\n\n const rawPx = slope * width + intercept\n return Math.round(rawPx / step) * step\n }\n\n if (!!rang1 || !!rang2) {\n let rang = !!rang1 ? rang1 : rang2\n let [width1, px1] = rang!\n\n // px1 /width1 = ? / width\n const rawPx = (px1 * width) / width1\n return Math.round(rawPx / step) * step\n }\n // 不允许一个不传\n throw new Error('Unexpected error in range calculation')\n}\n"],"names":[],"mappings":"AAAO,SAAS,sBACd,OACA,SAIQ;AACR,QAAM,EAAE,QAAQ,KAAA,IAAS;AAEzB,MAAI,QAAiC;AACrC,MAAI,QAAiC;AAErC,WAAS,IAAI,GAAG,IAAI,OAAO,SAAS,GAAG,KAAK;AAC1C,UAAM,CAAC,QAAQ,GAAG,IAAI,OAAO,CAAC;AAC9B,UAAM,CAAC,QAAQ,GAAG,IAAI,OAAO,IAAI,CAAC;AAGlC,QAAI,SAAS,UAAU,SAAS,QAAQ;AACtC,cAAQ,CAAC,QAAQ,GAAG;AACpB,cAAQ,CAAC,QAAQ,GAAG;AACpB;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,OAAO,CAAC,EAAE,CAAC,GAAG;AACxB,YAAQ,OAAO,CAAC;AAChB,YAAQ,OAAO,CAAC;AAAA,EAClB;AAEA,MAAI,QAAQ,OAAO,OAAO,SAAS,CAAC,EAAE,CAAC,GAAG;AACxC,YAAQ,OAAO,OAAO,SAAS,CAAC;AAChC,YAAQ,OAAO,OAAO,SAAS,CAAC;AAAA,EAClC;AAEA,MAAI,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;AACtB,QAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,UAAM,SAAS,MAAM,QAAQ,SAAS;AACtC,UAAM,YAAY,MAAM,QAAQ;AAEhC,UAAM,QAAQ,QAAQ,QAAQ;AAC9B,WAAO,KAAK,MAAM,QAAQ,IAAI,IAAI;AAAA,EACpC;AAEA,MAAI,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;AACtB,QAAI,OAAO,CAAC,CAAC,QAAQ,QAAQ;AAC7B,QAAI,CAAC,QAAQ,GAAG,IAAI;AAGpB,UAAM,QAAS,MAAM,QAAS;AAC9B,WAAO,KAAK,MAAM,QAAQ,IAAI,IAAI;AAAA,EACpC;AAEA,QAAM,IAAI,MAAM,uCAAuC;AACzD;"}
|
|
@@ -4,7 +4,7 @@ import { Button } from "antd";
|
|
|
4
4
|
import { BoldOutlined, ItalicOutlined, UnderlineOutlined, OrderedListOutlined, UnorderedListOutlined, AlignLeftOutlined, AlignCenterOutlined, AlignRightOutlined, ColumnWidthOutlined } from "@ant-design/icons";
|
|
5
5
|
import ReactDOM from "react-dom";
|
|
6
6
|
import { useTranslation } from "react-i18next";
|
|
7
|
-
import { createEditor,
|
|
7
|
+
import { createEditor, Range, Editor, Transforms, Element as Element$1 } from "slate";
|
|
8
8
|
import { withHistory } from "slate-history";
|
|
9
9
|
import { withReact, Slate, Editable, useSlate, useFocused } from "slate-react";
|
|
10
10
|
import useDebounce from "./useDebounce.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../../packages/dashboard-workbench/components/module-content/text-module/editor/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { ReactNode, useCallback, useEffect, useMemo, useRef } from 'react'\nimport { Button } from 'antd'\nimport {\n AlignCenterOutlined,\n AlignLeftOutlined,\n AlignRightOutlined,\n BoldOutlined,\n ColumnWidthOutlined,\n ItalicOutlined,\n OrderedListOutlined,\n UnderlineOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons'\nimport ReactDOM from 'react-dom'\nimport { useTranslation } from 'react-i18next'\nimport { JSX } from 'react/jsx-runtime'\nimport {\n BaseElement,\n createEditor,\n Editor,\n Range,\n Element as SlateElement,\n Transforms,\n} from 'slate'\nimport { withHistory } from 'slate-history'\nimport { Editable, Slate, useFocused, useSlate, withReact } from 'slate-react'\nimport useDebounce from './useDebounce'\nimport './prose.css'\n\ninterface CustomElement extends BaseElement {\n type: string // 你需要的类型\n align?: string // 如果你有对齐属性\n}\n\nconst LIST_TYPES = ['numbered-list', 'bulleted-list']\nconst TEXT_ALIGN_TYPES = ['left', 'center', 'right', 'justify']\n\nconst Portal = ({ children }: { children?: ReactNode }) => {\n return typeof document === 'object' ? ReactDOM.createPortal(children, document.body) : null\n}\n\ninterface FormatButtonProps {\n format: string\n\n icon: any\n}\n\ninterface EditorProps {\n defaultValue: any\n onChange: (val: unknown) => void\n}\n\nconst BoxEditor: React.FC<EditorProps> = ({ defaultValue, onChange }) => {\n const { t } = useTranslation()\n const renderElement = useCallback(\n (\n props: JSX.IntrinsicAttributes & {\n attributes: any\n children: any\n element: any\n }\n ) => <Element {...props} />,\n []\n )\n const renderLeaf = useCallback(\n (\n props: JSX.IntrinsicAttributes & {\n attributes: any\n children: any\n leaf: any\n }\n ) => <Leaf {...props} />,\n []\n )\n const editor = useMemo(() => withHistory(withReact(createEditor())), [])\n\n const debouncedOnChange = useDebounce((val: any) => {\n onChange?.(val)\n }, 300) // 300 毫秒的延迟\n\n return (\n <div style={{ width: '100%', height: '100%' }}>\n <Slate editor={editor} initialValue={defaultValue} onChange={debouncedOnChange}>\n <HoveringToolbar />\n <Editable\n style={{ width: '100%', height: '100%', outline: 'none' }}\n className=\"prose prose-sm\"\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n spellCheck\n autoFocus\n placeholder={t('pleaseEnter')}\n onDOMBeforeInput={(event: InputEvent) => {\n switch (event.inputType) {\n case 'formatBold':\n event.preventDefault()\n return toggleMark(editor, 'bold')\n case 'formatItalic':\n event.preventDefault()\n return toggleMark(editor, 'italic')\n case 'formatUnderline':\n event.preventDefault()\n return toggleMark(editor, 'underlined')\n }\n }}\n />\n </Slate>\n </div>\n )\n}\n\n// 更新 toggleBlock 函数\nconst toggleBlock = (editor: Editor, format: string) => {\n const isActive = isBlockActive(\n editor,\n format,\n TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type'\n )\n const isList = LIST_TYPES.includes(format)\n\n Transforms.unwrapNodes(editor, {\n match: n =>\n !Editor.isEditor(n) &&\n SlateElement.isElement(n) &&\n LIST_TYPES.includes((n as CustomElement).type) && // 使用类型断言\n !TEXT_ALIGN_TYPES.includes(format),\n split: true,\n })\n\n const newProperties: Partial<CustomElement> = {}\n if (TEXT_ALIGN_TYPES.includes(format)) {\n newProperties.align = isActive ? undefined : format\n } else {\n newProperties.type = isActive ? 'paragraph' : isList ? 'list-item' : format\n }\n Transforms.setNodes<CustomElement>(editor, newProperties)\n\n if (!isActive && isList) {\n const block: CustomElement = { type: format, children: [] }\n Transforms.wrapNodes(editor, block)\n }\n}\n\nconst toggleMark = (editor: Editor, format: string) => {\n const isActive = isMarkActive(editor, format)\n\n if (isActive) {\n Editor.removeMark(editor, format)\n } else {\n Editor.addMark(editor, format, true)\n }\n}\n\n// 更新 isBlockActive 函数\nconst isBlockActive = (editor: Editor, format: string, blockType = 'type') => {\n const { selection } = editor\n if (!selection) return false\n\n const [match] = Array.from(\n Editor.nodes(editor, {\n at: Editor.unhangRange(editor, selection),\n match: n =>\n !Editor.isEditor(n) && SlateElement.isElement(n) && (n as any)[blockType] === format, // 使用类型断言\n })\n )\n\n return !!match\n}\n\nconst isMarkActive = (editor: Editor, format: string) => {\n const marks: any = Editor.marks(editor)\n return marks ? marks[format] === true : false\n}\n\nconst Element = ({\n attributes,\n children,\n element,\n}: {\n attributes: any\n\n children: any\n\n element: any\n}) => {\n const style = { textAlign: element.align }\n switch (element.type) {\n case 'block-quote':\n return (\n <blockquote style={style} {...attributes}>\n {children}\n </blockquote>\n )\n case 'bulleted-list':\n return (\n <ul style={style} {...attributes}>\n {children}\n </ul>\n )\n case 'heading-one':\n return (\n <h1 style={style} {...attributes}>\n {children}\n </h1>\n )\n case 'heading-two':\n return (\n <h2 style={style} {...attributes}>\n {children}\n </h2>\n )\n case 'list-item':\n return (\n <li style={style} {...attributes}>\n {children}\n </li>\n )\n case 'numbered-list':\n return (\n <ol style={style} {...attributes}>\n {children}\n </ol>\n )\n default:\n return (\n <p style={style} {...attributes}>\n {children}\n </p>\n )\n }\n}\n\nconst Leaf = ({\n attributes,\n children,\n leaf,\n}: {\n attributes: any\n\n children: any\n\n leaf: any\n}) => {\n if (leaf.bold) {\n children = <strong>{children}</strong>\n }\n\n if (leaf.code) {\n children = <code>{children}</code>\n }\n\n if (leaf.italic) {\n children = <em>{children}</em>\n }\n\n if (leaf.underline) {\n children = <u>{children}</u>\n }\n\n return <span {...attributes}>{children}</span>\n}\n\nconst HoveringToolbar = () => {\n const ref = useRef<HTMLDivElement>(null)\n const editor = useSlate()\n const inFocus = useFocused()\n\n useEffect(() => {\n const el = ref.current\n const { selection } = editor\n\n if (!el) {\n return\n }\n\n if (\n !selection ||\n !inFocus ||\n Range.isCollapsed(selection) ||\n Editor.string(editor, selection) === ''\n ) {\n el.removeAttribute('style')\n return\n }\n\n const domSelection = window.getSelection()\n const domRange = domSelection?.getRangeAt(0)\n const rect = domRange?.getBoundingClientRect()\n el.style.opacity = '1'\n if (rect) {\n el.style.top = `${rect.top + window.pageYOffset - el.offsetHeight}px`\n el.style.left = `${rect.left + window.pageXOffset - el.offsetWidth / 2 + rect.width / 2}px`\n }\n })\n\n return (\n <Portal>\n <div\n ref={ref}\n className=\"editor-menu\"\n onMouseDown={e => {\n // prevent toolbar from taking focus away from editor\n e.preventDefault()\n }}\n >\n <FormatButton format=\"bold\" icon={<BoldOutlined />} />\n <FormatButton format=\"italic\" icon={<ItalicOutlined />} />\n <FormatButton format=\"underline\" icon={<UnderlineOutlined />} />\n <BlockButton format=\"numbered-list\" icon={<OrderedListOutlined />} />\n <BlockButton format=\"bulleted-list\" icon={<UnorderedListOutlined />} />\n <BlockButton format=\"left\" icon={<AlignLeftOutlined />} />\n <BlockButton format=\"center\" icon={<AlignCenterOutlined />} />\n <BlockButton format=\"right\" icon={<AlignRightOutlined />} />\n <BlockButton format=\"justify\" icon={<ColumnWidthOutlined />} />\n </div>\n </Portal>\n )\n}\n\nconst FormatButton: React.FC<FormatButtonProps> = ({ format, icon }) => {\n const editor = useSlate()\n return (\n <Button\n onClick={() => toggleMark(editor, format)}\n icon={icon}\n color={isMarkActive(editor, format) ? 'primary' : 'default'}\n variant=\"text\"\n ></Button>\n )\n}\n\nconst BlockButton: React.FC<FormatButtonProps> = ({ format, icon }) => {\n const editor = useSlate()\n return (\n <Button\n color={\n isBlockActive(editor, format, TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type')\n ? 'primary'\n : 'default'\n }\n icon={icon}\n variant=\"text\"\n onClick={() => {\n toggleBlock(editor, format)\n }}\n ></Button>\n )\n}\n\nexport default BoxEditor\n"],"names":["SlateElement"],"mappings":";;;;;;;;;;;AAmCA,MAAM,aAAa,CAAC,iBAAiB,eAAe;AACpD,MAAM,mBAAmB,CAAC,QAAQ,UAAU,SAAS,SAAS;AAE9D,MAAM,SAAS,CAAC,EAAE,eAAyC;AAClD,SAAA,OAAO,aAAa,WAAW,SAAS,aAAa,UAAU,SAAS,IAAI,IAAI;AACzF;AAaA,MAAM,YAAmC,CAAC,EAAE,cAAc,eAAe;AACjE,QAAA,EAAE,EAAE,IAAI,eAAe;AAC7B,QAAM,gBAAgB;AAAA,IACpB,CACE,UAKI,oBAAA,SAAA,EAAS,GAAG,MAAO,CAAA;AAAA,IACzB,CAAA;AAAA,EACF;AACA,QAAM,aAAa;AAAA,IACjB,CACE,UAKI,oBAAA,MAAA,EAAM,GAAG,MAAO,CAAA;AAAA,IACtB,CAAA;AAAA,EACF;AACM,QAAA,SAAS,QAAQ,MAAM,YAAY,UAAU,aAAc,CAAA,CAAC,GAAG,EAAE;AAEjE,QAAA,oBAAoB,YAAY,CAAC,QAAa;AAClD,yCAAW;AAAA,KACV,GAAG;AAEN,SACG,oBAAA,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,OAAO,GAC1C,+BAAC,OAAM,EAAA,QAAgB,cAAc,cAAc,UAAU,mBAC3D,UAAA;AAAA,IAAA,oBAAC,iBAAgB,EAAA;AAAA,IACjB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,SAAS,OAAO;AAAA,QACxD,WAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,YAAU;AAAA,QACV,WAAS;AAAA,QACT,aAAa,EAAE,aAAa;AAAA,QAC5B,kBAAkB,CAAC,UAAsB;AACvC,kBAAQ,MAAM,WAAW;AAAA,YACvB,KAAK;AACH,oBAAM,eAAe;AACd,qBAAA,WAAW,QAAQ,MAAM;AAAA,YAClC,KAAK;AACH,oBAAM,eAAe;AACd,qBAAA,WAAW,QAAQ,QAAQ;AAAA,YACpC,KAAK;AACH,oBAAM,eAAe;AACd,qBAAA,WAAW,QAAQ,YAAY;AAAA,UAAA;AAAA,QAC1C;AAAA,MACF;AAAA,IAAA;AAAA,EACF,EAAA,CACF,EACF,CAAA;AAEJ;AAGA,MAAM,cAAc,CAAC,QAAgB,WAAmB;AACtD,QAAM,WAAW;AAAA,IACf;AAAA,IACA;AAAA,IACA,iBAAiB,SAAS,MAAM,IAAI,UAAU;AAAA,EAChD;AACM,QAAA,SAAS,WAAW,SAAS,MAAM;AAEzC,aAAW,YAAY,QAAQ;AAAA,IAC7B,OAAO,CAAA,MACL,CAAC,OAAO,SAAS,CAAC,KAClBA,UAAa,UAAU,CAAC,KACxB,WAAW,SAAU,EAAoB,IAAI;AAAA,IAC7C,CAAC,iBAAiB,SAAS,MAAM;AAAA,IACnC,OAAO;AAAA,EAAA,CACR;AAED,QAAM,gBAAwC,CAAC;AAC3C,MAAA,iBAAiB,SAAS,MAAM,GAAG;AACvB,kBAAA,QAAQ,WAAW,SAAY;AAAA,EAAA,OACxC;AACL,kBAAc,OAAO,WAAW,cAAc,SAAS,cAAc;AAAA,EAAA;AAE5D,aAAA,SAAwB,QAAQ,aAAa;AAEpD,MAAA,CAAC,YAAY,QAAQ;AACvB,UAAM,QAAuB,EAAE,MAAM,QAAQ,UAAU,CAAA,EAAG;AAC/C,eAAA,UAAU,QAAQ,KAAK;AAAA,EAAA;AAEtC;AAEA,MAAM,aAAa,CAAC,QAAgB,WAAmB;AAC/C,QAAA,WAAW,aAAa,QAAQ,MAAM;AAE5C,MAAI,UAAU;AACL,WAAA,WAAW,QAAQ,MAAM;AAAA,EAAA,OAC3B;AACE,WAAA,QAAQ,QAAQ,QAAQ,IAAI;AAAA,EAAA;AAEvC;AAGA,MAAM,gBAAgB,CAAC,QAAgB,QAAgB,YAAY,WAAW;AACtE,QAAA,EAAE,cAAc;AAClB,MAAA,CAAC,UAAkB,QAAA;AAEjB,QAAA,CAAC,KAAK,IAAI,MAAM;AAAA,IACpB,OAAO,MAAM,QAAQ;AAAA,MACnB,IAAI,OAAO,YAAY,QAAQ,SAAS;AAAA,MACxC,OAAO,CAAA,MACL,CAAC,OAAO,SAAS,CAAC,KAAKA,UAAa,UAAU,CAAC,KAAM,EAAU,SAAS,MAAM;AAAA;AAAA,IACjF,CAAA;AAAA,EACH;AAEA,SAAO,CAAC,CAAC;AACX;AAEA,MAAM,eAAe,CAAC,QAAgB,WAAmB;AACjD,QAAA,QAAa,OAAO,MAAM,MAAM;AACtC,SAAO,QAAQ,MAAM,MAAM,MAAM,OAAO;AAC1C;AAEA,MAAM,UAAU,CAAC;AAAA,EACf;AAAA,EACA;AAAA,EACA;AACF,MAMM;AACJ,QAAM,QAAQ,EAAE,WAAW,QAAQ,MAAM;AACzC,UAAQ,QAAQ,MAAM;AAAA,IACpB,KAAK;AACH,aACG,oBAAA,cAAA,EAAW,OAAe,GAAG,YAC3B,UACH;AAAA,IAEJ,KAAK;AACH,aACG,oBAAA,MAAA,EAAG,OAAe,GAAG,YACnB,UACH;AAAA,IAEJ,KAAK;AACH,aACG,oBAAA,MAAA,EAAG,OAAe,GAAG,YACnB,UACH;AAAA,IAEJ,KAAK;AACH,aACG,oBAAA,MAAA,EAAG,OAAe,GAAG,YACnB,UACH;AAAA,IAEJ,KAAK;AACH,aACG,oBAAA,MAAA,EAAG,OAAe,GAAG,YACnB,UACH;AAAA,IAEJ,KAAK;AACH,aACG,oBAAA,MAAA,EAAG,OAAe,GAAG,YACnB,UACH;AAAA,IAEJ;AACE,aACG,oBAAA,KAAA,EAAE,OAAe,GAAG,YAClB,UACH;AAAA,EAAA;AAGR;AAEA,MAAM,OAAO,CAAC;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACF,MAMM;AACJ,MAAI,KAAK,MAAM;AACF,eAAA,oBAAC,YAAQ,SAAS,CAAA;AAAA,EAAA;AAG/B,MAAI,KAAK,MAAM;AACF,eAAA,oBAAC,UAAM,SAAS,CAAA;AAAA,EAAA;AAG7B,MAAI,KAAK,QAAQ;AACJ,eAAA,oBAAC,QAAI,SAAS,CAAA;AAAA,EAAA;AAG3B,MAAI,KAAK,WAAW;AACP,eAAA,oBAAC,OAAG,SAAS,CAAA;AAAA,EAAA;AAG1B,SAAQ,oBAAA,QAAA,EAAM,GAAG,YAAa,SAAS,CAAA;AACzC;AAEA,MAAM,kBAAkB,MAAM;AACtB,QAAA,MAAM,OAAuB,IAAI;AACvC,QAAM,SAAS,SAAS;AACxB,QAAM,UAAU,WAAW;AAE3B,YAAU,MAAM;AACd,UAAM,KAAK,IAAI;AACT,UAAA,EAAE,cAAc;AAEtB,QAAI,CAAC,IAAI;AACP;AAAA,IAAA;AAGF,QACE,CAAC,aACD,CAAC,WACD,MAAM,YAAY,SAAS,KAC3B,OAAO,OAAO,QAAQ,SAAS,MAAM,IACrC;AACA,SAAG,gBAAgB,OAAO;AAC1B;AAAA,IAAA;AAGI,UAAA,eAAe,OAAO,aAAa;AACnC,UAAA,WAAW,6CAAc,WAAW;AACpC,UAAA,OAAO,qCAAU;AACvB,OAAG,MAAM,UAAU;AACnB,QAAI,MAAM;AACL,SAAA,MAAM,MAAM,GAAG,KAAK,MAAM,OAAO,cAAc,GAAG,YAAY;AACjE,SAAG,MAAM,OAAO,GAAG,KAAK,OAAO,OAAO,cAAc,GAAG,cAAc,IAAI,KAAK,QAAQ,CAAC;AAAA,IAAA;AAAA,EACzF,CACD;AAED,6BACG,QACC,EAAA,UAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,WAAU;AAAA,MACV,aAAa,CAAK,MAAA;AAEhB,UAAE,eAAe;AAAA,MACnB;AAAA,MAEA,UAAA;AAAA,QAAA,oBAAC,gBAAa,QAAO,QAAO,MAAM,oBAAC,eAAa,CAAA,GAAI;AAAA,4BACnD,cAAa,EAAA,QAAO,UAAS,MAAM,oBAAC,iBAAe,CAAA,GAAI;AAAA,4BACvD,cAAa,EAAA,QAAO,aAAY,MAAM,oBAAC,oBAAkB,CAAA,GAAI;AAAA,4BAC7D,aAAY,EAAA,QAAO,iBAAgB,MAAM,oBAAC,sBAAoB,CAAA,GAAI;AAAA,4BAClE,aAAY,EAAA,QAAO,iBAAgB,MAAM,oBAAC,wBAAsB,CAAA,GAAI;AAAA,4BACpE,aAAY,EAAA,QAAO,QAAO,MAAM,oBAAC,oBAAkB,CAAA,GAAI;AAAA,4BACvD,aAAY,EAAA,QAAO,UAAS,MAAM,oBAAC,sBAAoB,CAAA,GAAI;AAAA,4BAC3D,aAAY,EAAA,QAAO,SAAQ,MAAM,oBAAC,qBAAmB,CAAA,GAAI;AAAA,4BACzD,aAAY,EAAA,QAAO,WAAU,MAAM,oBAAC,uBAAoB,EAAI,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA,GAEjE;AAEJ;AAEA,MAAM,eAA4C,CAAC,EAAE,QAAQ,WAAW;AACtE,QAAM,SAAS,SAAS;AAEtB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,SAAS,MAAM,WAAW,QAAQ,MAAM;AAAA,MACxC;AAAA,MACA,OAAO,aAAa,QAAQ,MAAM,IAAI,YAAY;AAAA,MAClD,SAAQ;AAAA,IAAA;AAAA,EACT;AAEL;AAEA,MAAM,cAA2C,CAAC,EAAE,QAAQ,WAAW;AACrE,QAAM,SAAS,SAAS;AAEtB,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OACE,cAAc,QAAQ,QAAQ,iBAAiB,SAAS,MAAM,IAAI,UAAU,MAAM,IAC9E,YACA;AAAA,MAEN;AAAA,MACA,SAAQ;AAAA,MACR,SAAS,MAAM;AACb,oBAAY,QAAQ,MAAM;AAAA,MAAA;AAAA,IAC5B;AAAA,EACD;AAEL;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../../packages/dashboard-workbench/components/module-content/text-module/editor/index.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport React, { ReactNode, useCallback, useEffect, useMemo, useRef } from 'react'\nimport { Button } from 'antd'\nimport {\n AlignCenterOutlined,\n AlignLeftOutlined,\n AlignRightOutlined,\n BoldOutlined,\n ColumnWidthOutlined,\n ItalicOutlined,\n OrderedListOutlined,\n UnderlineOutlined,\n UnorderedListOutlined,\n} from '@ant-design/icons'\nimport ReactDOM from 'react-dom'\nimport { useTranslation } from 'react-i18next'\nimport { JSX } from 'react/jsx-runtime'\nimport {\n BaseElement,\n createEditor,\n Editor,\n Range,\n Element as SlateElement,\n Transforms,\n} from 'slate'\nimport { withHistory } from 'slate-history'\nimport { Editable, Slate, useFocused, useSlate, withReact } from 'slate-react'\nimport useDebounce from './useDebounce'\nimport './prose.css'\n\ninterface CustomElement extends BaseElement {\n type: string // 你需要的类型\n align?: string // 如果你有对齐属性\n}\n\nconst LIST_TYPES = ['numbered-list', 'bulleted-list']\nconst TEXT_ALIGN_TYPES = ['left', 'center', 'right', 'justify']\n\nconst Portal = ({ children }: { children?: ReactNode }) => {\n return typeof document === 'object' ? ReactDOM.createPortal(children, document.body) : null\n}\n\ninterface FormatButtonProps {\n format: string\n\n icon: any\n}\n\ninterface EditorProps {\n defaultValue: any\n onChange: (val: unknown) => void\n}\n\nconst BoxEditor: React.FC<EditorProps> = ({ defaultValue, onChange }) => {\n const { t } = useTranslation()\n const renderElement = useCallback(\n (\n props: JSX.IntrinsicAttributes & {\n attributes: any\n children: any\n element: any\n }\n ) => <Element {...props} />,\n []\n )\n const renderLeaf = useCallback(\n (\n props: JSX.IntrinsicAttributes & {\n attributes: any\n children: any\n leaf: any\n }\n ) => <Leaf {...props} />,\n []\n )\n const editor = useMemo(() => withHistory(withReact(createEditor())), [])\n\n const debouncedOnChange = useDebounce((val: any) => {\n onChange?.(val)\n }, 300) // 300 毫秒的延迟\n\n return (\n <div style={{ width: '100%', height: '100%' }}>\n <Slate editor={editor} initialValue={defaultValue} onChange={debouncedOnChange}>\n <HoveringToolbar />\n <Editable\n style={{ width: '100%', height: '100%', outline: 'none' }}\n className=\"prose prose-sm\"\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n spellCheck\n autoFocus\n placeholder={t('pleaseEnter')}\n onDOMBeforeInput={(event: InputEvent) => {\n switch (event.inputType) {\n case 'formatBold':\n event.preventDefault()\n return toggleMark(editor, 'bold')\n case 'formatItalic':\n event.preventDefault()\n return toggleMark(editor, 'italic')\n case 'formatUnderline':\n event.preventDefault()\n return toggleMark(editor, 'underlined')\n }\n }}\n />\n </Slate>\n </div>\n )\n}\n\n// 更新 toggleBlock 函数\nconst toggleBlock = (editor: Editor, format: string) => {\n const isActive = isBlockActive(\n editor,\n format,\n TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type'\n )\n const isList = LIST_TYPES.includes(format)\n\n Transforms.unwrapNodes(editor, {\n match: n =>\n !Editor.isEditor(n) &&\n SlateElement.isElement(n) &&\n LIST_TYPES.includes((n as CustomElement).type) && // 使用类型断言\n !TEXT_ALIGN_TYPES.includes(format),\n split: true,\n })\n\n const newProperties: Partial<CustomElement> = {}\n if (TEXT_ALIGN_TYPES.includes(format)) {\n newProperties.align = isActive ? undefined : format\n } else {\n newProperties.type = isActive ? 'paragraph' : isList ? 'list-item' : format\n }\n Transforms.setNodes<CustomElement>(editor, newProperties)\n\n if (!isActive && isList) {\n const block: CustomElement = { type: format, children: [] }\n Transforms.wrapNodes(editor, block)\n }\n}\n\nconst toggleMark = (editor: Editor, format: string) => {\n const isActive = isMarkActive(editor, format)\n\n if (isActive) {\n Editor.removeMark(editor, format)\n } else {\n Editor.addMark(editor, format, true)\n }\n}\n\n// 更新 isBlockActive 函数\nconst isBlockActive = (editor: Editor, format: string, blockType = 'type') => {\n const { selection } = editor\n if (!selection) return false\n\n const [match] = Array.from(\n Editor.nodes(editor, {\n at: Editor.unhangRange(editor, selection),\n match: n =>\n !Editor.isEditor(n) && SlateElement.isElement(n) && (n as any)[blockType] === format, // 使用类型断言\n })\n )\n\n return !!match\n}\n\nconst isMarkActive = (editor: Editor, format: string) => {\n const marks: any = Editor.marks(editor)\n return marks ? marks[format] === true : false\n}\n\nconst Element = ({\n attributes,\n children,\n element,\n}: {\n attributes: any\n\n children: any\n\n element: any\n}) => {\n const style = { textAlign: element.align }\n switch (element.type) {\n case 'block-quote':\n return (\n <blockquote style={style} {...attributes}>\n {children}\n </blockquote>\n )\n case 'bulleted-list':\n return (\n <ul style={style} {...attributes}>\n {children}\n </ul>\n )\n case 'heading-one':\n return (\n <h1 style={style} {...attributes}>\n {children}\n </h1>\n )\n case 'heading-two':\n return (\n <h2 style={style} {...attributes}>\n {children}\n </h2>\n )\n case 'list-item':\n return (\n <li style={style} {...attributes}>\n {children}\n </li>\n )\n case 'numbered-list':\n return (\n <ol style={style} {...attributes}>\n {children}\n </ol>\n )\n default:\n return (\n <p style={style} {...attributes}>\n {children}\n </p>\n )\n }\n}\n\nconst Leaf = ({\n attributes,\n children,\n leaf,\n}: {\n attributes: any\n\n children: any\n\n leaf: any\n}) => {\n if (leaf.bold) {\n children = <strong>{children}</strong>\n }\n\n if (leaf.code) {\n children = <code>{children}</code>\n }\n\n if (leaf.italic) {\n children = <em>{children}</em>\n }\n\n if (leaf.underline) {\n children = <u>{children}</u>\n }\n\n return <span {...attributes}>{children}</span>\n}\n\nconst HoveringToolbar = () => {\n const ref = useRef<HTMLDivElement>(null)\n const editor = useSlate()\n const inFocus = useFocused()\n\n useEffect(() => {\n const el = ref.current\n const { selection } = editor\n\n if (!el) {\n return\n }\n\n if (\n !selection ||\n !inFocus ||\n Range.isCollapsed(selection) ||\n Editor.string(editor, selection) === ''\n ) {\n el.removeAttribute('style')\n return\n }\n\n const domSelection = window.getSelection()\n const domRange = domSelection?.getRangeAt(0)\n const rect = domRange?.getBoundingClientRect()\n el.style.opacity = '1'\n if (rect) {\n el.style.top = `${rect.top + window.pageYOffset - el.offsetHeight}px`\n el.style.left = `${rect.left + window.pageXOffset - el.offsetWidth / 2 + rect.width / 2}px`\n }\n })\n\n return (\n <Portal>\n <div\n ref={ref}\n className=\"editor-menu\"\n onMouseDown={e => {\n // prevent toolbar from taking focus away from editor\n e.preventDefault()\n }}\n >\n <FormatButton format=\"bold\" icon={<BoldOutlined />} />\n <FormatButton format=\"italic\" icon={<ItalicOutlined />} />\n <FormatButton format=\"underline\" icon={<UnderlineOutlined />} />\n <BlockButton format=\"numbered-list\" icon={<OrderedListOutlined />} />\n <BlockButton format=\"bulleted-list\" icon={<UnorderedListOutlined />} />\n <BlockButton format=\"left\" icon={<AlignLeftOutlined />} />\n <BlockButton format=\"center\" icon={<AlignCenterOutlined />} />\n <BlockButton format=\"right\" icon={<AlignRightOutlined />} />\n <BlockButton format=\"justify\" icon={<ColumnWidthOutlined />} />\n </div>\n </Portal>\n )\n}\n\nconst FormatButton: React.FC<FormatButtonProps> = ({ format, icon }) => {\n const editor = useSlate()\n return (\n <Button\n onClick={() => toggleMark(editor, format)}\n icon={icon}\n color={isMarkActive(editor, format) ? 'primary' : 'default'}\n variant=\"text\"\n ></Button>\n )\n}\n\nconst BlockButton: React.FC<FormatButtonProps> = ({ format, icon }) => {\n const editor = useSlate()\n return (\n <Button\n color={\n isBlockActive(editor, format, TEXT_ALIGN_TYPES.includes(format) ? 'align' : 'type')\n ? 'primary'\n : 'default'\n }\n icon={icon}\n variant=\"text\"\n onClick={() => {\n toggleBlock(editor, format)\n }}\n ></Button>\n )\n}\n\nexport default BoxEditor\n"],"names":["SlateElement"],"mappings":"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"}
|
package/es/dashboard-workbench/components/module-content/text-module/editor/useDebounce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDebounce.js","sources":["../../../../../../packages/dashboard-workbench/components/module-content/text-module/editor/useDebounce.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useRef } from 'react'\n\nconst useDebounce = <T extends (...args: any[]) => void>(\n callback: T,\n delay: number\n): ((...args: Parameters<T>) => void) => {\n const timeoutRef = useRef<any | null>(null)\n\n const debouncedCallback = (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n timeoutRef.current = setTimeout(() => {\n callback(...args)\n }, delay)\n }\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n return debouncedCallback\n}\n\nexport default useDebounce\n"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"useDebounce.js","sources":["../../../../../../packages/dashboard-workbench/components/module-content/text-module/editor/useDebounce.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useRef } from 'react'\n\nconst useDebounce = <T extends (...args: any[]) => void>(\n callback: T,\n delay: number\n): ((...args: Parameters<T>) => void) => {\n const timeoutRef = useRef<any | null>(null)\n\n const debouncedCallback = (...args: Parameters<T>) => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n timeoutRef.current = setTimeout(() => {\n callback(...args)\n }, delay)\n }\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [])\n\n return debouncedCallback\n}\n\nexport default useDebounce\n"],"names":[],"mappings":";AAGA,MAAM,cAAc,CAClB,UACA,UACuC;AACvC,QAAM,aAAa,OAAmB,IAAI;AAE1C,QAAM,oBAAoB,IAAI,SAAwB;AACpD,QAAI,WAAW,SAAS;AACtB,mBAAa,WAAW,OAAO;AAAA,IACjC;AACA,eAAW,UAAU,WAAW,MAAM;AACpC,eAAS,GAAG,IAAI;AAAA,IAClB,GAAG,KAAK;AAAA,EACV;AAEA,YAAU,MAAM;AACd,WAAO,MAAM;AACX,UAAI,WAAW,SAAS;AACtB,qBAAa,WAAW,OAAO;AAAA,MACjC;AAAA,IACF;AAAA,EACF,GAAG,CAAA,CAAE;AAEL,SAAO;AACT;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/text-module/index.tsx"],"sourcesContent":["import React from 'react'\nimport Editor from './editor'\n\ninterface TextModuleProps {\n defaultValue: unknown\n onChange: (val: unknown) => void\n}\n\nconst TextModule: React.FC<TextModuleProps> = ({ defaultValue, onChange }) => {\n return (\n <div style={{ width: '100%', height: '100%', overflowY: 'auto', padding: '0 10px' }}>\n <Editor defaultValue={defaultValue} onChange={onChange} />\n </div>\n )\n}\n\nexport default React.memo(TextModule)\n"],"names":["Editor"],"mappings":";;;AAQA,MAAM,aAAwC,CAAC,EAAE,cAAc,eAAe;AAC5E,6BACG,
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../../packages/dashboard-workbench/components/module-content/text-module/index.tsx"],"sourcesContent":["import React from 'react'\nimport Editor from './editor'\n\ninterface TextModuleProps {\n defaultValue: unknown\n onChange: (val: unknown) => void\n}\n\nconst TextModule: React.FC<TextModuleProps> = ({ defaultValue, onChange }) => {\n return (\n <div style={{ width: '100%', height: '100%', overflowY: 'auto', padding: '0 10px' }}>\n <Editor defaultValue={defaultValue} onChange={onChange} />\n </div>\n )\n}\n\nexport default React.memo(TextModule)\n"],"names":["Editor"],"mappings":";;;AAQA,MAAM,aAAwC,CAAC,EAAE,cAAc,eAAe;AAC5E,6BACG,OAAA,EAAI,OAAO,EAAE,OAAO,QAAQ,QAAQ,QAAQ,WAAW,QAAQ,SAAS,YACvE,8BAACA,WAAA,EAAO,cAA4B,UAAoB,GAC1D;AAEJ;AAEA,MAAA,eAAe,MAAM,KAAK,UAAU;"}
|