@dnb/eufemia
Version:
DNB Eufemia Design System UI Library
187 lines (186 loc) • 6.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.convertStringToDate = convertStringToDate;
exports.correctV1Format = correctV1Format;
exports.dayOffset = dayOffset;
exports.getCalendar = getCalendar;
exports.getMonth = getMonth;
exports.getWeek = getWeek;
exports.isDisabled = isDisabledCalc;
exports.makeDayObject = makeDayObject;
exports.toRange = toRange;
require("core-js/modules/es.string.replace.js");
require("core-js/modules/web.dom-collections.iterator.js");
var _dateFns = require("date-fns");
var _componentHelper = require("../../shared/component-helper");
const calendarCache = {};
function makeDayObject(date, _ref) {
let {
startDate,
endDate,
hoverDate,
minDate,
maxDate,
month
} = _ref;
const range = getRange(startDate, endDate, hoverDate);
const isLastMonth = (0, _dateFns.isSameMonth)((0, _dateFns.subMonths)(date, 1), month);
const isNextMonth = (0, _dateFns.isSameMonth)((0, _dateFns.addMonths)(date, 1), month);
const isStartDate = isStartDateCalc(date, range);
const isEndDate = isEndDateCalc(date, range);
const isWithinSelection = isWithinSelectionCalc(date, startDate, endDate);
const isPreview = isPreviewCalc(date, startDate, endDate, hoverDate);
const isDisabled = isDisabledCalc(date, minDate, maxDate);
return {
date,
isToday: (0, _dateFns.isToday)(date),
isLastMonth,
isNextMonth,
isStartDate,
isEndDate,
isWithinSelection,
isPreview,
isDisabled,
isSelectable: !isLastMonth && !isNextMonth && !isDisabled,
isInactive: isLastMonth || isNextMonth || isDisabled
};
}
function getCalendar(month) {
let weekStartsOn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
let {
onlyMonth = false,
hideNextMonthWeek = false
} = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
const cacheKey = month.toISOString();
const thisMonth = getMonth(month);
if (onlyMonth) {
return calendarCache[cacheKey] = [...thisMonth];
}
if (calendarCache[cacheKey]) {
return calendarCache[cacheKey];
}
const firstDay = (7 + (0, _dateFns.getDay)((0, _dateFns.startOfMonth)(month)) - weekStartsOn) % 7;
const lastMonth = getMonth((0, _dateFns.subMonths)(month, 1), (0, _dateFns.getDaysInMonth)((0, _dateFns.subMonths)(month, 1)) - firstDay);
let fillCount = -1;
if (hideNextMonthWeek) {
fillCount = 35 - (thisMonth.length + firstDay);
}
if (fillCount < 0) {
fillCount = 42 - (thisMonth.length + firstDay);
}
const nextMonth = getMonth((0, _dateFns.addMonths)(month, 1), 0, fillCount > -1 ? fillCount : 0);
return calendarCache[cacheKey] = [...lastMonth, ...thisMonth, ...nextMonth];
}
function dayOffset(dayName) {
const week = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
return dayName ? week.indexOf(dayName.toLowerCase()) : 0;
}
function toRange(startDate, endDate) {
if ((0, _dateFns.isBefore)(endDate, startDate)) {
const _startDate = startDate;
startDate = endDate;
endDate = _startDate;
}
return {
startDate,
endDate
};
}
function getRange(startDate, endDate, hoverDate) {
if (startDate && endDate) {
return toRange(startDate, endDate);
} else if (startDate && hoverDate) {
return toRange(startDate, hoverDate);
} else {
return toRange(startDate, startDate);
}
}
function getWeek(weekStartsOn) {
const startDay = (0, _dateFns.startOfWeek)(new Date(), {
weekStartsOn
});
return Array(7).fill(1).map((value, i) => (0, _dateFns.addDays)(startDay, i));
}
function getMonth(month) {
let skip = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
let limit = arguments.length > 2 ? arguments[2] : undefined;
const startDay = (0, _dateFns.startOfMonth)(month);
let size = (0, _dateFns.getDaysInMonth)(month) - skip;
size = Math.min(Math.max(size, 0), limit > -1 ? limit : size);
size = size < 0 ? 0 : size;
return Array(size).fill(1).map((value, i) => (0, _dateFns.addDays)(startDay, i + skip));
}
function isWithinSelectionCalc(date, startDate, endDate) {
const {
startDate: start,
endDate: end
} = toRange(startDate, endDate);
return startDate && endDate ? (0, _dateFns.isValid)(start) && (0, _dateFns.isValid)(end) && (0, _dateFns.isWithinInterval)(date, {
start,
end
}) : false;
}
function isDisabledCalc(date, minDate, maxDate) {
return minDate && (0, _dateFns.isBefore)((0, _dateFns.startOfDay)(date), (0, _dateFns.startOfDay)(minDate)) || maxDate && (0, _dateFns.isAfter)((0, _dateFns.startOfDay)(date), (0, _dateFns.startOfDay)(maxDate));
}
function isStartDateCalc(date, range) {
return range.startDate && (0, _dateFns.isSameDay)(date, range.startDate);
}
function isEndDateCalc(date, range) {
return range.endDate && (0, _dateFns.isSameDay)(date, range.endDate);
}
function isPreviewCalc(date, startDate, endDate, hoverDate) {
const {
startDate: start,
endDate: end
} = toRange(startDate, hoverDate);
return startDate && !endDate && (0, _dateFns.isValid)(start) && (0, _dateFns.isValid)(end) && (0, _dateFns.isWithinInterval)(date, {
start,
end
});
}
function correctV1Format(date) {
if (/YYYY/.test(date) && /DD/.test(date)) {
(0, _componentHelper.warn)('You are using "YYYY-MM-DD" as the dateFormat or returnFormat? Please use "yyyy-MM-dd" instead!');
date = date.replace(/DD/, 'dd').replace(/YYYY/, 'yyyy');
}
return date;
}
function parseHumanDate(input) {
let humanDateFormats = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ['dd.MM.yyyy', 'dd/MM/yyyy', 'yyyy-MM-dd'];
for (const format of humanDateFormats) {
const parsed = (0, _dateFns.parse)(input, format, new Date());
if ((0, _dateFns.isValid)(parsed)) {
return parsed;
}
}
return null;
}
function convertStringToDate(date) {
let {
dateFormat = null
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
if (!date) {
return null;
}
let dateObject;
if (typeof date === 'string') {
dateObject = (0, _dateFns.parseISO)(date);
if (!(0, _dateFns.isValid)(dateObject)) {
dateObject = parseHumanDate(date);
}
if (dateFormat && !(0, _dateFns.isValid)(dateObject)) {
dateObject = parseHumanDate(date, [correctV1Format(dateFormat)]);
}
} else {
dateObject = (0, _dateFns.toDate)(date);
}
if (!(0, _dateFns.isValid)(dateObject)) {
(0, _componentHelper.warn)('convertStringToDate got invalid date:', date);
return null;
}
return dateObject;
}
//# sourceMappingURL=DatePickerCalc.js.map