A fully custom, Angular date-picker component built with HTML, SCSS, and TypeScript. This component provides:
A dropdown calendar
Month & year selectors
Highlighting of the current day
Prevention of selecting future dates
A 6×7 (42-cell) grid that dynamically renders all days of the selected month
A clean UI wrapper matching standard Angular component patterns
/src/app/date-picker/
│── date-picker.component.html
│── date-picker.component.scss
│── date-picker.component.ts
Include the date picker inside any page using:
<div class="date-picker">
<div app-calendar></div>
</div>
Builds a 42-cell date grid (6 weeks) including leading/trailing blank cells for alignment.
Click the month or year to toggle dropdown menus.
Automatically highlights today’s date.
Selecting a future date triggers an alert.
Can be dropped into any Angular component with minimal setup.
<div id="calendar-component">
<input
type="text"
placeholder="Select a date..."
(focus)="openCalendar()"
[ngClass]="{ 'future-date': selectedDate > currentDate }"
value="{{ months[monthIndex] + ' ' + currentDay + ', ' + year }}"
/>
<div *ngIf="calendarVisible" class="calendar">
<!-- Navigation -->
<nav>
<div class="close-calendar" (click)="closeCalendar()">
<span>✕</span>
</div>
<!-- Month selector -->
<div class="month" (click)="showMonths()">
<span>{{ months[monthIndex] }}</span>
<div class="caret" [ngClass]="{ rotate: monthsMenu }"></div>
<ul *ngIf="monthsMenu">
<li *ngFor="let month of months; let i = index" (click)="selectMonth(i)">
{{ month }}
</li>
</ul>
</div>
<!-- Year selector -->
<div class="year" (click)="showYears()">
<span>{{ year }}</span>
<div class="caret" [ngClass]="{ rotate: yearsMenu }"></div>
<ul *ngIf="yearsMenu">
<li *ngFor="let year of years" (click)="selectYear(year)">
{{ year }}
</li>
</ul>
</div>
</nav>
<!-- Weekdays -->
<div class="weekdays">
<ul>
<li *ngFor="let day of weekdays">{{ day }}</li>
</ul>
</div>
<!-- Day Grid -->
<div class="all-days-skeleton">
<div
*ngFor="let day of daySpan"
(click)="selectDay(day)"
[ngClass]="{
'has-value': day.value != null,
'current-date': day.value === currentDay
}"
>
<div class="day-value">{{ day.value }}</div>
</div>
</div>
</div>
</div>
The component handles:
Calculating first/last day of each month
Generating a 42-cell matrix
Toggling calendar visibility
Selecting month/year/day
Blocking future dates
import { Component, OnInit } from '@angular/core';
@Component({
selector: '[app-calendar]',
templateUrl: './date-picker.component.html',
styleUrls: ['./date-picker.component.scss'],
})
export class DatepickerComponent implements OnInit {
calendarVisible = false;
d = new Date();
weekdays = ['S', 'M', 'T', 'W', 'T', 'F', 'S'];
months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
// Set Years
years = [
2003,2004,2005,2006,2007,2008,2009,2010,2011,2012,2013,2014,
2015,2016,2017,2018,2019,2020,2021,2022,2023,2024,2025
];
currentDay = this.d.getDate();
monthIndex = this.d.getMonth();
year = this.d.getFullYear();
firstDay: any;
lastDay: any;
monthsMenu = false;
yearsMenu = false;
daySpan: any[] = [];
selectedDate: number;
currentDate: number;
ngOnInit() {
this.firstLastDays();
}
calculateStartEndDate(firstDayOfMonth: number, lastDayOfMonth: number) {
this.daySpan = [];
let dayIndex = 1, emptyCells = 0;
for (let i = 0; i < 42; i++) {
if (firstDayOfMonth > i) emptyCells++;
this.daySpan.push({
value:
i >= firstDayOfMonth && i < emptyCells + lastDayOfMonth
? dayIndex++
: null,
});
}
}
firstLastDays() {
this.firstDay = new Date(this.year, this.monthIndex, 1);
this.lastDay = new Date(this.year, this.monthIndex + 1, 0);
this.calculateStartEndDate(this.firstDay.getDay(), this.lastDay.getDate());
}
selectYear(year: number) {
this.year = year;
this.firstLastDays();
this.checkForFutureDate(year, this.monthIndex, this.currentDay);
}
selectMonth(i: number) {
this.monthIndex = i;
this.firstLastDays();
this.checkForFutureDate(this.year, this.monthIndex + 1, this.currentDay);
}
selectDay(dayObj: any) {
this.currentDay = dayObj.value;
this.checkForFutureDate(this.year, this.monthIndex, this.currentDay);
}
openCalendar() {
this.calendarVisible = true;
}
closeCalendar() {
this.calendarVisible = false;
}
showMonths() {
this.monthsMenu = !this.monthsMenu;
this.yearsMenu = false;
}
showYears() {
this.yearsMenu = !this.yearsMenu;
this.monthsMenu = false;
}
checkForFutureDate(y: number, m: number, d: number) {
this.selectedDate = new Date(y, m, d).getTime();
this.currentDate = new Date().getTime();
if (this.selectedDate > this.currentDate) {
alert('Please select a non future date');
}
}
}
MIT — free to use, modify, and integrate into any Angular project.