angular-custom-datepicker
Version:
Custom Datepicker component for Angular
394 lines • 75.5 kB
JavaScript
import { Component, EventEmitter, HostListener, Input, Output, ViewChild, } from '@angular/core';
import { faAngleLeft } from '@fortawesome/free-solid-svg-icons';
import { faAngleRight } from '@fortawesome/free-solid-svg-icons';
import * as i0 from "@angular/core";
import * as i1 from "@fortawesome/angular-fontawesome";
import * as i2 from "@angular/common";
export class AngularCustomDatepickerComponent {
constructor(window) {
this.window = window;
this.faAngleLeft = faAngleLeft;
this.faAngleRight = faAngleRight;
this.years = [];
this.months = [
{ id: 0, val: 'Jan' },
{ id: 1, val: 'Feb' },
{ id: 2, val: 'Mar' },
{ id: 3, val: 'Apr' },
{ id: 4, val: 'May' },
{ id: 5, val: 'Jun' },
{ id: 6, val: 'Jul' },
{ id: 7, val: 'Aug' },
{ id: 8, val: 'Sep' },
{ id: 9, val: 'Oct' },
{ id: 10, val: 'Nov' },
{ id: 11, val: 'Dec' },
];
this.date = new Date();
this.show = false;
this.days = [];
// Display on input box
this.displayDate = null;
this.minDate = null;
this.maxDate = null;
this.min = null;
this.max = null;
this.disabled = false;
this.selectedValue = null;
this.placeholder = 'Select Date';
this.SelectedDate = new EventEmitter();
}
// To detect any outside click to toggle or close the calendar accordingly
clickedOutside(event) {
if (this.disabled == true)
return;
else if (this.calendarInput?.nativeElement.contains(event.target)) {
this.show = !this.show;
if (this.show == true) {
// to display the selected date after dropdown is re-opened
if (this.displayDate != null) {
this.renderSelectedDate();
}
}
}
// Do not close the calendar if user clicks anywhere inside calendar
else if (this.calendar?.nativeElement.contains(event.target)) {
this.show = true;
}
else {
// Close the calendar if user clicks anywhere outside calendar/calendar input
this.show = false;
}
}
// To detect where to render (upside/downside) the calendar based on spacing
onResize(event) {
this.dropUpOrDown();
}
ngOnInit() {
this.yearAssigner();
let todaysDate = new Date().setHours(0, 0, 0, 0);
this.currentDateOrignal = new Date(todaysDate);
this.date.setDate(1);
this.date.setHours(0, 0, 0, 0);
this.selectedYear = this.date.getFullYear();
this.selectedMonth = this.date.getMonth();
if (this.min != null) {
let d = new Date(this.min).setHours(0, 0, 0, 0);
this.minDate = new Date(d);
}
if (this.max != null) {
let d = new Date(this.max).setHours(0, 0, 0, 0);
this.maxDate = new Date(d);
this.date.setYear(this.maxDate.getFullYear());
this.selectedYear = this.maxDate.getFullYear();
this.date.setMonth(this.maxDate.getMonth());
this.selectedMonth = this.maxDate.getMonth();
}
if (this?.selectedValue) {
this.setDisplayDateAccordingtoInput();
}
// Index of day of the first-date
this.firstDayIndex = this.date.getDay();
this.configureAndRenderCalendar();
}
ngAfterViewInit() {
this.dropUpOrDown();
}
ngOnChanges(changes) {
this.min = null;
this.max = null;
if (changes?.['min']?.currentValue) {
this.min = `${changes?.['min'].currentValue}`;
}
if (changes?.['max']?.currentValue) {
this.max = `${changes?.['max'].currentValue}`;
}
if (changes?.['selectedValue']?.currentValue) {
let selectedDate = new Date(`${changes?.['selectedValue'].currentValue}`);
selectedDate.setHours(0, 0, 0, 0);
this.selectedValue = selectedDate;
}
else {
this.displayDate = null;
}
if (changes?.['min']?.currentValue ||
changes?.['max']?.currentValue ||
changes?.['selectedValue']?.currentValue)
this.ngOnInit();
}
configureAndRenderCalendar() {
this.days = [];
this.lastDayofCurrentMonth = 0;
this.lastDayofPrevMonth = 0;
this.lastDayIndex = 0;
this.nextDays = 0;
this.lastDayIndex = new Date(this.date.getFullYear(), this.date.getMonth() + 1, 0).getDay();
//days of next month to be displayed
this.nextDays = 7 - this.lastDayIndex - 1;
this.lastDayofCurrentMonth = new Date(this.date.getFullYear(), this.date.getMonth() + 1, 0).getDate();
this.lastDayofPrevMonth = new Date(this.date.getFullYear(), this.date.getMonth(), 0).getDate();
// Previous month dates (Dates like 29,30,31,1)
for (let x = this.firstDayIndex - 1; x >= 0; x--) {
this.days.push({
day: this.lastDayofPrevMonth - x,
type: 'prev',
disabled: true,
});
}
// Setting Current month dates (1-30 / 1-31)
let disabled;
for (let i = 1; i <= this.lastDayofCurrentMonth; i++) {
disabled = false;
// Check if mindate lies between these dates
if (this?.minDate) {
if (this.checkIfDateisEqualtoMinDate(i))
this.leftIconDisabled = true;
if (this.checkIfDateisLessThanMinDate(i)) {
this.leftIconDisabled = true;
disabled = true;
}
}
// Check if maxdate lies between these dates
if (this?.maxDate) {
if (this.checkIfDateisEqualtoMaxDate(i))
this.rightIconDisabled = true;
if (this.checkIfDateisGreaterThanMaxDate(i)) {
this.rightIconDisabled = true;
disabled = true;
}
}
// To highlight the selected date
if (i == this?.displayDate?.getDate() &&
this?.displayDate?.getMonth() == this.date.getMonth() &&
this?.displayDate?.getFullYear() == this.date.getFullYear()) {
this.days.push({ day: i, type: 'target', disabled: disabled });
}
else {
this.days.push({ day: i, type: 'curr', disabled: disabled });
}
}
// Number of next days to be displayed
if (this.nextDays <= 2) {
this.nextDays += 3;
}
// Dates of next month
for (let j = 1; j <= this.nextDays; j++) {
this.days.push({ day: j, type: 'next', disabled: true });
}
}
// Toggle calendar on icon click
calendarClick() {
this.show = !this.show;
}
// If left arrow is clicked
prevArrow() {
// Do not allow if disabled
if (this.leftIconDisabled)
return;
// Reset
this.leftIconDisabled = false;
this.rightIconDisabled = false;
this.date.setMonth(this.date.getMonth() - 1);
this.selectedYear = this.date.getFullYear();
// If calendar is finished (first month and first year of calendar)
this.checkIfCalendarisFinished(this.date.getMonth(), this.selectedYear);
this.date.setDate(1);
this.firstDayIndex = this.date.getDay();
this.configureAndRenderCalendar();
}
// If right arrow is clicked
nextArrow() {
// Do not allow if disabled
if (this.rightIconDisabled)
return;
// Reset
this.leftIconDisabled = false;
this.rightIconDisabled = false;
this.date.setMonth(this.date.getMonth() + 1);
this.selectedYear = this.date.getFullYear();
// If calendar is finished (last month and last year of calendar)
this.checkIfCalendarisFinished(this.date.getMonth(), this.selectedYear);
this.date.setDate(1);
this.firstDayIndex = this.date.getDay();
this.configureAndRenderCalendar();
}
dateClicked(val) {
// If date is not disabled
if ((val.type == 'curr' || val.type == 'target') && !val.disabled) {
this.show = false;
let day = val.day;
let month = this.date.getMonth();
let year = this.date.getFullYear();
this.selectedDay = day;
this.selectedMonth = month;
this.selectedYear = year;
this.date = new Date(year, month, day);
this.displayDate = new Date(year, month, day);
this.SelectedDate.emit(this.displayDate);
this.configureAndRenderCalendar();
}
}
// Year is changed
yearSelected(e) {
this.leftIconDisabled = false;
this.rightIconDisabled = false;
let y = e.target.value;
this.date.setYear(y);
this.selectedYear = this.date.getFullYear();
this.date.setDate(1);
// Disable leftIcon/RightIcon if calendar is finished
this.checkIfCalendarisFinished(this.date.getMonth(), this.selectedYear);
// To Display and render correct month in case mindate and/or maxdate is set
if (this?.minDate?.getFullYear() == this.selectedYear ||
this?.maxDate?.getFullYear() == this.selectedYear) {
if (this?.minDate?.getFullYear() == this.selectedYear) {
if (this.date.getMonth() <= this.minDate.getMonth())
this.date.setMonth(this.minDate.getMonth());
}
else if (this?.maxDate?.getFullYear() == this.selectedYear) {
if (this.date.getMonth() >= this.maxDate.getMonth())
this.date.setMonth(this.maxDate.getMonth());
}
}
this.date.setDate(1);
this.firstDayIndex = this.date.getDay(0);
this.configureAndRenderCalendar();
}
// Month is changed
monthSelected(e) {
this.leftIconDisabled = false;
this.rightIconDisabled = false;
let m = e.target.value;
this.date.setMonth(m);
this.selectedMonth = this.date.getMonth();
// Disable leftIcon/RightIcon if calendar is finished
this.checkIfCalendarisFinished(this.date.getMonth(), this.selectedYear);
this.firstDayIndex = this.date.getDay();
this.configureAndRenderCalendar();
}
// Position to render the calendar accordingly
dropUpOrDown() {
let dropdownHeight = 288 + 42;
let windowHeight = this.window.innerHeight;
let calendarStart = this.calendarInput.nativeElement.getBoundingClientRect().top;
if (windowHeight - calendarStart < dropdownHeight) {
return 'dropup';
}
else {
return 'dropdown';
}
}
// Assign 100 years starting from (currentYear-100);
yearAssigner() {
this.years = [];
let currentYear = new Date().getFullYear();
let startYear = Number(currentYear) - 100;
for (let i = startYear; i <= currentYear; i++) {
this.years.push({ val: `${i}` });
}
}
checkIfCalendarisFinished(month, year) {
if (month == 0 && year == this.years[0].val) {
this.leftIconDisabled = true;
}
else if (month == 11 && year == this.years[this.years.length - 1].val) {
this.rightIconDisabled = true;
}
}
checkIfDateisLessThanMinDate(d) {
if (new Date(this.date.getFullYear(), this.date.getMonth(), d).getTime() <
this?.minDate?.getTime()) {
return true;
}
else
return false;
}
checkIfDateisEqualtoMinDate(d) {
if (new Date(this.date.getFullYear(), this.date.getMonth(), d).getTime() ==
this?.minDate?.getTime()) {
return true;
}
else
return false;
}
checkIfDateisEqualtoMaxDate(d) {
if (new Date(this.date.getFullYear(), this.date.getMonth(), d).getTime() ==
this?.maxDate?.getTime()) {
return true;
}
else
return false;
}
checkIfDateisGreaterThanMaxDate(d) {
if (new Date(this.date.getFullYear(), this.date.getMonth(), d).getTime() >
this?.maxDate?.getTime()) {
return true;
}
else
return false;
}
renderSelectedDate() {
this.leftIconDisabled = false;
this.rightIconDisabled = false;
this.date.setYear(this.displayDate?.getFullYear());
this.date.setMonth(this.displayDate?.getMonth());
this.date.setDate(this.displayDate?.getDate());
this.firstDayIndex = new Date(this.displayDate?.getFullYear(), this.displayDate?.getMonth(), 1).getDay();
this.selectedYear = this.displayDate?.getFullYear();
this.selectedMonth = this.displayDate?.getMonth();
this.checkIfCalendarisFinished(this.selectedMonth, this.selectedYear);
this.configureAndRenderCalendar();
}
setDisplayDateAccordingtoInput() {
if (this.minDate != null && this.maxDate != null) {
if (this?.selectedValue?.getTime() >= this?.minDate?.getTime() &&
this?.selectedValue?.getTime() <= this?.maxDate?.getTime()) {
this.displayDate = this.selectedValue;
}
}
else if (this.minDate != null &&
this?.selectedValue?.getTime() >= this?.minDate?.getTime()) {
this.displayDate = this.selectedValue;
}
else if (this.maxDate != null &&
this?.selectedValue?.getTime() <= this?.maxDate?.getTime()) {
this.displayDate = this.selectedValue;
}
else if (this.minDate == null && this.maxDate == null)
this.displayDate = this.selectedValue;
}
}
AngularCustomDatepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AngularCustomDatepickerComponent, deps: [{ token: Window }], target: i0.ɵɵFactoryTarget.Component });
AngularCustomDatepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: AngularCustomDatepickerComponent, selector: "date-picker", inputs: { min: "min", max: "max", disabled: "disabled", selectedValue: "selectedValue", placeholder: "placeholder" }, outputs: { SelectedDate: "SelectedDate" }, host: { listeners: { "document:click": "clickedOutside($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "calendar", first: true, predicate: ["cally"], descendants: true }, { propertyName: "calendarInput", first: true, predicate: ["callyinp"], descendants: true }, { propertyName: "calendarIcon", first: true, predicate: ["callyicon"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\n <div class=\"set\">\n <div #callyinp class=\"inputtag\">\n <input\n [disabled]=\"this?.disabled\"\n [readonly]=\"true\"\n placeholder=\"{{placeholder}}\"\n [value]=\"displayDate?.toDateString() | date: 'dd/MM/yyyy'\"\n class=\"calendar-input\"\n type=\"text\"\n />\n <div #callyicon class=\"iconholder\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n fill=\"currentColor\"\n class=\"icon bi bi-calendar-event\"\n viewBox=\"0 0 16 16\"\n >\n <path\n d=\"M11 6.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1z\"\n />\n <path\n d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5zM1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4H1z\"\n />\n </svg>\n </div>\n </div>\n <div *ngIf=\"show\" #cally class=\"calendar\" [ngClass]=\"dropUpOrDown()\">\n <div class=\"calendarheader\">\n <span (click)=\"prevArrow()\" class=\"leftIcon\">\n <fa-icon\n [ngClass]=\"{ 'fa-disabled': leftIconDisabled }\"\n size=\"lg\"\n [icon]=\"faAngleLeft\"\n ></fa-icon>\n </span>\n\n <div class=\"month_year\">\n <select (change)=\"monthSelected($event)\" class=\"monthpicker\">\n <ng-container *ngFor=\"let month of months\">\n <option\n *ngIf=\"\n month.id <= this?.maxDate?.getMonth() ||\n this.selectedYear != this?.maxDate?.getFullYear()\n \"\n [disabled]=\"\n (this.selectedYear == this?.minDate?.getFullYear() &&\n month.id < this?.minDate?.getMonth()) ||\n (month.id > this?.maxDate?.getMonth() &&\n this.selectedYear == this?.maxDate?.getFullYear())\n \"\n [selected]=\"this.date.getMonth() == month.id\"\n [value]=\"month.id\"\n >\n {{ month.val }}\n </option>\n </ng-container>\n <!-- (this.selectedYear == this?.minDate?.getFullYear() &&\n month.id < this?.minDate?.getMonth()) ||\n (month.id > this?.maxDate?.getMonth() &&\n this.selectedYear == this?.maxDate?.getFullYear()) ||\n (this.selectedYear >= this.currentDateOrignal.getFullYear() &&\n month.id > this.currentDateOrignal.getMonth()) -->\n </select>\n <select (change)=\"yearSelected($event)\" class=\"yearpicker\">\n <ng-container *ngFor=\"let year of years\">\n <option\n *ngIf=\"\n !(this?.minDate && year.val < this?.minDate?.getFullYear()) &&\n !(this?.maxDate && year.val > this?.maxDate?.getFullYear())\n \"\n [disabled]=\"\n (this?.minDate && year.val < this?.minDate?.getFullYear()) ||\n (this?.maxDate && year.val > this?.maxDate?.getFullYear())\n \"\n [selected]=\"this.date.getFullYear() == year.val\"\n [value]=\"year.val\"\n >\n <span>{{ year.val }}</span>\n </option>\n </ng-container>\n </select>\n </div>\n\n <span (click)=\"nextArrow()\" class=\"rightIcon\">\n <fa-icon\n [ngClass]=\"{ 'fa-disabled': rightIconDisabled }\"\n size=\"lg\"\n [icon]=\"faAngleRight\"\n ></fa-icon>\n </span>\n </div>\n <div class=\"weekdays\">\n <div>Su</div>\n <div>Mo</div>\n <div>Tu</div>\n <div>We</div>\n <div>Th</div>\n <div>Fr</div>\n <div>Sa</div>\n </div>\n <div class=\"days\">\n <div\n (click)=\"dateClicked(day)\"\n [ngClass]=\"{\n 'prev-date': day.type == 'prev',\n 'next-date': day.type == 'next',\n target: day.type == 'target',\n disabled: day.disabled == true,\n currentDate:\n this.currentDateOrignal.getDate() == day.day &&\n day.type == 'curr' &&\n this.currentDateOrignal.getFullYear() ==\n this.date.getFullYear() &&\n this.currentDateOrignal.getMonth() == this.date.getMonth()\n }\"\n *ngFor=\"let day of days\"\n >\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".container{width:100%;height:100vh;background-color:#fff;display:flex;justify-content:center;align-items:center}.parent,.set{position:relative}.calendarheader{border-radius:5px;height:2rem;color:#fff;background-color:#0974ad;display:flex;justify-content:space-between;align-items:center}.calendar{font-family:Arial,Helvetica,sans-serif;background-color:#d6f1ff;width:19rem;height:18rem;padding:.5rem;z-index:999}.leftIcon{cursor:pointer;margin-left:4px}.rightIcon{cursor:pointer;margin-right:4px}.select{font-size:1rem}.monthpicker{font-size:1rem;width:5.5rem;padding-left:5px;height:1.5rem}.yearpicker{width:5.5rem;font-size:1rem;height:1.5rem;padding-left:5px}.yearpicker,.monthpicker:focus{outline:none}.weekdays{width:100%;height:2.5rem;display:flex;align-items:center;font-weight:600;margin-bottom:.2rem}.weekdays div{font-size:1.1rem;width:2.5614285714rem;text-align:center;box-sizing:border-box}.days{display:flex;flex-wrap:wrap;align-items:center}.days div{box-sizing:border-box;width:2.5614285714rem;text-align:center;height:2rem;display:flex;justify-content:center;align-items:center}.prev-date,.next-date{opacity:.5}.days div:hover:not(.today,.next-date,.prev-date,.disabled,.target,.currentDate){border:.1rem solid #777;border-radius:10%}.days div:hover:not(.next-date,.prev-date,.disabled){cursor:pointer}.calendar-input{width:100%;padding:.5rem;font-size:1rem;border:1px solid #ced4da;border-radius:.2rem}.calendar-input:focus{outline:none}.inputtag{position:relative!important}.iconholder{top:25%;position:absolute;right:3%;cursor:pointer}.icon:hover{transition:.1s;width:1.2rem;height:1.2rem}.calendar{position:absolute}.target{background-color:#0974ad;color:#fff;border-radius:10%}.disabled{opacity:.5}.fa-disabled{opacity:.6;cursor:not-allowed}.currentDate{background-color:#9ed6f3;border-radius:10%}.dropup{bottom:2.62rem;border-top-left-radius:3%;border-top-right-radius:3%}.dropdown{left:0;border-bottom-left-radius:3%;border-bottom-right-radius:3%}@media (min-width: 320px) and (max-width: 500px){.calendar{width:100%!important}.weekdays div,.days div{width:14.2857142857%!important}.monthpicker,.yearpicker{width:6rem!important;height:1.7rem;padding-left:5px}.calendarheader{height:2.5rem!important}.leftIcon,.rightIcon{font-size:1.3rem!important}}select{color:#000;-webkit-appearance:none;border-radius:0;-webkit-border-radius:0px;background-image:url(\"data:image/svg+xml;utf8,<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='24' height='24' viewBox='0 0 24 24'><path fill='%23444' d='M7.406 7.828l4.594 4.594 4.594-4.594 1.406 1.406-6 6-6-6z'></path></svg>\");background-position:100% 50%;background-repeat:no-repeat;background-color:#fff;border:1px solid #767676}\n"], components: [{ type: i1.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "date": i2.DatePipe } });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: AngularCustomDatepickerComponent, decorators: [{
type: Component,
args: [{ selector: 'date-picker', template: "<div>\n <div class=\"set\">\n <div #callyinp class=\"inputtag\">\n <input\n [disabled]=\"this?.disabled\"\n [readonly]=\"true\"\n placeholder=\"{{placeholder}}\"\n [value]=\"displayDate?.toDateString() | date: 'dd/MM/yyyy'\"\n class=\"calendar-input\"\n type=\"text\"\n />\n <div #callyicon class=\"iconholder\">\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"18\"\n height=\"18\"\n fill=\"currentColor\"\n class=\"icon bi bi-calendar-event\"\n viewBox=\"0 0 16 16\"\n >\n <path\n d=\"M11 6.5a.5.5 0 0 1 .5-.5h1a.5.5 0 0 1 .5.5v1a.5.5 0 0 1-.5.5h-1a.5.5 0 0 1-.5-.5v-1z\"\n />\n <path\n d=\"M3.5 0a.5.5 0 0 1 .5.5V1h8V.5a.5.5 0 0 1 1 0V1h1a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h1V.5a.5.5 0 0 1 .5-.5zM1 4v10a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1V4H1z\"\n />\n </svg>\n </div>\n </div>\n <div *ngIf=\"show\" #cally class=\"calendar\" [ngClass]=\"dropUpOrDown()\">\n <div class=\"calendarheader\">\n <span (click)=\"prevArrow()\" class=\"leftIcon\">\n <fa-icon\n [ngClass]=\"{ 'fa-disabled': leftIconDisabled }\"\n size=\"lg\"\n [icon]=\"faAngleLeft\"\n ></fa-icon>\n </span>\n\n <div class=\"month_year\">\n <select (change)=\"monthSelected($event)\" class=\"monthpicker\">\n <ng-container *ngFor=\"let month of months\">\n <option\n *ngIf=\"\n month.id <= this?.maxDate?.getMonth() ||\n this.selectedYear != this?.maxDate?.getFullYear()\n \"\n [disabled]=\"\n (this.selectedYear == this?.minDate?.getFullYear() &&\n month.id < this?.minDate?.getMonth()) ||\n (month.id > this?.maxDate?.getMonth() &&\n this.selectedYear == this?.maxDate?.getFullYear())\n \"\n [selected]=\"this.date.getMonth() == month.id\"\n [value]=\"month.id\"\n >\n {{ month.val }}\n </option>\n </ng-container>\n <!-- (this.selectedYear == this?.minDate?.getFullYear() &&\n month.id < this?.minDate?.getMonth()) ||\n (month.id > this?.maxDate?.getMonth() &&\n this.selectedYear == this?.maxDate?.getFullYear()) ||\n (this.selectedYear >= this.currentDateOrignal.getFullYear() &&\n month.id > this.currentDateOrignal.getMonth()) -->\n </select>\n <select (change)=\"yearSelected($event)\" class=\"yearpicker\">\n <ng-container *ngFor=\"let year of years\">\n <option\n *ngIf=\"\n !(this?.minDate && year.val < this?.minDate?.getFullYear()) &&\n !(this?.maxDate && year.val > this?.maxDate?.getFullYear())\n \"\n [disabled]=\"\n (this?.minDate && year.val < this?.minDate?.getFullYear()) ||\n (this?.maxDate && year.val > this?.maxDate?.getFullYear())\n \"\n [selected]=\"this.date.getFullYear() == year.val\"\n [value]=\"year.val\"\n >\n <span>{{ year.val }}</span>\n </option>\n </ng-container>\n </select>\n </div>\n\n <span (click)=\"nextArrow()\" class=\"rightIcon\">\n <fa-icon\n [ngClass]=\"{ 'fa-disabled': rightIconDisabled }\"\n size=\"lg\"\n [icon]=\"faAngleRight\"\n ></fa-icon>\n </span>\n </div>\n <div class=\"weekdays\">\n <div>Su</div>\n <div>Mo</div>\n <div>Tu</div>\n <div>We</div>\n <div>Th</div>\n <div>Fr</div>\n <div>Sa</div>\n </div>\n <div class=\"days\">\n <div\n (click)=\"dateClicked(day)\"\n [ngClass]=\"{\n 'prev-date': day.type == 'prev',\n 'next-date': day.type == 'next',\n target: day.type == 'target',\n disabled: day.disabled == true,\n currentDate:\n this.currentDateOrignal.getDate() == day.day &&\n day.type == 'curr' &&\n this.currentDateOrignal.getFullYear() ==\n this.date.getFullYear() &&\n this.currentDateOrignal.getMonth() == this.date.getMonth()\n }\"\n *ngFor=\"let day of days\"\n >\n {{ day.day }}\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".container{width:100%;height:100vh;background-color:#fff;display:flex;justify-content:center;align-items:center}.parent,.set{position:relative}.calendarheader{border-radius:5px;height:2rem;color:#fff;background-color:#0974ad;display:flex;justify-content:space-between;align-items:center}.calendar{font-family:Arial,Helvetica,sans-serif;background-color:#d6f1ff;width:19rem;height:18rem;padding:.5rem;z-index:999}.leftIcon{cursor:pointer;margin-left:4px}.rightIcon{cursor:pointer;margin-right:4px}.select{font-size:1rem}.monthpicker{font-size:1rem;width:5.5rem;padding-left:5px;height:1.5rem}.yearpicker{width:5.5rem;font-size:1rem;height:1.5rem;padding-left:5px}.yearpicker,.monthpicker:focus{outline:none}.weekdays{width:100%;height:2.5rem;display:flex;align-items:center;font-weight:600;margin-bottom:.2rem}.weekdays div{font-size:1.1rem;width:2.5614285714rem;text-align:center;box-sizing:border-box}.days{display:flex;flex-wrap:wrap;align-items:center}.days div{box-sizing:border-box;width:2.5614285714rem;text-align:center;height:2rem;display:flex;justify-content:center;align-items:center}.prev-date,.next-date{opacity:.5}.days div:hover:not(.today,.next-date,.prev-date,.disabled,.target,.currentDate){border:.1rem solid #777;border-radius:10%}.days div:hover:not(.next-date,.prev-date,.disabled){cursor:pointer}.calendar-input{width:100%;padding:.5rem;font-size:1rem;border:1px solid #ced4da;border-radius:.2rem}.calendar-input:focus{outline:none}.inputtag{position:relative!important}.iconholder{top:25%;position:absolute;right:3%;cursor:pointer}.icon:hover{transition:.1s;width:1.2rem;height:1.2rem}.calendar{position:absolute}.target{background-color:#0974ad;color:#fff;border-radius:10%}.disabled{opacity:.5}.fa-disabled{opacity:.6;cursor:not-allowed}.currentDate{background-color:#9ed6f3;border-radius:10%}.dropup{bottom:2.62rem;border-top-left-radius:3%;border-top-right-radius:3%}.dropdown{left:0;border-bottom-left-radius:3%;border-bottom-right-radius:3%}@media (min-width: 320px) and (max-width: 500px){.calendar{width:100%!important}.weekdays div,.days div{width:14.2857142857%!important}.monthpicker,.yearpicker{width:6rem!important;height:1.7rem;padding-left:5px}.calendarheader{height:2.5rem!important}.leftIcon,.rightIcon{font-size:1.3rem!important}}select{color:#000;-webkit-appearance:none;border-radius:0;-webkit-border-radius:0px;background-image:url(\"data:image/svg+xml;utf8,<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' width='24' height='24' viewBox='0 0 24 24'><path fill='%23444' d='M7.406 7.828l4.594 4.594 4.594-4.594 1.406 1.406-6 6-6-6z'></path></svg>\");background-position:100% 50%;background-repeat:no-repeat;background-color:#fff;border:1px solid #767676}\n"] }]
}], ctorParameters: function () { return [{ type: Window }]; }, propDecorators: { calendar: [{
type: ViewChild,
args: ['cally']
}], calendarInput: [{
type: ViewChild,
args: ['callyinp']
}], calendarIcon: [{
type: ViewChild,
args: ['callyicon']
}], clickedOutside: [{
type: HostListener,
args: ['document:click', ['$event']]
}], onResize: [{
type: HostListener,
args: ['window:resize', ['$event']]
}], min: [{
type: Input
}], max: [{
type: Input
}], disabled: [{
type: Input
}], selectedValue: [{
type: Input
}], placeholder: [{
type: Input
}], SelectedDate: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1jdXN0b20tZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWN1c3RvbS1kYXRlcGlja2VyL3NyYy9saWIvYW5ndWxhci1jdXN0b20tZGF0ZXBpY2tlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWN1c3RvbS1kYXRlcGlja2VyL3NyYy9saWIvZGF0ZS1waWNrZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7QUFNakUsTUFBTSxPQUFPLGdDQUFnQztJQU0zQyxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUZsQyxnQkFBVyxHQUFHLFdBQVcsQ0FBQztRQUMxQixpQkFBWSxHQUFHLFlBQVksQ0FBQztRQStCNUIsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLFdBQU0sR0FBRztZQUNQLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQ3JCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQ3JCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQ3JCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQ3JCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFO1lBQ3JCLEVBQUUsRUFB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