Datepicker is a highly configurable component that adds datepicker functionality to your pages. You can customize the date format and language, restrict the selectable date ranges.
The easiest way to add the datepicker component to your app (will be added to the root module)
Basic
Note: If you installed ngx-bootstrap not via ng add command, you will need to perform a several actions
Notable change is additional css for it "/datepicker/bs-datepicker.css"
There are two ways of adding css:
- Load it from CDN. Add
<link rel="stylesheet" href="https://unpkg.com/ngx-bootstrap/datepicker/bs-datepicker.css">
to yourindex.html
- Load it from
dist/ngx-bootstrap/datepicker/bs-datepicker.css
via package bundler like Angular CLI, if you're using one.
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" bsDatepicker> </div> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-basic', templateUrl: './basic.html', standalone: false }) export class DemoDatepickerBasicComponent {}
Inline
with initial state set by bsInlineValue
property
<div class="row"> <div class="pr-3 pb-3 pe-3 w-auto"> <bs-datepicker-inline [bsValue]="bsInlineValue"></bs-datepicker-inline> </div> <div class="pr-3 pb-3 pe-3 w-auto"> <bs-daterangepicker-inline [bsValue]="bsInlineRangeValue"></bs-daterangepicker-inline> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-inline', templateUrl: './inline-datepicker.component.html', standalone: false }) export class DemoDatepickerInlineComponent { bsInlineValue = new Date(); bsInlineRangeValue: Date[]; maxDate = new Date(); constructor() { this.maxDate.setDate(this.maxDate.getDate() + 7); this.bsInlineRangeValue = [this.bsInlineValue, this.maxDate]; } }
With animation
You can enable animation via isAnimated
config option
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" bsDatepicker [bsConfig]="{ isAnimated: true }"> </div> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [bsConfig]="{ isAnimated: true }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-animated', templateUrl: './animated.html', standalone: false }) export class DemoDatePickerAnimatedComponent {}
Adaptive position
You can enable adaptive position via adaptivePosition
option in bsConfig
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" bsDatepicker [bsConfig]="{ adaptivePosition: true }"> </div> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [bsConfig]="{ adaptivePosition: true }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-adaptive-position', templateUrl: './adaptive-position.html', standalone: false }) export class DemoDatePickerAdaptivePositionComponent {}
Initial state
bsValue
property sets initial state in this example
ngModel
property sets two-way data binding in this example
<p><code>bsValue</code> property sets initial state in this example</p> <div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" class="form-control" #dp="bsDatepicker" bsDatepicker [bsValue]="bsValue"> </div> <div class="col-xs-12 col-12 col-md-3 form-group mb-3"> <button class="btn btn-success" (click)="dp.toggle()" [attr.aria-expanded]="dp.isOpen" type="button">Date Picker</button> </div> </div> <p><code>ngModel</code> property sets two-way data binding in this example</p> <div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input class="form-control" #drp="bsDaterangepicker" bsDaterangepicker [(ngModel)]="bsRangeValue"> </div> <div class="col-xs-12 col-12 col-md-3 form-group mb-3"> <button class="btn btn-success" (click)="drp.toggle()" [attr.aria-expanded]="drp.isOpen" type="button">Date Range Picker</button> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-date-initial-state', templateUrl: './date-initial-state.html', standalone: false }) export class DemoDatepickerDateInitialStateComponent { bsValue = new Date(); bsRangeValue: Date[]; maxDate = new Date(); constructor() { this.maxDate.setDate(this.maxDate.getDate() + 7); this.bsRangeValue = [this.bsValue, this.maxDate]; } }
Custom date format
You can easily change the date format by specifying the dateInputFormat
in [bsConfig]
To set your own date format you can use variety of formats provided by moment.js
The following examples show how to use several date formats inside a form:
YYYY-MM-DD
MM/DD/YYYY
MMMM Do YYYY,h:mm:ss a
<form [formGroup]="form"> <div class="row"> <div class="col-xs-12 col-md-5 col-lg-4 form-group mb-3"> <input class="form-control" #datepickerYMD="bsDatepicker" bsDatepicker formControlName="dateYMD" [bsConfig]="{ dateInputFormat: 'YYYY-MM-DD' }"> </div> <div class="col-xs-12 col-12 col-md-3 form-group mb-3"> <button class="btn btn-success" (click)="datepickerYMD.toggle()" [attr.aria-expanded]="datepickerYMD.isOpen" type="button">Date Picker</button> </div> </div> <br> <div class="row"> <div class="col-xs-12 col-md-5 col-lg-4 form-group mb-3"> <input class="form-control" #datepickerMDY="bsDatepicker" bsDatepicker formControlName="dateMDY" [bsConfig]="{ dateInputFormat: 'MM/DD/YYYY' }"> </div> <div class="col-xs-12 col-12 col-md-3 form-group mb-3"> <button class="btn btn-success" (click)="datepickerMDY.toggle()" [attr.aria-expanded]="datepickerMDY.isOpen" type="button">Date Picker</button> </div> </div> <br> <div class="row"> <div class="col-xs-12 col-md-5 col-lg-4 form-group mb-3"> <input class="form-control" #datepickerFull="bsDatepicker" bsDatepicker formControlName="dateFull" [bsConfig]="{ dateInputFormat: 'MMMM Do YYYY, h:mm:ss a' }"> </div> <div class="col-xs-12 col-12 col-md-3 form-group mb-3"> <button class="btn btn-success" (click)="datepickerFull.toggle()" [attr.aria-expanded]="datepickerFull.isOpen" type="button">Date Picker</button> </div> </div> <div class="row"> <div class="col-xs-12 col-md-5 col-lg-4 form-group mb-3"> <input type="text" class="form-control" formControlName="dateRange" #daterangepicker="bsDaterangepicker" bsDaterangepicker [bsConfig]="{ rangeInputFormat : 'MMMM Do YYYY, h:mm:ss a', dateInputFormat: 'MMMM Do YYYY, h:mm:ss a', showWeekNumbers: false }"> </div> <div class="col-xs-12 col-12 col-md-3 form-group mb-3"> <button class="btn btn-success" (click)="daterangepicker.toggle()" [attr.aria-expanded]="daterangepicker.isOpen" type="button">Date Range Picker</button> </div> </div> </form>
import { Component } from '@angular/core'; import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-date-picker-custom-format', templateUrl: './custom-format.html', standalone: false }) export class DemoDatePickerCustomFormatComponent { currentDate = new Date(); form = new UntypedFormGroup({ dateYMD: new UntypedFormControl(new Date()), dateFull: new UntypedFormControl(new Date()), dateMDY: new UntypedFormControl(new Date()), dateRange: new UntypedFormControl([ new Date(), new Date(this.currentDate.setDate(this.currentDate.getDate() + 7)) ]) }); }
Hide on scroll
Hide the datepicker on page scroll.
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input placeholder="Datepicker" class="form-control" #dp="bsDatepicker" bsDatepicker> </div> <div class="col-xs-12 col-12 col-md-3 form-group mb-3"> <button class="btn btn-success" (click)="dp.toggle()" [attr.aria-expanded]="dp.isOpen" type="button">Date Picker</button> </div> </div> <br>
import { Component, HostListener, ViewChild } from '@angular/core'; import { BsDatepickerDirective } from 'ngx-bootstrap/datepicker'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-date-picker-hide-on-scroll', templateUrl: './hide-on-scroll.html', standalone: false }) export class DemoDatepickerHideOnScrollComponent { @ViewChild(BsDatepickerDirective, { static: false }) datepicker?: BsDatepickerDirective; @HostListener('window:scroll') onScrollEvent() { this.datepicker?.hide(); } }
Themes
Datepicker comes with some default color schemes.
You can change it by manipulating containerClass
property in bsConfig
object
There are 6 color schemes: theme-default
, theme-green
, theme-blue
,
theme-dark-blue
, theme-red
, theme-orange
<div class="row"> <div class="col-xs-12 col-12 col-md-4 col-lg-4 form-group mb-3"> <select class="custom-select form-control from-select" [(ngModel)]="colorTheme" (ngModelChange)="applyTheme(dp);"> <option value="theme-default">default</option> <option value="theme-green">green</option> <option value="theme-blue">blue</option> <option value="theme-dark-blue">dark-blue</option> <option value="theme-red">red</option> <option value="theme-orange">orange</option> </select> </div> <div class="col-xs-12 col-12 col-md-5 col-lg-5 form-group mb-3"> <div class="form-group mb-3"> <div class="input-group"> <input type="text" class="form-control" bsDatepicker #dp="bsDatepicker" [bsConfig]="bsConfig"> <div class="input-group-btn"> <button class="btn btn-success" (click)="dp.show()" [attr.aria-expanded]="dp.isOpen" type="button"> Open </button> </div> </div> </div> </div> </div> <br>
import { Component } from '@angular/core'; import { BsDatepickerConfig, BsDatepickerDirective } from 'ngx-bootstrap/datepicker'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-color-theming', templateUrl: './color-theming.html', standalone: false }) export class DemoDatepickerColorThemingComponent { colorTheme = 'theme-green'; bsConfig?: Partial<BsDatepickerConfig>; applyTheme(pop: BsDatepickerDirective) { // create new object on each property change // so Angular can catch object reference change this.bsConfig = Object.assign({}, { containerClass: this.colorTheme }); setTimeout(() => { pop.show(); }); } }
Locales
Datepicker can use different locales.
It's possible to change a locale by calling
use
method of BsLocaleService
, list of available locales is in dropdown below.
To use a different locale, you have to import it from ngx-bootstrap/chronos
first, then
define it in your @NgModule
using function defineLocale
Example:
import { defineLocale } from 'ngx-bootstrap/chronos';
import { deLocale } from 'ngx-bootstrap/locale';
defineLocale('de', deLocale);
<div class="row"> <div class="col-xs-12 col-12 col-sm-3 col-md-3 col-lg-2 form-group mb-3"> <select class="custom-select form-control from-select" [(ngModel)]="locale" (ngModelChange)="applyLocale(dp);"> <option *ngFor="let loc of locales" [value]="loc">{{ loc }}</option> </select> </div> <div class="col-xs-12 col-12 col-sm-5 col-md-6 col-lg-4 form-group mb-3"> <input placeholder="Datepicker" type="text" class="form-control" bsDatepicker #dp="bsDatepicker"> </div> <div class="col-xs-12 col-12 col-sm-4 col-md-12 col-lg-4 form-group mb-3"> <button class="btn btn-success" (click)="dp.show()" [attr.aria-expanded]="dp.isOpen" type="button">Date Picker</button> </div> </div> <br> <div class="row"> <div class="col-xs-12 col-12 col-sm-3 col-md-3 col-lg-2 form-group mb-3"> <select class="custom-select form-control from-select" [(ngModel)]="locale" (ngModelChange)="applyLocale(dpr);"> <option *ngFor="let loc of locales" [value]="loc">{{ loc }}</option> </select> </div> <div class="col-xs-12 col-12 col-sm-5 col-md-6 col-lg-4 form-group mb-3"> <input placeholder="Daterangepicker" type="text" class="form-control" bsDaterangepicker #dpr="bsDaterangepicker"> </div> <div class="col-xs-12 col-12 col-sm-4 col-md-12 col-lg-4 form-group mb-3"> <button class="btn btn-success" (click)="dpr.show()" [attr.aria-expanded]="dpr.isOpen" type="button">Date Range Picker</button> </div> </div>
import { Component } from '@angular/core'; import { BsDatepickerDirective, BsDaterangepickerDirective, BsLocaleService } from 'ngx-bootstrap/datepicker'; import { listLocales } from 'ngx-bootstrap/chronos'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-change-locale', templateUrl: './change-locale.html', standalone: false }) export class DemoDatepickerChangeLocaleComponent { locale = 'en'; locales = listLocales(); constructor(private localeService: BsLocaleService) {} applyLocale(pop: BsDatepickerDirective | BsDaterangepickerDirective) { this.localeService.use(this.locale); pop.hide(); pop.show(); } }
Min-max
You can set min and max date of datepicker/daterangepicker using minDate
and
maxDate
properties
In the following example minDate
is set to yesterday and maxDate
to the current day in the next week
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Datepicker" ngModel bsDatepicker [minDate]="minDate" [maxDate]="maxDate"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Daterangepicker" ngModel bsDaterangepicker [minDate]="minDate" [maxDate]="maxDate"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-min-max', templateUrl: './min-max.component.html', standalone: false }) export class DemoDatepickerMinMaxComponent { minDate: Date; maxDate: Date; constructor() { this.minDate = new Date(); this.maxDate = new Date(); this.minDate.setDate(this.minDate.getDate() - 1); this.maxDate.setDate(this.maxDate.getDate() + 7); } }
Days disabled
You can set which days of the week should be disabled with daysDisabled
In the following example daysDisabled
is set with an array which disabled Saturday and Sunday.
Sunday is considered the first day of the week and thus has the value 0
Saturday and Sunday are not selectable
Saturday and Sunday are selectable
Saturday and Sunday are not selectable
Saturday and Sunday are selectable
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <p>Saturday and Sunday are not selectable</p> <input class="form-control" placeholder="Datepicker" bsDatepicker [daysDisabled]="[6,0]"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <p>Saturday and Sunday are selectable</p> <input class="form-control" placeholder="Datepicker" bsDatepicker> </div> </div> <div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <p>Saturday and Sunday are not selectable</p> <input class="form-control" placeholder="Daterangepicker" bsDaterangepicker [daysDisabled]="[6,0]"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <p>Saturday and Sunday are selectable</p> <input class="form-control" placeholder="Daterangepicker" bsDaterangepicker> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-daysdisabled', templateUrl: './disable-days.html', standalone: false }) export class DemoDatepickerDaysDisabledComponent {}
Dates disabled
You can set which dates should be disabled with datesDisabled
In the following example datesDisabled
is set with an array to disable 2020-02-05 and 2020-02-09.
NOTE: DO NOT USE this functionality with datesEnabled
at the same time
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" bsDatepicker [datesDisabled]="disabledDates"> </div> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [datesDisabled]="disabledDates"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-datesdisabled', templateUrl: './disable-dates.html', standalone: false }) export class DemoDatepickerDatesDisabledComponent { disabledDates = [ new Date('2020-02-05'), new Date('2020-02-09') ]; }
Dates enabled
You can set which dates should be enable with datesEnabled
In the following example datesEnabled
is set with an array to enable 2020-02-06, 2020-02-08 and 2020-02-11. All other dates are disabled
NOTE: DO NOT USE this functionality with datesDisabled
at the same time
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" bsDatepicker [datesEnabled]="enabledDates"> </div> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [datesEnabled]="enabledDates"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-datesenabled', templateUrl: './enable-dates.html', standalone: false }) export class DemoDatepickerDatesEnabledComponent { enabledDates = [ new Date('2020-02-06'), new Date('2020-02-08'), new Date('2020-02-11'), ]; }
Display one month
You can configure, how many months you want to show for daterangepicker via displayMonths
in BsDaterangepickerConfig.
With displayOneMonthRange
you can show only one month for two cases
maxDate
is today
minDate
month is equal to maxDate
month
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-6 form-group mb-3"> <p><code>maxDate</code> is today</p> <input class="form-control" placeholder="Daterangepicker" ngModel bsDaterangepicker [maxDate]="today" [bsConfig]="{ dateInputFormat: 'DD-MM-YYYY', displayOneMonthRange: true }"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-6 form-group mb-3"> <p><code>minDate</code> month is equal to <code>maxDate</code> month</p> <input class="form-control" placeholder="Daterangepicker" ngModel bsDaterangepicker [minDate]="minDate" [maxDate]="maxDate" [bsConfig]="{ dateInputFormat: 'DD-MM-YYYY', displayOneMonthRange: true }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-daterangepicker-display-one-month', templateUrl: './display-one-month.html', standalone: false }) // eslint-disable-next-line @angular-eslint/component-class-suffix export class DemoDateRangePickerDisplayOneMonth { today: Date; maxDate: Date; minDate: Date; constructor() { this.today = new Date(); this.minDate = new Date(this.today.getFullYear(), this.today.getMonth(), 2); this.maxDate = new Date(this.today.getFullYear(), this.today.getMonth(), 25); } }
Min-mode
You can set min view mode of datepicker using minMode
property
In the following example minMode
is set to 'month'
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" class="form-control" [bsConfig]="bsConfig" #dp="bsDatepicker" bsDatepicker [(bsValue)]="datePickerValue"> </div> <div class="col-xs-12 col-12 col-md-3 form-group mb-3"> <button class="btn btn-success" (click)="dp.toggle()" type="button">Date Picker</button> </div> </div> <div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" class="form-control" [bsConfig]="bsConfig" #drp="bsDaterangepicker" bsDaterangepicker [(bsValue)]="dateRangePickerValue"> </div> <div class="col-xs-12 col-12 col-md-3 form-group mb-3"> <button class="btn btn-success" (click)="drp.toggle()" type="button">DateRange Picker</button> </div> </div> <br>
import { Component, OnInit } from '@angular/core'; import { BsDatepickerConfig, BsDatepickerViewMode } from 'ngx-bootstrap/datepicker'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-min-mode', templateUrl: './min-mode.component.html', standalone: false }) export class DemoDatepickerMinModeComponent implements OnInit { datePickerValue: Date = new Date(2020, 7); dateRangePickerValue?: (Date | undefined)[]; range1: Date = new Date(2020, 5); range2: Date = new Date(2020, 8); minMode: BsDatepickerViewMode = 'month'; bsConfig?: Partial<BsDatepickerConfig>; ngOnInit(): void { this.dateRangePickerValue = [this.range1, this.range2]; this.bsConfig = Object.assign({}, { minMode : this.minMode }); } }
Disabled
If you want to disable datepicker's or daterangepicker's content set isDisabled
property to true
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Datepicker" bsDatepicker #dp="bsDatepicker" [isDisabled]="isDisabled"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Daterangepicker" bsDaterangepicker #dpr="bsDaterangepicker" [isDisabled]="isDisabled"> </div> <div class="col-xs-12 col-12 col-sm-4 col-md-12 col-lg-4 form-group mb-3"> <button class="btn btn-success" (click)="toggleDisabling()" type="button">Toggle disabling</button> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-disabled', templateUrl: './disabled.component.html', standalone: false }) export class DemoDatepickerDisabledComponent { isDisabled = false; toggleDisabling(): void { this.isDisabled = !this.isDisabled; } }
Custom today class
If you want to add custom class to current day datepicker's content set value to customTodayClass
option in bsConfig
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" [bsConfig]="{ customTodayClass: 'custom-today-class' }" bsDatepicker> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-custom-today-class', templateUrl: './custom-today-class.component.html', standalone: false }) export class DemoDatepickerCustomTodayClassComponent { }
Forms
Datepicker and daterangepicker can be used in forms. Keep in mind that
value of ngModel
is Date
object for datepicker and array of 2
Date
objects for daterangepicker
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input type="text" class="form-control" placeholder="Datepicker" bsDatepicker [(ngModel)]="datepickerModel" /> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input type="text" class="form-control" placeholder="Daterangepicker" bsDaterangepicker [(ngModel)]="daterangepickerModel" /> </div> </div> <div class="row"> <div class="col-xs-12 col-md-12"> <pre class="code-preview">{{datepickerModel}}<br>{{daterangepickerModel}}</pre> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-forms', templateUrl: './forms.component.html', standalone: false }) export class DemoDatepickerFormsComponent { datepickerModel?: Date; daterangepickerModel?: Date[]; }
Reactive forms
<form *ngIf="myForm" [formGroup]="myForm"> <div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input type="text" class="form-control mb-3" placeholder="Datepicker" bsDatepicker formControlName="date" /> <pre *ngIf="myForm?.value?.date" class="code-preview">{{myForm?.value?.date | date}}</pre> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input type="text" class="form-control mb-3" placeholder="Daterangepicker" bsDaterangepicker formControlName="range" /> <pre *ngIf="myForm?.value?.range" class="code-preview">from {{myForm?.value?.range[0] | date}} to {{myForm?.value?.range[1] | date}}</pre> </div> </div> </form>
import { Component, OnInit } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-reactive-forms', templateUrl: './reactive-forms.component.html', standalone: false }) export class DemoDatepickerReactiveFormsComponent implements OnInit { myForm?: UntypedFormGroup; constructor(private formBuilder: UntypedFormBuilder) {} ngOnInit() { this.myForm = this.formBuilder.group({ date: null, range: null }); } }
Return focus to input
Allows to return focus to input of datepicker or daterangepicker after the date or daterange selection
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Datepicker" bsDatepicker [bsConfig]="{ dateInputFormat: 'DD-MM-YYYY', returnFocusToInput: true }"> </div> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [bsConfig]="{ dateInputFormat: 'DD-MM-YYYY', returnFocusToInput: true }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-return-focus-to-input', templateUrl: './return-focus-to-input.component.html', standalone: false }) export class DemoDatePickerReturnFocusToInputComponent {}
Manual triggering
You can manage datepicker's state by using its show()
, hide()
and toggle()
methods
<div class="row"> <div class="col-xs-12 col-12 col-sm-4 form-group mb-3"> <input type="text" class="form-control" #dp="bsDatepicker" bsDatepicker [outsideClick]="false"> </div> <div class="col-xs-12 col-12 col-sm-8 form-group mb-3"> <button class="btn btn-success" (click)="dp.show()" type="button"> Open </button> <button class="btn btn-success" (click)="dp.hide()" type="button"> Close </button> <button class="btn btn-success" (click)="dp.toggle()" [attr.aria-expanded]="dp.isOpen" type="button"> Toggle </button> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-triggers-manual', templateUrl: './triggers-manual.html', standalone: false }) export class DemoDatepickerTriggersManualComponent {}
Placement
Add placement
property if you want to change placement
The datepicker's placement is right
The datepicker's placement is top
The datepicker's placement is bottom
The datepicker's placement is left
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-3 form-group mb-3 d-flex flex-column justify-content-between"> <p>The datepicker's placement is right</p> <input class="form-control" placeholder="Datepicker" bsDatepicker placement="right"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-3 form-group mb-3 d-flex flex-column justify-content-between"> <p>The datepicker's placement is top</p> <input class="form-control" placeholder="Datepicker" bsDatepicker placement="top"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-3 form-group mb-3 d-flex flex-column justify-content-between"> <p>The datepicker's placement is bottom</p> <input class="form-control" placeholder="Datepicker" bsDatepicker placement="bottom"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-3 form-group mb-3 d-flex flex-column justify-content-between"> <p>The datepicker's placement is left</p> <input class="form-control" placeholder="Datepicker" bsDatepicker placement="left"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-placement', templateUrl: './placement.html', standalone: false }) export class DemoDatepickerPlacementComponent {}
Config method
You can manage datepicker's options by using its setConfig()
method
<div class="row"> <div class="col-xs-12 col-12 col-sm-4 form-group mb-3"> <input type="text" class="form-control" placeholder="Datepicker" #dp="bsDatepicker" bsDatepicker [bsConfig]="bsConfig"> </div> <div class="col-xs-12 col-12 col-sm-8 form-group mb-3"> <button class="btn btn-success" (click)="setOptions()" type="button">Set min date</button> </div> </div>
import { Component, ViewChild } from '@angular/core'; import { BsDaterangepickerDirective, BsDatepickerConfig } from 'ngx-bootstrap/datepicker'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-config-method', templateUrl: './config-method.html', standalone: false }) export class DemoDatepickerConfigMethodComponent { @ViewChild('dp', { static: false }) datepicker?: BsDaterangepickerDirective; bsConfig?: Partial<BsDatepickerConfig>; minDate = new Date(2018, 5, 13); setOptions(): void { this.bsConfig = Object.assign({}, { minDate: this.minDate }); this.datepicker?.setConfig(); setTimeout(() => { this.datepicker?.toggle(); }); } }
Visibility Events
You can subscribe to datepicker's visibility events
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Datepicker" placement="right" bsDatepicker (onShown)="handler('onShown')" (onHidden)="handler('onHidden')"> </div> <div class="col-xs-12 col-12"> <pre class="card card-block card-header" *ngFor="let message of messages">{{message}}</pre> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-visibility-events', templateUrl: './visibility-events.html', standalone: false }) export class DemoDatePickerVisibilityEventsComponent { messages: string[] = []; message = 'onShown'; handler(value: string): void { if(this.message === value) { this.messages = []; } this.messages.push(`Event ${value} is fired`); } }
Value change event
You can subscribe to datepicker's value change event (bsValueChange
).
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <div class="mb-3"> <pre class="card card-block card-header" *ngIf="data">Changed date is {{data | date}}</pre> </div> <input class="form-control" placeholder="Datepicker" bsDatepicker (bsValueChange)="onValueChange($event)"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-value-change-event', templateUrl: './value-change-event.html', standalone: false }) export class DemoDatepickerValueChangeEventComponent { data?: Date; onValueChange(value: Date): void { this.data = value; } }
Config properties
You can configure the datepicker via its bsConfig
option
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Datepicker" bsDatepicker [bsConfig]="{ dateInputFormat: 'DD-MM-YYYY', containerClass: 'theme-red' }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-config-object', templateUrl: './config-object.html', standalone: false }) export class DemoDatePickerConfigObjectComponent {}
Select dates from other month
You can enable dates from other months via selectFromOtherMonth
option in bsConfig
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Datepicker" bsDatepicker [bsConfig]="{ dateInputFormat: 'DD-MM-YYYY', selectFromOtherMonth: true }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-select-dates-from-other-months', templateUrl: './select-dates-from-other-months.html', standalone: false }) export class DemoDatePickerSelectDatesFromOtherMonthsComponent {}
Select week
You can enable ability to select a week number (first day of the week will be selected) via selectWeek
option in bsConfig
Also works with selectFromOtherMonth
option, which allows to select weeks which started on previous month
If first day of the week is disabled, the next one will be selected.
Two first days of the each week are disabled
If all days in week are disabled, you can't select this week
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Datepicker with select week" bsDatepicker [bsConfig]="{ selectWeek: true}"> </div> </div> <p>Also works with <code>selectFromOtherMonth</code> option, which allows to select weeks which started on previous month</p> <div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input class="form-control" placeholder="selectFromOtherMonth active" bsDatepicker [bsConfig]="{ selectWeek: true, selectFromOtherMonth: true }"> </div> </div> <p>If first day of the week is disabled, the next one will be selected.</p> <div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <p>Two first days of the each week are disabled</p> <input class="form-control" placeholder="Two first days disabled" bsDatepicker [daysDisabled]="[0,1]" [bsConfig]="{ selectWeek: true, selectFromOtherMonth: true }"> </div> </div> <p>If all days in week are disabled, you can't select this week</p> <div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <input class="form-control" placeholder="All days disabled" bsDatepicker [daysDisabled]="[0,1,2,3,4,5,6]" [bsConfig]="{ selectWeek: true }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-select-week', templateUrl: './select-week.html', standalone: false }) export class DemoDatePickerSelectWeekComponent {}
Select week range
You can enable ability to select a week number (range with first weekday - last weekday will be selected) via selectWeekRange
option in bsConfig
Also works with selectFromOtherMonth
option, which allows to select weeks which started on previous month
If first day of the week is disabled, the next one will be selected.
Two first days of the each week are disabled
If all days in week are disabled, you can't select this week
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <input class="form-control" placeholder="Daterangepicker with select week" bsDaterangepicker [bsConfig]="{ selectWeekDateRange: true}"> </div> </div> <p>Also works with <code>selectFromOtherMonth</code> option, which allows to select weeks which started on previous month</p> <div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <input class="form-control" placeholder="Daterangepicker" bsDaterangepicker [bsConfig]="{ selectWeekDateRange: true, selectFromOtherMonth: true }"> </div> </div> <p>If first day of the week is disabled, the next one will be selected.</p> <div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <p>Two first days of the each week are disabled</p> <input class="form-control" placeholder="Two days disabled" bsDaterangepicker [daysDisabled]="[0,1]" [bsConfig]="{ selectWeekDateRange: true }"> </div> </div> <p>If all days in week are disabled, you can't select this week</p> <div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <input class="form-control" placeholder="All days disabled" bsDaterangepicker [daysDisabled]="[0,1,2,3,4,5,6]" [bsConfig]="{ selectWeekDateRange: true }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-select-week-range', templateUrl: './select-week-range.html', standalone: false }) export class DemoDatePickerSelectWeekRangeComponent {}
Outside click
Datepicker closes after outside click by default. To change
this behavior, use outsideClick
property.
Outside click closes the datepicker in this example
Outside click doesn't close the datepicker in this example
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <p>Outside click closes the datepicker in this example</p> <input class="form-control" placeholder="Datepicker" bsDatepicker [outsideClick]="true"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-5 form-group mb-3"> <p>Outside click doesn't close the datepicker in this example</p> <input class="form-control" placeholder="Datepicker" bsDatepicker [outsideClick]="false"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-outside-click', templateUrl: './outside-click.html', standalone: false }) export class DemoDatepickerOutsideClickComponent {}
Trigger by isOpen property
Datepicker can be shown or hidden by changing isOpen
property
<div class="row"> <div class="col-xs-8 col-8 col-md-5 col-lg-4 form-group mb-3"> <input class="form-control" placeholder="Datepicker" bsDatepicker [isOpen]="isOpen"/> </div> <div class="col-xs-4 col-4 col-md-4 form-group mb-3"> <button class="btn btn-success" (click)="isOpen = !isOpen" type="button">Toggle</button> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-trigger-by-isopen', templateUrl: './trigger-by-isopen-property.html', standalone: false }) export class DemoDatepickerByIsOpenPropComponent { isOpen = false; }
Custom triggers
Use different triggers ( for example keydown
, mouseenter
and
dblclick
) to interact with datepicker
Hover over the input to open the datepicker
Focus on input and press any key to open the datepicker
Сlick twice on input to open the datepicker
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-lg-3 form-group mb-3"> <p>Hover over the input to open the datepicker</p> <input type="text" class="form-control" placeholder="Datepicker" bsDatepicker triggers="mouseenter:click"> </div> <div class="col-xs-12 col-12 col-sm-6 col-lg-3 form-group mb-3"> <p>Focus on input and press any key to open the datepicker</p> <input type="text" class="form-control" placeholder="Daterangepicker" bsDaterangepicker triggers="keydown:click"> </div> <div class="col-xs-12 col-12 col-sm-6 col-lg-3 form-group mb-3"> <p>Сlick twice on input to open the datepicker</p> <input type="text" class="form-control" placeholder="Daterangepicker" bsDaterangepicker triggers="dblclick:click"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-triggers-custom', templateUrl: './triggers-custom.html', standalone: false }) export class DemoDatepickerTriggersCustomComponent {}
Date custom classes
Style dates with custom classes
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Datepicker" ngModel bsDatepicker [dateCustomClasses]="dateCustomClasses"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <input class="form-control" placeholder="Daterangepicker" ngModel bsDaterangepicker [dateCustomClasses]="dateCustomClasses"> </div> </div>
import { Component } from '@angular/core'; import { DatepickerDateCustomClasses } from 'ngx-bootstrap/datepicker'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-date-custom-classes', templateUrl: './date-custom-classes.html', styleUrls: ['./date-custom-classes.scss'], standalone: false }) export class DemoDatepickerDateCustomClassesComponent { dateCustomClasses: DatepickerDateCustomClasses[]; constructor() { const now = new Date(); const twoDaysAhead = new Date(); twoDaysAhead.setDate(now.getDate() + 2); const fourDaysAhead = new Date(); fourDaysAhead.setDate(now.getDate() + 4); this.dateCustomClasses = [ { date: now, classes: [] }, { date: twoDaysAhead, classes: ['bg-warning'] }, { date: fourDaysAhead, classes: ['bg-danger', 'text-warning'] } ]; } }
[object Module]
Tooltip for selected dates
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" bsDatepicker [dateTooltipTexts]="selectedDates" [bsConfig]="{ dateTooltipTexts: selectedDates }"> </div> </div>
import { Component } from '@angular/core'; import { DatepickerDateTooltipText } from 'ngx-bootstrap/datepicker'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-tooltip-to-selected-dates', templateUrl: './tooltip-to-selected-dates.html', standalone: false }) // eslint-disable-next-line @angular-eslint/component-class-suffix export class DemoDatePickerTooltipToSelectedDates { selectedDates : DatepickerDateTooltipText[] = [{ date: new Date('2020-08-08'), tooltipText: '8th of August'}, { date: new Date('2020-08-09'), tooltipText: '9th of August'}, { date: new Date('2020-08-07'), tooltipText: '7th of August'} ]; }
Quick select ranges
Quick select ranges can be added to Daterangepicker using ranges
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [bsConfig]="{ ranges: ranges }"> </div> </div>
import { Component } from '@angular/core'; interface IRange { value: Date[]; label: string; } @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-quick-select-ranges', templateUrl: './quick-select-ranges.html', standalone: false }) export class DemoDatePickerQuickSelectRangesComponent { ranges: IRange[] = [{ value: [new Date(new Date().setDate(new Date().getDate() - 7)), new Date()], label: 'Last 7 Days' }, { value: [new Date(), new Date(new Date().setDate(new Date().getDate() + 7))], label: 'Next 7 Days' }]; }
Prevent change to next month
Pick some date from second month and it wont change to the next month
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [bsConfig]="{ preventChangeToNextMonth: true }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-prevent-change-to-next-month', templateUrl: './prevent-change-to-next-month.component.html', standalone: false }) export class DemoDatepickerPreventChangeToNextMonthComponent { maxDate = new Date(); constructor() { this.maxDate.setDate(this.maxDate.getDate() + 7); } }
Previous month in Daterangepicker
Pick previous & current month instead of current & next month.When daterange selected and related to current month, daterangepicker will works by default, with current & next month
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [bsConfig]="{ showPreviousMonth: true }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-daterangepicker-show-previous-month', templateUrl: './show-previous-month.html', standalone: false }) // eslint-disable-next-line @angular-eslint/component-class-suffix export class DemoDateRangePickerShowPreviousMonth {}
Show Today Button
Display an optional 'Today' button that will automatically select today's date.
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" bsDatepicker [bsConfig]="{ containerClass: 'theme-dark-blue', showTodayButton: true, todayPosition: 'center' }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-today-button', templateUrl: './today-button.html', standalone: false }) export class DemoDatepickerTodayButtonComponent {}
Show Clear Button
Display an optional 'Clear' button that will automatically clear date.
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" bsDatepicker [bsConfig]="{ containerClass: 'theme-orange', showClearButton: true, clearPosition: 'right' }"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-clear-button', templateUrl: './clear-button.html', standalone: false }) export class DemoDatepickerClearButtonComponent {}
Start view
Add startView
property if you want to change start view
The datepicker's start view is day (default)
The datepicker's start view is month
The datepicker's start view is year
<div class="row"> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <p>The datepicker's start view is day (default)</p> <input bsDatepicker class="form-control" placeholder="Datepicker"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <p>The datepicker's start view is month</p> <input [bsConfig]="{startView: 'month'}" bsDatepicker class="form-control" placeholder="Datepicker"> </div> <div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3"> <p>The datepicker's start view is year</p> <input [bsConfig]="{startView: 'year'}" bsDatepicker class="form-control" placeholder="Datepicker"> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-start-view', templateUrl: './start-view.html', standalone: false }) export class DemoDatepickerStartViewComponent {}
Max Date Range in Daterangepicker
Max date range after first date selection can be added to Daterangepicker using maxDateRange
.
If you also use maxDate
property, you can't select second date, which exceeds value of maxDate
.
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [maxDate]="maxDate" [bsConfig]="{ maxDateRange: 25 }"> </div> </div>
import {Component} from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-max-date-range', templateUrl: './max-date-range.html', standalone: false }) export class DemoDateRangePickerMaxDateRangeComponent { maxDate: Date; constructor() { this.maxDate = new Date(); this.maxDate.setDate(this.maxDate.getDate() + 30); } }
With timepicker
You can enable timepicker via withTimepicker
config option
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group"> <input type="text" placeholder="Datepicker" class="form-control" [bsConfig]="{withTimepicker: true, rangeInputFormat : 'MMMM Do YYYY, h:mm:ss a', dateInputFormat: 'MMMM Do YYYY, h:mm:ss a'}" bsDatepicker> </div> <div class="col-xs-12 col-12 col-md-4 form-group"> <input type="text" placeholder="Daterangepicker" class="form-control" [bsConfig]="{withTimepicker: true, rangeInputFormat : 'MMMM Do YYYY, h:mm:ss a', dateInputFormat: 'MMMM Do YYYY, h:mm:ss a'}" bsDaterangepicker> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'demo-datepicker-with-timepicker', templateUrl: './with-timepicker.html', standalone: false }) export class DemoDatepickerWithTimepickerComponent { }
Close behavior with timepicker changes
If you use datepicker with timepicker together, you are able to set keepDatepickerOpened
config option and keep datepicker opened until date isn't changed
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group"> <input type="text" placeholder="Datepicker" class="form-control" [bsConfig]="{withTimepicker: true, keepDatepickerOpened: true, rangeInputFormat : 'MMMM Do YYYY, h:mm:ss a', dateInputFormat: 'MMMM Do YYYY, h:mm:ss a'}" bsDatepicker> </div> <div class="col-xs-12 col-12 col-md-4 form-group"> <input type="text" placeholder="Daterangepicker" class="form-control" [bsConfig]="{withTimepicker: true, keepDatepickerOpened: true, rangeInputFormat : 'MMMM Do YYYY, h:mm:ss a', dateInputFormat: 'MMMM Do YYYY, h:mm:ss a'}" bsDaterangepicker> </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'datepicker-close-behavior', templateUrl: './datepicker-close-behavior.html', standalone: false }) export class DatepickerCloseBehaviorComponent { }
Don't overwrite dates out of rule
If you use datepicker with rules (minDate, maxDate) you can set config property keepDatesOutOfRules
to true to avoid overwriting invalid dates. Default value is false.
<div class="row"> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Datepicker" class="form-control" bsDatepicker [bsConfig]="{keepDatesOutOfRules: true}" [maxDate]="maxDate" [minDate]="minDate" [bsValue]="bsInvalidDate" > </div> <div class="col-xs-12 col-12 col-md-4 form-group mb-3"> <input type="text" placeholder="Daterangepicker" class="form-control" bsDaterangepicker [bsConfig]="{keepDatesOutOfRules: true}" [maxDate]="maxDate" [minDate]="minDate" [bsValue]="bsRangeValue" > </div> </div>
import { Component } from '@angular/core'; @Component({ // eslint-disable-next-line @angular-eslint/component-selector selector: 'keep-dates-out-of-rules', templateUrl: './keep-dates-out-of-rules.component.html', standalone: false }) export class KeepDatesOutOfRulesComponent { minDate = new Date(); bsRangeValue: Date[]; maxDate = new Date(); bsInvalidDate: Date = new Date(); constructor() { this.maxDate.setDate(this.maxDate.getDate() + 7); this.bsInvalidDate.setDate(this.maxDate.getDate() + 2); this.bsRangeValue = [this.minDate, this.bsInvalidDate]; } }
Installation
ng add ngx-bootstrap --component datepicker
### Standalone component usage import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BsDatepickerModule } from 'ngx-bootstrap/datepicker'; @Components({ imports: [ BrowserAnimationsModule, BsDatepickerModule, ... ] }) export class AppComponents(){} ### Module usage import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { BsDatepickerModule } from 'ngx-bootstrap/datepicker'; @NgModule({ imports: [ BrowserAnimationsModule, BsDatepickerModule, ... ] }) export class AppModule(){}
BsDatepickerConfig
For date range picker there are BsDaterangepickerConfig
which inherits all properties,
except displayMonths
, for range picker it default to 2
Properties
adaptivePosition | Type: boolean Default value: false sets use adaptive position |
allowedPositions | Type: string[] Set allowed positions of container. |
clearButtonLabel | Type: string Default value: Clear Label for 'clear' button |
clearPosition | Type: string Default value: right Positioning of 'clear' button |
containerClass | Type: string Default value: theme-green CSS class which will be applied to datepicker container, usually used to set color theme |
customRangeButtonLabel | Type: string Default value: Custom Range Label for 'custom range' button |
customTodayClass | Type: string Add class to current day |
dateCustomClasses | Type: DatepickerDateCustomClasses[] Default date custom classes for all date/range pickers |
datesDisabled | Type: Date[] Disable specific dates |
datesEnabled | Type: Date[] Enable specific dates |
dateTooltipTexts | Type: DatepickerDateTooltipText[] Default tooltip text for all date/range pickers |
daysDisabled | Type: number[] Disable specific days, e.g. [0,6] will disable all Saturdays and Sundays |
displayOneMonthRange | Type: boolean Show one months for special cases (only for dateRangePicker)
|
initCurrentTime | Type: boolean Set current hours, minutes, seconds and milliseconds for bsValue |
isAnimated | Type: boolean Default value: false turn on/off animation |
keepDatepickerOpened | Type: boolean Default value: false Set rule for datepicker closing. If value is true datepicker closes only if date is changed, if user changes only time datepicker doesn't close. It is available only if property withTimepicker is set true |
keepDatesOutOfRules | Type: boolean Default value: false Allows keep invalid dates in range. Can be used with minDate, maxDate |
maxDate | Type: Date Default max date for all date/range pickers |
maxDateRange | Type: number Max Date Range in days |
minDate | Type: Date Default min date for all date/range pickers |
minMode | Type: BsDatepickerViewMode Default mode for all date pickers |
preventChangeToNextMonth | Type: boolean Prevents change to next month for right calendar in two calendars view (dateRangePicker only) |
rangeInputFormat | Type: string Default value: L Date format for date range input field |
ranges | Type: BsCustomDates[] Predefined ranges |
returnFocusToInput | Type: boolean Default value: false If true, returns focus to the datepicker / daterangepicker input after date selection |
selectFromOtherMonth | Type: boolean Makes dates from other months active |
selectWeek | Type: boolean Allows select first date of the week by click on week number |
selectWeekDateRange | Type: boolean Allows select daterange as first and last day of week by click on week number (dateRangePicker only) |
showClearButton | Type: boolean Default value: false Shows clear button |
showPreviousMonth | Type: boolean Shows previous and current month, instead of current and next (dateRangePicker only) |
showTodayButton | Type: boolean Default value: false Shows 'today' button |
showWeekNumbers | Type: boolean Default value: true Allows to hide week numbers in datepicker |
startView | Type: BsDatepickerViewMode Default value: day The view that the datepicker should start in |
todayButtonLabel | Type: string Default value: Today Label for 'today' button |
todayPosition | Type: string Default value: center Positioning of 'today' button |
useUtc | Type: boolean Default value: false sets use UTC date time format |
withTimepicker | Type: boolean Default value: false Shows timepicker under datepicker |
Basic
Inline
With animation
Adaptive position
Initial state
bsValue
property sets initial state in this example
ngModel
property sets two-way data binding in this example
Custom date format
Hide on scroll
Themes
Locales
Min-max
Days disabled
Saturday and Sunday are not selectable
Saturday and Sunday are selectable
Saturday and Sunday are not selectable
Saturday and Sunday are selectable
Dates disabled
Dates enabled
Display one month
maxDate
is today
minDate
month is equal to maxDate
month
Min-mode
Disabled
Custom today class
Forms
Reactive forms
Return focus to input
Manual triggering
Placement
The datepicker's placement is right
The datepicker's placement is top
The datepicker's placement is bottom
The datepicker's placement is left
Config method
Visibility Events
Value change event
Config properties
Select dates from other month
Select week
Also works with selectFromOtherMonth
option, which allows to select weeks which started on previous month
If first day of the week is disabled, the next one will be selected.
Two first days of the each week are disabled
If all days in week are disabled, you can't select this week
Select week range
Also works with selectFromOtherMonth
option, which allows to select weeks which started on previous month
If first day of the week is disabled, the next one will be selected.
Two first days of the each week are disabled
If all days in week are disabled, you can't select this week
Outside click
Outside click closes the datepicker in this example
Outside click doesn't close the datepicker in this example
Trigger by isOpen property
Custom triggers
Hover over the input to open the datepicker
Focus on input and press any key to open the datepicker
Сlick twice on input to open the datepicker
Date custom classes
Tooltip for selected dates
Quick select ranges
Prevent change to next month
Previous month in Daterangepicker
Show Today Button
Show Clear Button
Start view
The datepicker's start view is day (default)
The datepicker's start view is month
The datepicker's start view is year
Max Date Range in Daterangepicker
With timepicker
datepicker close behavior with timepicker
Don't overwrite dates out of rule
- Basic
- Inline
- With animation
- Adaptive position
- Initial state
- Custom date format
- Hide on scroll
- Themes
- Locales
- Min-max
- Days disabled
- Dates disabled
- Dates enabled
- Display one month
- Min-mode
- Disabled
- Custom today class
- Forms
- Reactive forms
- Return focus to input
- Manual triggering
- Placement
- Config method
- Visibility Events
- Value change event
- Config properties
- Select dates from other month
- Select week
- Select week range
- Outside click
- Trigger by isOpen property
- Custom triggers
- Date custom classes
- Tooltip for selected dates
- Quick select ranges
- Prevent change to next month
- Previous month in Daterangepicker
- Show Today Button
- Show Clear Button
- Start view
- Max Date Range in Daterangepicker
- With timepicker
- Close behavior with timepicker changes
- Don't overwrite dates out of rule