@doku-dev/doku-fragment
Version:
A new Angular UI library that moving away from Bootstrap and built from scratch.
109 lines • 18.3 kB
JavaScript
export class CalendarUtil {
static generateMonthSelectOptions(props) {
const locale = props?.locale || this.DEFAULT_LOCALE;
return Array.from({ length: 12 }).map((_, idx) => {
let disabledByMinDate = false;
if (props.minDate) {
const shouldApply = props.minDate.getFullYear() === props.activeYear;
if (shouldApply)
disabledByMinDate = idx < props.minDate.getMonth();
}
let disabledByMaxDate = false;
if (props.maxDate) {
const shouldApply = props.maxDate.getFullYear() === props.activeYear;
if (shouldApply)
disabledByMaxDate = idx > props.maxDate.getMonth();
}
return {
label: new Date(0, idx).toLocaleString(locale, { month: 'short' }),
value: idx.toString(),
disabled: disabledByMinDate || disabledByMaxDate,
};
});
}
static generateYearSelectOptions(props) {
const numberOfYearsDisplayed = 21;
const startYear = props.activeYear - Math.floor(numberOfYearsDisplayed / 2);
return Array.from({ length: numberOfYearsDisplayed }, (_, i) => {
const year = startYear + i;
const disabledByMinDate = props.minDate ? year < props.minDate.getFullYear() : false;
const disabledByMaxDate = props.maxDate ? year > props.maxDate.getFullYear() : false;
return {
label: year.toString(),
value: year.toString(),
disabled: disabledByMinDate || disabledByMaxDate,
};
});
}
static generateWeekdays(options) {
const locale = options?.locale || this.DEFAULT_LOCALE;
return Array.from({ length: 7 }).map((_, idx) => {
let label = new Date(0, 0, idx + 1).toLocaleString(locale, { weekday: 'short' });
if (locale.startsWith('en'))
label = label.substring(0, 2);
return label;
});
}
static generateDates({ month, year }) {
const totalDates = new Date(year, month + 1, 0).getDate();
return Array.from({ length: totalDates }).map((_, idx) => new Date(year, month, idx + 1));
}
static isValidMinYear(minDate, checkedDate) {
return checkedDate.getFullYear() >= minDate.getFullYear();
}
static isValidMinMonth(minDate, checkedDate) {
if (!this.isValidMinYear(minDate, checkedDate))
return false;
const sameYear = minDate.getFullYear() === checkedDate.getFullYear();
return sameYear ? checkedDate.getMonth() >= minDate.getMonth() : true;
}
static isValidMinDate(minDate, checkedDate, options) {
if (!this.isValidMinMonth(minDate, checkedDate))
return false;
if (options?.useStrictTime) {
const result = (minDate.getTime() - checkedDate.getTime()) / 1000;
return result < this.oneDayInSecond;
}
else {
return checkedDate >= minDate;
}
}
static isValidMaxYear(maxDate, checkedDate) {
return checkedDate.getFullYear() <= maxDate.getFullYear();
}
static isValidMaxMonth(maxDate, checkedDate) {
if (!this.isValidMaxYear(maxDate, checkedDate))
return false;
const sameYear = maxDate.getFullYear() === checkedDate.getFullYear();
return sameYear ? checkedDate.getMonth() <= maxDate.getMonth() : true;
}
static isValidMaxDate(maxDate, checkedDate, options) {
if (!this.isValidMaxMonth(maxDate, checkedDate))
return false;
if (options?.useStrictTime) {
const result = (checkedDate.getTime() - maxDate.getTime()) / 1000;
return result <= 0;
}
else {
return checkedDate <= maxDate;
}
}
static isSameDate(date, anotherDate) {
const sameYear = date?.getFullYear() === anotherDate?.getFullYear();
const sameMonth = date?.getMonth() === anotherDate?.getMonth();
const sameDate = date?.getDate() === anotherDate?.getDate();
return sameYear && sameMonth && sameDate;
}
static isInvalidMinOrMaxDate(date, minDate, maxDate, options) {
const invalidMinDate = minDate
? !CalendarUtil.isValidMinDate(minDate, date, { useStrictTime: options?.useStrictTime })
: false;
const invalidMaxDate = maxDate
? !CalendarUtil.isValidMaxDate(maxDate, date, { useStrictTime: options?.useStrictTime })
: false;
return invalidMinDate || invalidMaxDate;
}
}
CalendarUtil.DEFAULT_LOCALE = 'en-US';
CalendarUtil.oneDayInSecond = 60 * 60 * 24;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXIudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Rva3UtZnJhZ21lbnQvc3JjL2xpYi9kYXRlLXBpY2tlci9iYXNlL2NhbGVuZGFyLnV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBVUEsTUFBTSxPQUFPLFlBQVk7SUFJdkIsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEtBS2pDO1FBQ0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRXBELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUMvQyxJQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQztZQUM5QixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ2pCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLFVBQVUsQ0FBQztnQkFDckUsSUFBSSxXQUFXO29CQUFFLGlCQUFpQixHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3JFO1lBRUQsSUFBSSxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDOUIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUNqQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxLQUFLLEtBQUssQ0FBQyxVQUFVLENBQUM7Z0JBQ3JFLElBQUksV0FBVztvQkFBRSxpQkFBaUIsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNyRTtZQUVELE9BQU87Z0JBQ0wsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsRUFB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T0FBTztZQUM1QixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3hGLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDVixNQUFNLGNBQWMsR0FBRyxPQUFPO1lBQzVCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDeEYsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNWLE9BQU8sY0FBYyxJQUFJLGNBQWMsQ0FBQztJQUMxQyxDQUFDOztBQXhJdUIsMkJBQWMsR0FBRyxPQUFPLENBQUM7QUFDbEMsMkJBQWMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERva3VTZWxlY3RPcHRpb25JdGVtIH0gZnJvbSAnLi4vLi4vc2VsZWN0JztcblxuaW50ZXJmYWNlIEl0ZW1PcHRpb24ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBNb250aFNlbGVjdE9wdGlvbiA9IEl0ZW1PcHRpb247XG5leHBvcnQgdHlwZSBZZWFyU2VsZWN0T3B0aW9uID0gSXRlbU9wdGlvbjtcblxuZXhwb3J0IGNsYXNzIENhbGVuZGFyVXRpbCB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTE9DQUxFID0gJ2VuLVVTJztcbiAgcHJpdmF0ZSBzdGF0aWMgb25lRGF5SW5TZWNvbmQgPSA2MCAqIDYwICogMjQ7XG5cbiAgc3RhdGljIGdlbmVyYXRlTW9udGhTZWxlY3RPcHRpb25zKHByb3BzOiB7XG4gICAgYWN0aXZlWWVhcjogbnVtYmVyO1xuICAgIGxvY2FsZT86IHN0cmluZztcbiAgICBtaW5EYXRlPzogRGF0ZSB8IG51bGw7XG4gICAgbWF4RGF0ZT86IERhdGUgfCBudWxsO1xuICB9KTogRG9rdVNlbGVjdE9wdGlvbkl0ZW1bXSB7XG4gICAgY29uc3QgbG9jYWxlID0gcHJvcHM/LmxvY2FsZSB8fCB0aGlzLkRFRkFVTFRfTE9DQUxFO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IDEyIH0pLm1hcCgoXywgaWR4KSA9PiB7XG4gICAgICBsZXQgZGlzYWJsZWRCeU1pbkRhdGUgPSBmYWxzZTtcbiAgICAgIGlmIChwcm9wcy5taW5EYXRlKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZEFwcGx5ID0gcHJvcHMubWluRGF0ZS5nZXRGdWxsWWVhcigpID09PSBwcm9wcy5hY3RpdmVZZWFyO1xuICAgICAgICBpZiAoc2hvdWxkQXBwbHkpIGRpc2FibGVkQnlNaW5EYXRlID0gaWR4IDwgcHJvcHMubWluRGF0ZS5nZXRNb250aCgpO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGlzYWJsZWRCeU1heERhdGUgPSBmYWxzZTtcbiAgICAgIGlmIChwcm9wcy5tYXhEYXRlKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZEFwcGx5ID0gcHJvcHMubWF4RGF0ZS5nZXRGdWxsWWVhcigpID09PSBwcm9wcy5hY3RpdmVZZWFyO1xuICAgICAgICBpZiAoc2hvdWxkQXBwbHkpIGRpc2FibGVkQnlNYXhEYXRlID0gaWR4ID4gcHJvcHMubWF4RGF0ZS5nZXRNb250aCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBsYWJlbDogbmV3IERhdGUoMCwgaWR4KS50b0xvY2FsZVN0cmluZyhsb2NhbGUsIHsgbW9udGg6ICdzaG9ydCcgfSksXG4gICAgICAgIHZhbHVlOiBpZHgudG9TdHJpbmcoKSxcbiAgICAgICAgZGlzYWJsZWQ6IGRpc2FibGVkQnlNaW5EYXRlIHx8IGRpc2FibGVkQnlNYXhEYXRlLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZW5lcmF0ZVllYXJTZWxlY3RPcHRpb25zKHByb3BzOiB7XG4gICAgYWN0aXZlWWVhcjogbnVtYmVyO1xuICAgIG1pbkRhdGU/OiBEYXRlIHwgbnVsbDtcbiAgICBtYXhEYXRlPzogRGF0ZSB8IG51bGw7XG4gIH0pOiBEb2t1U2VsZWN0T3B0aW9uSXRlbVtdIHtcbiAgICBjb25zdCBudW1iZXJPZlllYXJzRGlzcGxheWVkID0gMjE7XG4gICAgY29uc3Qgc3RhcnRZZWFyID0gcHJvcHMuYWN0aXZlWWVhciAtIE1hdGguZmxvb3IobnVtYmVyT2ZZZWFyc0Rpc3BsYXllZCAvIDIpO1xuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IG51bWJlck9mWWVhcnNEaXNwbGF5ZWQgfSwgKF8sIGkpID0+IHtcbiAgICAgIGNvbnN0IHllYXIgPSBzdGFydFllYXIgKyBpO1xuXG4gICAgICBjb25zdCBkaXNhYmxlZEJ5TWluRGF0ZSA9IHByb3BzLm1pbkRhdGUgPyB5ZWFyIDwgcHJvcHMubWluRGF0ZS5nZXRGdWxsWWVhcigpIDogZmFsc2U7XG4gICAgICBjb25zdCBkaXNhYmxlZEJ5TWF4RGF0ZSA9IHByb3BzLm1heERhdGUgPyB5ZWFyID4gcHJvcHMubWF4RGF0ZS5nZXRGdWxsWWVhcigpIDogZmFsc2U7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiB5ZWFyLnRvU3RyaW5nKCksXG4gICAgICAgIHZhbHVlOiB5ZWFyLnRvU3RyaW5nKCksXG4gICAgICAgIGRpc2FibGVkOiBkaXNhYmxlZEJ5TWluRGF0ZSB8fCBkaXNhYmxlZEJ5TWF4RGF0ZSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgZ2VuZXJhdGVXZWVrZGF5cyhvcHRpb25zPzogeyBsb2NhbGU/OiBzdHJpbmcgfSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBsb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgfHwgdGhpcy5ERUZBVUxUX0xPQ0FMRTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogNyB9KS5tYXAoKF8sIGlkeCkgPT4ge1xuICAgICAgbGV0IGxhYmVsID0gbmV3IERhdGUoMCwgMCwgaWR4ICsgMSkudG9Mb2NhbGVTdHJpbmcobG9jYWxlLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSk7XG4gICAgICBpZiAobG9jYWxlLnN0YXJ0c1dpdGgoJ2VuJykpIGxhYmVsID0gbGFiZWwuc3Vic3RyaW5nKDAsIDIpO1xuICAgICAgcmV0dXJuIGxhYmVsO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdlbmVyYXRlRGF0ZXMoeyBtb250aCwgeWVhciB9OiB7IG1vbnRoOiBudW1iZXI7IHllYXI6IG51bWJlciB9KTogRGF0ZVtdIHtcbiAgICBjb25zdCB0b3RhbERhdGVzID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKS5nZXREYXRlKCk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHRvdGFsRGF0ZXMgfSkubWFwKChfLCBpZHgpID0+IG5ldyBEYXRlKHllYXIsIG1vbnRoLCBpZHggKyAxKSk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE1pblllYXIobWluRGF0ZTogRGF0ZSwgY2hlY2tlZERhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gY2hlY2tlZERhdGUuZ2V0RnVsbFllYXIoKSA+PSBtaW5EYXRlLmdldEZ1bGxZZWFyKCk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE1pbk1vbnRoKG1pbkRhdGU6IERhdGUsIGNoZWNrZWREYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRNaW5ZZWFyKG1pbkRhdGUsIGNoZWNrZWREYXRlKSkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNhbWVZZWFyID0gbWluRGF0ZS5nZXRGdWxsWWVhcigpID09PSBjaGVja2VkRGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIHJldHVybiBzYW1lWWVhciA/IGNoZWNrZWREYXRlLmdldE1vbnRoKCkgPj0gbWluRGF0ZS5nZXRNb250aCgpIDogdHJ1ZTtcbiAgfVxuXG4gIHN0YXRpYyBpc1ZhbGlkTWluRGF0ZShcbiAgICBtaW5EYXRlOiBEYXRlLFxuICAgIGNoZWNrZWREYXRlOiBEYXRlLFxuICAgIG9wdGlvbnM/OiB7IHVzZVN0cmljdFRpbWU/OiBib29sZWFuIH1cbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzVmFsaWRNaW5Nb250aChtaW5EYXRlLCBjaGVja2VkRGF0ZSkpIHJldHVybiBmYWxzZTtcbiAgICBpZiAob3B0aW9ucz8udXNlU3RyaWN0VGltZSkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gKG1pbkRhdGUuZ2V0VGltZSgpIC0gY2hlY2tlZERhdGUuZ2V0VGltZSgpKSAvIDEwMDA7XG4gICAgICByZXR1cm4gcmVzdWx0IDwgdGhpcy5vbmVEYXlJblNlY29uZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNoZWNrZWREYXRlID49IG1pbkRhdGU7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGlzVmFsaWRNYXhZZWFyKG1heERhdGU6IERhdGUsIGNoZWNrZWREYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGNoZWNrZWREYXRlLmdldEZ1bGxZZWFyKCkgPD0gbWF4RGF0ZS5nZXRGdWxsWWVhcigpO1xuICB9XG5cbiAgc3RhdGljIGlzVmFsaWRNYXhNb250aChtYXhEYXRlOiBEYXRlLCBjaGVja2VkRGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkTWF4WWVhcihtYXhEYXRlLCBjaGVja2VkRGF0ZSkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzYW1lWWVhciA9IG1heERhdGUuZ2V0RnVsbFllYXIoKSA9PT0gY2hlY2tlZERhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gc2FtZVllYXIgPyBjaGVja2VkRGF0ZS5nZXRNb250aCgpIDw9IG1heERhdGUuZ2V0TW9udGgoKSA6IHRydWU7XG4gIH1cblxuICBzdGF0aWMgaXNWYWxpZE1heERhdGUoXG4gICAgbWF4RGF0ZTogRGF0ZSxcbiAgICBjaGVja2VkRGF0ZTogRGF0ZSxcbiAgICBvcHRpb25zPzogeyB1c2VTdHJpY3RUaW1lPzogYm9vbGVhbiB9XG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5pc1ZhbGlkTWF4TW9udGgobWF4RGF0ZSwgY2hlY2tlZERhdGUpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnM/LnVzZVN0cmljdFRpbWUpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IChjaGVja2VkRGF0ZS5nZXRUaW1lKCkgLSBtYXhEYXRlLmdldFRpbWUoKSkgLyAxMDAwO1xuICAgICAgcmV0dXJuIHJlc3VsdCA8PSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY2hlY2tlZERhdGUgPD0gbWF4RGF0ZTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgaXNTYW1lRGF0ZShkYXRlPzogRGF0ZSB8IG51bGwsIGFub3RoZXJEYXRlPzogRGF0ZSB8IG51bGwpIHtcbiAgICBjb25zdCBzYW1lWWVhciA9IGRhdGU/LmdldEZ1bGxZZWFyKCkgPT09IGFub3RoZXJEYXRlPy5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IHNhbWVNb250aCA9IGRhdGU/LmdldE1vbnRoKCkgPT09IGFub3RoZXJEYXRlPy5nZXRNb250aCgpO1xuICAgIGNvbnN0IHNhbWVEYXRlID0gZGF0ZT8uZ2V0RGF0ZSgpID09PSBhbm90aGVyRGF0ZT8uZ2V0RGF0ZSgpO1xuICAgIHJldHVybiBzYW1lWWVhciAmJiBzYW1lTW9udGggJiYgc2FtZURhdGU7XG4gIH1cblxuICBzdGF0aWMgaXNJbnZhbGlkTWluT3JNYXhEYXRlKFxuICAgIGRhdGU6IERhdGUsXG4gICAgbWluRGF0ZT86IERhdGUgfCBudWxsLFxuICAgIG1heERhdGU/OiBEYXRlIHwgbnVsbCxcbiAgICBvcHRpb25zPzogeyB1c2VTdHJpY3RUaW1lPzogYm9vbGVhbiB9XG4gICkge1xuICAgIGNvbnN0IGludmFsaWRNaW5EYXRlID0gbWluRGF0ZVxuICAgICAgPyAhQ2FsZW5kYXJVdGlsLmlzVmFsaWRNaW5EYXRlKG1pbkRhdGUsIGRhdGUsIHsgdXNlU3RyaWN0VGltZTogb3B0aW9ucz8udXNlU3RyaWN0VGltZSB9KVxuICAgICAgOiBmYWxzZTtcbiAgICBjb25zdCBpbnZhbGlkTWF4RGF0ZSA9IG1heERhdGVcbiAgICAgID8gIUNhbGVuZGFyVXRpbC5pc1ZhbGlkTWF4RGF0ZShtYXhEYXRlLCBkYXRlLCB7IHVzZVN0cmljdFRpbWU6IG9wdGlvbnM/LnVzZVN0cmljdFRpbWUgfSlcbiAgICAgIDogZmFsc2U7XG4gICAgcmV0dXJuIGludmFsaWRNaW5EYXRlIHx8IGludmFsaWRNYXhEYXRlO1xuICB9XG59XG4iXX0=