victory-chart
Version:
Chart Component for Victory
168 lines (144 loc) • 6.38 kB
JavaScript
Object.defineProperty(exports,"__esModule",{value:true});var _defaults2=require("lodash/defaults");var _defaults3=_interopRequireDefault(_defaults2);var _omit2=require("lodash/omit");var _omit3=_interopRequireDefault(_omit2);var _pick2=require("lodash/pick");var _pick3=_interopRequireDefault(_pick2);var _assign2=require("lodash/assign");var _assign3=_interopRequireDefault(_assign2);
var _victoryCore=require("victory-core");function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _toConsumableArray(arr){if(Array.isArray(arr)){for(var i=0,arr2=Array(arr.length);i<arr.length;i++){arr2[i]=arr[i];}return arr2;}else{return Array.from(arr);}}exports.default=
{
getBaseProps:function getBaseProps(props,fallbackProps){
props=_victoryCore.Helpers.modifyProps(props,fallbackProps,"candlestick");
var calculatedValues=this.getCalculatedValues(props);var
data=calculatedValues.data,style=calculatedValues.style,scale=calculatedValues.scale;var _props=
props,groupComponent=_props.groupComponent,width=_props.width,height=_props.height,padding=_props.padding;
var childProps={parent:{scale:scale,width:width,height:height,data:data,style:style.parent}};
for(var index=0,len=data.length;index<len;index++){
var datum=data[index];
var eventKey=datum.eventKey||index;
var x=scale.x(datum.x1||datum.x);
var y1=scale.y(datum.high);
var y2=scale.y(datum.low);
var candleHeight=Math.abs(scale.y(datum.open)-scale.y(datum.close));
var y=scale.y(Math.max(datum.open,datum.close));
var dataStyle=this.getDataStyles(datum,style.data,props);
var dataProps={
x:x,y:y,y1:y1,y2:y2,candleHeight:candleHeight,scale:scale,data:data,datum:datum,groupComponent:groupComponent,
index:index,style:dataStyle,padding:padding,width:width};
childProps[eventKey]={
data:dataProps};
var text=this.getLabelText(props,datum,index);
if(text!==undefined&&text!==null||props.events||props.sharedEvents){
childProps[eventKey].labels=this.getLabelProps(dataProps,text,style);
}
}
return childProps;
},
getLabelProps:function getLabelProps(dataProps,text,calculatedStyle){var
x=dataProps.x,y1=dataProps.y1,index=dataProps.index,scale=dataProps.scale,datum=dataProps.datum,data=dataProps.data;
var labelStyle=this.getLabelStyle(calculatedStyle.labels,dataProps)||{};
return{
style:labelStyle,
y:y1-(labelStyle.padding||0),
x:x,
text:text,
index:index,
scale:scale,
datum:datum,
data:data,
textAnchor:labelStyle.textAnchor,
verticalAnchor:labelStyle.verticalAnchor||"end",
angle:labelStyle.angle};
},
getCalculatedValues:function getCalculatedValues(props){var
theme=props.theme;
var defaultStyle=theme&&theme.candlestick&&theme.candlestick.style?
theme.candlestick.style:{};
var style=_victoryCore.Helpers.getStyles(props.style,defaultStyle,"auto","100%");
var data=_victoryCore.Data.addEventKeys(props,this.getData(props));
var range={
x:_victoryCore.Helpers.getRange(props,"x"),
y:_victoryCore.Helpers.getRange(props,"y")};
var domain={
x:this.getDomain(props,"x"),
y:this.getDomain(props,"y")};
var scale={
x:_victoryCore.Scale.getBaseScale(props,"x").domain(domain.x).range(range.x),
y:_victoryCore.Scale.getBaseScale(props,"y").domain(domain.y).range(range.y)};
return{data:data,scale:scale,style:style};
},
getData:function getData(props){
if(!props.data||props.data.length<1){
_victoryCore.Log.warn("This is an empty dataset.");
return[];
}
var stringMap={
x:_victoryCore.Data.createStringMap(props,"x")};
var accessor={
x:_victoryCore.Helpers.createAccessor(props.x!==undefined?props.x:"x"),
open:_victoryCore.Helpers.createAccessor(props.open!==undefined?props.open:"open"),
close:_victoryCore.Helpers.createAccessor(props.close!==undefined?props.close:"close"),
high:_victoryCore.Helpers.createAccessor(props.high!==undefined?props.high:"high"),
low:_victoryCore.Helpers.createAccessor(props.low!==undefined?props.low:"low")};
return props.data.map(function(datum,index){
var evaluatedX=accessor.x(datum);
var x=evaluatedX!==undefined?evaluatedX:index;
var open=accessor.open(datum);
var close=accessor.close(datum);
var high=accessor.high(datum);
var low=accessor.low(datum);
var y=[open,close,high,low];
return(0,_assign3.default)(
{},
datum,
{x:x,y:y,open:open,close:close,high:high,low:low},
typeof x==="string"?{x:stringMap.x[x],xName:x}:{});
});
},
getDomain:function getDomain(props,axis){
var domain=void 0;
if(props.domain&&props.domain[axis]){
domain=props.domain[axis];
}else if(props.domain&&Array.isArray(props.domain)){
domain=props.domain;
}else{
var dataset=this.getData(props);
var allData=dataset.reduce(function(memo,datum){
return Array.isArray(datum[axis])?
memo.concat.apply(memo,_toConsumableArray(datum[axis])):memo.concat(datum[axis]);
},
[]);
if(allData.length<1){
return _victoryCore.Scale.getBaseScale(props,axis).domain();
}
var min=Math.min.apply(Math,_toConsumableArray(allData));
var max=Math.max.apply(Math,_toConsumableArray(allData));
if(min===max){
var adjustedMax=max===0?1:max+max;
return[0,adjustedMax];
}
domain=[min,max];
}
return _victoryCore.Domain.cleanDomain(_victoryCore.Domain.padDomain(domain,props,axis),props);
},
isTransparent:function isTransparent(attr){
return attr==="none"||attr==="transparent";
},
getDataStyles:function getDataStyles(datum,style,props){
style=style||{};
var stylesFromData=(0,_omit3.default)(datum,[
"x","y","size","name","label","open","close","high","low"]);
var candleColor=datum.open>datum.close?
props.candleColors.negative:props.candleColors.positive;
var fill=datum.fill||style.fill||candleColor;
var strokeColor=datum.stroke||style.stroke;
var stroke=this.isTransparent(strokeColor)?fill:strokeColor||"black";
var baseDataStyle=(0,_defaults3.default)({},stylesFromData,{stroke:stroke,fill:fill},style);
return _victoryCore.Helpers.evaluateStyle(baseDataStyle,datum);
},
getLabelText:function getLabelText(props,datum,index){
return datum.label||(Array.isArray(props.labels)?
props.labels[index]:_victoryCore.Helpers.evaluateProp(props.labels,datum));
},
getLabelStyle:function getLabelStyle(labelStyle,dataProps){
labelStyle=labelStyle||{};var
datum=dataProps.datum,size=dataProps.size,style=dataProps.style;
var matchedStyle=(0,_pick3.default)(style,["opacity","fill"]);
var padding=labelStyle.padding||size*0.25;
var baseLabelStyle=(0,_defaults3.default)({},labelStyle,matchedStyle,{padding:padding});
return _victoryCore.Helpers.evaluateStyle(baseLabelStyle,datum);
}};