UNPKG

@dnb/eufemia

Version:

DNB Eufemia Design System UI Library

187 lines (186 loc) 6.62 kB
"use strict"; 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