270 lines
10 KiB
JavaScript
270 lines
10 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.pluckValueFromRange = exports.getQuarterString = exports.getYearString = exports.getMonthString = exports.getDefaultTime = exports.getDerivedTimeFromKeyboardEvent = exports.strictParse = exports.quarterArray = exports.yearArray = exports.monthArray = exports.dateArray = void 0;
|
|
const date_fns_1 = require("date-fns"); //
|
|
const config_1 = require("./config");
|
|
function getDerivedTimeFromKeyboardEvent(prevValue, event) {
|
|
const now = (0, date_fns_1.getTime)(Date.now());
|
|
if (typeof prevValue !== 'number')
|
|
return now;
|
|
switch (event.key) {
|
|
case 'ArrowUp':
|
|
return (0, date_fns_1.getTime)((0, date_fns_1.addDays)(prevValue, -7));
|
|
case 'ArrowDown':
|
|
return (0, date_fns_1.getTime)((0, date_fns_1.addDays)(prevValue, 7));
|
|
case 'ArrowRight':
|
|
return (0, date_fns_1.getTime)((0, date_fns_1.addDays)(prevValue, 1));
|
|
case 'ArrowLeft':
|
|
return (0, date_fns_1.getTime)((0, date_fns_1.addDays)(prevValue, -1));
|
|
}
|
|
return now;
|
|
}
|
|
exports.getDerivedTimeFromKeyboardEvent = getDerivedTimeFromKeyboardEvent;
|
|
const matcherMap = {
|
|
date: date_fns_1.isSameDay,
|
|
month: date_fns_1.isSameMonth,
|
|
year: date_fns_1.isSameYear,
|
|
quarter: date_fns_1.isSameQuarter
|
|
};
|
|
function makeWeekMatcher(firstDayOfWeek) {
|
|
return (sourceTime, patternTime) => {
|
|
// date-fns: 0 - Sunday
|
|
// naive-ui: 0 - Monday
|
|
const weekStartsOn = ((firstDayOfWeek + 1) % 7);
|
|
return (0, date_fns_1.isSameWeek)(sourceTime, patternTime, { weekStartsOn });
|
|
};
|
|
}
|
|
function matchDate(sourceTime, patternTime, type, firstDayOfWeek = 0) {
|
|
const matcher = type === 'week' ? makeWeekMatcher(firstDayOfWeek) : matcherMap[type];
|
|
return matcher(sourceTime, patternTime);
|
|
}
|
|
function dateOrWeekItem(time, monthTs, valueTs, currentTs, mode, firstDayOfWeek) {
|
|
if (mode === 'date') {
|
|
return dateItem(time, monthTs, valueTs, currentTs);
|
|
}
|
|
else {
|
|
return weekItem(time, monthTs, valueTs, currentTs, firstDayOfWeek);
|
|
}
|
|
}
|
|
// date item's valueTs can be a tuple since two date may show in one panel, so
|
|
// any matched value would make it shown as selected
|
|
function dateItem(time, monthTs, valueTs, currentTs) {
|
|
let inSpan = false;
|
|
let startOfSpan = false;
|
|
let endOfSpan = false;
|
|
if (Array.isArray(valueTs)) {
|
|
if (valueTs[0] < time && time < valueTs[1]) {
|
|
inSpan = true;
|
|
}
|
|
if (matchDate(valueTs[0], time, 'date'))
|
|
startOfSpan = true;
|
|
if (matchDate(valueTs[1], time, 'date'))
|
|
endOfSpan = true;
|
|
}
|
|
const selected = valueTs !== null &&
|
|
(Array.isArray(valueTs)
|
|
? matchDate(valueTs[0], time, 'date') ||
|
|
matchDate(valueTs[1], time, 'date')
|
|
: matchDate(valueTs, time, 'date'));
|
|
return {
|
|
type: 'date',
|
|
dateObject: {
|
|
date: (0, date_fns_1.getDate)(time),
|
|
month: (0, date_fns_1.getMonth)(time),
|
|
year: (0, date_fns_1.getYear)(time)
|
|
},
|
|
inCurrentMonth: (0, date_fns_1.isSameMonth)(time, monthTs),
|
|
isCurrentDate: matchDate(currentTs, time, 'date'),
|
|
inSpan,
|
|
inSelectedWeek: false,
|
|
startOfSpan,
|
|
endOfSpan,
|
|
selected,
|
|
ts: (0, date_fns_1.getTime)(time)
|
|
};
|
|
}
|
|
function getMonthString(month, monthFormat, locale) {
|
|
const date = Date.UTC(2000, month, 1);
|
|
return (0, date_fns_1.format)(date, monthFormat, { locale });
|
|
}
|
|
exports.getMonthString = getMonthString;
|
|
function getYearString(year, yearFormat, locale) {
|
|
const date = Date.UTC(year, 1, 1);
|
|
return (0, date_fns_1.format)(date, yearFormat, { locale });
|
|
}
|
|
exports.getYearString = getYearString;
|
|
function getQuarterString(quarter, quarterFormat, locale) {
|
|
const date = Date.UTC(2000, quarter * 3 - 2, 1);
|
|
return (0, date_fns_1.format)(date, quarterFormat, { locale });
|
|
}
|
|
exports.getQuarterString = getQuarterString;
|
|
function weekItem(time, monthTs, valueTs, currentTs, firstDayOfWeek) {
|
|
let inSpan = false;
|
|
let startOfSpan = false;
|
|
let endOfSpan = false;
|
|
if (Array.isArray(valueTs)) {
|
|
if (valueTs[0] < time && time < valueTs[1]) {
|
|
inSpan = true;
|
|
}
|
|
if (matchDate(valueTs[0], time, 'week', firstDayOfWeek))
|
|
startOfSpan = true;
|
|
if (matchDate(valueTs[1], time, 'week', firstDayOfWeek))
|
|
endOfSpan = true;
|
|
}
|
|
const inSelectedWeek = valueTs !== null &&
|
|
(Array.isArray(valueTs)
|
|
? matchDate(valueTs[0], time, 'week', firstDayOfWeek) ||
|
|
matchDate(valueTs[1], time, 'week', firstDayOfWeek)
|
|
: matchDate(valueTs, time, 'week', firstDayOfWeek));
|
|
return {
|
|
type: 'date',
|
|
dateObject: {
|
|
date: (0, date_fns_1.getDate)(time),
|
|
month: (0, date_fns_1.getMonth)(time),
|
|
year: (0, date_fns_1.getYear)(time)
|
|
},
|
|
inCurrentMonth: (0, date_fns_1.isSameMonth)(time, monthTs),
|
|
isCurrentDate: matchDate(currentTs, time, 'date'),
|
|
inSpan,
|
|
startOfSpan,
|
|
endOfSpan,
|
|
selected: false,
|
|
inSelectedWeek,
|
|
ts: (0, date_fns_1.getTime)(time)
|
|
};
|
|
}
|
|
function monthItem(monthTs, valueTs, currentTs, { monthFormat }) {
|
|
return {
|
|
type: 'month',
|
|
monthFormat,
|
|
dateObject: {
|
|
month: (0, date_fns_1.getMonth)(monthTs),
|
|
year: (0, date_fns_1.getYear)(monthTs)
|
|
},
|
|
isCurrent: (0, date_fns_1.isSameMonth)(currentTs, monthTs),
|
|
selected: valueTs !== null && matchDate(valueTs, monthTs, 'month'),
|
|
ts: (0, date_fns_1.getTime)(monthTs)
|
|
};
|
|
}
|
|
function yearItem(yearTs, valueTs, currentTs, { yearFormat }) {
|
|
return {
|
|
type: 'year',
|
|
yearFormat,
|
|
dateObject: {
|
|
year: (0, date_fns_1.getYear)(yearTs)
|
|
},
|
|
isCurrent: (0, date_fns_1.isSameYear)(currentTs, yearTs),
|
|
selected: valueTs !== null && matchDate(valueTs, yearTs, 'year'),
|
|
ts: (0, date_fns_1.getTime)(yearTs)
|
|
};
|
|
}
|
|
function quarterItem(quarterTs, valueTs, currentTs, { quarterFormat }) {
|
|
return {
|
|
type: 'quarter',
|
|
quarterFormat,
|
|
dateObject: {
|
|
quarter: (0, date_fns_1.getQuarter)(quarterTs),
|
|
year: (0, date_fns_1.getYear)(quarterTs)
|
|
},
|
|
isCurrent: (0, date_fns_1.isSameQuarter)(currentTs, quarterTs),
|
|
selected: valueTs !== null && matchDate(valueTs, quarterTs, 'quarter'),
|
|
ts: (0, date_fns_1.getTime)(quarterTs)
|
|
};
|
|
}
|
|
/**
|
|
* Given time to display calendar, given the selected time, given current time,
|
|
* return the date array of display time's month.
|
|
*/
|
|
function dateArray(monthTs, valueTs, currentTs, startDay, strip = false, weekMode = false) {
|
|
const granularity = weekMode ? 'week' : 'date';
|
|
const displayMonth = (0, date_fns_1.getMonth)(monthTs);
|
|
// First day of current month
|
|
let displayMonthIterator = (0, date_fns_1.getTime)((0, date_fns_1.startOfMonth)(monthTs));
|
|
// Last day of last month
|
|
let lastMonthIterator = (0, date_fns_1.getTime)((0, date_fns_1.addDays)(displayMonthIterator, -1));
|
|
const calendarDays = [];
|
|
let protectLastMonthDateIsShownFlag = !strip;
|
|
while ((0, date_fns_1.getDay)(lastMonthIterator) !== startDay ||
|
|
protectLastMonthDateIsShownFlag) {
|
|
calendarDays.unshift(dateOrWeekItem(lastMonthIterator, monthTs, valueTs, currentTs, granularity, startDay));
|
|
lastMonthIterator = (0, date_fns_1.getTime)((0, date_fns_1.addDays)(lastMonthIterator, -1));
|
|
protectLastMonthDateIsShownFlag = false;
|
|
}
|
|
while ((0, date_fns_1.getMonth)(displayMonthIterator) === displayMonth) {
|
|
calendarDays.push(dateOrWeekItem(displayMonthIterator, monthTs, valueTs, currentTs, granularity, startDay));
|
|
displayMonthIterator = (0, date_fns_1.getTime)((0, date_fns_1.addDays)(displayMonthIterator, 1));
|
|
}
|
|
const endIndex = strip
|
|
? calendarDays.length <= 28
|
|
? 28
|
|
: calendarDays.length <= 35
|
|
? 35
|
|
: 42
|
|
: 42;
|
|
while (calendarDays.length < endIndex) {
|
|
calendarDays.push(dateOrWeekItem(displayMonthIterator, monthTs, valueTs, currentTs, granularity, startDay));
|
|
displayMonthIterator = (0, date_fns_1.getTime)((0, date_fns_1.addDays)(displayMonthIterator, 1));
|
|
}
|
|
return calendarDays;
|
|
}
|
|
exports.dateArray = dateArray;
|
|
function monthArray(yearAnchorTs, valueTs, currentTs, format) {
|
|
const calendarMonths = [];
|
|
const yearStart = (0, date_fns_1.startOfYear)(yearAnchorTs);
|
|
for (let i = 0; i < 12; i++) {
|
|
calendarMonths.push(monthItem((0, date_fns_1.getTime)((0, date_fns_1.addMonths)(yearStart, i)), valueTs, currentTs, format));
|
|
}
|
|
return calendarMonths;
|
|
}
|
|
exports.monthArray = monthArray;
|
|
function quarterArray(yearAnchorTs, valueTs, currentTs, format) {
|
|
const calendarQuarters = [];
|
|
const yearStart = (0, date_fns_1.startOfYear)(yearAnchorTs);
|
|
for (let i = 0; i < 4; i++) {
|
|
calendarQuarters.push(quarterItem((0, date_fns_1.getTime)((0, date_fns_1.addQuarters)(yearStart, i)), valueTs, currentTs, format));
|
|
}
|
|
return calendarQuarters;
|
|
}
|
|
exports.quarterArray = quarterArray;
|
|
function yearArray(valueTs, currentTs, format) {
|
|
const calendarYears = [];
|
|
const time1900 = new Date(config_1.START_YEAR, 0, 1);
|
|
// 1900 is not a round time, so we use 1911 as start...
|
|
// new Date(1900, 0, 1)
|
|
// 1899-12-31T15:54:17.000Z
|
|
for (let i = 0; i < 200; i++) {
|
|
calendarYears.push(yearItem((0, date_fns_1.getTime)((0, date_fns_1.addYears)(time1900, i)), valueTs, currentTs, format));
|
|
}
|
|
return calendarYears;
|
|
}
|
|
exports.yearArray = yearArray;
|
|
function strictParse(string, pattern, backup, option) {
|
|
const result = (0, date_fns_1.parse)(string, pattern, backup, option);
|
|
if (!(0, date_fns_1.isValid)(result))
|
|
return result;
|
|
else if ((0, date_fns_1.format)(result, pattern, option) === string)
|
|
return result;
|
|
else
|
|
return new Date(NaN);
|
|
}
|
|
exports.strictParse = strictParse;
|
|
function getDefaultTime(timeValue) {
|
|
if (timeValue === undefined) {
|
|
return undefined;
|
|
}
|
|
if (typeof timeValue === 'number') {
|
|
return timeValue;
|
|
}
|
|
const [hour, minute, second] = timeValue.split(':');
|
|
return {
|
|
hours: Number(hour),
|
|
minutes: Number(minute),
|
|
seconds: Number(second)
|
|
};
|
|
}
|
|
exports.getDefaultTime = getDefaultTime;
|
|
function pluckValueFromRange(value, type) {
|
|
return Array.isArray(value) ? value[type === 'start' ? 0 : 1] : null;
|
|
}
|
|
exports.pluckValueFromRange = pluckValueFromRange;
|