Add coexistence checks to all enqueue methods to prevent loading both React and Grid.js assets simultaneously. Changes: - ReactAdmin.php: Only enqueue React assets when ?react=1 - Init.php: Skip Grid.js when React active on admin pages - Form.php, Coupon.php, Access.php: Restore classic assets when ?react=0 - Customer.php, Product.php, License.php: Add coexistence checks Now the toggle between Classic and React versions works correctly. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1059 lines
34 KiB
JavaScript
1059 lines
34 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
var react = require('react');
|
|
|
|
/**
|
|
* @name toDate
|
|
* @category Common Helpers
|
|
* @summary Convert the given argument to an instance of Date.
|
|
*
|
|
* @description
|
|
* Convert the given argument to an instance of Date.
|
|
*
|
|
* If the argument is an instance of Date, the function returns its clone.
|
|
*
|
|
* If the argument is a number, it is treated as a timestamp.
|
|
*
|
|
* If the argument is none of the above, the function returns Invalid Date.
|
|
*
|
|
* **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param argument - The value to convert
|
|
*
|
|
* @returns The parsed date in the local time zone
|
|
*
|
|
* @example
|
|
* // Clone the date:
|
|
* const result = toDate(new Date(2014, 1, 11, 11, 30, 30))
|
|
* //=> Tue Feb 11 2014 11:30:30
|
|
*
|
|
* @example
|
|
* // Convert the timestamp to date:
|
|
* const result = toDate(1392098430000)
|
|
* //=> Tue Feb 11 2014 11:30:30
|
|
*/
|
|
function toDate(argument) {
|
|
const argStr = Object.prototype.toString.call(argument);
|
|
|
|
// Clone the date
|
|
if (
|
|
argument instanceof Date ||
|
|
(typeof argument === "object" && argStr === "[object Date]")
|
|
) {
|
|
// Prevent the date to lose the milliseconds when passed to new Date() in IE10
|
|
return new argument.constructor(+argument);
|
|
} else if (
|
|
typeof argument === "number" ||
|
|
argStr === "[object Number]" ||
|
|
typeof argument === "string" ||
|
|
argStr === "[object String]"
|
|
) {
|
|
// TODO: Can we get rid of as?
|
|
return new Date(argument);
|
|
} else {
|
|
// TODO: Can we get rid of as?
|
|
return new Date(NaN);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @name constructFrom
|
|
* @category Generic Helpers
|
|
* @summary Constructs a date using the reference date and the value
|
|
*
|
|
* @description
|
|
* The function constructs a new date using the constructor from the reference
|
|
* date and the given value. It helps to build generic functions that accept
|
|
* date extensions.
|
|
*
|
|
* It defaults to `Date` if the passed reference date is a number or a string.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The reference date to take constructor from
|
|
* @param value - The value to create the date
|
|
*
|
|
* @returns Date initialized using the given date and value
|
|
*
|
|
* @example
|
|
* import { constructFrom } from 'date-fns'
|
|
*
|
|
* // A function that clones a date preserving the original type
|
|
* function cloneDate<DateType extends Date(date: DateType): DateType {
|
|
* return constructFrom(
|
|
* date, // Use contrustor from the given date
|
|
* date.getTime() // Use the date value to create a new date
|
|
* )
|
|
* }
|
|
*/
|
|
function constructFrom(date, value) {
|
|
if (date instanceof Date) {
|
|
return new date.constructor(value);
|
|
} else {
|
|
return new Date(value);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @name addDays
|
|
* @category Day Helpers
|
|
* @summary Add the specified number of days to the given date.
|
|
*
|
|
* @description
|
|
* Add the specified number of days to the given date.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date to be changed
|
|
* @param amount - The amount of days to be added.
|
|
*
|
|
* @returns The new date with the days added
|
|
*
|
|
* @example
|
|
* // Add 10 days to 1 September 2014:
|
|
* const result = addDays(new Date(2014, 8, 1), 10)
|
|
* //=> Thu Sep 11 2014 00:00:00
|
|
*/
|
|
function addDays(date, amount) {
|
|
const _date = toDate(date);
|
|
if (isNaN(amount)) return constructFrom(date, NaN);
|
|
if (!amount) {
|
|
// If 0 days, no-op to avoid changing times in the hour before end of DST
|
|
return _date;
|
|
}
|
|
_date.setDate(_date.getDate() + amount);
|
|
return _date;
|
|
}
|
|
|
|
/**
|
|
* @name addMonths
|
|
* @category Month Helpers
|
|
* @summary Add the specified number of months to the given date.
|
|
*
|
|
* @description
|
|
* Add the specified number of months to the given date.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date to be changed
|
|
* @param amount - The amount of months to be added.
|
|
*
|
|
* @returns The new date with the months added
|
|
*
|
|
* @example
|
|
* // Add 5 months to 1 September 2014:
|
|
* const result = addMonths(new Date(2014, 8, 1), 5)
|
|
* //=> Sun Feb 01 2015 00:00:00
|
|
*
|
|
* // Add one month to 30 January 2023:
|
|
* const result = addMonths(new Date(2023, 0, 30), 1)
|
|
* //=> Tue Feb 28 2023 00:00:00
|
|
*/
|
|
function addMonths(date, amount) {
|
|
const _date = toDate(date);
|
|
if (isNaN(amount)) return constructFrom(date, NaN);
|
|
if (!amount) {
|
|
// If 0 months, no-op to avoid changing times in the hour before end of DST
|
|
return _date;
|
|
}
|
|
const dayOfMonth = _date.getDate();
|
|
|
|
// The JS Date object supports date math by accepting out-of-bounds values for
|
|
// month, day, etc. For example, new Date(2020, 0, 0) returns 31 Dec 2019 and
|
|
// new Date(2020, 13, 1) returns 1 Feb 2021. This is *almost* the behavior we
|
|
// want except that dates will wrap around the end of a month, meaning that
|
|
// new Date(2020, 13, 31) will return 3 Mar 2021 not 28 Feb 2021 as desired. So
|
|
// we'll default to the end of the desired month by adding 1 to the desired
|
|
// month and using a date of 0 to back up one day to the end of the desired
|
|
// month.
|
|
const endOfDesiredMonth = constructFrom(date, _date.getTime());
|
|
endOfDesiredMonth.setMonth(_date.getMonth() + amount + 1, 0);
|
|
const daysInMonth = endOfDesiredMonth.getDate();
|
|
if (dayOfMonth >= daysInMonth) {
|
|
// If we're already at the end of the month, then this is the correct date
|
|
// and we're done.
|
|
return endOfDesiredMonth;
|
|
} else {
|
|
// Otherwise, we now know that setting the original day-of-month value won't
|
|
// cause an overflow, so set the desired day-of-month. Note that we can't
|
|
// just set the date of `endOfDesiredMonth` because that object may have had
|
|
// its time changed in the unusual case where where a DST transition was on
|
|
// the last day of the month and its local time was in the hour skipped or
|
|
// repeated next to a DST transition. So we use `date` instead which is
|
|
// guaranteed to still have the original time.
|
|
_date.setFullYear(
|
|
endOfDesiredMonth.getFullYear(),
|
|
endOfDesiredMonth.getMonth(),
|
|
dayOfMonth,
|
|
);
|
|
return _date;
|
|
}
|
|
}
|
|
|
|
let defaultOptions = {};
|
|
|
|
function getDefaultOptions() {
|
|
return defaultOptions;
|
|
}
|
|
|
|
/**
|
|
* The {@link startOfWeek} function options.
|
|
*/
|
|
|
|
/**
|
|
* @name startOfWeek
|
|
* @category Week Helpers
|
|
* @summary Return the start of a week for the given date.
|
|
*
|
|
* @description
|
|
* Return the start of a week for the given date.
|
|
* The result will be in the local timezone.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The original date
|
|
* @param options - An object with options
|
|
*
|
|
* @returns The start of a week
|
|
*
|
|
* @example
|
|
* // The start of a week for 2 September 2014 11:55:00:
|
|
* const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0))
|
|
* //=> Sun Aug 31 2014 00:00:00
|
|
*
|
|
* @example
|
|
* // If the week starts on Monday, the start of the week for 2 September 2014 11:55:00:
|
|
* const result = startOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })
|
|
* //=> Mon Sep 01 2014 00:00:00
|
|
*/
|
|
function startOfWeek(date, options) {
|
|
const defaultOptions = getDefaultOptions();
|
|
const weekStartsOn =
|
|
options?.weekStartsOn ??
|
|
options?.locale?.options?.weekStartsOn ??
|
|
defaultOptions.weekStartsOn ??
|
|
defaultOptions.locale?.options?.weekStartsOn ??
|
|
0;
|
|
|
|
const _date = toDate(date);
|
|
const day = _date.getDay();
|
|
const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
|
|
|
|
_date.setDate(_date.getDate() - diff);
|
|
_date.setHours(0, 0, 0, 0);
|
|
return _date;
|
|
}
|
|
|
|
/**
|
|
* @name startOfDay
|
|
* @category Day Helpers
|
|
* @summary Return the start of a day for the given date.
|
|
*
|
|
* @description
|
|
* Return the start of a day for the given date.
|
|
* The result will be in the local timezone.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The original date
|
|
*
|
|
* @returns The start of a day
|
|
*
|
|
* @example
|
|
* // The start of a day for 2 September 2014 11:55:00:
|
|
* const result = startOfDay(new Date(2014, 8, 2, 11, 55, 0))
|
|
* //=> Tue Sep 02 2014 00:00:00
|
|
*/
|
|
function startOfDay(date) {
|
|
const _date = toDate(date);
|
|
_date.setHours(0, 0, 0, 0);
|
|
return _date;
|
|
}
|
|
|
|
/**
|
|
* @name addWeeks
|
|
* @category Week Helpers
|
|
* @summary Add the specified number of weeks to the given date.
|
|
*
|
|
* @description
|
|
* Add the specified number of week to the given date.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date to be changed
|
|
* @param amount - The amount of weeks to be added.
|
|
*
|
|
* @returns The new date with the weeks added
|
|
*
|
|
* @example
|
|
* // Add 4 weeks to 1 September 2014:
|
|
* const result = addWeeks(new Date(2014, 8, 1), 4)
|
|
* //=> Mon Sep 29 2014 00:00:00
|
|
*/
|
|
function addWeeks(date, amount) {
|
|
const days = amount * 7;
|
|
return addDays(date, days);
|
|
}
|
|
|
|
/**
|
|
* @name addYears
|
|
* @category Year Helpers
|
|
* @summary Add the specified number of years to the given date.
|
|
*
|
|
* @description
|
|
* Add the specified number of years to the given date.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date to be changed
|
|
* @param amount - The amount of years to be added.
|
|
*
|
|
* @returns The new date with the years added
|
|
*
|
|
* @example
|
|
* // Add 5 years to 1 September 2014:
|
|
* const result = addYears(new Date(2014, 8, 1), 5)
|
|
* //=> Sun Sep 01 2019 00:00:00
|
|
*/
|
|
function addYears(date, amount) {
|
|
return addMonths(date, amount * 12);
|
|
}
|
|
|
|
/**
|
|
* @name endOfMonth
|
|
* @category Month Helpers
|
|
* @summary Return the end of a month for the given date.
|
|
*
|
|
* @description
|
|
* Return the end of a month for the given date.
|
|
* The result will be in the local timezone.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The original date
|
|
*
|
|
* @returns The end of a month
|
|
*
|
|
* @example
|
|
* // The end of a month for 2 September 2014 11:55:00:
|
|
* const result = endOfMonth(new Date(2014, 8, 2, 11, 55, 0))
|
|
* //=> Tue Sep 30 2014 23:59:59.999
|
|
*/
|
|
function endOfMonth(date) {
|
|
const _date = toDate(date);
|
|
const month = _date.getMonth();
|
|
_date.setFullYear(_date.getFullYear(), month + 1, 0);
|
|
_date.setHours(23, 59, 59, 999);
|
|
return _date;
|
|
}
|
|
|
|
/**
|
|
* The {@link eachDayOfInterval} function options.
|
|
*/
|
|
|
|
/**
|
|
* @name eachDayOfInterval
|
|
* @category Interval Helpers
|
|
* @summary Return the array of dates within the specified time interval.
|
|
*
|
|
* @description
|
|
* Return the array of dates within the specified time interval.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param interval - The interval.
|
|
* @param options - An object with options.
|
|
*
|
|
* @returns The array with starts of days from the day of the interval start to the day of the interval end
|
|
*
|
|
* @example
|
|
* // Each day between 6 October 2014 and 10 October 2014:
|
|
* const result = eachDayOfInterval({
|
|
* start: new Date(2014, 9, 6),
|
|
* end: new Date(2014, 9, 10)
|
|
* })
|
|
* //=> [
|
|
* // Mon Oct 06 2014 00:00:00,
|
|
* // Tue Oct 07 2014 00:00:00,
|
|
* // Wed Oct 08 2014 00:00:00,
|
|
* // Thu Oct 09 2014 00:00:00,
|
|
* // Fri Oct 10 2014 00:00:00
|
|
* // ]
|
|
*/
|
|
function eachDayOfInterval(interval, options) {
|
|
const startDate = toDate(interval.start);
|
|
const endDate = toDate(interval.end);
|
|
|
|
let reversed = +startDate > +endDate;
|
|
const endTime = reversed ? +startDate : +endDate;
|
|
const currentDate = reversed ? endDate : startDate;
|
|
currentDate.setHours(0, 0, 0, 0);
|
|
|
|
let step = options?.step ?? 1;
|
|
if (!step) return [];
|
|
if (step < 0) {
|
|
step = -step;
|
|
reversed = !reversed;
|
|
}
|
|
|
|
const dates = [];
|
|
|
|
while (+currentDate <= endTime) {
|
|
dates.push(toDate(currentDate));
|
|
currentDate.setDate(currentDate.getDate() + step);
|
|
currentDate.setHours(0, 0, 0, 0);
|
|
}
|
|
|
|
return reversed ? dates.reverse() : dates;
|
|
}
|
|
|
|
/**
|
|
* The {@link eachMonthOfInterval} function options.
|
|
*/
|
|
|
|
/**
|
|
* @name eachMonthOfInterval
|
|
* @category Interval Helpers
|
|
* @summary Return the array of months within the specified time interval.
|
|
*
|
|
* @description
|
|
* Return the array of months within the specified time interval.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param interval - The interval
|
|
*
|
|
* @returns The array with starts of months from the month of the interval start to the month of the interval end
|
|
*
|
|
* @example
|
|
* // Each month between 6 February 2014 and 10 August 2014:
|
|
* const result = eachMonthOfInterval({
|
|
* start: new Date(2014, 1, 6),
|
|
* end: new Date(2014, 7, 10)
|
|
* })
|
|
* //=> [
|
|
* // Sat Feb 01 2014 00:00:00,
|
|
* // Sat Mar 01 2014 00:00:00,
|
|
* // Tue Apr 01 2014 00:00:00,
|
|
* // Thu May 01 2014 00:00:00,
|
|
* // Sun Jun 01 2014 00:00:00,
|
|
* // Tue Jul 01 2014 00:00:00,
|
|
* // Fri Aug 01 2014 00:00:00
|
|
* // ]
|
|
*/
|
|
function eachMonthOfInterval(interval, options) {
|
|
const startDate = toDate(interval.start);
|
|
const endDate = toDate(interval.end);
|
|
|
|
let reversed = +startDate > +endDate;
|
|
const endTime = reversed ? +startDate : +endDate;
|
|
const currentDate = reversed ? endDate : startDate;
|
|
currentDate.setHours(0, 0, 0, 0);
|
|
currentDate.setDate(1);
|
|
|
|
let step = options?.step ?? 1;
|
|
if (!step) return [];
|
|
if (step < 0) {
|
|
step = -step;
|
|
reversed = !reversed;
|
|
}
|
|
|
|
const dates = [];
|
|
|
|
while (+currentDate <= endTime) {
|
|
dates.push(toDate(currentDate));
|
|
currentDate.setMonth(currentDate.getMonth() + step);
|
|
}
|
|
|
|
return reversed ? dates.reverse() : dates;
|
|
}
|
|
|
|
/**
|
|
* The {@link eachWeekOfInterval} function options.
|
|
*/
|
|
|
|
/**
|
|
* @name eachWeekOfInterval
|
|
* @category Interval Helpers
|
|
* @summary Return the array of weeks within the specified time interval.
|
|
*
|
|
* @description
|
|
* Return the array of weeks within the specified time interval.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param interval - The interval.
|
|
* @param options - An object with options.
|
|
*
|
|
* @returns The array with starts of weeks from the week of the interval start to the week of the interval end
|
|
*
|
|
* @example
|
|
* // Each week within interval 6 October 2014 - 23 November 2014:
|
|
* const result = eachWeekOfInterval({
|
|
* start: new Date(2014, 9, 6),
|
|
* end: new Date(2014, 10, 23)
|
|
* })
|
|
* //=> [
|
|
* // Sun Oct 05 2014 00:00:00,
|
|
* // Sun Oct 12 2014 00:00:00,
|
|
* // Sun Oct 19 2014 00:00:00,
|
|
* // Sun Oct 26 2014 00:00:00,
|
|
* // Sun Nov 02 2014 00:00:00,
|
|
* // Sun Nov 09 2014 00:00:00,
|
|
* // Sun Nov 16 2014 00:00:00,
|
|
* // Sun Nov 23 2014 00:00:00
|
|
* // ]
|
|
*/
|
|
function eachWeekOfInterval(interval, options) {
|
|
const startDate = toDate(interval.start);
|
|
const endDate = toDate(interval.end);
|
|
|
|
let reversed = +startDate > +endDate;
|
|
const startDateWeek = reversed
|
|
? startOfWeek(endDate, options)
|
|
: startOfWeek(startDate, options);
|
|
const endDateWeek = reversed
|
|
? startOfWeek(startDate, options)
|
|
: startOfWeek(endDate, options);
|
|
|
|
// Some timezones switch DST at midnight, making start of day unreliable in these timezones, 3pm is a safe bet
|
|
startDateWeek.setHours(15);
|
|
endDateWeek.setHours(15);
|
|
|
|
const endTime = +endDateWeek.getTime();
|
|
let currentDate = startDateWeek;
|
|
|
|
let step = options?.step ?? 1;
|
|
if (!step) return [];
|
|
if (step < 0) {
|
|
step = -step;
|
|
reversed = !reversed;
|
|
}
|
|
|
|
const dates = [];
|
|
|
|
while (+currentDate <= endTime) {
|
|
currentDate.setHours(0);
|
|
dates.push(toDate(currentDate));
|
|
currentDate = addWeeks(currentDate, step);
|
|
currentDate.setHours(15);
|
|
}
|
|
|
|
return reversed ? dates.reverse() : dates;
|
|
}
|
|
|
|
/**
|
|
* @name startOfMonth
|
|
* @category Month Helpers
|
|
* @summary Return the start of a month for the given date.
|
|
*
|
|
* @description
|
|
* Return the start of a month for the given date.
|
|
* The result will be in the local timezone.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The original date
|
|
*
|
|
* @returns The start of a month
|
|
*
|
|
* @example
|
|
* // The start of a month for 2 September 2014 11:55:00:
|
|
* const result = startOfMonth(new Date(2014, 8, 2, 11, 55, 0))
|
|
* //=> Mon Sep 01 2014 00:00:00
|
|
*/
|
|
function startOfMonth(date) {
|
|
const _date = toDate(date);
|
|
_date.setDate(1);
|
|
_date.setHours(0, 0, 0, 0);
|
|
return _date;
|
|
}
|
|
|
|
/**
|
|
* The {@link endOfWeek} function options.
|
|
*/
|
|
|
|
/**
|
|
* @name endOfWeek
|
|
* @category Week Helpers
|
|
* @summary Return the end of a week for the given date.
|
|
*
|
|
* @description
|
|
* Return the end of a week for the given date.
|
|
* The result will be in the local timezone.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The original date
|
|
* @param options - An object with options
|
|
*
|
|
* @returns The end of a week
|
|
*
|
|
* @example
|
|
* // The end of a week for 2 September 2014 11:55:00:
|
|
* const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0))
|
|
* //=> Sat Sep 06 2014 23:59:59.999
|
|
*
|
|
* @example
|
|
* // If the week starts on Monday, the end of the week for 2 September 2014 11:55:00:
|
|
* const result = endOfWeek(new Date(2014, 8, 2, 11, 55, 0), { weekStartsOn: 1 })
|
|
* //=> Sun Sep 07 2014 23:59:59.999
|
|
*/
|
|
function endOfWeek(date, options) {
|
|
const defaultOptions = getDefaultOptions();
|
|
const weekStartsOn =
|
|
options?.weekStartsOn ??
|
|
options?.locale?.options?.weekStartsOn ??
|
|
defaultOptions.weekStartsOn ??
|
|
defaultOptions.locale?.options?.weekStartsOn ??
|
|
0;
|
|
|
|
const _date = toDate(date);
|
|
const day = _date.getDay();
|
|
const diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);
|
|
|
|
_date.setDate(_date.getDate() + diff);
|
|
_date.setHours(23, 59, 59, 999);
|
|
return _date;
|
|
}
|
|
|
|
/**
|
|
* @name getDaysInMonth
|
|
* @category Month Helpers
|
|
* @summary Get the number of days in a month of the given date.
|
|
*
|
|
* @description
|
|
* Get the number of days in a month of the given date.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The given date
|
|
*
|
|
* @returns The number of days in a month
|
|
*
|
|
* @example
|
|
* // How many days are in February 2000?
|
|
* const result = getDaysInMonth(new Date(2000, 1))
|
|
* //=> 29
|
|
*/
|
|
function getDaysInMonth(date) {
|
|
const _date = toDate(date);
|
|
const year = _date.getFullYear();
|
|
const monthIndex = _date.getMonth();
|
|
const lastDayOfMonth = constructFrom(date, 0);
|
|
lastDayOfMonth.setFullYear(year, monthIndex + 1, 0);
|
|
lastDayOfMonth.setHours(0, 0, 0, 0);
|
|
return lastDayOfMonth.getDate();
|
|
}
|
|
|
|
/**
|
|
* @name isAfter
|
|
* @category Common Helpers
|
|
* @summary Is the first date after the second one?
|
|
*
|
|
* @description
|
|
* Is the first date after the second one?
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date that should be after the other one to return true
|
|
* @param dateToCompare - The date to compare with
|
|
*
|
|
* @returns The first date is after the second date
|
|
*
|
|
* @example
|
|
* // Is 10 July 1989 after 11 February 1987?
|
|
* const result = isAfter(new Date(1989, 6, 10), new Date(1987, 1, 11))
|
|
* //=> true
|
|
*/
|
|
function isAfter(date, dateToCompare) {
|
|
const _date = toDate(date);
|
|
const _dateToCompare = toDate(dateToCompare);
|
|
return _date.getTime() > _dateToCompare.getTime();
|
|
}
|
|
|
|
/**
|
|
* @name isBefore
|
|
* @category Common Helpers
|
|
* @summary Is the first date before the second one?
|
|
*
|
|
* @description
|
|
* Is the first date before the second one?
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date that should be before the other one to return true
|
|
* @param dateToCompare - The date to compare with
|
|
*
|
|
* @returns The first date is before the second date
|
|
*
|
|
* @example
|
|
* // Is 10 July 1989 before 11 February 1987?
|
|
* const result = isBefore(new Date(1989, 6, 10), new Date(1987, 1, 11))
|
|
* //=> false
|
|
*/
|
|
function isBefore(date, dateToCompare) {
|
|
const _date = toDate(date);
|
|
const _dateToCompare = toDate(dateToCompare);
|
|
return +_date < +_dateToCompare;
|
|
}
|
|
|
|
/**
|
|
* @name isEqual
|
|
* @category Common Helpers
|
|
* @summary Are the given dates equal?
|
|
*
|
|
* @description
|
|
* Are the given dates equal?
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param dateLeft - The first date to compare
|
|
* @param dateRight - The second date to compare
|
|
*
|
|
* @returns The dates are equal
|
|
*
|
|
* @example
|
|
* // Are 2 July 2014 06:30:45.000 and 2 July 2014 06:30:45.500 equal?
|
|
* const result = isEqual(
|
|
* new Date(2014, 6, 2, 6, 30, 45, 0),
|
|
* new Date(2014, 6, 2, 6, 30, 45, 500)
|
|
* )
|
|
* //=> false
|
|
*/
|
|
function isEqual(leftDate, rightDate) {
|
|
const _dateLeft = toDate(leftDate);
|
|
const _dateRight = toDate(rightDate);
|
|
return +_dateLeft === +_dateRight;
|
|
}
|
|
|
|
/**
|
|
* @name setMonth
|
|
* @category Month Helpers
|
|
* @summary Set the month to the given date.
|
|
*
|
|
* @description
|
|
* Set the month to the given date.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date to be changed
|
|
* @param month - The month index to set (0-11)
|
|
*
|
|
* @returns The new date with the month set
|
|
*
|
|
* @example
|
|
* // Set February to 1 September 2014:
|
|
* const result = setMonth(new Date(2014, 8, 1), 1)
|
|
* //=> Sat Feb 01 2014 00:00:00
|
|
*/
|
|
function setMonth(date, month) {
|
|
const _date = toDate(date);
|
|
const year = _date.getFullYear();
|
|
const day = _date.getDate();
|
|
|
|
const dateWithDesiredMonth = constructFrom(date, 0);
|
|
dateWithDesiredMonth.setFullYear(year, month, 15);
|
|
dateWithDesiredMonth.setHours(0, 0, 0, 0);
|
|
const daysInMonth = getDaysInMonth(dateWithDesiredMonth);
|
|
// Set the last day of the new month
|
|
// if the original date was the last day of the longer month
|
|
_date.setMonth(month, Math.min(day, daysInMonth));
|
|
return _date;
|
|
}
|
|
|
|
/**
|
|
* @name set
|
|
* @category Common Helpers
|
|
* @summary Set date values to a given date.
|
|
*
|
|
* @description
|
|
* Set date values to a given date.
|
|
*
|
|
* Sets time values to date from object `values`.
|
|
* A value is not set if it is undefined or null or doesn't exist in `values`.
|
|
*
|
|
* Note about bundle size: `set` does not internally use `setX` functions from date-fns but instead opts
|
|
* to use native `Date#setX` methods. If you use this function, you may not want to include the
|
|
* other `setX` functions that date-fns provides if you are concerned about the bundle size.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date to be changed
|
|
* @param values - The date values to be set
|
|
*
|
|
* @returns The new date with options set
|
|
*
|
|
* @example
|
|
* // Transform 1 September 2014 into 20 October 2015 in a single line:
|
|
* const result = set(new Date(2014, 8, 20), { year: 2015, month: 9, date: 20 })
|
|
* //=> Tue Oct 20 2015 00:00:00
|
|
*
|
|
* @example
|
|
* // Set 12 PM to 1 September 2014 01:23:45 to 1 September 2014 12:00:00:
|
|
* const result = set(new Date(2014, 8, 1, 1, 23, 45), { hours: 12 })
|
|
* //=> Mon Sep 01 2014 12:23:45
|
|
*/
|
|
|
|
function set(date, values) {
|
|
let _date = toDate(date);
|
|
|
|
// Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date
|
|
if (isNaN(+_date)) {
|
|
return constructFrom(date, NaN);
|
|
}
|
|
|
|
if (values.year != null) {
|
|
_date.setFullYear(values.year);
|
|
}
|
|
|
|
if (values.month != null) {
|
|
_date = setMonth(_date, values.month);
|
|
}
|
|
|
|
if (values.date != null) {
|
|
_date.setDate(values.date);
|
|
}
|
|
|
|
if (values.hours != null) {
|
|
_date.setHours(values.hours);
|
|
}
|
|
|
|
if (values.minutes != null) {
|
|
_date.setMinutes(values.minutes);
|
|
}
|
|
|
|
if (values.seconds != null) {
|
|
_date.setSeconds(values.seconds);
|
|
}
|
|
|
|
if (values.milliseconds != null) {
|
|
_date.setMilliseconds(values.milliseconds);
|
|
}
|
|
|
|
return _date;
|
|
}
|
|
|
|
/**
|
|
* @name setYear
|
|
* @category Year Helpers
|
|
* @summary Set the year to the given date.
|
|
*
|
|
* @description
|
|
* Set the year to the given date.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date to be changed
|
|
* @param year - The year of the new date
|
|
*
|
|
* @returns The new date with the year set
|
|
*
|
|
* @example
|
|
* // Set year 2013 to 1 September 2014:
|
|
* const result = setYear(new Date(2014, 8, 1), 2013)
|
|
* //=> Sun Sep 01 2013 00:00:00
|
|
*/
|
|
function setYear(date, year) {
|
|
const _date = toDate(date);
|
|
|
|
// Check if date is Invalid Date because Date.prototype.setFullYear ignores the value of Invalid Date
|
|
if (isNaN(+_date)) {
|
|
return constructFrom(date, NaN);
|
|
}
|
|
|
|
_date.setFullYear(year);
|
|
return _date;
|
|
}
|
|
|
|
/**
|
|
* @name startOfToday
|
|
* @category Day Helpers
|
|
* @summary Return the start of today.
|
|
* @pure false
|
|
*
|
|
* @description
|
|
* Return the start of today.
|
|
*
|
|
* @returns The start of today
|
|
*
|
|
* @example
|
|
* // If today is 6 October 2014:
|
|
* const result = startOfToday()
|
|
* //=> Mon Oct 6 2014 00:00:00
|
|
*/
|
|
function startOfToday() {
|
|
return startOfDay(Date.now());
|
|
}
|
|
|
|
/**
|
|
* @name subMonths
|
|
* @category Month Helpers
|
|
* @summary Subtract the specified number of months from the given date.
|
|
*
|
|
* @description
|
|
* Subtract the specified number of months from the given date.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date to be changed
|
|
* @param amount - The amount of months to be subtracted.
|
|
*
|
|
* @returns The new date with the months subtracted
|
|
*
|
|
* @example
|
|
* // Subtract 5 months from 1 February 2015:
|
|
* const result = subMonths(new Date(2015, 1, 1), 5)
|
|
* //=> Mon Sep 01 2014 00:00:00
|
|
*/
|
|
function subMonths(date, amount) {
|
|
return addMonths(date, -amount);
|
|
}
|
|
|
|
/**
|
|
* @name subYears
|
|
* @category Year Helpers
|
|
* @summary Subtract the specified number of years from the given date.
|
|
*
|
|
* @description
|
|
* Subtract the specified number of years from the given date.
|
|
*
|
|
* @typeParam DateType - The `Date` type, the function operates on. Gets inferred from passed arguments. Allows to use extensions like [`UTCDate`](https://github.com/date-fns/utc).
|
|
*
|
|
* @param date - The date to be changed
|
|
* @param amount - The amount of years to be subtracted.
|
|
*
|
|
* @returns The new date with the years subtracted
|
|
*
|
|
* @example
|
|
* // Subtract 5 years from 1 September 2014:
|
|
* const result = subYears(new Date(2014, 8, 1), 5)
|
|
* //=> Tue Sep 01 2009 00:00:00
|
|
*/
|
|
function subYears(date, amount) {
|
|
return addYears(date, -amount);
|
|
}
|
|
|
|
exports.Month = void 0;
|
|
(function (Month) {
|
|
Month[Month["JANUARY"] = 0] = "JANUARY";
|
|
Month[Month["FEBRUARY"] = 1] = "FEBRUARY";
|
|
Month[Month["MARCH"] = 2] = "MARCH";
|
|
Month[Month["APRIL"] = 3] = "APRIL";
|
|
Month[Month["MAY"] = 4] = "MAY";
|
|
Month[Month["JUNE"] = 5] = "JUNE";
|
|
Month[Month["JULY"] = 6] = "JULY";
|
|
Month[Month["AUGUST"] = 7] = "AUGUST";
|
|
Month[Month["SEPTEMBER"] = 8] = "SEPTEMBER";
|
|
Month[Month["OCTOBER"] = 9] = "OCTOBER";
|
|
Month[Month["NOVEMBER"] = 10] = "NOVEMBER";
|
|
Month[Month["DECEMBER"] = 11] = "DECEMBER";
|
|
})(exports.Month || (exports.Month = {}));
|
|
exports.Day = void 0;
|
|
(function (Day) {
|
|
Day[Day["SUNDAY"] = 0] = "SUNDAY";
|
|
Day[Day["MONDAY"] = 1] = "MONDAY";
|
|
Day[Day["TUESDAY"] = 2] = "TUESDAY";
|
|
Day[Day["WEDNESDAY"] = 3] = "WEDNESDAY";
|
|
Day[Day["THURSDAY"] = 4] = "THURSDAY";
|
|
Day[Day["FRIDAY"] = 5] = "FRIDAY";
|
|
Day[Day["SATURDAY"] = 6] = "SATURDAY";
|
|
})(exports.Day || (exports.Day = {}));
|
|
var inRange = function (date, min, max) {
|
|
return (isEqual(date, min) || isAfter(date, min)) && (isEqual(date, max) || isBefore(date, max));
|
|
};
|
|
var clearTime = function (date) { return set(date, { hours: 0, minutes: 0, seconds: 0, milliseconds: 0 }); };
|
|
var useLilius = function (_a) {
|
|
var _b = _a === void 0 ? {} : _a, _c = _b.weekStartsOn, weekStartsOn = _c === void 0 ? exports.Day.SUNDAY : _c, _d = _b.viewing, initialViewing = _d === void 0 ? new Date() : _d, _e = _b.selected, initialSelected = _e === void 0 ? [] : _e, _f = _b.numberOfMonths, numberOfMonths = _f === void 0 ? 1 : _f;
|
|
var _g = react.useState(initialViewing), viewing = _g[0], setViewing = _g[1];
|
|
var viewToday = react.useCallback(function () { return setViewing(startOfToday()); }, [setViewing]);
|
|
var viewMonth = react.useCallback(function (month) { return setViewing(function (v) { return setMonth(v, month); }); }, []);
|
|
var viewPreviousMonth = react.useCallback(function () { return setViewing(function (v) { return subMonths(v, 1); }); }, []);
|
|
var viewNextMonth = react.useCallback(function () { return setViewing(function (v) { return addMonths(v, 1); }); }, []);
|
|
var viewYear = react.useCallback(function (year) { return setViewing(function (v) { return setYear(v, year); }); }, []);
|
|
var viewPreviousYear = react.useCallback(function () { return setViewing(function (v) { return subYears(v, 1); }); }, []);
|
|
var viewNextYear = react.useCallback(function () { return setViewing(function (v) { return addYears(v, 1); }); }, []);
|
|
var _h = react.useState(initialSelected.map(clearTime)), selected = _h[0], setSelected = _h[1];
|
|
var clearSelected = function () { return setSelected([]); };
|
|
var isSelected = react.useCallback(function (date) { return selected.findIndex(function (s) { return isEqual(s, date); }) > -1; }, [selected]);
|
|
var select = react.useCallback(function (date, replaceExisting) {
|
|
if (replaceExisting) {
|
|
setSelected(Array.isArray(date) ? date : [date]);
|
|
}
|
|
else {
|
|
setSelected(function (selectedItems) { return selectedItems.concat(Array.isArray(date) ? date : [date]); });
|
|
}
|
|
}, []);
|
|
var deselect = react.useCallback(function (date) {
|
|
return setSelected(function (selectedItems) {
|
|
return Array.isArray(date)
|
|
? selectedItems.filter(function (s) { return !date.map(function (d) { return d.getTime(); }).includes(s.getTime()); })
|
|
: selectedItems.filter(function (s) { return !isEqual(s, date); });
|
|
});
|
|
}, []);
|
|
var toggle = react.useCallback(function (date, replaceExisting) { return (isSelected(date) ? deselect(date) : select(date, replaceExisting)); }, [deselect, isSelected, select]);
|
|
var selectRange = react.useCallback(function (start, end, replaceExisting) {
|
|
if (replaceExisting) {
|
|
setSelected(eachDayOfInterval({ start: start, end: end }));
|
|
}
|
|
else {
|
|
setSelected(function (selectedItems) { return selectedItems.concat(eachDayOfInterval({ start: start, end: end })); });
|
|
}
|
|
}, []);
|
|
var deselectRange = react.useCallback(function (start, end) {
|
|
setSelected(function (selectedItems) {
|
|
return selectedItems.filter(function (s) {
|
|
return !eachDayOfInterval({ start: start, end: end })
|
|
.map(function (d) { return d.getTime(); })
|
|
.includes(s.getTime());
|
|
});
|
|
});
|
|
}, []);
|
|
var calendar = react.useMemo(function () {
|
|
return eachMonthOfInterval({
|
|
start: startOfMonth(viewing),
|
|
end: endOfMonth(addMonths(viewing, numberOfMonths - 1)),
|
|
}).map(function (month) {
|
|
return eachWeekOfInterval({
|
|
start: startOfMonth(month),
|
|
end: endOfMonth(month),
|
|
}, { weekStartsOn: weekStartsOn }).map(function (week) {
|
|
return eachDayOfInterval({
|
|
start: startOfWeek(week, { weekStartsOn: weekStartsOn }),
|
|
end: endOfWeek(week, { weekStartsOn: weekStartsOn }),
|
|
});
|
|
});
|
|
});
|
|
}, [viewing, weekStartsOn, numberOfMonths]);
|
|
return {
|
|
clearTime: clearTime,
|
|
inRange: inRange,
|
|
viewing: viewing,
|
|
setViewing: setViewing,
|
|
viewToday: viewToday,
|
|
viewMonth: viewMonth,
|
|
viewPreviousMonth: viewPreviousMonth,
|
|
viewNextMonth: viewNextMonth,
|
|
viewYear: viewYear,
|
|
viewPreviousYear: viewPreviousYear,
|
|
viewNextYear: viewNextYear,
|
|
selected: selected,
|
|
setSelected: setSelected,
|
|
clearSelected: clearSelected,
|
|
isSelected: isSelected,
|
|
select: select,
|
|
deselect: deselect,
|
|
toggle: toggle,
|
|
selectRange: selectRange,
|
|
deselectRange: deselectRange,
|
|
calendar: calendar,
|
|
};
|
|
};
|
|
|
|
exports.useLilius = useLilius;
|
|
//# sourceMappingURL=index.js.map
|