@xq-labs/data-ui-v2 0.2.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,6 @@
1
- import { _ as _objectSpread2, D as DEFAULT_COLORS, a as _toConsumableArray, m as mergeChartOption, i as isEmptyData } from './colors-ca059479.js';
1
+ import { _ as _objectSpread2, D as DEFAULT_COLORS, a as _toConsumableArray, m as mergeChartOption, i as isEmptyData } from './colors-ec0ad9ce.js';
2
2
  import * as echarts from 'echarts/core';
3
+ import { SeriesModel } from 'echarts/core';
3
4
  import { PieChart as PieChart$1 } from 'echarts/charts';
4
5
  import { TooltipComponent, LegendComponent, GridComponent, TitleComponent, GraphicComponent } from 'echarts/components';
5
6
  import { CanvasRenderer } from 'echarts/renderers';
@@ -69,10 +70,11 @@ var PIE_HEIGHT_MODE = {
69
70
  VALUE: 'value'
70
71
  };
71
72
  var DEFAULT_HEIGHT_RANGE = {
72
- min: 20,
73
- max: 80
73
+ min: 10,
74
+ max: 25
74
75
  };
75
- var DEFAULT_3D_VIEW_ALPHA = 28;
76
+ var DEFAULT_3D_VIEW_DISTANCE = 120;
77
+ var DEFAULT_3D_VIEW_ALPHA = 55;
76
78
  var DEFAULT_INTERNAL_DIAMETER_RATIO = 0.6;
77
79
  var DEFAULT_ROSE_RADIUS_RANGE = [0.75, 1.15];
78
80
  var DEFAULT_LABEL_OPTIONS = {
@@ -90,6 +92,17 @@ var DEFAULT_LABEL_OPTIONS = {
90
92
  verticalGap: 8,
91
93
  radialOffset: 0.12
92
94
  };
95
+ var DEFAULT_TOOLTIP_STYLE = {
96
+ backgroundColor: '#fff',
97
+ borderColor: 'transparent',
98
+ borderWidth: 0,
99
+ padding: [8, 12],
100
+ textStyle: {
101
+ color: '#333',
102
+ fontSize: 12
103
+ },
104
+ extraCssText: 'box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); border-radius: 4px;'
105
+ };
93
106
 
94
107
  /**
95
108
  * 将输入值转为安全数字。
@@ -196,6 +209,9 @@ function buildPieChartData(data) {
196
209
  function replaceLabelTemplate(template, params) {
197
210
  return template.replace(/\{b\}/g, params.name).replace(/\{c\}/g, params.value).replace(/\{d\}/g, params.percent);
198
211
  }
212
+ function escapeTooltipHtml(value) {
213
+ return String(value).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#39;');
214
+ }
199
215
  function formatPieLabelText(formatter, params) {
200
216
  if (typeof formatter === 'function') {
201
217
  return formatter(params);
@@ -205,29 +221,65 @@ function formatPieLabelText(formatter, params) {
205
221
  }
206
222
  return "".concat(params.name, "\n").concat(params.percent, "%");
207
223
  }
224
+ function createFallbackTooltipMarker(color) {
225
+ var markerColor = escapeTooltipHtml(color || '#6B98F8');
226
+ return "<span style=\"display:inline-block;margin-right:4px;border-radius:50%;width:10px;height:10px;background-color:".concat(markerColor, ";\"></span>");
227
+ }
228
+ function formatPieTooltipContent(_ref) {
229
+ var marker = _ref.marker,
230
+ name = _ref.name,
231
+ value = _ref.value,
232
+ color = _ref.color;
233
+ var safeMarker = marker || createFallbackTooltipMarker(color);
234
+ return "".concat(safeMarker).concat(escapeTooltipHtml(name), ":").concat(escapeTooltipHtml(value));
235
+ }
236
+
237
+ /**
238
+ * 创建饼图统一 hover tooltip 样式。
239
+ * 默认呈现为白底阴影卡片,内容为“彩色圆点 + 名称:值”,贴近业务看板常见展示形态。
240
+ */
241
+ function createPieTooltipOption(formatter) {
242
+ return _objectSpread2(_objectSpread2({}, DEFAULT_TOOLTIP_STYLE), {}, {
243
+ formatter: formatter
244
+ });
245
+ }
246
+ function formatPie2DTooltip() {
247
+ var params = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
248
+ return formatPieTooltipContent({
249
+ marker: params.marker,
250
+ name: params.name === undefined ? '' : params.name,
251
+ value: params.value === undefined ? '' : params.value,
252
+ color: params.color
253
+ });
254
+ }
208
255
 
209
256
  /**
210
257
  * 格式化 3D 饼图默认 tooltip 文案。
211
258
  * surface 系列 hover 时拿到的 `params.value` 实际是参数方程采样值,
212
259
  * 不能直接当业务值展示,因此统一回退到扇区自身的 `pieData`。
213
260
  */
214
- function formatPieTooltipText(name, value, percent) {
215
- return "".concat(name, ": ").concat(value, " (").concat(percent, "%)");
261
+ function formatPie3DTooltip(params, pieData) {
262
+ return formatPieTooltipContent({
263
+ marker: params && params.marker,
264
+ name: pieData && pieData.name !== undefined ? pieData.name : '',
265
+ value: pieData && pieData.value !== undefined ? pieData.value : 0,
266
+ color: pieData && pieData.itemStyle && pieData.itemStyle.color
267
+ });
216
268
  }
217
269
 
218
270
  /**
219
271
  * 为单个 3D 扇区生成专用 tooltip。
220
272
  * 这样即使鼠标落在 surface 网格采样点上,展示的仍然是业务名称、原始值与百分比。
221
273
  */
222
- function createPie3DTooltip(pieData, totalValue) {
274
+ function createPie3DTooltip(pieData) {
223
275
  var value = toNumber(pieData && pieData.value, 0);
224
- var percent = totalValue > 0 ? Number((value / totalValue * 100).toFixed(2)) : 0;
225
276
  var name = pieData && pieData.name !== undefined ? pieData.name : '';
226
- return {
227
- formatter: function formatter() {
228
- return formatPieTooltipText(name, value, percent);
229
- }
230
- };
277
+ return createPieTooltipOption(function (params) {
278
+ return formatPie3DTooltip(params, _objectSpread2(_objectSpread2({}, pieData), {}, {
279
+ name: name,
280
+ value: value
281
+ }));
282
+ });
231
283
  }
232
284
  function multiplyMat4Vec4(matrix, vector) {
233
285
  return [matrix[0] * vector[0] + matrix[4] * vector[1] + matrix[8] * vector[2] + matrix[12] * vector[3], matrix[1] * vector[0] + matrix[5] * vector[1] + matrix[9] * vector[2] + matrix[13] * vector[3], matrix[2] * vector[0] + matrix[6] * vector[1] + matrix[10] * vector[2] + matrix[14] * vector[3], matrix[3] * vector[0] + matrix[7] * vector[1] + matrix[11] * vector[2] + matrix[15] * vector[3]];
@@ -436,11 +488,9 @@ function createHeightValues(values, mode, minHeight, maxHeight) {
436
488
  }
437
489
  return mapValueToRange(values, safeMinHeight, safeMaxHeight);
438
490
  }
439
- function createAdaptiveViewControl(showLabelLine, maxHeight) {
440
- var baseDistance = showLabelLine ? 175 : 180;
441
- var extraDistance = Math.max(0, maxHeight - 200) * 0.18;
491
+ function createDefaultViewControl() {
442
492
  return {
443
- distance: baseDistance + extraDistance,
493
+ distance: DEFAULT_3D_VIEW_DISTANCE,
444
494
  alpha: DEFAULT_3D_VIEW_ALPHA
445
495
  };
446
496
  }
@@ -577,9 +627,6 @@ function buildPie3DSeries(pieData) {
577
627
  var valueList = renderPieData.map(function (item) {
578
628
  return Math.max(0, toNumber(item.value, 0));
579
629
  });
580
- var totalValue = valueList.reduce(function (sum, value) {
581
- return sum + value;
582
- }, 0);
583
630
  var angleValueList = getAngleValueList(valueList);
584
631
  var totalAngleValue = angleValueList.reduce(function (sum, value) {
585
632
  return sum + value;
@@ -613,7 +660,7 @@ function buildPie3DSeries(pieData) {
613
660
  selected: false,
614
661
  hovered: false
615
662
  },
616
- tooltip: createPie3DTooltip(item, totalValue),
663
+ tooltip: createPie3DTooltip(item),
617
664
  itemStyle: _objectSpread2({}, item.itemStyle),
618
665
  parametricEquation: getParametricEquation(startRatio, endRatio, false, false, geometry)
619
666
  };
@@ -708,7 +755,7 @@ function createPie3DOption(input, variant) {
708
755
  hideZeroValueSlices: input.hideZeroValueSlices !== false
709
756
  };
710
757
  var pie3D = buildPie3DSeries(data, chartConfig);
711
- var viewControl = createAdaptiveViewControl(chartConfig.showLabelLine, safeMaxHeight);
758
+ var viewControl = createDefaultViewControl();
712
759
  return {
713
760
  xAxis3D: {
714
761
  min: -pie3D.axisLimit,
@@ -895,10 +942,9 @@ function buildPieOption() {
895
942
  });
896
943
  var baseOption = {
897
944
  color: DEFAULT_COLORS,
898
- tooltip: {
899
- trigger: 'item',
900
- formatter: '{b}: {c} ({d}%)'
901
- },
945
+ tooltip: _objectSpread2({
946
+ trigger: 'item'
947
+ }, createPieTooltipOption(formatPie2DTooltip)),
902
948
  legend: {
903
949
  data: normalizedData.map(function (item) {
904
950
  return item.name;
@@ -927,33 +973,26 @@ function buildPieOption() {
927
973
  return mergeChartOption(mergeChartOption(baseOption, presetOption, variantOption), customOption);
928
974
  }
929
975
 
930
- var runtimePromise = null;
931
- var ECHARTS_GL_PACKAGE_NAME = 'echarts-gl';
932
- var MISSING_RUNTIME_MESSAGE = '使用 PieChart 3D 能力需要安装 echarts-gl,请执行 npm install echarts-gl。';
933
- var createMissingRuntimeError = function createMissingRuntimeError(error) {
934
- var runtimeError = new Error(MISSING_RUNTIME_MESSAGE);
935
- runtimeError.cause = error;
936
- return runtimeError;
937
- };
938
- var importRuntime = function importRuntime() {
939
- var dynamicImport = new Function('packageName', 'return import(packageName)');
940
- return dynamicImport(ECHARTS_GL_PACKAGE_NAME);
976
+ var SURFACE_SERIES_TYPE = 'series.surface';
977
+ var MISSING_RUNTIME_MESSAGE = "使用 PieChart 3D 能力前,请先在业务页面中执行 import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'。";
978
+ var hasSurfaceSeriesRuntime = function hasSurfaceSeriesRuntime() {
979
+ return SeriesModel && (typeof SeriesModel.getClass === 'function' && !!SeriesModel.getClass('series', 'surface') || typeof SeriesModel.getClassesByMainType === 'function' && SeriesModel.getClassesByMainType('series').some(function (seriesClass) {
980
+ return seriesClass && seriesClass.type === SURFACE_SERIES_TYPE;
981
+ }));
941
982
  };
942
983
 
943
984
  /**
944
- * 按需加载 echarts-gl 运行时。
985
+ * 检测 PieChart 3D 运行时是否已经由业务项目接入。
945
986
  *
946
- * 这里不能在模块顶层静态加载 echarts-gl,否则只使用 2D 饼图的业务方也会被迫安装。
947
- * 加载结果会被缓存,避免同一个页面内多个 3D 饼图重复触发运行时加载。
987
+ * 方案 B 修订版下,组件库不再负责动态加载 `echarts-gl`,
988
+ * 而是要求业务项目在使用 3D PieChart 的页面中显式执行桥接入口:
989
+ * `import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'`
948
990
  */
949
991
  function ensureEchartsGlRuntime() {
950
- if (!runtimePromise) {
951
- runtimePromise = importRuntime()["catch"](function (error) {
952
- runtimePromise = null;
953
- throw createMissingRuntimeError(error);
954
- });
992
+ if (hasSurfaceSeriesRuntime()) {
993
+ return Promise.resolve();
955
994
  }
956
- return runtimePromise;
995
+ return Promise.reject(new Error(MISSING_RUNTIME_MESSAGE));
957
996
  }
958
997
 
959
998
  echarts.use([PieChart$1, TooltipComponent, LegendComponent, GridComponent, TitleComponent, GraphicComponent, CanvasRenderer]);
@@ -1028,7 +1067,7 @@ var script = {
1028
1067
  */
1029
1068
  minHeight: {
1030
1069
  type: Number,
1031
- "default": 20
1070
+ "default": 10
1032
1071
  },
1033
1072
  /**
1034
1073
  * 3D 模式下的最大扇区高度。
@@ -1036,7 +1075,7 @@ var script = {
1036
1075
  */
1037
1076
  maxHeight: {
1038
1077
  type: Number,
1039
- "default": 80
1078
+ "default": 25
1040
1079
  },
1041
1080
  /**
1042
1081
  * 环图内径比例。
@@ -1139,13 +1178,13 @@ var script = {
1139
1178
  },
1140
1179
  /**
1141
1180
  * 判断当前是否进入 3D 饼图能力。
1142
- * 只有 3D 才需要加载 echarts-gl2D 场景不应触发任何 3D 运行时依赖。
1181
+ * 只有 3D 才需要 echarts-gl 桥接入口,2D 场景不应触发任何 3D 运行时依赖。
1143
1182
  */
1144
1183
  is3D: function is3D() {
1145
1184
  return this.dimension === '3d';
1146
1185
  },
1147
1186
  /**
1148
- * 标识 echarts-gl 是否已经加载完成。
1187
+ * 标识 echarts-gl 运行时是否已经注册完成。
1149
1188
  * 3D option 只有在运行时就绪后才会生成 surface 序列。
1150
1189
  */
1151
1190
  isEchartsGlReady: function isEchartsGlReady() {
@@ -1153,14 +1192,14 @@ var script = {
1153
1192
  },
1154
1193
  /**
1155
1194
  * 汇总外部 loading 与 3D 运行时加载状态。
1156
- * 这样 3D 首次加载 echarts-gl 时,底层 BaseChart 能保持 loading 态。
1195
+ * 这样 3D 首次检测运行时期间,底层 BaseChart 能保持 loading 态。
1157
1196
  */
1158
1197
  chartLoading: function chartLoading() {
1159
1198
  return this.loading || this.is3D && this.echartsGlStatus === 'loading';
1160
1199
  },
1161
1200
  /**
1162
1201
  * 汇总数据空态与 3D 运行时失败状态。
1163
- * 缺少 echarts-gl 时不让 BaseChart 继续渲染空 surface option。
1202
+ * 缺少 3D 桥接运行时时不让 BaseChart 继续渲染空 surface option。
1164
1203
  */
1165
1204
  chartEmpty: function chartEmpty() {
1166
1205
  return this.isEmpty || this.is3D && this.echartsGlStatus === 'failed';
@@ -1176,7 +1215,7 @@ var script = {
1176
1215
  if (this.is3D && this.echartsGlStatus === 'failed') {
1177
1216
  return {
1178
1217
  empty: _objectSpread2(_objectSpread2({}, emptyConfig), {}, {
1179
- text: this.echartsGlErrorMessage || '使用 3D 饼图需要安装 echarts-gl'
1218
+ text: this.echartsGlErrorMessage || "使用 PieChart 3D 能力前,请先在业务页面中执行 import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'。"
1180
1219
  }),
1181
1220
  loading: _objectSpread2({}, loadingConfig)
1182
1221
  };
@@ -1216,7 +1255,7 @@ var script = {
1216
1255
  watch: {
1217
1256
  /**
1218
1257
  * dimension 是 2D/3D 分发的公开开关。
1219
- * 只有切到 3D 时才按需加载 echarts-gl,避免 2D 使用方被迫安装 3D 运行时。
1258
+ * 只有切到 3D 时才检测 3D 运行时,避免 2D 使用方被迫安装 3D 运行时。
1220
1259
  */
1221
1260
  dimension: {
1222
1261
  immediate: true,
@@ -1248,7 +1287,7 @@ var script = {
1248
1287
  this.$emit('ready', chart);
1249
1288
  },
1250
1289
  /**
1251
- * 在真正进入 3D 能力时按需加载 echarts-gl
1290
+ * 在真正进入 3D 能力时检测 echarts-gl 桥接入口是否已经注册。
1252
1291
  *
1253
1292
  * 返回 Promise 是为了让单测和后续业务扩展能准确等待状态变化;
1254
1293
  * 2D、已就绪、加载中三种场景会直接返回 resolved Promise。
@@ -1264,7 +1303,7 @@ var script = {
1264
1303
  _this.echartsGlStatus = 'ready';
1265
1304
  })["catch"](function (error) {
1266
1305
  _this.echartsGlStatus = 'failed';
1267
- _this.echartsGlErrorMessage = error && error.message ? error.message : '使用 3D 饼图需要安装 echarts-gl';
1306
+ _this.echartsGlErrorMessage = error && error.message ? error.message : "使用 PieChart 3D 能力前,请先在业务页面中执行 import '@xq-labs/data-ui-v2/pie-chart/3d-runtime'。";
1268
1307
  _this.$emit('runtime-error', error);
1269
1308
  });
1270
1309
  },
@@ -1302,7 +1341,7 @@ var script = {
1302
1341
  }
1303
1342
  };
1304
1343
 
1305
- var css_248z = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
1344
+ var css_248z = "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
1306
1345
  styleInject(css_248z);
1307
1346
 
1308
1347
  /* script */
@@ -1334,7 +1373,7 @@ __vue_render__._withStripped = true;
1334
1373
  /* style */
1335
1374
  var __vue_inject_styles__ = undefined;
1336
1375
  /* scoped */
1337
- var __vue_scope_id__ = "data-v-19bfc774";
1376
+ var __vue_scope_id__ = "data-v-7f129cbd";
1338
1377
  /* module identifier */
1339
1378
  var __vue_module_identifier__ = undefined;
1340
1379
  /* functional template */