557 lines
11 KiB
JavaScript
557 lines
11 KiB
JavaScript
|
// Utilities
|
||
|
import { createRange, padStart } from "../../../util/index.mjs"; // Types
|
||
|
const firstDay = {
|
||
|
'001': 1,
|
||
|
AD: 1,
|
||
|
AE: 6,
|
||
|
AF: 6,
|
||
|
AG: 0,
|
||
|
AI: 1,
|
||
|
AL: 1,
|
||
|
AM: 1,
|
||
|
AN: 1,
|
||
|
AR: 1,
|
||
|
AS: 0,
|
||
|
AT: 1,
|
||
|
AU: 1,
|
||
|
AX: 1,
|
||
|
AZ: 1,
|
||
|
BA: 1,
|
||
|
BD: 0,
|
||
|
BE: 1,
|
||
|
BG: 1,
|
||
|
BH: 6,
|
||
|
BM: 1,
|
||
|
BN: 1,
|
||
|
BR: 0,
|
||
|
BS: 0,
|
||
|
BT: 0,
|
||
|
BW: 0,
|
||
|
BY: 1,
|
||
|
BZ: 0,
|
||
|
CA: 0,
|
||
|
CH: 1,
|
||
|
CL: 1,
|
||
|
CM: 1,
|
||
|
CN: 1,
|
||
|
CO: 0,
|
||
|
CR: 1,
|
||
|
CY: 1,
|
||
|
CZ: 1,
|
||
|
DE: 1,
|
||
|
DJ: 6,
|
||
|
DK: 1,
|
||
|
DM: 0,
|
||
|
DO: 0,
|
||
|
DZ: 6,
|
||
|
EC: 1,
|
||
|
EE: 1,
|
||
|
EG: 6,
|
||
|
ES: 1,
|
||
|
ET: 0,
|
||
|
FI: 1,
|
||
|
FJ: 1,
|
||
|
FO: 1,
|
||
|
FR: 1,
|
||
|
GB: 1,
|
||
|
'GB-alt-variant': 0,
|
||
|
GE: 1,
|
||
|
GF: 1,
|
||
|
GP: 1,
|
||
|
GR: 1,
|
||
|
GT: 0,
|
||
|
GU: 0,
|
||
|
HK: 0,
|
||
|
HN: 0,
|
||
|
HR: 1,
|
||
|
HU: 1,
|
||
|
ID: 0,
|
||
|
IE: 1,
|
||
|
IL: 0,
|
||
|
IN: 0,
|
||
|
IQ: 6,
|
||
|
IR: 6,
|
||
|
IS: 1,
|
||
|
IT: 1,
|
||
|
JM: 0,
|
||
|
JO: 6,
|
||
|
JP: 0,
|
||
|
KE: 0,
|
||
|
KG: 1,
|
||
|
KH: 0,
|
||
|
KR: 0,
|
||
|
KW: 6,
|
||
|
KZ: 1,
|
||
|
LA: 0,
|
||
|
LB: 1,
|
||
|
LI: 1,
|
||
|
LK: 1,
|
||
|
LT: 1,
|
||
|
LU: 1,
|
||
|
LV: 1,
|
||
|
LY: 6,
|
||
|
MC: 1,
|
||
|
MD: 1,
|
||
|
ME: 1,
|
||
|
MH: 0,
|
||
|
MK: 1,
|
||
|
MM: 0,
|
||
|
MN: 1,
|
||
|
MO: 0,
|
||
|
MQ: 1,
|
||
|
MT: 0,
|
||
|
MV: 5,
|
||
|
MX: 0,
|
||
|
MY: 1,
|
||
|
MZ: 0,
|
||
|
NI: 0,
|
||
|
NL: 1,
|
||
|
NO: 1,
|
||
|
NP: 0,
|
||
|
NZ: 1,
|
||
|
OM: 6,
|
||
|
PA: 0,
|
||
|
PE: 0,
|
||
|
PH: 0,
|
||
|
PK: 0,
|
||
|
PL: 1,
|
||
|
PR: 0,
|
||
|
PT: 0,
|
||
|
PY: 0,
|
||
|
QA: 6,
|
||
|
RE: 1,
|
||
|
RO: 1,
|
||
|
RS: 1,
|
||
|
RU: 1,
|
||
|
SA: 0,
|
||
|
SD: 6,
|
||
|
SE: 1,
|
||
|
SG: 0,
|
||
|
SI: 1,
|
||
|
SK: 1,
|
||
|
SM: 1,
|
||
|
SV: 0,
|
||
|
SY: 6,
|
||
|
TH: 0,
|
||
|
TJ: 1,
|
||
|
TM: 1,
|
||
|
TR: 1,
|
||
|
TT: 0,
|
||
|
TW: 0,
|
||
|
UA: 1,
|
||
|
UM: 0,
|
||
|
US: 0,
|
||
|
UY: 1,
|
||
|
UZ: 1,
|
||
|
VA: 1,
|
||
|
VE: 0,
|
||
|
VI: 0,
|
||
|
VN: 1,
|
||
|
WS: 0,
|
||
|
XK: 1,
|
||
|
YE: 0,
|
||
|
ZA: 0,
|
||
|
ZW: 0
|
||
|
};
|
||
|
function getWeekArray(date, locale) {
|
||
|
const weeks = [];
|
||
|
let currentWeek = [];
|
||
|
const firstDayOfMonth = startOfMonth(date);
|
||
|
const lastDayOfMonth = endOfMonth(date);
|
||
|
const firstDayWeekIndex = (firstDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()] + 7) % 7;
|
||
|
const lastDayWeekIndex = (lastDayOfMonth.getDay() - firstDay[locale.slice(-2).toUpperCase()] + 7) % 7;
|
||
|
for (let i = 0; i < firstDayWeekIndex; i++) {
|
||
|
const adjacentDay = new Date(firstDayOfMonth);
|
||
|
adjacentDay.setDate(adjacentDay.getDate() - (firstDayWeekIndex - i));
|
||
|
currentWeek.push(adjacentDay);
|
||
|
}
|
||
|
for (let i = 1; i <= lastDayOfMonth.getDate(); i++) {
|
||
|
const day = new Date(date.getFullYear(), date.getMonth(), i);
|
||
|
|
||
|
// Add the day to the current week
|
||
|
currentWeek.push(day);
|
||
|
|
||
|
// If the current week has 7 days, add it to the weeks array and start a new week
|
||
|
if (currentWeek.length === 7) {
|
||
|
weeks.push(currentWeek);
|
||
|
currentWeek = [];
|
||
|
}
|
||
|
}
|
||
|
for (let i = 1; i < 7 - lastDayWeekIndex; i++) {
|
||
|
const adjacentDay = new Date(lastDayOfMonth);
|
||
|
adjacentDay.setDate(adjacentDay.getDate() + i);
|
||
|
currentWeek.push(adjacentDay);
|
||
|
}
|
||
|
if (currentWeek.length > 0) {
|
||
|
weeks.push(currentWeek);
|
||
|
}
|
||
|
return weeks;
|
||
|
}
|
||
|
function startOfWeek(date) {
|
||
|
const d = new Date(date);
|
||
|
while (d.getDay() !== 0) {
|
||
|
d.setDate(d.getDate() - 1);
|
||
|
}
|
||
|
return d;
|
||
|
}
|
||
|
function endOfWeek(date) {
|
||
|
const d = new Date(date);
|
||
|
while (d.getDay() !== 6) {
|
||
|
d.setDate(d.getDate() + 1);
|
||
|
}
|
||
|
return d;
|
||
|
}
|
||
|
function startOfMonth(date) {
|
||
|
return new Date(date.getFullYear(), date.getMonth(), 1);
|
||
|
}
|
||
|
function endOfMonth(date) {
|
||
|
return new Date(date.getFullYear(), date.getMonth() + 1, 0);
|
||
|
}
|
||
|
function parseLocalDate(value) {
|
||
|
const parts = value.split('-').map(Number);
|
||
|
|
||
|
// new Date() uses local time zone when passing individual date component values
|
||
|
return new Date(parts[0], parts[1] - 1, parts[2]);
|
||
|
}
|
||
|
const _YYYMMDD = /^([12]\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\d|3[01]))$/;
|
||
|
function date(value) {
|
||
|
if (value == null) return new Date();
|
||
|
if (value instanceof Date) return value;
|
||
|
if (typeof value === 'string') {
|
||
|
let parsed;
|
||
|
if (_YYYMMDD.test(value)) {
|
||
|
return parseLocalDate(value);
|
||
|
} else {
|
||
|
parsed = Date.parse(value);
|
||
|
}
|
||
|
if (!isNaN(parsed)) return new Date(parsed);
|
||
|
}
|
||
|
return null;
|
||
|
}
|
||
|
const sundayJanuarySecond2000 = new Date(2000, 0, 2);
|
||
|
function getWeekdays(locale) {
|
||
|
const daysFromSunday = firstDay[locale.slice(-2).toUpperCase()];
|
||
|
return createRange(7).map(i => {
|
||
|
const weekday = new Date(sundayJanuarySecond2000);
|
||
|
weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
|
||
|
return new Intl.DateTimeFormat(locale, {
|
||
|
weekday: 'narrow'
|
||
|
}).format(weekday);
|
||
|
});
|
||
|
}
|
||
|
function format(value, formatString, locale, formats) {
|
||
|
const newDate = date(value) ?? new Date();
|
||
|
const customFormat = formats?.[formatString];
|
||
|
if (typeof customFormat === 'function') {
|
||
|
return customFormat(newDate, formatString, locale);
|
||
|
}
|
||
|
let options = {};
|
||
|
switch (formatString) {
|
||
|
case 'fullDateWithWeekday':
|
||
|
options = {
|
||
|
weekday: 'long',
|
||
|
day: 'numeric',
|
||
|
month: 'long',
|
||
|
year: 'numeric'
|
||
|
};
|
||
|
break;
|
||
|
case 'hours12h':
|
||
|
options = {
|
||
|
hour: 'numeric',
|
||
|
hour12: true
|
||
|
};
|
||
|
break;
|
||
|
case 'normalDateWithWeekday':
|
||
|
options = {
|
||
|
weekday: 'short',
|
||
|
day: 'numeric',
|
||
|
month: 'short'
|
||
|
};
|
||
|
break;
|
||
|
case 'keyboardDate':
|
||
|
options = {
|
||
|
day: '2-digit',
|
||
|
month: '2-digit',
|
||
|
year: 'numeric'
|
||
|
};
|
||
|
break;
|
||
|
case 'monthAndDate':
|
||
|
options = {
|
||
|
month: 'long',
|
||
|
day: 'numeric'
|
||
|
};
|
||
|
break;
|
||
|
case 'monthAndYear':
|
||
|
options = {
|
||
|
month: 'long',
|
||
|
year: 'numeric'
|
||
|
};
|
||
|
break;
|
||
|
case 'month':
|
||
|
options = {
|
||
|
month: 'long'
|
||
|
};
|
||
|
break;
|
||
|
case 'monthShort':
|
||
|
options = {
|
||
|
month: 'short'
|
||
|
};
|
||
|
break;
|
||
|
case 'dayOfMonth':
|
||
|
return new Intl.NumberFormat(locale).format(newDate.getDate());
|
||
|
case 'shortDate':
|
||
|
options = {
|
||
|
year: '2-digit',
|
||
|
month: 'numeric',
|
||
|
day: 'numeric'
|
||
|
};
|
||
|
break;
|
||
|
case 'weekdayShort':
|
||
|
options = {
|
||
|
weekday: 'short'
|
||
|
};
|
||
|
break;
|
||
|
case 'year':
|
||
|
options = {
|
||
|
year: 'numeric'
|
||
|
};
|
||
|
break;
|
||
|
default:
|
||
|
options = customFormat ?? {
|
||
|
timeZone: 'UTC',
|
||
|
timeZoneName: 'short'
|
||
|
};
|
||
|
}
|
||
|
return new Intl.DateTimeFormat(locale, options).format(newDate);
|
||
|
}
|
||
|
function toISO(adapter, value) {
|
||
|
const date = adapter.toJsDate(value);
|
||
|
const year = date.getFullYear();
|
||
|
const month = padStart(String(date.getMonth() + 1), 2, '0');
|
||
|
const day = padStart(String(date.getDate()), 2, '0');
|
||
|
return `${year}-${month}-${day}`;
|
||
|
}
|
||
|
function parseISO(value) {
|
||
|
const [year, month, day] = value.split('-').map(Number);
|
||
|
return new Date(year, month - 1, day);
|
||
|
}
|
||
|
function addMinutes(date, amount) {
|
||
|
const d = new Date(date);
|
||
|
d.setMinutes(d.getMinutes() + amount);
|
||
|
return d;
|
||
|
}
|
||
|
function addHours(date, amount) {
|
||
|
const d = new Date(date);
|
||
|
d.setHours(d.getHours() + amount);
|
||
|
return d;
|
||
|
}
|
||
|
function addDays(date, amount) {
|
||
|
const d = new Date(date);
|
||
|
d.setDate(d.getDate() + amount);
|
||
|
return d;
|
||
|
}
|
||
|
function addWeeks(date, amount) {
|
||
|
const d = new Date(date);
|
||
|
d.setDate(d.getDate() + amount * 7);
|
||
|
return d;
|
||
|
}
|
||
|
function addMonths(date, amount) {
|
||
|
const d = new Date(date);
|
||
|
d.setMonth(d.getMonth() + amount);
|
||
|
return d;
|
||
|
}
|
||
|
function getYear(date) {
|
||
|
return date.getFullYear();
|
||
|
}
|
||
|
function getMonth(date) {
|
||
|
return date.getMonth();
|
||
|
}
|
||
|
function getNextMonth(date) {
|
||
|
return new Date(date.getFullYear(), date.getMonth() + 1, 1);
|
||
|
}
|
||
|
function getHours(date) {
|
||
|
return date.getHours();
|
||
|
}
|
||
|
function getMinutes(date) {
|
||
|
return date.getMinutes();
|
||
|
}
|
||
|
function startOfYear(date) {
|
||
|
return new Date(date.getFullYear(), 0, 1);
|
||
|
}
|
||
|
function endOfYear(date) {
|
||
|
return new Date(date.getFullYear(), 11, 31);
|
||
|
}
|
||
|
function isWithinRange(date, range) {
|
||
|
return isAfter(date, range[0]) && isBefore(date, range[1]);
|
||
|
}
|
||
|
function isValid(date) {
|
||
|
const d = new Date(date);
|
||
|
return d instanceof Date && !isNaN(d.getTime());
|
||
|
}
|
||
|
function isAfter(date, comparing) {
|
||
|
return date.getTime() > comparing.getTime();
|
||
|
}
|
||
|
function isBefore(date, comparing) {
|
||
|
return date.getTime() < comparing.getTime();
|
||
|
}
|
||
|
function isEqual(date, comparing) {
|
||
|
return date.getTime() === comparing.getTime();
|
||
|
}
|
||
|
function isSameDay(date, comparing) {
|
||
|
return date.getDate() === comparing.getDate() && date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
|
||
|
}
|
||
|
function isSameMonth(date, comparing) {
|
||
|
return date.getMonth() === comparing.getMonth() && date.getFullYear() === comparing.getFullYear();
|
||
|
}
|
||
|
function getDiff(date, comparing, unit) {
|
||
|
const d = new Date(date);
|
||
|
const c = new Date(comparing);
|
||
|
if (unit === 'month') {
|
||
|
return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12;
|
||
|
}
|
||
|
return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));
|
||
|
}
|
||
|
function setHours(date, count) {
|
||
|
const d = new Date(date);
|
||
|
d.setHours(count);
|
||
|
return d;
|
||
|
}
|
||
|
function setMinutes(date, count) {
|
||
|
const d = new Date(date);
|
||
|
d.setMinutes(count);
|
||
|
return d;
|
||
|
}
|
||
|
function setMonth(date, count) {
|
||
|
const d = new Date(date);
|
||
|
d.setMonth(count);
|
||
|
return d;
|
||
|
}
|
||
|
function setYear(date, year) {
|
||
|
const d = new Date(date);
|
||
|
d.setFullYear(year);
|
||
|
return d;
|
||
|
}
|
||
|
function startOfDay(date) {
|
||
|
return new Date(date.getFullYear(), date.getMonth(), date.getDate());
|
||
|
}
|
||
|
function endOfDay(date) {
|
||
|
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);
|
||
|
}
|
||
|
export class VuetifyDateAdapter {
|
||
|
constructor(options) {
|
||
|
this.locale = options.locale;
|
||
|
this.formats = options.formats;
|
||
|
}
|
||
|
date(value) {
|
||
|
return date(value);
|
||
|
}
|
||
|
toJsDate(date) {
|
||
|
return date;
|
||
|
}
|
||
|
toISO(date) {
|
||
|
return toISO(this, date);
|
||
|
}
|
||
|
parseISO(date) {
|
||
|
return parseISO(date);
|
||
|
}
|
||
|
addMinutes(date, amount) {
|
||
|
return addMinutes(date, amount);
|
||
|
}
|
||
|
addHours(date, amount) {
|
||
|
return addHours(date, amount);
|
||
|
}
|
||
|
addDays(date, amount) {
|
||
|
return addDays(date, amount);
|
||
|
}
|
||
|
addWeeks(date, amount) {
|
||
|
return addWeeks(date, amount);
|
||
|
}
|
||
|
addMonths(date, amount) {
|
||
|
return addMonths(date, amount);
|
||
|
}
|
||
|
getWeekArray(date) {
|
||
|
return getWeekArray(date, this.locale);
|
||
|
}
|
||
|
startOfWeek(date) {
|
||
|
return startOfWeek(date);
|
||
|
}
|
||
|
endOfWeek(date) {
|
||
|
return endOfWeek(date);
|
||
|
}
|
||
|
startOfMonth(date) {
|
||
|
return startOfMonth(date);
|
||
|
}
|
||
|
endOfMonth(date) {
|
||
|
return endOfMonth(date);
|
||
|
}
|
||
|
format(date, formatString) {
|
||
|
return format(date, formatString, this.locale, this.formats);
|
||
|
}
|
||
|
isEqual(date, comparing) {
|
||
|
return isEqual(date, comparing);
|
||
|
}
|
||
|
isValid(date) {
|
||
|
return isValid(date);
|
||
|
}
|
||
|
isWithinRange(date, range) {
|
||
|
return isWithinRange(date, range);
|
||
|
}
|
||
|
isAfter(date, comparing) {
|
||
|
return isAfter(date, comparing);
|
||
|
}
|
||
|
isBefore(date, comparing) {
|
||
|
return !isAfter(date, comparing) && !isEqual(date, comparing);
|
||
|
}
|
||
|
isSameDay(date, comparing) {
|
||
|
return isSameDay(date, comparing);
|
||
|
}
|
||
|
isSameMonth(date, comparing) {
|
||
|
return isSameMonth(date, comparing);
|
||
|
}
|
||
|
setMinutes(date, count) {
|
||
|
return setMinutes(date, count);
|
||
|
}
|
||
|
setHours(date, count) {
|
||
|
return setHours(date, count);
|
||
|
}
|
||
|
setMonth(date, count) {
|
||
|
return setMonth(date, count);
|
||
|
}
|
||
|
setYear(date, year) {
|
||
|
return setYear(date, year);
|
||
|
}
|
||
|
getDiff(date, comparing, unit) {
|
||
|
return getDiff(date, comparing, unit);
|
||
|
}
|
||
|
getWeekdays() {
|
||
|
return getWeekdays(this.locale);
|
||
|
}
|
||
|
getYear(date) {
|
||
|
return getYear(date);
|
||
|
}
|
||
|
getMonth(date) {
|
||
|
return getMonth(date);
|
||
|
}
|
||
|
getNextMonth(date) {
|
||
|
return getNextMonth(date);
|
||
|
}
|
||
|
getHours(date) {
|
||
|
return getHours(date);
|
||
|
}
|
||
|
getMinutes(date) {
|
||
|
return getMinutes(date);
|
||
|
}
|
||
|
startOfDay(date) {
|
||
|
return startOfDay(date);
|
||
|
}
|
||
|
endOfDay(date) {
|
||
|
return endOfDay(date);
|
||
|
}
|
||
|
startOfYear(date) {
|
||
|
return startOfYear(date);
|
||
|
}
|
||
|
endOfYear(date) {
|
||
|
return endOfYear(date);
|
||
|
}
|
||
|
}
|
||
|
//# sourceMappingURL=vuetify.mjs.map
|