/** * Created by mm28969 on 11/7/16. */ // declare let d3; import * as d3 from "d3"; import {convertValueToAttribute} from "../mmviz-common/index"; import {createViewModel} from "./layout"; import {LayoutScale} from "./scale"; import {ScaleTypeEnum} from "./scale_container"; export function lineLayoutCreator(colorScaleKey = "color"){ //layout extender return function(dataModel, layoutScale: LayoutScale){ let xDomain, yDomain = d3.extent(dataModel.dataArray, dataModel.yValueMap), scaleContainer = layoutScale.getScaleContainer("x") ; if(scaleContainer.type === ScaleTypeEnum.BAND){ xDomain = d3.map(dataModel.dataArray, dataModel.xValueMap).keys(); } else { xDomain = d3.extent(dataModel.dataArray, dataModel.xValueMap) } layoutScale.extendDomainX(xDomain).extendDomainY(yDomain); //utility function to layout datum function layoutDatum(d){ let x, y, dLayout: any={}, width; x = dataModel.xValueMap(d); y = dataModel.yValueMap(d); dLayout.valueX = x; dLayout.valueY = y; dLayout.key = dataModel.keyMap(d); dLayout.data = d; dLayout.x = layoutScale.xScale(x); if(scaleContainer.type === ScaleTypeEnum.BAND){ width = layoutScale.xScale.bandwidth(); dLayout.x = dLayout.x + (width * 0.5); } dLayout.y = layoutScale.yScale(y); return dLayout; } //view layouter return function(){ let d, dLayout, color, dModel, dModelMap: any = {}, scaleContainer, viewModel: any = createViewModel(), lineWidth = layoutScale.lineWidth; viewModel.y0 = d3.min(layoutScale.yScale.range()); for (d of dataModel.dataArray) { dLayout = layoutDatum(d); //TODO: to keep it consistent, the color mapping should happen under layoutDatum() color = layoutScale.mapValue(colorScaleKey, dataModel, d); dLayout.color = color; dModel = dModelMap[color.key]; if (!dModel) { dModel = { key: color.key, category: color.key, categoryAttr: "category-" + convertValueToAttribute(color.key), color: color, lineWidth: lineWidth, dataArray: [] }; dModelMap[color.key] = dModel; viewModel.dataArray.push(dModel); } if(dataModel.detailsMap){ dLayout.details = dataModel.detailsMap(d); } dModel.dataArray.push(dLayout); } return viewModel; } } }