ct-react-stockcharts
Version:
Highly customizable stock charts with ReactJS and d3
156 lines (118 loc) • 6.77 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
exports.default = function (_ref2) {
var xScale = _ref2.xScale,
useWholeData = _ref2.useWholeData,
clamp = _ref2.clamp,
pointsPerPxThreshold = _ref2.pointsPerPxThreshold,
minPointsPerPxThreshold = _ref2.minPointsPerPxThreshold,
flipXScale = _ref2.flipXScale;
return extentsWrapper(useWholeData || (0, _utils.isNotDefined)(xScale.invert), clamp, pointsPerPxThreshold, minPointsPerPxThreshold, flipXScale);
};
var _utils = require("../utils");
var log = (0, _utils.getLogger)("evaluator");
function getNewEnd(fallbackEnd, xAccessor, initialXScale, start) {
var lastItem = fallbackEnd.lastItem,
lastItemX = fallbackEnd.lastItemX;
var lastItemXValue = xAccessor(lastItem);
var _initialXScale$range = initialXScale.range(),
_initialXScale$range2 = _slicedToArray(_initialXScale$range, 2),
rangeStart = _initialXScale$range2[0],
rangeEnd = _initialXScale$range2[1];
var newEnd = (rangeEnd - rangeStart) / (lastItemX - rangeStart) * (lastItemXValue - start) + start;
return newEnd;
}
function extentsWrapper(useWholeData, clamp, pointsPerPxThreshold, minPointsPerPxThreshold, flipXScale) {
function filterData(data, inputDomain, xAccessor, initialXScale) {
var _ref = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {},
currentPlotData = _ref.currentPlotData,
currentDomain = _ref.currentDomain,
fallbackStart = _ref.fallbackStart,
fallbackEnd = _ref.fallbackEnd;
if (useWholeData) {
return { plotData: data, domain: inputDomain };
}
var left = (0, _utils.head)(inputDomain);
var right = (0, _utils.last)(inputDomain);
var clampedDomain = inputDomain;
var filteredData = getFilteredResponse(data, left, right, xAccessor);
if (filteredData.length === 1 && (0, _utils.isDefined)(fallbackStart)) {
left = fallbackStart;
right = getNewEnd(fallbackEnd, xAccessor, initialXScale, left);
clampedDomain = [left, right];
filteredData = getFilteredResponse(data, left, right, xAccessor);
}
if (typeof clamp === "function") {
clampedDomain = clamp(clampedDomain, [xAccessor((0, _utils.head)(data)), xAccessor((0, _utils.last)(data))]);
} else {
if (clamp === "left" || clamp === "both" || clamp === true) {
clampedDomain = [Math.max(left, xAccessor((0, _utils.head)(data))), clampedDomain[1]];
}
if (clamp === "right" || clamp === "both" || clamp === true) {
clampedDomain = [clampedDomain[0], Math.min(right, xAccessor((0, _utils.last)(data)))];
}
}
if (clampedDomain !== inputDomain) {
filteredData = getFilteredResponse(data, clampedDomain[0], clampedDomain[1], xAccessor);
}
var realInputDomain = clampedDomain;
// [xAccessor(head(filteredData)), xAccessor(last(filteredData))];
var xScale = initialXScale.copy().domain(realInputDomain);
var width = Math.floor(xScale(xAccessor((0, _utils.last)(filteredData))) - xScale(xAccessor((0, _utils.head)(filteredData))));
// prevent negative width when flipXScale
if (flipXScale && width < 0) {
width = width * -1;
}
var plotData = void 0,
domain = void 0;
var chartWidth = (0, _utils.last)(xScale.range()) - (0, _utils.head)(xScale.range());
log("Trying to show " + filteredData.length + " points in " + width + "px," + (" I can show up to " + (showMaxThreshold(width, pointsPerPxThreshold) - 1) + " points in that width. ") + ("Also FYI the entire chart width is " + chartWidth + "px and pointsPerPxThreshold is " + pointsPerPxThreshold));
if (canShowTheseManyPeriods(width, filteredData.length, pointsPerPxThreshold, minPointsPerPxThreshold)) {
plotData = filteredData;
domain = realInputDomain;
log("AND IT WORKED");
} else {
if (chartWidth > showMaxThreshold(width, pointsPerPxThreshold) && (0, _utils.isDefined)(fallbackEnd)) {
plotData = filteredData;
var newEnd = getNewEnd(fallbackEnd, xAccessor, initialXScale, (0, _utils.head)(realInputDomain));
domain = [(0, _utils.head)(realInputDomain), newEnd];
// plotData = currentPlotData || filteredData.slice(filteredData.length - showMax(width, pointsPerPxThreshold));
// domain = currentDomain || [xAccessor(head(plotData)), xAccessor(last(plotData))];
var newXScale = xScale.copy().domain(domain);
var newWidth = Math.floor(newXScale(xAccessor((0, _utils.last)(plotData))) - newXScale(xAccessor((0, _utils.head)(plotData))));
log("and ouch, that is too much, so instead showing " + plotData.length + " in " + newWidth + "px");
} else {
plotData = currentPlotData || filteredData.slice(filteredData.length - showMax(width, pointsPerPxThreshold));
domain = currentDomain || [xAccessor((0, _utils.head)(plotData)), xAccessor((0, _utils.last)(plotData))];
var _newXScale = xScale.copy().domain(domain);
var _newWidth = Math.floor(_newXScale(xAccessor((0, _utils.last)(plotData))) - _newXScale(xAccessor((0, _utils.head)(plotData))));
log("and ouch, that is too much, so instead showing " + plotData.length + " in " + _newWidth + "px");
}
}
return { plotData: plotData, domain: domain };
}
return { filterData: filterData };
}
function canShowTheseManyPeriods(width, arrayLength, maxThreshold, minThreshold) {
return arrayLength > showMinThreshold(width, minThreshold) && arrayLength < showMaxThreshold(width, maxThreshold);
}
function showMinThreshold(width, threshold) {
return Math.max(1, Math.ceil(width * threshold));
}
function showMaxThreshold(width, threshold) {
return Math.floor(width * threshold);
}
function showMax(width, threshold) {
return Math.floor(showMaxThreshold(width, threshold) * 0.97);
}
function getFilteredResponse(data, left, right, xAccessor) {
var newLeftIndex = (0, _utils.getClosestItemIndexes)(data, left, xAccessor).right;
var newRightIndex = (0, _utils.getClosestItemIndexes)(data, right, xAccessor).left;
var filteredData = data.slice(newLeftIndex, newRightIndex + 1);
// console.log(right, newRightIndex, dataForInterval.length);
return filteredData;
}
//# sourceMappingURL=evaluator.js.map
;