date-picker-custom
Version:
A simple customizable date picker for Angular
320 lines (313 loc) • 21.4 kB
JavaScript
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