@kelvininc/ui-components
Version:
Kelvin UI Components
116 lines (115 loc) • 5.75 kB
JavaScript
import dayjs from "dayjs";
import advancedFormat from "dayjs/plugin/advancedFormat";
import customParseFormat from "dayjs/plugin/customParseFormat";
import localeData from "dayjs/plugin/localeData";
import objectSupport from "dayjs/plugin/objectSupport";
import timezone from "dayjs/plugin/timezone";
import isBetween from "dayjs/plugin/isBetween";
import quarterOfYear from "dayjs/plugin/quarterOfYear";
import utc from "dayjs/plugin/utc";
import { TIMEZONES } from "./date.config";
dayjs.extend(quarterOfYear);
dayjs.extend(advancedFormat);
dayjs.extend(customParseFormat);
dayjs.extend(localeData);
dayjs.extend(objectSupport);
dayjs.extend(timezone);
dayjs.extend(isBetween);
dayjs.extend(utc);
/**
* Helper methods for date type display, parse, calculate and manipulation.
*
* @note The month number should be a number between 1 and 12, where 1 corresponds to January and 12 December.
*/
export const newDate = (date) => dayjs(date);
export const newTimezoneDate = (timezone, date) => dayjs.tz(date, timezone);
export const newTimezoneDateFromFormat = (timezone, format, date) => dayjs.tz(date, format, timezone);
// Constructors
export const fromISO = (date) => newDate(date);
export const fromDateFields = (day, month, year) => newDate({ day, month: month - 1, year });
export const fromDateInput = (date) => newDate(date);
// Months
export const getMonthName = (month) => `${dayjs()
.month(month - 1)
.format('MMMM')}`;
export const getNumberOfDaysInMonth = (month, year) => dayjs()
.month(month - 1)
.year(year)
.daysInMonth();
// Weekdays
export const getWeekdaysNames = () => dayjs.weekdaysMin();
export const getFirstWeekdayIndexOfMonth = (month, year) => Number.parseInt(newDate({ month: month - 1, year })
.startOf('month')
.format('d'));
// Dates
export const isDateBefore = (dateA, dateB) => newDate(dateA).isBefore(dateB, 'days');
export const isDateTimeBefore = (dateA, dateB) => newDate(dateA).isBefore(dateB);
export const isDateTimeAfter = (dateA, dateB) => newDate(dateA).isAfter(dateB);
export const isDateAfter = (dateA, dateB) => newDate(dateA).isAfter(dateB, 'days');
export const isDateSame = (dateA, dateB) => newDate(dateA).isSame(dateB, 'days');
export const isDateInRange = (date, rangeStartDate, rangeEndDate, inclusive = true) => {
const daysOffset = inclusive ? 1 : 0;
const rangeStartDateInstance = newDate(rangeStartDate).subtract(daysOffset, 'days');
const rangeEndDateInstance = newDate(rangeEndDate).add(daysOffset, 'days');
return isDateAfter(date, rangeStartDateInstance) && isDateBefore(date, rangeEndDateInstance);
};
export const isDateInArray = (date, array = []) => array.some(arrayDate => newDate(date).isSame(arrayDate, 'days'));
export const getDateMonth = (date) => newDate(date).month() + 1;
export const getDateYear = (date) => newDate(date).year();
export const getDatesBetweenRange = (dateRangeStart, dateRangeEnd, inclusive = true) => {
const daysOffset = inclusive ? 1 : 0;
const rangeStartDateInstance = newDate(dateRangeStart).subtract(daysOffset, 'days');
const rangeEndDateInstance = newDate(dateRangeEnd).add(daysOffset, 'days');
const dates = [];
for (let indexDate = rangeStartDateInstance.add(1, 'days'); indexDate.diff(rangeEndDateInstance, 'days') < 0; indexDate = indexDate.add(1, 'days')) {
dates.push(formatDate(indexDate));
}
return dates;
};
// Timezones
export const getTimezonesNames = () => { var _a, _b, _c; return (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.Intl) === null || _a === void 0 ? void 0 : _a.supportedValuesOf) === null || _b === void 0 ? void 0 : _b.call(_a, 'timeZone')) !== null && _c !== void 0 ? _c : TIMEZONES; };
export const getDefaultTimezone = () => { var _a; return (_a = dayjs.tz.guess()) !== null && _a !== void 0 ? _a : 'UTC'; };
export const getTimezoneOffset = (zone) => newDate().tz(zone).utcOffset();
// Formatters
export const formatDateTime = (date, mask = 'YYYY-MM-DD HH:mm:ss') => fromDateInput(date).format(mask);
export const formatDate = (date, mask = 'YYYY-MM-DD') => newDate(date).format(mask);
export const formatTimezoneName = (timezone, date = dayjs()) => `(${newDate(date).tz(timezone).format('Z')}) ${timezone.replace(/_+/g, ' ')}`;
export const formatForTimezone = (timezone, date) => newTimezoneDate(timezone, date).format();
// Utils
export const areDatesValid = (dates) => {
return dates.find(date => !isDateValid(date)) === undefined;
};
export const isDateValid = (date) => {
if (date === undefined) {
return false;
}
return newDate(date).isValid();
};
export const calculateDate = (date, amount = 0, unit = 'days') => {
if (unit === 'quarter') {
return newDate(date).add(amount, 'quarter');
}
return newDate(date).add(amount, unit);
};
export const getDatesRangeKey = (startDate = 'start-date', endDate = 'end-date') => `${startDate}#${endDate}`;
export const fromDatesRangeKey = (datesKey) => {
const [startDate, endDate] = datesKey.split('#');
return [startDate, endDate].filter(isDateValid);
};
export const getMonthAndYearTitle = (month, year) => `${getMonthName(month)} ${year}`;
export const getDefaultTimezoneSettings = (timezone) => {
const defaultTimezone = timezone !== null && timezone !== void 0 ? timezone : getDefaultTimezone();
return {
name: defaultTimezone,
offset: getTimezoneOffset(defaultTimezone)
};
};
export const buildTimezoneByOffset = (timezones) => {
return timezones
.map(name => {
const offset = getTimezoneOffset(name);
const label = formatTimezoneName(name);
return { offset, name, label };
})
.sort((name1, name2) => name1.offset - name2.offset);
};