UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

109 lines 18.3 kB
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=