ct-react-stockcharts
Version:
Highly customizable stock charts with ReactJS and d3
292 lines (251 loc) • 10.1 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"); } }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
// import { map as d3Map } from "d3-collection";
exports.discontinuousTimeScaleProviderBuilder = discontinuousTimeScaleProviderBuilder;
var _d3TimeFormat = require("d3-time-format");
var _financeDiscontinuousScale = require("./financeDiscontinuousScale");
var _financeDiscontinuousScale2 = _interopRequireDefault(_financeDiscontinuousScale);
var _utils = require("../utils");
var _levels = require("./levels");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function evaluateLevel(d, date, i, formatters) {
return _levels.levelDefinition.map(function (eachLevel, idx) {
return {
level: _levels.levelDefinition.length - idx - 1,
format: formatters[eachLevel(d, date, i)]
};
}).find(function (l) {
return !!l.format;
});
}
var discontinuousIndexCalculator = (0, _utils.slidingWindow)().windowSize(2).undefinedValue(function (d, idx, _ref) {
var initialIndex = _ref.initialIndex,
formatters = _ref.formatters;
var i = initialIndex;
var row = {
date: d.getTime(),
startOf30Seconds: false,
startOfMinute: false,
startOf5Minutes: false,
startOf15Minutes: false,
startOf30Minutes: false,
startOfHour: false,
startOfEighthOfADay: false,
startOfQuarterDay: false,
startOfHalfDay: false,
startOfDay: true,
startOfWeek: false,
startOfMonth: false,
startOfQuarter: false,
startOfYear: false
};
var level = evaluateLevel(row, d, i, formatters);
return _extends({}, row, { index: i }, level);
});
var discontinuousIndexCalculatorLocalTime = discontinuousIndexCalculator.accumulator(function (_ref2, i, idx, _ref3) {
var _ref4 = _slicedToArray(_ref2, 2),
prevDate = _ref4[0],
nowDate = _ref4[1];
var initialIndex = _ref3.initialIndex,
formatters = _ref3.formatters;
var startOf30Seconds = nowDate.getSeconds() % 30 === 0;
var startOfMinute = nowDate.getMinutes() !== prevDate.getMinutes();
var startOf5Minutes = startOfMinute && nowDate.getMinutes() % 5 <= prevDate.getMinutes() % 5;
var startOf15Minutes = startOfMinute && nowDate.getMinutes() % 15 <= prevDate.getMinutes() % 15;
var startOf30Minutes = startOfMinute && nowDate.getMinutes() % 30 <= prevDate.getMinutes() % 30;
var startOfHour = nowDate.getHours() !== prevDate.getHours();
var startOfEighthOfADay = startOfHour && nowDate.getHours() % 3 === 0;
var startOfQuarterDay = startOfHour && nowDate.getHours() % 6 === 0;
var startOfHalfDay = startOfHour && nowDate.getHours() % 12 === 0;
var startOfDay = nowDate.getDay() !== prevDate.getDay();
// According to ISO calendar
// Sunday = 0, Monday = 1, ... Saturday = 6
// day of week of today < day of week of yesterday then today is start of week
var startOfWeek = nowDate.getDay() < prevDate.getDay();
// month of today != month of yesterday then today is start of month
var startOfMonth = nowDate.getMonth() !== prevDate.getMonth();
// if start of month and month % 3 === 0 then it is start of quarter
var startOfQuarter = startOfMonth && nowDate.getMonth() % 3 <= prevDate.getMonth() % 3;
// year of today != year of yesterday then today is start of year
var startOfYear = nowDate.getFullYear() !== prevDate.getFullYear();
var row = {
date: nowDate.getTime(),
startOf30Seconds: startOf30Seconds,
startOfMinute: startOfMinute,
startOf5Minutes: startOf5Minutes,
startOf15Minutes: startOf15Minutes,
startOf30Minutes: startOf30Minutes,
startOfHour: startOfHour,
startOfEighthOfADay: startOfEighthOfADay,
startOfQuarterDay: startOfQuarterDay,
startOfHalfDay: startOfHalfDay,
startOfDay: startOfDay,
startOfWeek: startOfWeek,
startOfMonth: startOfMonth,
startOfQuarter: startOfQuarter,
startOfYear: startOfYear
};
var level = evaluateLevel(row, nowDate, i, formatters);
if (level == null) {
console.log(row);
}
return _extends({}, row, { index: i + initialIndex }, level);
});
function doStuff(realDateAccessor, inputDateAccessor, initialIndex, formatters) {
return function (data) {
var dateAccessor = realDateAccessor(inputDateAccessor);
var calculate = discontinuousIndexCalculatorLocalTime.source(dateAccessor).misc({ initialIndex: initialIndex, formatters: formatters });
var index = calculate(data).map(function (each) {
var format = each.format;
return {
// ...each,
index: each.index,
level: each.level,
date: new Date(each.date),
format: (0, _d3TimeFormat.timeFormat)(format)
};
});
/*
var map = d3Map();
for (var i = 0; i < data.length - 1; i++) {
var nextDate = dateAccessor(data[i + 1]);
var nowDate = dateAccessor(data[i]);
var diff = nextDate - nowDate;
if (map.has(diff)) {
var count = parseInt(map.get(diff), 10) + 1;
map.set(diff, count);
} else {
map.set(diff, 1);
}
}
var entries = map.entries().sort((a, b) => a.value < b.value);
// For Renko/p&f
var interval = entries[0].value === 1
? Math.round((dateAccessor(last(data)) - dateAccessor(head(data))) / data.length)
: parseInt(entries[0].key, 10); */
// return { index, interval };
return { index: index };
};
}
function discontinuousTimeScaleProviderBuilder() {
var initialIndex = 0,
realDateAccessor = _utils.identity;
var inputDateAccessor = function inputDateAccessor(d) {
return d.date;
},
indexAccessor = function indexAccessor(d) {
return d.idx;
},
indexMutator = function indexMutator(d, idx) {
return _extends({}, d, { idx: idx });
},
withIndex = void 0;
var currentFormatters = _levels.defaultFormatters;
// eslint-disable-next-line prefer-const
var discontinuousTimeScaleProvider = function discontinuousTimeScaleProvider(data) {
/*
console.warn("Are you sure you want to use a discontinuousTimeScale?"
+ " Use this only if you have discontinuous data which"
+ " needs to be displayed as continuous."
+ " If you have continuous data use a d3 scale like"
+ " `d3.scaleTime`"
);
*/
var index = withIndex;
if ((0, _utils.isNotDefined)(index)) {
var response = doStuff(realDateAccessor, inputDateAccessor, initialIndex, currentFormatters)(data);
index = response.index;
}
// console.log(interval, entries[0].key);
var inputIndex = index;
var xScale = (0, _financeDiscontinuousScale2.default)(inputIndex);
var mergedData = (0, _utils.zipper)().combine(indexMutator);
var finalData = mergedData(data, inputIndex);
return {
data: finalData,
xScale: xScale,
xAccessor: function xAccessor(d) {
return d && indexAccessor(d).index;
},
displayXAccessor: realDateAccessor(inputDateAccessor)
};
};
discontinuousTimeScaleProvider.initialIndex = function (x) {
if (!arguments.length) {
return initialIndex;
}
initialIndex = x;
return discontinuousTimeScaleProvider;
};
discontinuousTimeScaleProvider.inputDateAccessor = function (x) {
if (!arguments.length) {
return inputDateAccessor;
}
inputDateAccessor = x;
return discontinuousTimeScaleProvider;
};
discontinuousTimeScaleProvider.indexAccessor = function (x) {
if (!arguments.length) {
return indexAccessor;
}
indexAccessor = x;
return discontinuousTimeScaleProvider;
};
discontinuousTimeScaleProvider.indexMutator = function (x) {
if (!arguments.length) {
return indexMutator;
}
indexMutator = x;
return discontinuousTimeScaleProvider;
};
discontinuousTimeScaleProvider.withIndex = function (x) {
if (!arguments.length) {
return withIndex;
}
withIndex = x;
return discontinuousTimeScaleProvider;
};
discontinuousTimeScaleProvider.utc = function () {
realDateAccessor = function realDateAccessor(dateAccessor) {
return function (d) {
var date = dateAccessor(d);
// The getTimezoneOffset() method returns the time-zone offset from UTC, in minutes, for the current locale.
var offsetInMillis = date.getTimezoneOffset() * 60 * 1000;
return new Date(date.getTime() + offsetInMillis);
};
};
return discontinuousTimeScaleProvider;
};
discontinuousTimeScaleProvider.setLocale = function (locale) {
var formatters = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
if (locale) {
(0, _d3TimeFormat.timeFormatDefaultLocale)(locale);
}
if (formatters) {
currentFormatters = formatters;
}
return discontinuousTimeScaleProvider;
};
discontinuousTimeScaleProvider.indexCalculator = function () {
return doStuff(realDateAccessor, inputDateAccessor, initialIndex, currentFormatters);
};
return discontinuousTimeScaleProvider;
}
/* discontinuousTimeScaleProvider.utc = function(data,
dateAccessor,
indexAccessor,
indexMutator) {
var utcDateAccessor = d => {
var date = dateAccessor(d);
// The getTimezoneOffset() method returns the time-zone offset from UTC, in minutes, for the current locale.
var offsetInMillis = date.getTimezoneOffset() * 60 * 1000;
return new Date(date.getTime() + offsetInMillis);
};
return discontinuousTimeScaleProvider(data, utcDateAccessor, indexAccessor, indexMutator);
};*/
exports.default = discontinuousTimeScaleProviderBuilder();
//# sourceMappingURL=discontinuousTimeScaleProvider.js.map
;