devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
350 lines (299 loc) • 12.5 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.smartFormatter = smartFormatter;
exports.formatRange = formatRange;
var _format2 = require("../core/format");
var _format3 = _interopRequireDefault(_format2);
var _format_helper = require("../../format_helper");
var _format_helper2 = _interopRequireDefault(_format_helper);
var _type = require("../../core/utils/type");
var _date = require("../../core/utils/date");
var _date2 = _interopRequireDefault(_date);
var _math = require("../../core/utils/math");
var _utils = require("../core/utils");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var floor = Math.floor;
var abs = Math.abs;
var EXPONENTIAL = "exponential";
var formats = ["fixedPoint", "thousands", "millions", "billions", "trillions", EXPONENTIAL];
var dateUnitIntervals = ['millisecond', 'second', 'minute', 'hour', 'day', 'month', 'year'];
function getDatesDifferences(prevDate, curDate, nextDate, tickFormat) {
var prevDifferences,
nextDifferences,
dateUnitInterval,
tickFormatIndex,
dateUnitsLength = dateUnitIntervals.length,
i,
j;
if (tickFormat === "week") {
tickFormat = "day";
} else if (tickFormat === "quarter") {
tickFormat = "month";
} else if (tickFormat === "shorttime") {
tickFormat = "hour";
} else if (tickFormat === "longtime") {
tickFormat = "second";
}
tickFormatIndex = dateUnitIntervals.indexOf(tickFormat);
if (nextDate) {
nextDifferences = _date2.default.getDatesDifferences(curDate, nextDate);
prevDifferences = _date2.default.getDatesDifferences(curDate, prevDate);
if (nextDifferences[tickFormat]) {
for (i = dateUnitsLength - 1; i >= tickFormatIndex; i--) {
dateUnitInterval = dateUnitIntervals[i];
if (i === tickFormatIndex) {
setDateUnitInterval(nextDifferences, tickFormatIndex + (nextDifferences["millisecond"] ? 2 : 1));
} else if (nextDifferences[dateUnitInterval]) {
resetDateUnitInterval(nextDifferences, i);
break;
}
}
}
} else {
prevDifferences = _date2.default.getDatesDifferences(prevDate, curDate);
for (i = dateUnitsLength - 1; i >= tickFormatIndex; i--) {
dateUnitInterval = dateUnitIntervals[i];
if (prevDifferences[dateUnitInterval]) {
if (i - tickFormatIndex > 1) {
for (j = tickFormatIndex + 1; j >= 0; j--) {
resetDateUnitInterval(prevDifferences, j);
}
break;
} else if (isDateTimeStart(curDate, dateUnitInterval)) {
for (j = i - 1; j > 0; j--) {
resetDateUnitInterval(prevDifferences, j);
}
break;
}
}
}
}
return nextDate ? nextDifferences : prevDifferences;
}
function isDateTimeStart(date, dateUnitInterval) {
var unitNumbers = [date.getMilliseconds(), date.getSeconds(), date.getMinutes(), date.getHours(), date.getDate(), date.getMonth()],
unitIndex = dateUnitIntervals.indexOf(dateUnitInterval),
i;
for (i = 0; i < unitIndex; i++) {
if (i === 4 && unitNumbers[i] !== 1 || i !== 4 && unitNumbers[i] !== 0) {
return false;
}
}
return true;
}
function resetDateUnitInterval(differences, intervalIndex) {
var dateUnitInterval = dateUnitIntervals[intervalIndex];
if (differences[dateUnitInterval]) {
differences[dateUnitInterval] = false;
differences.count--;
}
}
function setDateUnitInterval(differences, intervalIndex) {
var dateUnitInterval = dateUnitIntervals[intervalIndex];
if (differences[dateUnitInterval] === false) {
differences[dateUnitInterval] = true;
differences.count++;
}
}
function getNoZeroIndex(str) {
return str.length - parseInt(str).toString().length;
}
function getTransitionTickIndex(ticks, value) {
var i,
curDiff,
minDiff,
nearestTickIndex = 0;
minDiff = abs(value - ticks[0]);
for (i = 1; i < ticks.length; i++) {
curDiff = abs(value - ticks[i]);
if (curDiff < minDiff) {
minDiff = curDiff;
nearestTickIndex = i;
}
}
return nearestTickIndex;
}
function splitDecimalNumber(value) {
return value.toString().split(".");
}
function createFormat(type) {
var formatter = void 0;
if ((0, _type.isFunction)(type)) {
formatter = type;
type = null;
}
return { format: { type: type, formatter: formatter } };
}
function smartFormatter(tick, options) {
var tickInterval = options.tickInterval,
tickIntervalIndex,
tickIndex,
actualIndex,
stringTick = abs(tick).toString(),
precision = 0,
typeFormat,
offset = 0,
separatedTickInterval,
indexOfFormat = 0,
indexOfTick = -1,
datesDifferences,
format = options.labelOptions.format,
ticks = options.ticks,
log10Tick,
prevDateIndex,
nextDateIndex,
isLogarithmic = options.type === "logarithmic";
if (!(0, _type.isDefined)(format) && (0, _type.isDefined)(tickInterval) && options.type !== "discrete" && tick && (options.logarithmBase === 10 || !isLogarithmic)) {
if (options.dataType !== "datetime") {
if (ticks.length && ticks.indexOf(tick) === -1) {
indexOfTick = getTransitionTickIndex(ticks, tick);
tickInterval = (0, _math.adjust)(abs(tick - ticks[indexOfTick]), tick);
}
separatedTickInterval = splitDecimalNumber(tickInterval);
if (separatedTickInterval < 2) {
separatedTickInterval = splitDecimalNumber(tick);
}
if (isLogarithmic) {
log10Tick = (0, _utils.getAdjustedLog10)(abs(tick));
if (log10Tick > 0) {
typeFormat = formats[floor(log10Tick / 3)] || EXPONENTIAL;
} else {
if (log10Tick < -4) {
typeFormat = EXPONENTIAL;
} else {
precision = undefined;
}
}
} else {
if (separatedTickInterval.length > 1 && !(0, _type.isExponential)(tickInterval)) {
precision = separatedTickInterval[1].length;
typeFormat = formats[indexOfFormat];
} else {
if ((0, _type.isExponential)(tickInterval) && (stringTick.indexOf(".") !== -1 || (0, _type.isExponential)(tick))) {
typeFormat = EXPONENTIAL;
if (!(0, _type.isExponential)(tick)) {
precision = abs(getNoZeroIndex(stringTick.split(".")[1]) - (0, _math.getExponent)(tickInterval) + 1);
} else {
precision = Math.max(abs((0, _math.getExponent)(tick) - (0, _math.getExponent)(tickInterval)), abs((0, _math.getPrecision)(tick) - (0, _math.getPrecision)(tickInterval)));
}
} else {
tickIntervalIndex = floor((0, _utils.getAdjustedLog10)(tickInterval));
actualIndex = tickIndex = floor((0, _utils.getAdjustedLog10)(abs(tick)));
if (tickIndex - tickIntervalIndex >= 2) {
actualIndex = tickIntervalIndex;
}
indexOfFormat = floor(actualIndex / 3);
offset = indexOfFormat * 3;
if (indexOfFormat < 5) {
if (tickIntervalIndex - offset === 2 && tickIndex >= 3) {
indexOfFormat++;
offset = indexOfFormat * 3;
}
typeFormat = formats[indexOfFormat];
} else {
typeFormat = formats[formats.length - 1];
}
if (offset > 0) {
separatedTickInterval = splitDecimalNumber(tickInterval / Math.pow(10, offset));
if (separatedTickInterval[1]) {
precision = separatedTickInterval[1].length;
}
}
}
}
}
format = {
type: typeFormat,
precision: precision
};
} else {
typeFormat = _date2.default.getDateFormatByTickInterval(tickInterval);
if (options.showTransition && ticks.length) {
indexOfTick = ticks.map(Number).indexOf(+tick);
if (ticks.length === 1 && indexOfTick === 0) {
typeFormat = _format_helper2.default.getDateFormatByTicks(ticks);
} else {
if (indexOfTick === -1) {
prevDateIndex = getTransitionTickIndex(ticks, tick);
} else {
prevDateIndex = indexOfTick === 0 ? ticks.length - 1 : indexOfTick - 1;
nextDateIndex = indexOfTick === 0 ? 1 : -1;
}
datesDifferences = getDatesDifferences(ticks[prevDateIndex], tick, ticks[nextDateIndex], typeFormat);
typeFormat = _format_helper2.default.getDateFormatByDifferences(datesDifferences, typeFormat);
}
}
format = createFormat(typeFormat).format;
}
}
return (0, _format3.default)(tick, { format: format, precision: options.labelOptions.precision });
}
function getHighDiffFormat(diff) {
var stop = false;
for (var i in diff) {
if (diff[i] === true || i === "hour" || stop) {
diff[i] = false;
stop = true;
} else if (diff[i] === false) {
diff[i] = true;
}
}
return createFormat(_format_helper2.default.getDateFormatByDifferences(diff));
}
function getHighAndSelfDiffFormat(diff, interval) {
var stop = false;
for (var i in diff) {
if (stop) {
diff[i] = false;
} else if (i === interval) {
stop = true;
} else {
diff[i] = true;
}
}
return createFormat(_format_helper2.default.getDateFormatByDifferences(diff));
}
function formatDateRange(startValue, endValue, tickInterval) {
var diff = getDatesDifferences(startValue, endValue);
var typeFormat = _date2.default.getDateFormatByTickInterval(tickInterval);
var diffFormatType = _format_helper2.default.getDateFormatByDifferences(diff, typeFormat);
var diffFormat = createFormat(diffFormatType);
var values = [];
if (tickInterval in diff) {
var rangeFormat = getHighAndSelfDiffFormat(getDatesDifferences(startValue, endValue), tickInterval);
var value = (0, _format3.default)(startValue, rangeFormat);
if (value) {
values.push(value);
}
} else {
var _rangeFormat = getHighDiffFormat(getDatesDifferences(startValue, endValue));
var highValue = (0, _format3.default)(startValue, _rangeFormat);
if (highValue) {
values.push(highValue);
}
values.push((0, _format3.default)(startValue, diffFormat) + " - " + (0, _format3.default)(endValue, diffFormat));
}
return values.join(", ");
}
function formatRange(startValue, endValue, tickInterval, _ref) {
var dataType = _ref.dataType,
type = _ref.type,
logarithmBase = _ref.logarithmBase;
if (type === "discrete") {
return "";
}
if (dataType === "datetime") {
return formatDateRange(startValue, endValue, tickInterval);
}
var formatOptions = {
ticks: [],
type: type,
dataType: dataType,
tickInterval: tickInterval,
logarithmBase: logarithmBase,
labelOptions: {}
};
return smartFormatter(startValue, formatOptions) + " - " + smartFormatter(endValue, formatOptions);
}