UNPKG

ngx-animating-datepicker

Version:

An Animating Datepicker for Angular 2+, for some smooth date picking :).

307 lines 15.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Injectable } from '@angular/core'; var DatepickerService = /** @class */ (function () { function DatepickerService() { } /** * Get the formatted weekdays * * @param language * @param format * @param start */ /** * Get the formatted weekdays * * @param {?} language * @param {?} format * @param {?} start * @return {?} */ DatepickerService.getWeekDays = /** * Get the formatted weekdays * * @param {?} language * @param {?} format * @param {?} start * @return {?} */ function (language, format, start) { /** @type {?} */ var days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']; /** @type {?} */ var index = days.indexOf(start.toLowerCase()); if (index < 0) { throw new Error('Invalid week day start: ' + start); } /** @type {?} */ var weekdays = []; for (var day = 5; day <= 11; day++) { weekdays.push(new Date(1970, 1 - 1, day + index).toLocaleString(language, { weekday: format })); } return weekdays; }; /** * Checks if is a value iso code * * @param isoCode */ /** * Checks if is a value iso code * * @param {?} isoCode * @return {?} */ DatepickerService.isValidIsoCode = /** * Checks if is a value iso code * * @param {?} isoCode * @return {?} */ function (isoCode) { /** @type {?} */ var pattern = new RegExp(/([a-z]{2})-([A-Z]{2})/); return pattern.test(isoCode); }; /** * Create a week array from the merged day arrays * * @param dayArray */ /** * Create a week array from the merged day arrays * * @param {?} dayArray * @return {?} */ DatepickerService.createWeekArray = /** * Create a week array from the merged day arrays * * @param {?} dayArray * @return {?} */ function (dayArray) { /** @type {?} */ var size = 7; /** @type {?} */ var weeks = []; while (dayArray.length) { weeks.push({ days: dayArray.splice(0, size) }); } return weeks; }; /** * @param {?} year * @param {?} month * @return {?} */ DatepickerService.getDaysInMonth = /** * @param {?} year * @param {?} month * @return {?} */ function (year, month) { return [31, DatepickerService.isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; }; /** * @param {?} value * @return {?} */ DatepickerService.isValidDate = /** * @param {?} value * @return {?} */ function (value) { /** @type {?} */ var validDate = true; for (var i = 0; i < value.length; i++) { if (!DatepickerService.isDate(value[i]) && validDate) { validDate = false; } } return validDate; }; /** * Check if year is a leap year * * @param year */ /** * Check if year is a leap year * * @param {?} year * @return {?} */ DatepickerService.isLeapYear = /** * Check if year is a leap year * * @param {?} year * @return {?} */ function (year) { return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; }; /** * Checks to see if value is a valid date * * @param value */ /** * Checks to see if value is a valid date * * @param {?} value * @return {?} */ DatepickerService.isDate = /** * Checks to see if value is a valid date * * @param {?} value * @return {?} */ function (value) { return value instanceof Date; }; /** * Get the year of the next month * * @param year * @param month */ /** * Get the year of the next month * * @param {?} year * @param {?} month * @return {?} */ DatepickerService.getYearOfNextMonth = /** * Get the year of the next month * * @param {?} year * @param {?} month * @return {?} */ function (year, month) { return month === 11 ? year + 1 : year; }; /** * Get the next month * * @param month */ /** * Get the next month * * @param {?} month * @return {?} */ DatepickerService.getNextMonth = /** * Get the next month * * @param {?} month * @return {?} */ function (month) { return month === 11 ? 0 : month + 1; }; /** * Get the year of the previous month * * @param year * @param month */ /** * Get the year of the previous month * * @param {?} year * @param {?} month * @return {?} */ DatepickerService.getYearOfPreviousMonth = /** * Get the year of the previous month * * @param {?} year * @param {?} month * @return {?} */ function (year, month) { return month === 0 ? year - 1 : year; }; /** * Get previous motnh * * @param month */ /** * Get previous motnh * * @param {?} month * @return {?} */ DatepickerService.getPreviousMonth = /** * Get previous motnh * * @param {?} month * @return {?} */ function (month) { return month === 0 ? 11 : month - 1; }; /** * Check if a date is later * * @param date * @param compareDate */ /** * Check if a date is later * * @param {?} date * @param {?} compareDate * @return {?} */ DatepickerService.isLater = /** * Check if a date is later * * @param {?} date * @param {?} compareDate * @return {?} */ function (date, compareDate) { return date > compareDate; }; /** * Check if a date is ealrier * * @param date * @param compareDate */ /** * Check if a date is ealrier * * @param {?} date * @param {?} compareDate * @return {?} */ DatepickerService.isEarlier = /** * Check if a date is ealrier * * @param {?} date * @param {?} compareDate * @return {?} */ function (date, compareDate) { return date < compareDate; }; DatepickerService.decorators = [ { type: Injectable }, ]; return DatepickerService; }()); export { DatepickerService }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWFuaW1hdGluZy1kYXRlcGlja2VyLyIsInNvdXJjZXMiOlsibGliL3NlcnZpY2VzL2RhdGVwaWNrZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUczQztJQUFBO0lBOElBLENBQUM7SUE1SUE7Ozs7OztPQU1HOzs7Ozs7Ozs7SUFDSSw2QkFBVzs7Ozs7Ozs7SUFBbEIsVUFBbUIsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYTs7WUFDM0QsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDOztZQUVyRixLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0MsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsR0FBRyxLQUFLLENBQUMsQ0FBQztTQUNwRDs7WUFFSyxRQUFRLEdBQUcsRUFBRTtRQUNuQixLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ25DLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2hHO1FBRUQsT0FBTyxRQUFRLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7O09BSUc7Ozs7Ozs7SUFDSSxnQ0FBYzs7Ozs7O0lBQXJCLFVBQXNCLE9BQWU7O1lBQzlCLE9BQU8s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Ozs7Ozs7SUFDSSx5QkFBTzs7Ozs7OztJQUFkLFVBQWUsSUFBVSxFQUFFLFdBQWlCO1FBQzNDLE9BQU8sSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUMzQixDQUFDO0lBRUQ7Ozs7O09BS0c7Ozs7Ozs7O0lBQ0ksMkJBQVM7Ozs7Ozs7SUFBaEIsVUFBaUIsSUFBVSxFQUFFLFdBQWlCO1FBQzdDLE9BQU8sSUFBSSxHQUFHLFdBQVcsQ0FBQztJQUMzQixDQUFDOztnQkE3SUQsVUFBVTs7SUE4SVgsd0JBQUM7Q0FBQSxBQTlJRCxJQThJQztTQTdJWSxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXksIFdlZWsgfSBmcm9tICcuLi9tb2RlbHMvZGF0ZXBpY2tlci5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEYXRlcGlja2VyU2VydmljZSB7XG5cdC8qKlxuXHQgKiBHZXQgdGhlIGZvcm1hdHRlZCB3ZWVrZGF5c1xuXHQgKlxuXHQgKiBAcGFyYW0gbGFuZ3VhZ2Vcblx0ICogQHBhcmFtIGZvcm1hdFxuXHQgKiBAcGFyYW0gc3RhcnRcblx0ICovXG5cdHN0YXRpYyBnZXRXZWVrRGF5cyhsYW5ndWFnZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZywgc3RhcnQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHRjb25zdCBkYXlzID0gWydtb25kYXknLCAndHVlc2RheScsICd3ZWRuZXNkYXknLCAndGh1cnNkYXknLCAnZnJpZGF5JywgJ3NhdHVyZGF5JywgJ3N1bmRheSddO1xuXG5cdFx0Y29uc3QgaW5kZXggPSBkYXlzLmluZGV4T2Yoc3RhcnQudG9Mb3dlckNhc2UoKSk7XG5cdFx0aWYgKGluZGV4IDwgMCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHdlZWsgZGF5IHN0YXJ0OiAnICsgc3RhcnQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHdlZWtkYXlzID0gW107XG5cdFx0Zm9yIChsZXQgZGF5ID0gNTsgZGF5IDw9IDExOyBkYXkrKykge1xuXHRcdFx0d2Vla2RheXMucHVzaChuZXcgRGF0ZSgxOTcwLCAxIC0gMSwgZGF5ICsgaW5kZXgpLnRvTG9jYWxlU3RyaW5nKGxhbmd1YWdlLCB7IHdlZWtkYXk6IGZvcm1hdCB9KSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHdlZWtkYXlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiBpcyBhIHZhbHVlIGlzbyBjb2RlXG5cdCAqXG5cdCAqIEBwYXJhbSBpc29Db2RlXG5cdCAqL1xuXHRzdGF0aWMgaXNWYWxpZElzb0NvZGUoaXNvQ29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoLyhbYS16XXsyfSktKFtBLVpdezJ9KS8pO1xuXHRcdHJldHVybiBwYXR0ZXJuLnRlc3QoaXNvQ29kZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGEgd2VlayBhcnJheSBmcm9tIHRoZSBtZXJnZWQgZGF5IGFycmF5c1xuXHQgKlxuXHQgKiBAcGFyYW0gZGF5QXJyYXlcblx0ICovXG5cdHN0YXRpYyBjcmVhdGVXZWVrQXJyYXkoZGF5QXJyYXk6IERheVtdKTogV2Vla1tdIHtcblx0XHRjb25zdCBzaXplID0gNztcblx0XHRjb25zdCB3ZWVrcyA9IFtdO1xuXHRcdHdoaWxlIChkYXlBcnJheS5sZW5ndGgpIHtcblx0XHRcdHdlZWtzLnB1c2goe1xuXHRcdFx0XHRkYXlzOiBkYXlBcnJheS5zcGxpY2UoMCwgc2l6ZSlcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRyZXR1cm4gd2Vla3M7XG5cdH1cblxuXHRzdGF0aWMgZ2V0RGF5c0luTW9udGgoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gWzMxLCBEYXRlcGlja2VyU2VydmljZS5pc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdW21vbnRoXTtcblx0fVxuXG5cdHN0YXRpYyBpc1ZhbGlkRGF0ZSh2YWx1ZTogYW55KTogYm9vbGVhbiB7XG5cdFx0bGV0IHZhbGlkRGF0ZSA9IHRydWU7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpZiAoIURhdGVwaWNrZXJTZXJ2aWNlLmlzRGF0ZSh2YWx1ZVtpXSkgJiYgdmFsaWREYXRlKSB7XG5cdFx0XHRcdHZhbGlkRGF0ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YWxpZERhdGU7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgeWVhciBpcyBhIGxlYXAgeWVhclxuXHQgKlxuXHQgKiBAcGFyYW0geWVhclxuXHQgKi9cblx0c3RhdGljIGlzTGVhcFllYXIoeWVhcjogbnVtYmVyKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrcyB0byBzZWUgaWYgdmFsdWUgaXMgYSB2YWxpZCBkYXRlXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKi9cblx0c3RhdGljIGlzRGF0ZSh2YWx1ZTogRGF0ZSkge1xuXHRcdHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSB5ZWFyIG9mIHRoZSBuZXh0IG1vbnRoXG5cdCAqXG5cdCAqIEBwYXJhbSB5ZWFyXG5cdCAqIEBwYXJhbSBtb250aFxuXHQgKi9cblx0c3RhdGljIGdldFllYXJPZk5leHRNb250aCh5ZWFyOiBudW1iZXIsIG1vbnRoOiBudW1iZXIpOiBudW1iZXIge1xuXHRcdHJldHVybiBtb250aCA9PT0gMTEgPyB5ZWFyICsgMSA6IHllYXI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBuZXh0IG1vbnRoXG5cdCAqXG5cdCAqIEBwYXJhbSBtb250aFxuXHQgKi9cblx0c3RhdGljIGdldE5leHRNb250aChtb250aDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gbW9udGggPT09IDExID8gMCA6IG1vbnRoICsgMTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXQgdGhlIHllYXIgb2YgdGhlIHByZXZpb3VzIG1vbnRoXG5cdCAqXG5cdCAqIEBwYXJhbSB5ZWFyXG5cdCAqIEBwYXJhbSBtb250aFxuXHQgKi9cblx0c3RhdGljIGdldFllYXJPZlByZXZpb3VzTW9udGgoeWVhcjogbnVtYmVyLCBtb250aDogbnVtYmVyKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gbW9udGggPT09IDAgPyB5ZWFyIC0gMSA6IHllYXI7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHByZXZpb3VzIG1vdG5oXG5cdCAqXG5cdCAqIEBwYXJhbSBtb250aFxuXHQgKi9cblx0c3RhdGljIGdldFByZXZpb3VzTW9udGgobW9udGg6IG51bWJlcik6IG51bWJlciB7XG5cdFx0cmV0dXJuIG1vbnRoID09PSAwID8gMTEgOiBtb250aCAtIDE7XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgYSBkYXRlIGlzIGxhdGVyXG5cdCAqXG5cdCAqIEBwYXJhbSBkYXRlXG5cdCAqIEBwYXJhbSBjb21wYXJlRGF0ZVxuXHQgKi9cblx0c3RhdGljIGlzTGF0ZXIoZGF0ZTogRGF0ZSwgY29tcGFyZURhdGU6IERhdGUpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZGF0ZSA+IGNvbXBhcmVEYXRlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGEgZGF0ZSBpcyBlYWxyaWVyXG5cdCAqXG5cdCAqIEBwYXJhbSBkYXRlXG5cdCAqIEBwYXJhbSBjb21wYXJlRGF0ZVxuXHQgKi9cblx0c3RhdGljIGlzRWFybGllcihkYXRlOiBEYXRlLCBjb21wYXJlRGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBkYXRlIDwgY29tcGFyZURhdGU7XG5cdH1cbn1cbiJdfQ==