UNPKG

5.39 kBJavaScriptView Raw
1import { __assign } from "tslib";
2import { deepMix, isString, each, get, isFunction } from '@antv/util';
3import { DIRECTION } from '../constant';
4import { getMappingValue } from './attr';
5import { omit } from './helper';
6import { MarkerSymbols } from './marker';
7/** 线条形 marker symbol */
8var STROKES_SYMBOLS = ['line', 'cross', 'tick', 'plus', 'hyphen'];
9/**
10 * 处理用户配置的 marker style
11 * @param markerStyle
12 * @param userMarker.style
13 * @returns {ShapeAttrs} newStyle
14 */
15function handleUserMarkerStyle(markerStyle, style) {
16 if (isFunction(style)) {
17 return style(markerStyle);
18 }
19 return deepMix({}, markerStyle, style);
20}
21/**
22 * 根据 marker 是否为线条形 symbol, 来调整下样式
23 * @param symbol
24 * @param style
25 * @param color
26 */
27function adpatorMarkerStyle(marker, color) {
28 var symbol = marker.symbol;
29 if (isString(symbol) && STROKES_SYMBOLS.indexOf(symbol) !== -1) {
30 var markerStyle = get(marker, 'style', {});
31 var lineWidth = get(markerStyle, 'lineWidth', 1);
32 var stroke = markerStyle.stroke || markerStyle.fill || color;
33 marker.style = deepMix({}, marker.style, { lineWidth: lineWidth, stroke: stroke, fill: null });
34 }
35}
36/**
37 * 设置 marker 的 symbol,将 字符串的 symbol 转换为真正的绘制命令
38 * @param marker
39 */
40function setMarkerSymbol(marker) {
41 var symbol = marker.symbol;
42 if (isString(symbol) && MarkerSymbols[symbol]) {
43 marker.symbol = MarkerSymbols[symbol];
44 }
45}
46/**
47 * @ignore
48 * get the legend layout from direction
49 * @param direction
50 * @returns layout 'horizontal' | 'vertical'
51 */
52export function getLegendLayout(direction) {
53 return direction.startsWith(DIRECTION.LEFT) || direction.startsWith(DIRECTION.RIGHT) ? 'vertical' : 'horizontal';
54}
55/**
56 * @ignore
57 * get the legend items
58 * @param view
59 * @param geometry
60 * @param attr
61 * @param themeMarker
62 * @param markerCfg
63 * @returns legend items
64 */
65export function getLegendItems(view, geometry, attr, themeMarker, userMarker) {
66 var scale = attr.getScale(attr.type);
67 if (scale.isCategory) {
68 var field_1 = scale.field;
69 var colorAttr_1 = geometry.getAttribute('color');
70 var shapeAttr_1 = geometry.getAttribute('shape');
71 var defaultColor_1 = view.getTheme().defaultColor;
72 var isInPolar_1 = geometry.coordinate.isPolar;
73 return scale.getTicks().map(function (tick, index) {
74 var _a;
75 var text = tick.text, scaleValue = tick.value;
76 var name = text;
77 var value = scale.invert(scaleValue);
78 // 通过过滤图例项的数据,来看是否 unchecked
79 var unchecked = view.filterFieldData(field_1, [(_a = {}, _a[field_1] = value, _a)]).length === 0;
80 each(view.views, function (subView) {
81 var _a;
82 if (!subView.filterFieldData(field_1, [(_a = {}, _a[field_1] = value, _a)]).length) {
83 unchecked = true;
84 }
85 });
86 // @ts-ignore
87 var color = getMappingValue(colorAttr_1, value, defaultColor_1);
88 var shape = getMappingValue(shapeAttr_1, value, 'point');
89 var marker = geometry.getShapeMarker(shape, {
90 color: color,
91 isInPolar: isInPolar_1,
92 });
93 var markerCfg = userMarker;
94 if (isFunction(markerCfg)) {
95 markerCfg = markerCfg(name, index, __assign({ name: name, value: value }, deepMix({}, themeMarker, marker)));
96 }
97 // the marker configure order should be ensure
98 marker = deepMix({}, themeMarker, marker, omit(__assign({}, markerCfg), ['style']));
99 adpatorMarkerStyle(marker, color);
100 if (markerCfg && markerCfg.style) {
101 // handle user's style settings
102 marker.style = handleUserMarkerStyle(marker.style, markerCfg.style);
103 }
104 setMarkerSymbol(marker);
105 return { id: value, name: name, value: value, marker: marker, unchecked: unchecked };
106 });
107 }
108 return [];
109}
110/**
111 *
112 * @ignore
113 * custom legend 的 items 获取
114 * @param themeMarker
115 * @param userMarker
116 * @param customItems
117 */
118export function getCustomLegendItems(themeMarker, userMarker, customItems) {
119 // 如果有自定义的 item,那么就直接使用,并合并主题的 marker 配置
120 return customItems.map(function (item, index) {
121 var markerCfg = userMarker;
122 if (isFunction(markerCfg)) {
123 markerCfg = markerCfg(item.name, index, deepMix({}, themeMarker, item));
124 }
125 var itemMarker = isFunction(item.marker)
126 ? item.marker(item.name, index, deepMix({}, themeMarker, item))
127 : item.marker;
128 var marker = deepMix({}, themeMarker, markerCfg, itemMarker);
129 setMarkerSymbol(marker);
130 item.marker = marker;
131 return item;
132 });
133}
134/**
135 * get the legend cfg from theme, will mix the common cfg of legend theme
136 *
137 * @param theme view theme object
138 * @param direction legend direction
139 * @returns legend theme cfg
140 */
141export function getLegendThemeCfg(theme, direction) {
142 var legendTheme = get(theme, ['components', 'legend'], {});
143 return deepMix({}, get(legendTheme, ['common'], {}), deepMix({}, get(legendTheme, [direction], {})));
144}
145//# sourceMappingURL=legend.js.map
\No newline at end of file