cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
366 lines (365 loc) • 12.9 kB
JavaScript
import { __extends } from "../../../tslib/tslib.es6.mjs";
import { parseDate, nice } from "../util/number.mjs";
import { format, fullLeveledFormatter, getDefaultFormatPrecisionOfInterval, getPrimaryTimeUnit, leveledFormat, ONE_DAY, ONE_SECOND, ONE_MINUTE, ONE_HOUR, ONE_YEAR, isPrimaryTimeUnit, timeUnits, secondsSetterName, millisecondsSetterName, minutesSetterName, hoursSetterName, dateSetterName, monthSetterName, millisecondsGetterName, secondsGetterName, minutesGetterName, hoursGetterName, dateGetterName, monthGetterName, fullYearGetterName, fullYearSetterName, getUnitValue } from "../util/time.mjs";
import { contain, normalize, scale } from "./helper.mjs";
import IntervalScale from "./Interval.mjs";
import Scale from "./Scale.mjs";
import { isNumber, filter, map } from "../../../zrender/lib/core/util.mjs";
var bisect = function(a, x, lo, hi) {
while (lo < hi) {
var mid = lo + hi >>> 1;
if (a[mid][1] < x) {
lo = mid + 1;
} else {
hi = mid;
}
}
return lo;
};
var TimeScale = function(_super) {
__extends(TimeScale2, _super);
function TimeScale2(settings) {
var _this = _super.call(this, settings) || this;
_this.type = "time";
return _this;
}
TimeScale2.prototype.getLabel = function(tick) {
var useUTC = this.getSetting("useUTC");
return format(tick.value, fullLeveledFormatter[getDefaultFormatPrecisionOfInterval(getPrimaryTimeUnit(this._minLevelUnit))] || fullLeveledFormatter.second, useUTC, this.getSetting("locale"));
};
TimeScale2.prototype.getFormattedLabel = function(tick, idx, labelFormatter) {
var isUTC = this.getSetting("useUTC");
var lang = this.getSetting("locale");
return leveledFormat(tick, idx, labelFormatter, lang, isUTC);
};
TimeScale2.prototype.getTicks = function() {
var interval = this._interval;
var extent = this._extent;
var ticks = [];
if (!interval) {
return ticks;
}
ticks.push({
value: extent[0],
level: 0
});
var useUTC = this.getSetting("useUTC");
var innerTicks = getIntervalTicks(this._minLevelUnit, this._approxInterval, useUTC, extent);
ticks = ticks.concat(innerTicks);
ticks.push({
value: extent[1],
level: 0
});
return ticks;
};
TimeScale2.prototype.calcNiceExtent = function(opt) {
var extent = this._extent;
if (extent[0] === extent[1]) {
extent[0] -= ONE_DAY;
extent[1] += ONE_DAY;
}
if (extent[1] === -Infinity && extent[0] === Infinity) {
var d = new Date();
extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate());
extent[0] = extent[1] - ONE_DAY;
}
this.calcNiceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval);
};
TimeScale2.prototype.calcNiceTicks = function(approxTickNum, minInterval, maxInterval) {
approxTickNum = approxTickNum || 10;
var extent = this._extent;
var span = extent[1] - extent[0];
this._approxInterval = span / approxTickNum;
if (minInterval != null && this._approxInterval < minInterval) {
this._approxInterval = minInterval;
}
if (maxInterval != null && this._approxInterval > maxInterval) {
this._approxInterval = maxInterval;
}
var scaleIntervalsLen = scaleIntervals.length;
var idx = Math.min(bisect(scaleIntervals, this._approxInterval, 0, scaleIntervalsLen), scaleIntervalsLen - 1);
this._interval = scaleIntervals[idx][1];
this._minLevelUnit = scaleIntervals[Math.max(idx - 1, 0)][0];
};
TimeScale2.prototype.parse = function(val) {
return isNumber(val) ? val : +parseDate(val);
};
TimeScale2.prototype.contain = function(val) {
return contain(this.parse(val), this._extent);
};
TimeScale2.prototype.normalize = function(val) {
return normalize(this.parse(val), this._extent);
};
TimeScale2.prototype.scale = function(val) {
return scale(val, this._extent);
};
TimeScale2.type = "time";
return TimeScale2;
}(IntervalScale);
var scaleIntervals = [
["second", ONE_SECOND],
["minute", ONE_MINUTE],
["hour", ONE_HOUR],
["quarter-day", ONE_HOUR * 6],
["half-day", ONE_HOUR * 12],
["day", ONE_DAY * 1.2],
["half-week", ONE_DAY * 3.5],
["week", ONE_DAY * 7],
["month", ONE_DAY * 31],
["quarter", ONE_DAY * 95],
["half-year", ONE_YEAR / 2],
["year", ONE_YEAR]
];
function isUnitValueSame(unit, valueA, valueB, isUTC) {
var dateA = parseDate(valueA);
var dateB = parseDate(valueB);
var isSame = function(unit2) {
return getUnitValue(dateA, unit2, isUTC) === getUnitValue(dateB, unit2, isUTC);
};
var isSameYear = function() {
return isSame("year");
};
var isSameMonth = function() {
return isSameYear() && isSame("month");
};
var isSameDay = function() {
return isSameMonth() && isSame("day");
};
var isSameHour = function() {
return isSameDay() && isSame("hour");
};
var isSameMinute = function() {
return isSameHour() && isSame("minute");
};
var isSameSecond = function() {
return isSameMinute() && isSame("second");
};
var isSameMilliSecond = function() {
return isSameSecond() && isSame("millisecond");
};
switch (unit) {
case "year":
return isSameYear();
case "month":
return isSameMonth();
case "day":
return isSameDay();
case "hour":
return isSameHour();
case "minute":
return isSameMinute();
case "second":
return isSameSecond();
case "millisecond":
return isSameMilliSecond();
}
}
function getDateInterval(approxInterval, daysInMonth) {
approxInterval /= ONE_DAY;
return approxInterval > 16 ? 16 : approxInterval > 7.5 ? 7 : approxInterval > 3.5 ? 4 : approxInterval > 1.5 ? 2 : 1;
}
function getMonthInterval(approxInterval) {
var APPROX_ONE_MONTH = 30 * ONE_DAY;
approxInterval /= APPROX_ONE_MONTH;
return approxInterval > 6 ? 6 : approxInterval > 3 ? 3 : approxInterval > 2 ? 2 : 1;
}
function getHourInterval(approxInterval) {
approxInterval /= ONE_HOUR;
return approxInterval > 12 ? 12 : approxInterval > 6 ? 6 : approxInterval > 3.5 ? 4 : approxInterval > 2 ? 2 : 1;
}
function getMinutesAndSecondsInterval(approxInterval, isMinutes) {
approxInterval /= isMinutes ? ONE_MINUTE : ONE_SECOND;
return approxInterval > 30 ? 30 : approxInterval > 20 ? 20 : approxInterval > 15 ? 15 : approxInterval > 10 ? 10 : approxInterval > 5 ? 5 : approxInterval > 2 ? 2 : 1;
}
function getMillisecondsInterval(approxInterval) {
return nice(approxInterval, true);
}
function getFirstTimestampOfUnit(date, unitName, isUTC) {
var outDate = new Date(date);
switch (getPrimaryTimeUnit(unitName)) {
case "year":
case "month":
outDate[monthSetterName(isUTC)](0);
case "day":
outDate[dateSetterName(isUTC)](1);
case "hour":
outDate[hoursSetterName(isUTC)](0);
case "minute":
outDate[minutesSetterName(isUTC)](0);
case "second":
outDate[secondsSetterName(isUTC)](0);
outDate[millisecondsSetterName(isUTC)](0);
}
return outDate.getTime();
}
function getIntervalTicks(bottomUnitName, approxInterval, isUTC, extent) {
var safeLimit = 1e4;
var unitNames = timeUnits;
var iter = 0;
function addTicksInSpan(interval, minTimestamp, maxTimestamp, getMethodName, setMethodName, isDate, out) {
var date = new Date(minTimestamp);
var dateTime = minTimestamp;
var d = date[getMethodName]();
while (dateTime < maxTimestamp && dateTime <= extent[1]) {
out.push({
value: dateTime
});
d += interval;
date[setMethodName](d);
dateTime = date.getTime();
}
out.push({
value: dateTime,
notAdd: true
});
}
function addLevelTicks(unitName, lastLevelTicks, levelTicks2) {
var newAddedTicks = [];
var isFirstLevel = !lastLevelTicks.length;
if (isUnitValueSame(getPrimaryTimeUnit(unitName), extent[0], extent[1], isUTC)) {
return;
}
if (isFirstLevel) {
lastLevelTicks = [{
value: getFirstTimestampOfUnit(new Date(extent[0]), unitName, isUTC)
}, {
value: extent[1]
}];
}
for (var i2 = 0; i2 < lastLevelTicks.length - 1; i2++) {
var startTick = lastLevelTicks[i2].value;
var endTick = lastLevelTicks[i2 + 1].value;
if (startTick === endTick) {
continue;
}
var interval = void 0;
var getterName = void 0;
var setterName = void 0;
var isDate = false;
switch (unitName) {
case "year":
interval = Math.max(1, Math.round(approxInterval / ONE_DAY / 365));
getterName = fullYearGetterName(isUTC);
setterName = fullYearSetterName(isUTC);
break;
case "half-year":
case "quarter":
case "month":
interval = getMonthInterval(approxInterval);
getterName = monthGetterName(isUTC);
setterName = monthSetterName(isUTC);
break;
case "week":
case "half-week":
case "day":
interval = getDateInterval(approxInterval);
getterName = dateGetterName(isUTC);
setterName = dateSetterName(isUTC);
isDate = true;
break;
case "half-day":
case "quarter-day":
case "hour":
interval = getHourInterval(approxInterval);
getterName = hoursGetterName(isUTC);
setterName = hoursSetterName(isUTC);
break;
case "minute":
interval = getMinutesAndSecondsInterval(approxInterval, true);
getterName = minutesGetterName(isUTC);
setterName = minutesSetterName(isUTC);
break;
case "second":
interval = getMinutesAndSecondsInterval(approxInterval, false);
getterName = secondsGetterName(isUTC);
setterName = secondsSetterName(isUTC);
break;
case "millisecond":
interval = getMillisecondsInterval(approxInterval);
getterName = millisecondsGetterName(isUTC);
setterName = millisecondsSetterName(isUTC);
break;
}
addTicksInSpan(interval, startTick, endTick, getterName, setterName, isDate, newAddedTicks);
if (unitName === "year" && levelTicks2.length > 1 && i2 === 0) {
levelTicks2.unshift({
value: levelTicks2[0].value - interval
});
}
}
for (var i2 = 0; i2 < newAddedTicks.length; i2++) {
levelTicks2.push(newAddedTicks[i2]);
}
return newAddedTicks;
}
var levelsTicks = [];
var currentLevelTicks = [];
var tickCount = 0;
var lastLevelTickCount = 0;
for (var i = 0; i < unitNames.length && iter++ < safeLimit; ++i) {
var primaryTimeUnit = getPrimaryTimeUnit(unitNames[i]);
if (!isPrimaryTimeUnit(unitNames[i])) {
continue;
}
addLevelTicks(unitNames[i], levelsTicks[levelsTicks.length - 1] || [], currentLevelTicks);
var nextPrimaryTimeUnit = unitNames[i + 1] ? getPrimaryTimeUnit(unitNames[i + 1]) : null;
if (primaryTimeUnit !== nextPrimaryTimeUnit) {
if (currentLevelTicks.length) {
lastLevelTickCount = tickCount;
currentLevelTicks.sort(function(a, b) {
return a.value - b.value;
});
var levelTicksRemoveDuplicated = [];
for (var i_1 = 0; i_1 < currentLevelTicks.length; ++i_1) {
var tickValue = currentLevelTicks[i_1].value;
if (i_1 === 0 || currentLevelTicks[i_1 - 1].value !== tickValue) {
levelTicksRemoveDuplicated.push(currentLevelTicks[i_1]);
if (tickValue >= extent[0] && tickValue <= extent[1]) {
tickCount++;
}
}
}
var targetTickNum = (extent[1] - extent[0]) / approxInterval;
if (tickCount > targetTickNum * 1.5 && lastLevelTickCount > targetTickNum / 1.5) {
break;
}
levelsTicks.push(levelTicksRemoveDuplicated);
if (tickCount > targetTickNum || bottomUnitName === unitNames[i]) {
break;
}
}
currentLevelTicks = [];
}
}
var levelsTicksInExtent = filter(map(levelsTicks, function(levelTicks2) {
return filter(levelTicks2, function(tick) {
return tick.value >= extent[0] && tick.value <= extent[1] && !tick.notAdd;
});
}), function(levelTicks2) {
return levelTicks2.length > 0;
});
var ticks = [];
var maxLevel = levelsTicksInExtent.length - 1;
for (var i = 0; i < levelsTicksInExtent.length; ++i) {
var levelTicks = levelsTicksInExtent[i];
for (var k = 0; k < levelTicks.length; ++k) {
ticks.push({
value: levelTicks[k].value,
level: maxLevel - i
});
}
}
ticks.sort(function(a, b) {
return a.value - b.value;
});
var result = [];
for (var i = 0; i < ticks.length; ++i) {
if (i === 0 || ticks[i].value !== ticks[i - 1].value) {
result.push(ticks[i]);
}
}
return result;
}
Scale.registerClass(TimeScale);
var TimeScale$1 = TimeScale;
export { TimeScale$1 as default };