|
1 | 1 | import { Types } from '@antv/g2';
|
2 |
| -import { isArray } from '@antv/util'; |
| 2 | +import { isArray, isNumber, get, map } from '@antv/util'; |
3 | 3 | import { flow, deepAssign } from '../../../utils';
|
4 | 4 | import { Params } from '../../../core/adaptor';
|
5 | 5 | import { Datum, Data } from '../../../types/common';
|
@@ -114,52 +114,61 @@ function geometry(params: Params<FunnelOptions>): Params<FunnelOptions> {
|
114 | 114 | return params;
|
115 | 115 | }
|
116 | 116 |
|
| 117 | +export function compareConversionTag(params: Params<FunnelOptions>) { |
| 118 | + // @ts-ignore |
| 119 | + const { chart, index, options } = params; |
| 120 | + const { conversionTag, isTransposed } = options; |
| 121 | + (isNumber(index) ? [chart] : chart.views).forEach((view, viewIndex) => { |
| 122 | + // 获取形状位置,再转化为需要的转化率位置 |
| 123 | + const dataArray = get(view, ['geometries', '0', 'dataArray'], []); |
| 124 | + const size = get(view, ['options', 'data', 'length']); |
| 125 | + const x = map(dataArray, (item) => get(item, ['0', 'nextPoints', '0', 'x']) * size - 0.5); |
| 126 | + |
| 127 | + const getLineCoordinate = ( |
| 128 | + datum: Datum, |
| 129 | + datumIndex: number, |
| 130 | + data: Data, |
| 131 | + initLineOption: Record<string, any> |
| 132 | + ): Types.LineOption => { |
| 133 | + const ratio = (index || viewIndex) === 0 ? -1 : 1; |
| 134 | + return deepAssign({}, initLineOption, { |
| 135 | + start: [x[datumIndex - 1] || datumIndex - 0.5, datum[FUNNEL_MAPPING_VALUE]], |
| 136 | + end: [x[datumIndex - 1] || datumIndex - 0.5, datum[FUNNEL_MAPPING_VALUE] + 0.05], |
| 137 | + text: isTransposed |
| 138 | + ? { |
| 139 | + style: { |
| 140 | + textAlign: 'start', |
| 141 | + }, |
| 142 | + } |
| 143 | + : { |
| 144 | + offsetX: conversionTag !== false ? ratio * conversionTag.offsetX : 0, |
| 145 | + style: { |
| 146 | + textAlign: (index || viewIndex) === 0 ? 'end' : 'start', |
| 147 | + }, |
| 148 | + }, |
| 149 | + }); |
| 150 | + }; |
| 151 | + |
| 152 | + conversionTagComponent(getLineCoordinate)( |
| 153 | + deepAssign( |
| 154 | + {}, |
| 155 | + { |
| 156 | + chart: view, |
| 157 | + options, |
| 158 | + } |
| 159 | + ) |
| 160 | + ); |
| 161 | + }); |
| 162 | +} |
| 163 | + |
117 | 164 | /**
|
118 | 165 | * 转化率组件
|
119 | 166 | * @param params
|
120 | 167 | */
|
121 | 168 | function conversionTag(params: Params<FunnelOptions>): Params<FunnelOptions> {
|
122 |
| - const { chart, options } = params; |
123 |
| - const { conversionTag, isTransposed } = options; |
| 169 | + const { chart } = params; |
124 | 170 | // @ts-ignore
|
125 |
| - chart.once('beforepaint', () => { |
126 |
| - chart.views.forEach((view, viewIndex) => { |
127 |
| - const getLineCoordinate = ( |
128 |
| - datum: Datum, |
129 |
| - datumIndex: number, |
130 |
| - data: Data, |
131 |
| - initLineOption: Record<string, any> |
132 |
| - ): Types.LineOption => { |
133 |
| - const ratio = viewIndex === 0 ? -1 : 1; |
134 |
| - return deepAssign({}, initLineOption, { |
135 |
| - start: [datumIndex - 0.5, datum[FUNNEL_MAPPING_VALUE]], |
136 |
| - end: [datumIndex - 0.5, datum[FUNNEL_MAPPING_VALUE] + 0.05], |
137 |
| - text: isTransposed |
138 |
| - ? { |
139 |
| - style: { |
140 |
| - textAlign: 'start', |
141 |
| - }, |
142 |
| - } |
143 |
| - : { |
144 |
| - offsetX: conversionTag !== false ? ratio * conversionTag.offsetX : 0, |
145 |
| - style: { |
146 |
| - textAlign: viewIndex === 0 ? 'end' : 'start', |
147 |
| - }, |
148 |
| - }, |
149 |
| - }); |
150 |
| - }; |
151 |
| - |
152 |
| - conversionTagComponent(getLineCoordinate)( |
153 |
| - deepAssign( |
154 |
| - {}, |
155 |
| - { |
156 |
| - chart: view, |
157 |
| - options, |
158 |
| - } |
159 |
| - ) |
160 |
| - ); |
161 |
| - }); |
162 |
| - }); |
| 171 | + chart.once('beforepaint', () => compareConversionTag(params)); |
163 | 172 | return params;
|
164 | 173 | }
|
165 | 174 |
|
|
0 commit comments