virool-pivot
Version:
A web-based exploratory visualization UI for Druid.io
196 lines (195 loc) • 8.6 kB
JavaScript
;
var d3 = require('d3');
var chronoshift_1 = require('chronoshift');
var granularity_1 = require('../../models/granularity/granularity');
var FORMAT_WITH_YEAR = d3.time.format('%b %-d, %Y');
var FORMAT_WITHOUT_YEAR = d3.time.format('%b %-d');
var FORMAT_TIME_OF_DAY_WITHOUT_MINUTES = d3.time.format('%-I%p');
var FORMAT_TIME_OF_DAY_WITH_MINUTES = d3.time.format('%-I:%M%p');
var FORMAT_FULL_MONTH_WITH_YEAR = d3.time.format('%B %Y');
function formatTimeOfDay(d) {
return d.getMinutes() ? FORMAT_TIME_OF_DAY_WITH_MINUTES(d) : FORMAT_TIME_OF_DAY_WITHOUT_MINUTES(d);
}
function isCurrentYear(year, timezone) {
var nowWallTime = chronoshift_1.WallTime.UTCToWallTime(new Date(), timezone.toString());
return nowWallTime.getFullYear() === year;
}
(function (DisplayYear) {
DisplayYear[DisplayYear["ALWAYS"] = 0] = "ALWAYS";
DisplayYear[DisplayYear["NEVER"] = 1] = "NEVER";
DisplayYear[DisplayYear["IF_DIFF"] = 2] = "IF_DIFF";
})(exports.DisplayYear || (exports.DisplayYear = {}));
var DisplayYear = exports.DisplayYear;
function getEndWallTimeInclusive(exclusiveEnd, timezone) {
return chronoshift_1.WallTime.UTCToWallTime(exclusiveToInclusiveEnd(exclusiveEnd), timezone.toString());
}
exports.getEndWallTimeInclusive = getEndWallTimeInclusive;
function exclusiveToInclusiveEnd(exclusiveEnd) {
return new Date(exclusiveEnd.valueOf() - 1);
}
exports.exclusiveToInclusiveEnd = exclusiveToInclusiveEnd;
function formatTimeRange(timeRange, timezone, displayYear) {
var start = timeRange.start, end = timeRange.end;
var startWallTime = chronoshift_1.WallTime.UTCToWallTime(start, timezone.toString());
var endWallTime = chronoshift_1.WallTime.UTCToWallTime(end, timezone.toString());
var endWallTimeInclusive = getEndWallTimeInclusive(end, timezone);
var showingYear = true;
var formatted;
if (startWallTime.getFullYear() !== endWallTimeInclusive.getFullYear()) {
formatted = [FORMAT_WITH_YEAR(startWallTime), FORMAT_WITH_YEAR(endWallTimeInclusive)].join(' - ');
}
else {
showingYear = displayYear === DisplayYear.ALWAYS || (displayYear === DisplayYear.IF_DIFF && !isCurrentYear(endWallTimeInclusive.getFullYear(), timezone));
var fmt = showingYear ? FORMAT_WITH_YEAR : FORMAT_WITHOUT_YEAR;
if (startWallTime.getMonth() !== endWallTimeInclusive.getMonth() || startWallTime.getDate() !== endWallTimeInclusive.getDate()) {
formatted = [FORMAT_WITHOUT_YEAR(startWallTime), fmt(endWallTimeInclusive)].join(' - ');
}
else {
formatted = fmt(startWallTime);
}
}
if (startWallTime.getHours() || startWallTime.getMinutes() || endWallTime.getHours() || endWallTime.getMinutes()) {
formatted += (showingYear ? ' ' : ', ');
var startTimeStr = formatTimeOfDay(startWallTime).toLowerCase();
var endTimeStr = formatTimeOfDay(endWallTime).toLowerCase();
if (startTimeStr === endTimeStr) {
formatted += startTimeStr;
}
else {
if (startTimeStr.substr(-2) === endTimeStr.substr(-2)) {
startTimeStr = startTimeStr.substr(0, startTimeStr.length - 2);
}
formatted += [startTimeStr, endTimeStr].join('-');
}
}
return formatted;
}
exports.formatTimeRange = formatTimeRange;
// calendar utils
function monthToWeeks(firstDayOfMonth, timezone, locale) {
var weeks = [];
var firstDayNextMonth = chronoshift_1.month.shift(firstDayOfMonth, timezone, 1);
var week = [];
var currentPointer = chronoshift_1.day.floor(firstDayOfMonth, timezone);
while (currentPointer < firstDayNextMonth) {
var wallTime = chronoshift_1.WallTime.UTCToWallTime(currentPointer, timezone.toString());
if ((wallTime.getDay() === locale.weekStart || 0) && week.length > 0) {
weeks.push(week);
week = [];
}
week.push(currentPointer);
currentPointer = chronoshift_1.day.shift(currentPointer, timezone, 1);
}
// push last week
if (week.length > 0)
weeks.push(week);
return weeks;
}
exports.monthToWeeks = monthToWeeks;
function prependDays(timezone, weekPrependTo, countPrepend) {
for (var i = 0; i < countPrepend; i++) {
var firstDate = weekPrependTo[0];
var shiftedDate = chronoshift_1.day.shift(firstDate, timezone, -1);
weekPrependTo.unshift(shiftedDate);
}
return weekPrependTo;
}
exports.prependDays = prependDays;
function appendDays(timezone, weekAppendTo, countAppend) {
for (var i = 0; i < countAppend; i++) {
var lastDate = weekAppendTo[weekAppendTo.length - 1];
var shiftedDate = chronoshift_1.day.shift(lastDate, timezone, 1);
weekAppendTo.push(shiftedDate);
}
return weekAppendTo;
}
exports.appendDays = appendDays;
function shiftOneDay(floored, timezone) {
return chronoshift_1.day.shift(floored, timezone, 1);
}
exports.shiftOneDay = shiftOneDay;
function datesEqual(d1, d2) {
if (!Boolean(d1) === Boolean(d2))
return false;
if (d1 === d2)
return true;
return d1.valueOf() === d2.valueOf();
}
exports.datesEqual = datesEqual;
function getWallTimeDay(date, timezone) {
return chronoshift_1.WallTime.UTCToWallTime(date, timezone.toString()).getDate();
}
exports.getWallTimeDay = getWallTimeDay;
function getWallTimeMonthWithYear(date, timezone) {
return FORMAT_FULL_MONTH_WITH_YEAR(chronoshift_1.WallTime.UTCToWallTime(date, timezone.toString()));
}
exports.getWallTimeMonthWithYear = getWallTimeMonthWithYear;
function wallTimeInclusiveEndEqual(d1, d2, timezone) {
if (!Boolean(d1) === Boolean(d2))
return false;
if (d1 === d2)
return true;
var d1InclusiveEnd = wallTimeHelper(getEndWallTimeInclusive(d1, timezone));
var d2InclusiveEnd = wallTimeHelper(getEndWallTimeInclusive(d2, timezone));
return datesEqual(d1InclusiveEnd, d2InclusiveEnd);
}
exports.wallTimeInclusiveEndEqual = wallTimeInclusiveEndEqual;
function getWallTimeString(date, timezone, includeTime, delimiter) {
var wallTimeISOString = cleanISOString(wallTimeHelper(chronoshift_1.WallTime.UTCToWallTime(date, timezone.toString())).toISOString());
if (includeTime) {
return wallTimeISOString.replace('T', delimiter || ', ');
}
return wallTimeISOString.replace(/:\d\d/, '').split('T')[0];
}
exports.getWallTimeString = getWallTimeString;
function wallTimeHelper(wallTime) {
return wallTime['wallTime'];
}
function cleanISOString(input) {
return input.replace(/(\.\d\d\d)?Z?$/, '');
}
function getTimeTicks(timeRange, timezone) {
var start = timeRange.start, end = timeRange.end;
var tickDuration = granularity_1.getBestBucketUnitForRange(timeRange, true);
return tickDuration.materialize(start, end, timezone);
}
exports.getTimeTicks = getTimeTicks;
function pad(input) {
if (input < 10)
return "0" + input;
return String(input);
}
function formatTimeBasedOnGranularity(range, granularity, timezone, locale) {
var wallTimeStart = chronoshift_1.WallTime.UTCToWallTime(range.start, timezone.toString());
var year = wallTimeStart.getFullYear();
var month = wallTimeStart.getMonth();
var day = wallTimeStart.getDate();
var hour = wallTimeStart.getHours();
var minute = wallTimeStart.getMinutes();
var second = wallTimeStart.getSeconds();
var monthString = locale.shortMonths[month];
var hourToTwelve = hour % 12 === 0 ? 12 : hour % 12;
var amPm = (hour / 12) >= 1 ? 'pm' : 'am';
var granularityString = granularity.toJS();
var unit = granularityString.substring(granularityString.length - 1);
switch (unit) {
case 'S':
return monthString + " " + day + ", " + pad(hour) + ":" + pad(minute) + ":" + pad(second);
case 'M':
var prefix = granularityString.substring(0, 2);
return prefix === "PT" ? monthString + " " + day + ", " + hourToTwelve + ":" + pad(minute) + amPm : monthString + ", " + year;
case 'H':
return monthString + " " + day + ", " + year + ", " + hourToTwelve + amPm;
case 'D':
return monthString + " " + day + ", " + year;
case 'W':
return "" + formatTimeRange(range, timezone, DisplayYear.ALWAYS);
default:
return cleanISOString(wallTimeHelper(wallTimeStart).toISOString());
}
}
exports.formatTimeBasedOnGranularity = formatTimeBasedOnGranularity;
function formatGranularity(granularity) {
return granularity.replace(/^PT?/, '');
}
exports.formatGranularity = formatGranularity;