(ecModel: GlobalModel, api: ExtensionAPI)
| 250 | export const funnelLayoutStageHandler = createSimpleOverallStageHandler(SERIES_TYPE_FUNNEL, funnelLayout); |
| 251 | |
| 252 | function funnelLayout(ecModel: GlobalModel, api: ExtensionAPI) { |
| 253 | ecModel.eachSeriesByType(SERIES_TYPE_FUNNEL, function (seriesModel: FunnelSeriesModel) { |
| 254 | const data = seriesModel.getData(); |
| 255 | const valueDim = data.mapDimension('value'); |
| 256 | const sort = seriesModel.get('sort'); |
| 257 | |
| 258 | const layoutRef = layout.createBoxLayoutReference(seriesModel, api); |
| 259 | const viewRect = layout.getLayoutRect(seriesModel.getBoxLayoutParams(), layoutRef.refContainer); |
| 260 | |
| 261 | const isHorizontal = isOrientHorizontal(seriesModel); |
| 262 | const viewWidth = viewRect.width; |
| 263 | const viewHeight = viewRect.height; |
| 264 | let indices = getSortedIndices(data, sort); |
| 265 | let x = viewRect.x; |
| 266 | let y = viewRect.y; |
| 267 | |
| 268 | const sizeExtent = isHorizontal ? [ |
| 269 | parsePercent(seriesModel.get('minSize'), viewHeight), |
| 270 | parsePercent(seriesModel.get('maxSize'), viewHeight) |
| 271 | ] : [ |
| 272 | parsePercent(seriesModel.get('minSize'), viewWidth), |
| 273 | parsePercent(seriesModel.get('maxSize'), viewWidth) |
| 274 | ]; |
| 275 | const dataExtent = data.getDataExtent(valueDim); |
| 276 | let min = seriesModel.get('min'); |
| 277 | let max = seriesModel.get('max'); |
| 278 | if (min == null) { |
| 279 | min = Math.min(dataExtent[0], 0); |
| 280 | } |
| 281 | if (max == null) { |
| 282 | max = dataExtent[1]; |
| 283 | } |
| 284 | |
| 285 | const funnelAlign = seriesModel.get('funnelAlign'); |
| 286 | let gap = seriesModel.get('gap'); |
| 287 | const viewSize = isHorizontal ? viewWidth : viewHeight; |
| 288 | let itemSize = (viewSize - gap * (data.count() - 1)) / data.count(); |
| 289 | |
| 290 | const getLinePoints = function (idx: number, offset: number) { |
| 291 | // End point index is data.count() and we assign it 0 |
| 292 | if (isHorizontal) { |
| 293 | const val = data.get(valueDim, idx) as number || 0; |
| 294 | const itemHeight = linearMap(val, [min, max], sizeExtent, true); |
| 295 | let y0; |
| 296 | switch (funnelAlign) { |
| 297 | case 'top': |
| 298 | y0 = y; |
| 299 | break; |
| 300 | case 'center': |
| 301 | y0 = y + (viewHeight - itemHeight) / 2; |
| 302 | break; |
| 303 | case 'bottom': |
| 304 | y0 = y + (viewHeight - itemHeight); |
| 305 | break; |
| 306 | } |
| 307 | |
| 308 | return [ |
| 309 | [offset, y0], |
nothing calls this directly
no test coverage detected
searching dependent graphs…