UNPKG

baseui

Version:

A React Component library implementing the Base design language

381 lines (377 loc) • 17.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /* Copyright (c) Uber Technologies, Inc. This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree. */ const MINUTE = 60; const HOUR = MINUTE * 60; class DateHelpers { constructor(_adapter) { _defineProperty(this, "adapter", void 0); _defineProperty(this, "cloneAdapter", (adapter, updateOptionsBase) => { const adapterMap = { // all utils classes set the arguments passed into their constructor as public members in some way // it just varies by class, most just set formats and locale, but this handles the exceptions MomentUtils: { formats: { monthNumber: 'M', dayOfMonthNumber: 'D', fullOrdinalWeek: 'dddd, MMMM Do YYYY', slashDate: 'YYYY/MM/DD', weekday: 'dddd', // moment does not have a similar 'single character' weekday format like the other libraries // the format below will only supply two character abbreviations. weekdaymin: 'dd', quarter: '[Q]Q' } }, DateFnsUtils: { formats: { monthNumber: 'M', dayOfMonthNumber: 'd', weekday: 'EEEE', weekdaymin: 'EEEEEE', slashDate: 'yyyy/MM/dd', fullOrdinalWeek: 'EEEE, MMMM do yyyy', quarter: 'QQQ' } }, LuxonUtils: { formats: { monthNumber: 'M', dayOfMonthNumber: 'd', weekday: 'EEEE', weekdaymin: 'EEEEE', slashDate: 'yyyy/MM/dd', fullOrdinalWeek: 'EEEE, MMMM dd yyyy', quarter: 'Qq' } } }; // @ts-ignore const defaultGetOptions = instance => ({ formats: instance.formats, locale: instance.locale }); const updateOptions = updateOptionsBase || defaultGetOptions; // eslint-disable-next-line @typescript-eslint/no-explicit-any const UtilsClass = adapter.constructor; const className = adapter.constructor.name; // This ensures that if the adapter class isn't // supported it just falls back the default formats // NOTE: in e2e tests playwright seems to add // a JSHandle wrapping class to all objects // so className always resolves to JSHandle:e // and if falls back to the default // if we want to test other adapter implementation // in e2e tests down the road, we're going to have // to figure that out const { getOptions = defaultGetOptions, formats } = // @ts-ignore adapterMap[className] || adapterMap.DateFnsUtils; const options = getOptions(adapter); return new UtilsClass(Object.assign({}, updateOptions(Object.assign({}, options, { formats: Object.assign({}, options.formats, formats) })))); }); // eslint-disable-next-line @typescript-eslint/no-explicit-any _defineProperty(this, "format", (date, format, locale) => { const adapter = locale ? this.getAdapterWithNewLocale(locale) : this.adapter; return adapter.format(date, format); }); _defineProperty(this, "getAdapterWithNewLocale", locale => { return this.cloneAdapter(this.adapter, options => ({ ...options, locale })); }); _defineProperty(this, "date", date => this.adapter.date(date)); _defineProperty(this, "dateToSeconds", date => { const seconds = this.adapter.getSeconds(date); const minutes = this.adapter.getMinutes(date) * MINUTE; const hours = this.adapter.getHours(date) * HOUR; return seconds + minutes + hours; }); _defineProperty(this, "secondsToHourMinute", seconds => { const d = this.adapter.toJsDate(this.adapter.date(seconds * 1000)); return [d.getUTCHours(), d.getUTCMinutes()]; }); _defineProperty(this, "differenceInCalendarMonths", (fromDate, toDate) => { var yearDiff = this.adapter.getYear(fromDate) - this.adapter.getYear(toDate); var monthDiff = this.adapter.getMonth(fromDate) - this.adapter.getMonth(toDate); return yearDiff * 12 + monthDiff; }); // eslint-disable-next-line @typescript-eslint/no-explicit-any _defineProperty(this, "getStartOfWeek", (date, locale) => { const adapter = locale ? this.getAdapterWithNewLocale(locale) : this.adapter; // rewrapping this date here ensures that the locale will be taken into account in all adapters return adapter.startOfWeek(adapter.date(date)); }); // eslint-disable-next-line @typescript-eslint/no-explicit-any _defineProperty(this, "formatDate", (date, formatString, locale) => { const adapter = locale ? this.getAdapterWithNewLocale(locale) : this.adapter; return adapter.formatByString(date, formatString); }); // eslint-disable-next-line @typescript-eslint/no-explicit-any _defineProperty(this, "getWeekdayMinInLocale", (date, locale) => { return this.getAdapterWithNewLocale(locale).format(date, 'weekdaymin'); }); // eslint-disable-next-line @typescript-eslint/no-explicit-any _defineProperty(this, "getMonthInLocale", (monthNumber, locale) => { const localeAdapter = this.getAdapterWithNewLocale(locale); return localeAdapter.format(localeAdapter.setMonth(localeAdapter.date(), monthNumber), 'month'); }); // eslint-disable-next-line @typescript-eslint/no-explicit-any _defineProperty(this, "getWeekdayInLocale", (date, locale) => { return this.getAdapterWithNewLocale(locale).format(date, 'weekday'); }); // eslint-disable-next-line @typescript-eslint/no-explicit-any _defineProperty(this, "getQuarterInLocale", (quarterNumber, locale) => { const localeAdapter = this.getAdapterWithNewLocale(locale); return localeAdapter.format(localeAdapter.setMonth(localeAdapter.date(), quarterNumber * 3), 'quarter'); }); _defineProperty(this, "getEndOfWeek", date => { return this.adapter.endOfWeek(date); }); _defineProperty(this, "getDay", date => { return Number(this.adapter.formatByString(date, 'e')) - 1; }); _defineProperty(this, "addWeeks", (date, weekNumber) => { return this.adapter.addDays(date, weekNumber * 7); }); _defineProperty(this, "subWeeks", (date, weekNumber) => { return this.addWeeks(date, weekNumber * -1); }); _defineProperty(this, "addYears", (date, yearNumber) => { return this.adapter.addMonths(date, yearNumber * 12); }); _defineProperty(this, "subYears", (date, yearNumber) => { return this.addYears(date, yearNumber * -1); }); _defineProperty(this, "isSameYear", (fromDate, toDate) => { if (fromDate && toDate) { return this.adapter.isSameYear(fromDate, toDate); } return false; }); _defineProperty(this, "isStartOfMonth", date => { return this.adapter.isSameDay(date, this.adapter.startOfMonth(date)); }); _defineProperty(this, "isEndOfMonth", date => { return this.adapter.isSameDay(date, this.adapter.endOfMonth(date)); }); _defineProperty(this, "isDayInRange", (date, startDate, endDate) => { return this.adapter.isWithinRange(date, [startDate, endDate]); }); _defineProperty(this, "isSameDay", (fromDate, toDate) => { if (fromDate && toDate) { return this.adapter.isSameDay(fromDate, toDate); } return false; }); _defineProperty(this, "isSameMonth", (fromDate, toDate) => { if (fromDate && toDate) { return this.adapter.isSameMonth(fromDate, toDate); } return false; }); _defineProperty(this, "dateRangeIncludesDates", (dateRange, dates) => { const [startDate, endDate] = dateRange; if (startDate && endDate && Array.isArray(dates) && dates.length) { for (let i = 0; i < dates.length; i++) { const day = dates[i]; if (this.isDayInRange(day, startDate, endDate)) { return true; } } } return false; }); _defineProperty(this, "subDays", (date, days) => { return this.adapter.addDays(date, days * -1); }); _defineProperty(this, "subMonths", (date, months) => { return this.adapter.addMonths(date, months * -1); }); _defineProperty(this, "min", dates => { return dates.reduce((minDate, date) => { return this.adapter.isBefore(date, minDate) ? date : minDate; }); }); _defineProperty(this, "max", dates => { return dates.reduce((maxDate, date) => { return this.adapter.isAfter(date, maxDate) ? date : maxDate; }); }); _defineProperty(this, "getEffectiveMinDate", ({ minDate, includeDates }) => { if (includeDates && minDate) { let minDates = includeDates.filter(includeDate => this.isOnOrAfterDay(includeDate, minDate)); return this.min(minDates); } else if (includeDates && includeDates.length) { return this.min(includeDates); } else if (!(includeDates && includeDates.length) && minDate) { return minDate; } // this condition can't ever be reached // but flow isn't smart enough to see that all of the conditions are covered return this.adapter.date(); }); _defineProperty(this, "getEffectiveMaxDate", ({ maxDate, includeDates }) => { if (includeDates && maxDate) { let maxDates = includeDates.filter(includeDate => this.isOnOrBeforeDay(includeDate, maxDate)); return this.max(maxDates); } else if (includeDates) { return this.max(includeDates); } else if (!includeDates && maxDate) { return maxDate; } // this condition can't ever be reached // but flow isn't smart enough to see that all of the conditions are covered return this.adapter.date(); }); _defineProperty(this, "monthDisabledBefore", (day, { minDate, includeDates } = {}) => { const previousMonth = this.subMonths(day, 1); return !!minDate && this.differenceInCalendarMonths(minDate, previousMonth) > 0 || !!includeDates && includeDates.every(includeDate => this.differenceInCalendarMonths(includeDate, previousMonth) > 0) || false; }); _defineProperty(this, "monthDisabledAfter", (day, { maxDate, includeDates } = {}) => { const nextMonth = this.adapter.addMonths(day, 1); return !!maxDate && this.differenceInCalendarMonths(nextMonth, maxDate) > 0 || !!includeDates && includeDates.every(includeDate => this.differenceInCalendarMonths(nextMonth, includeDate) > 0) || false; }); _defineProperty(this, "setDate", (date, dayNumber) => { const startOfMonthNoTime = this.adapter.startOfMonth(date); const startOfMonthHoursAndMinutes = this.adapter.mergeDateAndTime(startOfMonthNoTime, date); const startOfMonth = this.adapter.setSeconds(startOfMonthHoursAndMinutes, this.adapter.getSeconds(date)); return this.adapter.addDays(startOfMonth, dayNumber - 1); }); _defineProperty(this, "getDate", date => Number(this.adapter.format(date, 'dayOfMonthNumber'))); _defineProperty(this, "applyDateToTime", (time, date) => { if (!time) return date; const yearNumber = this.adapter.getYear(date); const monthNumber = this.adapter.getMonth(date); const dayNumber = this.getDate(date); const yearDate = this.adapter.setYear(time, yearNumber); const monthDate = this.adapter.setMonth(yearDate, monthNumber); return this.setDate(monthDate, dayNumber); }); _defineProperty(this, "applyTimeToDate", (date, time) => { if (!date) return time; return this.adapter.setSeconds(this.adapter.mergeDateAndTime(date, time), 0); }); _defineProperty(this, "isDayDisabled", (day, { minDate, maxDate, excludeDates, includeDates, filterDate } = {}) => { return this.isOutOfBounds(day, { minDate, maxDate }) || excludeDates && excludeDates.some(excludeDate => this.adapter.isSameDay(day, excludeDate)) || includeDates && !includeDates.some(includeDate => this.adapter.isSameDay(day, includeDate)) || filterDate && !filterDate(day) || false; }); //Tue Apr 12 2011 00:00:00 GMT-0500, Tue Apr 12 2011 11:21:31 GMT-0500 _defineProperty(this, "isOnOrAfterDay", (fromDate, toDate) => { if (this.adapter.isSameDay(fromDate, toDate)) { return true; } return this.adapter.isAfter(fromDate, toDate); }); _defineProperty(this, "isOnOrBeforeDay", (fromDate, toDate) => { if (this.adapter.isSameDay(fromDate, toDate)) { return true; } return this.adapter.isBefore(fromDate, toDate); }); _defineProperty(this, "isOutOfBounds", (day, { minDate, maxDate } = {}) => { return !!minDate && !this.isOnOrAfterDay(day, minDate) || !!maxDate && !this.isOnOrBeforeDay(day, maxDate); }); // eslint-disable-next-line @typescript-eslint/no-explicit-any _defineProperty(this, "parseString", (string, formatString, locale) => { const adapter = locale ? this.getAdapterWithNewLocale(locale) : this.adapter; return adapter.parse(string, formatString); }); // eslint-disable-next-line @typescript-eslint/no-explicit-any _defineProperty(this, "parse", (string, format, locale) => { const adapter = locale ? this.getAdapterWithNewLocale(locale) : this.adapter; return adapter.parse(string, adapter.formats[format]); }); _defineProperty(this, "setMilliseconds", (date, milliseconds) => { return this.adapter.date(this.adapter.getSeconds(this.adapter.startOfDay(date)) * 1000 + milliseconds); }); _defineProperty(this, "set", (date, values) => { let updatedDate = date; if (values.year != null) { updatedDate = this.setYear(updatedDate, values.year); } if (values.month != null) { updatedDate = this.setMonth(updatedDate, values.month); } if (values.date != null) { updatedDate = this.setDate(updatedDate, Number(values.date)); } if (values.hours != null) { updatedDate = this.setHours(updatedDate, Number(values.hours)); } if (values.minutes != null) { updatedDate = this.setMinutes(updatedDate, Number(values.minutes)); } if (values.seconds != null) { updatedDate = this.setSeconds(updatedDate, Number(values.seconds)); } return updatedDate; }); _defineProperty(this, "getQuarter", date => { return Math.floor(this.getMonth(date) / 3) + 1; }); _defineProperty(this, "setSeconds", (date, seconds) => this.adapter.setSeconds(date, seconds)); _defineProperty(this, "setMinutes", (date, minutes) => this.adapter.setMinutes(date, minutes)); _defineProperty(this, "setHours", (date, hours) => this.adapter.setHours(date, hours)); _defineProperty(this, "setMonth", (date, monthNumber) => this.adapter.setMonth(date, monthNumber)); _defineProperty(this, "setYear", (date, yearNumber) => this.adapter.setYear(date, yearNumber)); _defineProperty(this, "startOfDay", date => { return this.adapter.startOfDay(date); }); _defineProperty(this, "getMinutes", date => this.adapter.getMinutes(date)); _defineProperty(this, "getHours", date => this.adapter.getHours(date)); _defineProperty(this, "getMonth", date => this.adapter.getMonth(date)); _defineProperty(this, "getYear", date => this.adapter.getYear(date)); _defineProperty(this, "getStartOfMonth", date => this.adapter.startOfMonth(date)); _defineProperty(this, "getEndOfMonth", date => this.adapter.endOfMonth(date)); _defineProperty(this, "addDays", (date, days) => this.adapter.addDays(date, days)); _defineProperty(this, "addMonths", (date, months) => this.adapter.addMonths(date, months)); _defineProperty(this, "isBefore", (fromDate, toDate) => this.adapter.isBefore(fromDate, toDate)); _defineProperty(this, "isAfter", (fromDate, toDate) => this.adapter.isAfter(fromDate, toDate)); _defineProperty(this, "isEqual", (fromDate, toDate) => this.adapter.isEqual(fromDate, toDate)); _defineProperty(this, "isValid", possibleDate => { return this.adapter.isValid(possibleDate); }); this.adapter = this.cloneAdapter(_adapter); } } var _default = exports.default = DateHelpers;