UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

366 lines (365 loc) 12.9 kB
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 };