/** * Created by mm28969 on 11/8/16. * Modified by mm17060 6/13/17. */ import * as d3 from "d3"; import {Theme, convertValueToAttribute} from "../mmviz-common/index"; import {createDatumLayout, createViewModel, Layout} from "./layout"; import {LayoutScale} from "./scale"; import {ScaleTypeEnum} from "./scale_container"; export function areaLayoutCreator(colorScaleKey = "color") { // layout extender return function(dataModel, layoutScale: LayoutScale) { let xDomain = d3.extent(dataModel.dataArray, dataModel.xValueMap), yDomain = d3.extent(dataModel.dataArray, dataModel.yValueMap), theme: Theme = Theme.getInstance(); layoutScale.extendDomainX(xDomain).extendDomainY(yDomain); // layouter return function(){ let x, y, d, dLayout, color, y0, width, dModel, dModelMap: any = {}, scaleContainer, viewModel: any = createViewModel(), theme: Theme = Theme.getInstance(); y0 = layoutScale.yScale(layoutScale.yDomain[0]); for (d of dataModel.dataArray) { dLayout = createDatumLayout(dataModel, d); x = dataModel.xValueMap(d); y = dataModel.yValueMap(d); dLayout.valueX = x; dLayout.valueY = y; dLayout.x = layoutScale.xScale(x); scaleContainer = layoutScale.getScaleContainer("x"); if(scaleContainer.type === ScaleTypeEnum.BAND){ width = layoutScale.xScale.bandwidth(); dLayout.x = dLayout.x + (width * 0.5); } dLayout.y = layoutScale.yScale(y); dLayout.y0 = y0; color = layoutScale.mapValue(colorScaleKey, dataModel, d); dModel = dModelMap[color.key]; if (!dModel) { dModel = { key: color.key, category: color.key, categoryAttr: "category-" + convertValueToAttribute(color.key), color: color, dataArray: [] }; dModelMap[color.key] = dModel; viewModel.dataArray.push(dModel); } if(dataModel.detailsMap){ dLayout.details = dataModel.detailsMap(d); } dModel.dataArray.push(dLayout); } return viewModel; } } }