UNPKG

date-picker-custom

Version:

A simple customizable date picker for Angular

320 lines (313 loc) 21.4 kB
import { __spread, __decorate } from 'tslib'; import { ɵɵdefineInjectable, Injectable, EventEmitter, Input, Output, Component, NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; var DatePickerService = /** @class */ (function () { function DatePickerService() { this.monthDayMap = [ { numberOfDays: 31, month: 'January', days: this.arrangeDates(0, 31) //() => { return Array(31).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 28, month: 'February', days: this.arrangeDates(1, 28) //() => { return Array(28).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 31, month: 'March', days: this.arrangeDates(2, 31) //() => { return Array(31).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 30, month: 'April', days: this.arrangeDates(3, 30) //() => { return Array(30).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 31, month: 'May', days: this.arrangeDates(4, 31) //() => { return Array(31).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 30, month: 'June', days: this.arrangeDates(5, 30) //() => { return Array(30).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 31, month: 'July', days: this.arrangeDates(6, 31) //() => { return Array(31).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 31, month: 'August', days: this.arrangeDates(7, 31) //() => { return Array(31).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 30, month: 'September', days: this.arrangeDates(8, 30) //() => { return Array(30).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 31, month: 'October', days: this.arrangeDates(9, 31) //() => { return Array(31).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 30, month: 'November', days: this.arrangeDates(10, 30) //() => { return Array(30).fill(0).map((val, ind) => ind + 1); }, }, { numberOfDays: 31, month: 'December', days: this.arrangeDates(11, 31) //() => { return Array(31).fill(0).map((val, ind) => ind + 1); }, } ]; } DatePickerService.prototype.arrangeDates = function (month, numberOfDays, year) { var offsetDay = new Date(year || new Date().getFullYear(), month, 1).getDay(); var len = offsetDay + numberOfDays; return Array(len).fill(0).map(function (val, ind) { if (ind < offsetDay) val = 0; else val = ind - offsetDay + 1; return val; }); }; DatePickerService.prototype.monthToName = function (month) { return this.monthDayMap[month].month; }; DatePickerService.prototype.nameToMonth = function (month) { return this.monthDayMap.findIndex(function (element) { return element.month === month; }); }; DatePickerService.prototype.getMap = function () { return __spread(this.monthDayMap); }; DatePickerService.ɵprov = ɵɵdefineInjectable({ factory: function DatePickerService_Factory() { return new DatePickerService(); }, token: DatePickerService, providedIn: "root" }); DatePickerService = __decorate([ Injectable({ providedIn: 'root' }) ], DatePickerService); return DatePickerService; }()); var DatePickerComponent = /** @class */ (function () { function DatePickerComponent(datePickerService) { this.datePickerService = datePickerService; this.showDay = true; this.showMonth = true; this.showYear = true; this.themeColor = 'default'; this.finalDate = new EventEmitter(); this.finalDay = new EventEmitter(); this.finalMonth = new EventEmitter(); this.finalMonthName = new EventEmitter(); this.finalYear = new EventEmitter(); this.showDateBox = true; this.showMonthBox = false; this.showYearBox = false; } DatePickerComponent.prototype.ngOnInit = function () { var date = new Date(); this.selectedDay = this.checkDay = date.getDate(); this.selectedMonth = this.checkMonth = date.getMonth(); this.selectedYear = this.currentYear = this.checkYear = date.getFullYear(); this.years = Array(12).fill(this.selectedYear).map(function (val, ind) { val += ind; return val; }); this.monthDayMap = this.datePickerService.getMap(); this.themeColor = "theme-" + this.themeColor; if (this.showYear) { this.toggleDayMonthYear('year'); } if (this.showMonth) { this.toggleDayMonthYear('month'); } if (this.showDay) { this.toggleDayMonthYear('day'); } }; DatePickerComponent.prototype.monthYearPrev = function () { if (this.showDateBox) { this.selectedMonth--; if (this.selectedMonth < 0) { this.selectedYear--; this.selectedMonth = 11; } this.monthDayMap[this.selectedMonth].days = this.datePickerService.arrangeDates(this.selectedMonth, this.monthDayMap[this.selectedMonth].numberOfDays, this.selectedYear); } else if (this.showMonthBox) { this.selectedYear--; } else if (this.showYearBox) { this.currentYear -= 12; this.years = Array(12).fill(this.currentYear).map(function (val, ind) { val += ind; return val; }); } }; DatePickerComponent.prototype.monthYearNext = function () { if (this.showDateBox) { this.selectedMonth++; if (this.selectedMonth > 11) { this.selectedYear++; this.selectedMonth = 0; } this.monthDayMap[this.selectedMonth].days = this.datePickerService.arrangeDates(this.selectedMonth, this.monthDayMap[this.selectedMonth].numberOfDays, this.selectedYear); } else if (this.showMonthBox) { this.selectedYear++; } else if (this.showYearBox) { this.currentYear += 12; this.years = Array(12).fill(this.currentYear).map(function (val, ind) { val += ind; return val; }); } }; DatePickerComponent.prototype.selectDay = function (day) { this.selectedDay = this.checkDay = day; this.checkMonth = this.selectedMonth; this.checkYear = this.selectedYear; this.emitOutput(); }; DatePickerComponent.prototype.selectMonth = function (month) { this.selectedMonth = this.checkMonth = this.datePickerService.nameToMonth(month); this.checkYear = this.selectedYear; if (!this.showDay) { this.emitOutput(); } else { this.toggleDayMonthYear('day'); } }; DatePickerComponent.prototype.selectYear = function (year) { this.selectedYear = this.checkYear = year; if (!this.showMonth && !this.showDay) { this.emitOutput(); } else if (!this.showMonth) { this.toggleDayMonthYear('day'); } else { this.toggleDayMonthYear('month'); } }; DatePickerComponent.prototype.toggleDayMonthYear = function (param) { if (param === 'day') { this.showDateBox = true; this.showMonthBox = false; this.showYearBox = false; } else if (param === 'month') { this.showDateBox = false; this.showMonthBox = true; this.showYearBox = false; if (!this.showMonth && this.showYear) { this.toggleDayMonthYear('year'); } else if (!this.showMonth && !this.showYear) { this.toggleDayMonthYear('day'); } } else if (param === 'year' && this.showYear) { this.showDateBox = false; this.showMonthBox = false; this.showYearBox = true; } this.datePickerService.arrangeDates(this.selectedMonth, this.monthDayMap[this.selectedMonth].numberOfDays, this.selectedYear); }; DatePickerComponent.prototype.highlightCurrentDate = function (day) { var date = new Date(); return this.selectedDay === day && this.selectedMonth === this.checkMonth && this.selectedYear === this.checkYear; }; DatePickerComponent.prototype.highlightCurrentMonth = function (month) { var date = new Date(); return this.selectedMonth === this.datePickerService.nameToMonth(month) && this.selectedYear === this.checkYear; }; DatePickerComponent.prototype.highlightCurrentYear = function (year) { return year === this.selectedYear; }; DatePickerComponent.prototype.emitOutput = function () { var date = new Date(this.selectedYear, this.selectedMonth, this.selectedDay); var emitMonthName = this.datePickerService.monthToName(this.selectedMonth); var emitDay = this.selectedDay; var emitMonth = this.selectedMonth; var emitYear = this.selectedYear; if (!this.showDay) { emitDay = undefined; date = undefined; } if (!this.showMonth) { emitMonth = undefined; emitMonthName = undefined; date = undefined; } if (!this.showYear) { emitYear = undefined; date = undefined; } this.finalDate.emit(date); this.finalDay.emit(emitDay); this.finalMonth.emit(emitMonth); this.finalMonthName.emit(emitMonthName); this.finalYear.emit(emitYear); }; DatePickerComponent.ctorParameters = function () { return [ { type: DatePickerService } ]; }; __decorate([ Input('showDay') ], DatePickerComponent.prototype, "showDay", void 0); __decorate([ Input('showMonth') ], DatePickerComponent.prototype, "showMonth", void 0); __decorate([ Input('showYear') ], DatePickerComponent.prototype, "showYear", void 0); __decorate([ Input('theme') ], DatePickerComponent.prototype, "themeColor", void 0); __decorate([ Output('date') ], DatePickerComponent.prototype, "finalDate", void 0); __decorate([ Output('day') ], DatePickerComponent.prototype, "finalDay", void 0); __decorate([ Output('month') ], DatePickerComponent.prototype, "finalMonth", void 0); __decorate([ Output('month_name') ], DatePickerComponent.prototype, "finalMonthName", void 0); __decorate([ Output('year') ], DatePickerComponent.prototype, "finalYear", void 0); DatePickerComponent = __decorate([ Component({ selector: 'date-picker', template: "<main class='calendar-box' [ngClass]=\"themeColor\">\r\n <div class='calendar-box-heading-bar'>\r\n <div class=\"calendar-box-heading-bar-prev\" \r\n (click)=\"monthYearPrev()\">\r\n < \r\n </div>\r\n <div class=\"calendar-box-heading-bar-month\" \r\n (click)=\"toggleDayMonthYear('month')\"\r\n *ngIf='showDateBox && showDay'>\r\n {{monthDayMap[selectedMonth].month}} - {{selectedYear}}\r\n </div>\r\n <div class=\"calendar-box-heading-bar-month\" \r\n (click)=\"toggleDayMonthYear('year')\"\r\n *ngIf='showMonthBox && showMonth'>\r\n {{selectedYear}}\r\n </div>\r\n <div class=\"calendar-box-heading-bar-month\"\r\n *ngIf='showYearBox'>\r\n {{years[0]}}-{{years[11]}}\r\n </div>\r\n <div class=\"calendar-box-heading-bar-next\" \r\n (click)=\"monthYearNext()\">\r\n >\r\n </div>\r\n </div>\r\n <div class='calendar-box-days' *ngIf='showDateBox && showDay'>\r\n <div class='calendar-box-days-name' \r\n *ngFor=\"let day of ['S', 'M', 'T', 'W', 'T', 'F', 'S']\">\r\n {{day}}\r\n </div>\r\n <div class='calendar-box-days-day' \r\n *ngFor=\"let day of monthDayMap[selectedMonth].days\"\r\n (click)='selectDay(day)' \r\n [class.zero]='day === 0' \r\n [class.selected]='highlightCurrentDate(day)'>\r\n {{day}}\r\n </div>\r\n </div>\r\n <div class='calendar-box-months-years' *ngIf='showMonthBox && showMonth'>\r\n <div class='calendar-box-months-years-month-year' \r\n *ngFor=\"let month of monthDayMap\"\r\n (click)='selectMonth(month.month)' \r\n [class.selected]='highlightCurrentMonth(month.month)'>\r\n {{month.month.slice(0,3)}}\r\n </div>\r\n </div>\r\n <div class='calendar-box-months-years' *ngIf='showYearBox && showYear'>\r\n <div class='calendar-box-months-years-month-year' \r\n *ngFor=\"let year of years\" \r\n (click)='selectYear(year)'\r\n [class.selected]='highlightCurrentYear(year)'>\r\n {{year}}\r\n </div>\r\n </div>\r\n</main>", styles: [".calendar-box-heading-bar{cursor:pointer;display:flex}.calendar-box-heading-bar>*{padding:5px;transition:.2s ease-in-out}.theme-default .calendar-box-heading-bar>:hover{background-color:rgba(235,235,235,.377)}.theme-default .calendar-box-heading-bar>:active{background-color:rgba(158,158,158,.377);transition:.2s ease-in-out}.theme-red .calendar-box-heading-bar>:hover{background-color:rgba(255,208,208,.327)}.theme-red .calendar-box-heading-bar>:active{background-color:rgba(255,55,55,.327);transition:.2s ease-in-out}.theme-green .calendar-box-heading-bar>:hover{background-color:rgba(204,255,153,.534)}.theme-green .calendar-box-heading-bar>:active{background-color:rgba(128,255,0,.534);transition:.2s ease-in-out}.theme-yellow .calendar-box-heading-bar>:hover{background-color:rgba(255,255,168,.327)}.theme-yellow .calendar-box-heading-bar>:active{background-color:rgba(255,255,15,.327);transition:.2s ease-in-out}.theme-blue .calendar-box-heading-bar>:hover{background-color:rgba(168,213,255,.327)}.theme-blue .calendar-box-heading-bar>:active{background-color:rgba(15,139,255,.327);transition:.2s ease-in-out}.calendar-box-heading-bar-prev{width:10%;font-weight:700;font-size:18px;text-align:center}.theme-default .calendar-box-heading-bar-prev{border:1.5px solid rgba(82,82,82,.377);color:rgba(82,82,82,.377)}.theme-red .calendar-box-heading-bar-prev{border:1.5px solid rgba(157,0,0,.327);color:rgba(157,0,0,.327)}.theme-green .calendar-box-heading-bar-prev{border:1.5px solid rgba(51,102,0,.534);color:rgba(51,102,0,.534)}.theme-yellow .calendar-box-heading-bar-prev{border:1.5px solid rgba(117,117,0,.327);color:rgba(117,117,0,.327)}.theme-blue .calendar-box-heading-bar-prev{border:1.5px solid rgba(0,60,117,.327);color:rgba(0,60,117,.327)}.calendar-box-heading-bar-month{flex:1 1 auto;text-align:center}.calendar-box-heading-bar-next{width:10%;font-weight:700;font-size:18px;text-align:center}.theme-default .calendar-box-heading-bar-next{border:1.5px solid rgba(82,82,82,.377);color:rgba(82,82,82,.377)}.theme-red .calendar-box-heading-bar-next{border:1.5px solid rgba(157,0,0,.327);color:rgba(157,0,0,.327)}.theme-green .calendar-box-heading-bar-next{border:1.5px solid rgba(51,102,0,.534);color:rgba(51,102,0,.534)}.theme-yellow .calendar-box-heading-bar-next{border:1.5px solid rgba(117,117,0,.327);color:rgba(117,117,0,.327)}.theme-blue .calendar-box-heading-bar-next{border:1.5px solid rgba(0,60,117,.327);color:rgba(0,60,117,.327)}.calendar-box-days{height:200px;display:-ms-grid;display:grid;-ms-grid-columns:(1fr)[7];grid-template-columns:repeat(7,1fr)}.calendar-box-days-name{height:100%;width:100%;align-self:center;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:100;cursor:default;color:#979797;border-bottom:.05px solid #c7c7c7}.calendar-box-days-day{height:100%;width:100%;cursor:pointer;align-self:center;display:flex;align-items:center;justify-content:center;font-size:13px}.theme-default .calendar-box-days-day:hover{background-color:rgba(235,235,235,.377)}.theme-default .calendar-box-days-day:active{background-color:rgba(158,158,158,.377);transition:.2s ease-in-out}.theme-red .calendar-box-days-day:hover{background-color:rgba(255,208,208,.327)}.theme-red .calendar-box-days-day:active{background-color:rgba(255,55,55,.327);transition:.2s ease-in-out}.theme-green .calendar-box-days-day:hover{background-color:rgba(204,255,153,.534)}.theme-green .calendar-box-days-day:active{background-color:rgba(128,255,0,.534);transition:.2s ease-in-out}.theme-yellow .calendar-box-days-day:hover{background-color:rgba(255,255,168,.327)}.theme-yellow .calendar-box-days-day:active{background-color:rgba(255,255,15,.327);transition:.2s ease-in-out}.theme-blue .calendar-box-days-day:hover{background-color:rgba(168,213,255,.327)}.theme-blue .calendar-box-days-day:active{background-color:rgba(15,139,255,.327);transition:.2s ease-in-out}.theme-default .calendar-box-days-day.selected{background-color:rgba(158,158,158,.377)}.theme-red .calendar-box-days-day.selected{background-color:rgba(255,55,55,.327)}.theme-green .calendar-box-days-day.selected{background-color:rgba(128,255,0,.534)}.theme-yellow .calendar-box-days-day.selected{background-color:rgba(255,255,15,.327)}.theme-blue .calendar-box-days-day.selected{background-color:rgba(15,139,255,.327)}.calendar-box-days-day.zero{visibility:hidden!important}*{padding:0;margin:0;font-family:\"Segoe UI\",sans-serif,\"Helvetica Neue\"}.calendar-box-months-years{height:200px;display:-ms-grid;display:grid;-ms-grid-columns:(1fr)[3];grid-template-columns:repeat(3,1fr)}.calendar-box-months-years-month-year{height:100%;width:100%;cursor:pointer;align-self:center;display:flex;align-items:center;justify-content:center;font-size:13px}.theme-default .calendar-box-months-years-month-year:hover{background-color:rgba(235,235,235,.377)}.theme-default .calendar-box-months-years-month-year:active{background-color:rgba(158,158,158,.377);transition:.2s ease-in-out}.theme-red .calendar-box-months-years-month-year:hover{background-color:rgba(255,208,208,.327)}.theme-red .calendar-box-months-years-month-year:active{background-color:rgba(255,55,55,.327);transition:.2s ease-in-out}.theme-green .calendar-box-months-years-month-year:hover{background-color:rgba(204,255,153,.534)}.theme-green .calendar-box-months-years-month-year:active{background-color:rgba(128,255,0,.534);transition:.2s ease-in-out}.theme-yellow .calendar-box-months-years-month-year:hover{background-color:rgba(255,255,168,.327)}.theme-yellow .calendar-box-months-years-month-year:active{background-color:rgba(255,255,15,.327);transition:.2s ease-in-out}.theme-blue .calendar-box-months-years-month-year:hover{background-color:rgba(168,213,255,.327)}.theme-blue .calendar-box-months-years-month-year:active{background-color:rgba(15,139,255,.327);transition:.2s ease-in-out}.theme-default .calendar-box-months-years-month-year.selected{background-color:rgba(158,158,158,.377)}.theme-red .calendar-box-months-years-month-year.selected{background-color:rgba(255,55,55,.327)}.theme-green .calendar-box-months-years-month-year.selected{background-color:rgba(128,255,0,.534)}.theme-yellow .calendar-box-months-years-month-year.selected{background-color:rgba(255,255,15,.327)}.theme-blue .calendar-box-months-years-month-year.selected{background-color:rgba(15,139,255,.327)}.calendar-box{transition:.2s ease-in-out;position:relative;box-shadow:0 1.1px 2.1px -2px rgba(0,0,0,.1),0 4px 17px -8px rgba(0,0,0,.3);width:220px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}"] }) ], DatePickerComponent); return DatePickerComponent; }()); var DatePickerModule = /** @class */ (function () { function DatePickerModule() { } DatePickerModule = __decorate([ NgModule({ declarations: [DatePickerComponent], imports: [ BrowserModule ], exports: [DatePickerComponent] }) ], DatePickerModule); return DatePickerModule; }()); /* * Public API Surface of custom-date-picker */ /** * Generated bundle index. Do not edit. */ export { DatePickerComponent, DatePickerModule, DatePickerService }; //# sourceMappingURL=date-picker-custom.js.map