diff --git a/demo/src/app/components/+datepicker/datepicker-section.list.ts b/demo/src/app/components/+datepicker/datepicker-section.list.ts
index 5ce0f5337e..336bad988c 100644
--- a/demo/src/app/components/+datepicker/datepicker-section.list.ts
+++ b/demo/src/app/components/+datepicker/datepicker-section.list.ts
@@ -19,6 +19,7 @@ import { DemoDatepickerMinModeComponent } from './demos/min-mode/min-mode.compon
import { DemoDatepickerOutsideClickComponent } from './demos/outside-click/outside-click';
import { DemoDatepickerPlacementComponent } from './demos/placement/placement';
import { DemoDatepickerReactiveFormsComponent } from './demos/reactive-forms/reactive-forms.component';
+import { DemoDatepickerDateCustomClassesComponent } from './demos/date-custom-classes/date-custom-classes';
import {
DemoDatePickerSelectDatesFromOtherMonthsComponent
@@ -306,6 +307,14 @@ export const demoComponentContent: ContentSection[] = [
description: `
Use different triggers ( for example keydown
, mouseenter
and
dblclick
) to interact with datepicker
`,
outlet: DemoDatepickerTriggersCustomComponent
+ },
+ {
+ title: 'Date custom classes',
+ anchor: 'date-custom-classes',
+ component: require('!!raw-loader?lang=typescript!./demos/date-custom-classes/date-custom-classes.ts'),
+ html: require('!!raw-loader?lang=markup!./demos/date-custom-classes/date-custom-classes.html'),
+ description: `Style dates with custom classes
`,
+ outlet: DemoDatepickerDateCustomClassesComponent
}
]
},
diff --git a/demo/src/app/components/+datepicker/demos/date-custom-classes/date-custom-classes.html b/demo/src/app/components/+datepicker/demos/date-custom-classes/date-custom-classes.html
new file mode 100644
index 0000000000..84147b9ad0
--- /dev/null
+++ b/demo/src/app/components/+datepicker/demos/date-custom-classes/date-custom-classes.html
@@ -0,0 +1,18 @@
+
+
+
diff --git a/demo/src/app/components/+datepicker/demos/date-custom-classes/date-custom-classes.ts b/demo/src/app/components/+datepicker/demos/date-custom-classes/date-custom-classes.ts
new file mode 100644
index 0000000000..a15c1af52e
--- /dev/null
+++ b/demo/src/app/components/+datepicker/demos/date-custom-classes/date-custom-classes.ts
@@ -0,0 +1,24 @@
+import { Component } from '@angular/core';
+import { BsDatepickerDateCustomClasses } from 'ngx-bootstrap/datepicker';
+
+@Component({
+ selector: 'demo-datepicker-date-custom-classes',
+ templateUrl: './date-custom-classes.html'
+})
+export class DemoDatepickerDateCustomClassesComponent {
+ dateCustomClasses: BsDatepickerDateCustomClasses[];
+
+ constructor() {
+ let now = new Date();
+ let twoDaysAhead = new Date();
+ twoDaysAhead.setDate(now.getDate() + 2);
+ let 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'] }
+ ];
+ }
+}
diff --git a/demo/src/app/components/+datepicker/demos/index.ts b/demo/src/app/components/+datepicker/demos/index.ts
index 33dcb5cffc..d56926e222 100644
--- a/demo/src/app/components/+datepicker/demos/index.ts
+++ b/demo/src/app/components/+datepicker/demos/index.ts
@@ -28,6 +28,7 @@ import { DemoDatepickerTriggersCustomComponent } from './triggers-custom/trigger
import { DemoDatepickerTriggersManualComponent } from './triggers-manual/triggers-manual';
import { DemoDatepickerValueChangeEventComponent } from './value-change-event/value-change-event';
import { DemoDatePickerVisibilityEventsComponent } from './visibility-events/visibility-events';
+import { DemoDatepickerDateCustomClassesComponent } from './date-custom-classes/date-custom-classes'
export const DEMO_COMPONENTS = [
@@ -58,5 +59,6 @@ export const DEMO_COMPONENTS = [
DemoDatepickerTriggersCustomComponent,
DemoDatepickerTriggersManualComponent,
DemoDatepickerValueChangeEventComponent,
- DemoDatePickerVisibilityEventsComponent
+ DemoDatePickerVisibilityEventsComponent,
+ DemoDatepickerDateCustomClassesComponent
];
diff --git a/demo/src/ng-api-doc.ts b/demo/src/ng-api-doc.ts
index 1060ddf9a8..5e5b7f4c6c 100644
--- a/demo/src/ng-api-doc.ts
+++ b/demo/src/ng-api-doc.ts
@@ -676,6 +676,11 @@ export const ngdoc: any = {
"type": "Date",
"description": "Initial value of datepicker
\n"
},
+ {
+ "name": "dateCustomClasses",
+ "type": "BsDatepickerDateCustomClasses[]",
+ "description": "Date custom classes
\n"
+ },
{
"name": "isDisabled",
"type": "boolean",
@@ -748,6 +753,11 @@ export const ngdoc: any = {
"type": "string",
"description": "A selector specifying the element the datepicker should be appended to.\nCurrently only supports "body".
\n"
},
+ {
+ "name": "dateCustomClasses",
+ "type": "BsDatepickerDateCustomClasses[]",
+ "description": "Date custom classes
\n"
+ },
{
"name": "daysDisabled",
"type": "number[]",
@@ -862,6 +872,11 @@ export const ngdoc: any = {
"type": "string",
"description": "Add class to current day
\n"
},
+ {
+ "name": "dateCustomClasses",
+ "type": "BsDatepickerDateCustomClasses[]",
+ "description": "Default date custom classes for all date/range pickers
\n"
+ },
{
"name": "maxDate",
"type": "Date",
@@ -875,7 +890,7 @@ export const ngdoc: any = {
{
"name": "minMode",
"type": "BsDatepickerViewMode",
- "description": "Defaut mode for all date pickers
\n"
+ "description": "Default mode for all date pickers
\n"
},
{
"name": "rangeInputFormat",
@@ -888,6 +903,11 @@ export const ngdoc: any = {
"type": "boolean",
"description": "Makes dates from other months active
\n"
},
+ {
+ "name": "selectWeek",
+ "type": "boolean",
+ "description": "Makes dates from other months active
\n"
+ },
{
"name": "showWeekNumbers",
"defaultValue": "true",
@@ -929,6 +949,11 @@ export const ngdoc: any = {
"type": "string",
"description": "A selector specifying the element the daterangepicker should be appended\nto. Currently only supports "body".
\n"
},
+ {
+ "name": "dateCustomClasses",
+ "type": "BsDatepickerDateCustomClasses[]",
+ "description": "Date custom classes
\n"
+ },
{
"name": "isDisabled",
"type": "boolean",
@@ -1426,6 +1451,13 @@ export const ngdoc: any = {
"methods": [],
"properties": []
},
+ "DatepickerDateCustomClasses": {
+ "fileName": "src/datepicker/models/index.ts",
+ "className": "DatepickerDateCustomClasses",
+ "description": "",
+ "methods": [],
+ "properties": []
+ },
"BsNavigationEvent": {
"fileName": "src/datepicker/models/index.ts",
"className": "BsNavigationEvent",
@@ -1666,6 +1698,10 @@ export const ngdoc: any = {
"name": "onHover",
"description": ""
},
+ {
+ "name": "onHoverWeek",
+ "description": ""
+ },
{
"name": "onNavigate",
"description": ""
@@ -1940,7 +1976,7 @@ export const ngdoc: any = {
"properties": [
{
"name": "dropdownMenu",
- "type": "Promise",
+ "type": "Promise>",
"description": "Content to be displayed as popover.
\n"
}
]
@@ -2953,11 +2989,6 @@ export const ngdoc: any = {
"type": "boolean",
"description": "if true hours and minutes fields will be disabled
\n"
},
- {
- "name": "disabled",
- "type": "boolean",
- "description": "if true hours and minutes fields will be disabled
\n"
- },
{
"name": "hourStep",
"type": "number",
@@ -3046,12 +3077,6 @@ export const ngdoc: any = {
"type": "boolean",
"description": "if true hours and minutes fields will be disabled
\n"
},
- {
- "name": "disabled",
- "defaultValue": "false",
- "type": "boolean",
- "description": "if true hours and minutes fields will be disabled
\n"
- },
{
"name": "hourStep",
"defaultValue": "1",
diff --git a/src/datepicker/base/bs-datepicker-container.ts b/src/datepicker/base/bs-datepicker-container.ts
index 8895a27e16..fc284a0f02 100644
--- a/src/datepicker/base/bs-datepicker-container.ts
+++ b/src/datepicker/base/bs-datepicker-container.ts
@@ -9,6 +9,7 @@ import {
CalendarCellViewModel,
CellHoverEvent,
DatepickerRenderOptions,
+ DatepickerDateCustomClasses,
DaysCalendarViewModel,
DayViewModel,
MonthsCalendarViewModel,
@@ -38,6 +39,10 @@ export abstract class BsDatepickerAbstractComponent {
this._effects.setDisabled(value);
}
+ set dateCustomClasses(value: DatepickerDateCustomClasses[]) {
+ this._effects.setDateCustomClasses(value);
+ }
+
viewMode: Observable;
daysCalendar: Observable;
monthsCalendar: Observable;
diff --git a/src/datepicker/bs-datepicker-inline.component.ts b/src/datepicker/bs-datepicker-inline.component.ts
index f32645dcd6..7712502b87 100644
--- a/src/datepicker/bs-datepicker-inline.component.ts
+++ b/src/datepicker/bs-datepicker-inline.component.ts
@@ -6,7 +6,7 @@ import { ComponentLoader, ComponentLoaderFactory } from 'ngx-bootstrap/component
import { BsDatepickerInlineContainerComponent } from './themes/bs/bs-datepicker-inline-container.component';
import { Subscription } from 'rxjs';
import { BsDatepickerInlineConfig } from './bs-datepicker-inline.config';
-import { BsDatepickerConfig } from './bs-datepicker.config';
+import { BsDatepickerConfig, BsDatepickerDateCustomClasses } from './bs-datepicker.config';
@Directive({
selector: 'bs-datepicker-inline',
@@ -42,6 +42,10 @@ export class BsDatepickerInlineDirective implements OnInit, OnDestroy, OnChanges
* Maximum date which is available for selection
*/
@Input() maxDate: Date;
+ /**
+ * Date custom classes
+ */
+ @Input() dateCustomClasses: BsDatepickerDateCustomClasses[];
/**
* Emits when datepicker value has been changed
*/
@@ -106,6 +110,10 @@ export class BsDatepickerInlineDirective implements OnInit, OnDestroy, OnChanges
if (changes.isDisabled) {
this._datepickerRef.instance.isDisabled = this.isDisabled;
}
+
+ if (changes.dateCustomClasses) {
+ this._datepickerRef.instance.dateCustomClasses = this.dateCustomClasses;
+ }
}
/**
@@ -116,7 +124,8 @@ export class BsDatepickerInlineDirective implements OnInit, OnDestroy, OnChanges
value: this._bsValue,
isDisabled: this.isDisabled,
minDate: this.minDate || this.bsConfig && this.bsConfig.minDate,
- maxDate: this.maxDate || this.bsConfig && this.bsConfig.maxDate
+ maxDate: this.maxDate || this.bsConfig && this.bsConfig.maxDate,
+ dateCustomClasses: this.dateCustomClasses || this.bsConfig && this.bsConfig.dateCustomClasses
});
}
diff --git a/src/datepicker/bs-datepicker.component.ts b/src/datepicker/bs-datepicker.component.ts
index 4bdbcf4a14..45c89b9c7d 100644
--- a/src/datepicker/bs-datepicker.component.ts
+++ b/src/datepicker/bs-datepicker.component.ts
@@ -5,7 +5,7 @@ import {
import { ComponentLoader, ComponentLoaderFactory } from 'ngx-bootstrap/component-loader';
import { BsDatepickerContainerComponent } from './themes/bs/bs-datepicker-container.component';
import { Subscription } from 'rxjs';
-import { BsDatepickerConfig } from './bs-datepicker.config';
+import { BsDatepickerConfig, BsDatepickerDateCustomClasses } from './bs-datepicker.config';
import { BsDatepickerViewMode } from './models';
@Directive({
@@ -100,6 +100,10 @@ export class BsDatepickerDirective implements OnInit, OnDestroy, OnChanges {
* Disable Certain days in the week
*/
@Input() daysDisabled: number[];
+ /**
+ * Date custom classes
+ */
+ @Input() dateCustomClasses: BsDatepickerDateCustomClasses[];
/**
* Emits when datepicker value has been changed
*/
@@ -156,6 +160,10 @@ export class BsDatepickerDirective implements OnInit, OnDestroy, OnChanges {
if (changes.isDisabled) {
this._datepickerRef.instance.isDisabled = this.isDisabled;
}
+
+ if (changes.dateCustomClasses) {
+ this._datepickerRef.instance.dateCustomClasses = this.dateCustomClasses;
+ }
}
/**
@@ -227,7 +235,8 @@ export class BsDatepickerDirective implements OnInit, OnDestroy, OnChanges {
minDate: this.minDate || this.bsConfig && this.bsConfig.minDate,
maxDate: this.maxDate || this.bsConfig && this.bsConfig.maxDate,
daysDisabled: this.daysDisabled || this.bsConfig && this.bsConfig.daysDisabled,
- minMode: this.minMode || this.bsConfig && this.bsConfig.minMode
+ minMode: this.minMode || this.bsConfig && this.bsConfig.minMode,
+ dateCustomClasses: this.dateCustomClasses || this.bsConfig && this.bsConfig.dateCustomClasses
});
}
diff --git a/src/datepicker/bs-datepicker.config.ts b/src/datepicker/bs-datepicker.config.ts
index 3e5611654d..eb8728e398 100644
--- a/src/datepicker/bs-datepicker.config.ts
+++ b/src/datepicker/bs-datepicker.config.ts
@@ -1,10 +1,17 @@
import { Injectable } from '@angular/core';
import {
DatepickerRenderOptions,
- BsDatepickerViewMode
+ BsDatepickerViewMode,
+ DatepickerDateCustomClasses
} from './models';
+export class BsDatepickerDateCustomClasses
+ implements DatepickerDateCustomClasses {
+ date: Date;
+ classes: string[];
+}
+
/**
* For date range picker there are `BsDaterangepickerConfig` which inherits all properties,
* except `displayMonths`, for range picker it default to `2`
@@ -21,6 +28,10 @@ export class BsDatepickerConfig implements DatepickerRenderOptions {
* Default max date for all date/range pickers
*/
maxDate?: Date;
+ /**
+ * Default date custom classes for all date/range pickers
+ */
+ dateCustomClasses: BsDatepickerDateCustomClasses[];
daysDisabled?: number[];
/**
diff --git a/src/datepicker/bs-daterangepicker.component.ts b/src/datepicker/bs-daterangepicker.component.ts
index e58928a366..2496d15f92 100644
--- a/src/datepicker/bs-daterangepicker.component.ts
+++ b/src/datepicker/bs-daterangepicker.component.ts
@@ -16,7 +16,7 @@ import { BsDaterangepickerConfig } from './bs-daterangepicker.config';
import { BsDaterangepickerContainerComponent } from './themes/bs/bs-daterangepicker-container.component';
import { Subscription } from 'rxjs';
import { ComponentLoaderFactory, ComponentLoader } from 'ngx-bootstrap/component-loader';
-import { BsDatepickerConfig } from './bs-datepicker.config';
+import { BsDatepickerConfig, BsDatepickerDateCustomClasses } from './bs-datepicker.config';
import { filter } from 'rxjs/operators';
@Directive({
@@ -102,6 +102,10 @@ export class BsDaterangepickerDirective
* Maximum date which is available for selection
*/
@Input() maxDate: Date;
+ /**
+ * Date custom classes
+ */
+ @Input() dateCustomClasses: BsDatepickerDateCustomClasses[];
/**
* Emits when daterangepicker value has been changed
*/
@@ -153,6 +157,10 @@ export class BsDaterangepickerDirective
if (changes.isDisabled) {
this._datepickerRef.instance.isDisabled = this.isDisabled;
}
+
+ if (changes.dateCustomClasses) {
+ this._datepickerRef.instance.dateCustomClasses = this.dateCustomClasses;
+ }
}
/**
@@ -205,7 +213,8 @@ export class BsDaterangepickerDirective
value: this._bsValue,
isDisabled: this.isDisabled,
minDate: this.minDate || this.bsConfig && this.bsConfig.minDate,
- maxDate: this.maxDate || this.bsConfig && this.bsConfig.maxDate
+ maxDate: this.maxDate || this.bsConfig && this.bsConfig.maxDate,
+ dateCustomClasses: this.dateCustomClasses || this.bsConfig && this.bsConfig.dateCustomClasses
}
);
}
diff --git a/src/datepicker/engine/flag-days-calendar.ts b/src/datepicker/engine/flag-days-calendar.ts
index e361f81661..ae679e4fb7 100644
--- a/src/datepicker/engine/flag-days-calendar.ts
+++ b/src/datepicker/engine/flag-days-calendar.ts
@@ -1,7 +1,8 @@
import {
DaysCalendarViewModel,
DayViewModel,
- WeekViewModel
+ WeekViewModel,
+ DatepickerDateCustomClasses
} from '../models';
import {
@@ -25,6 +26,7 @@ export interface FlagDaysCalendarOptions {
selectedRange: Date[];
displayMonths: number;
monthIndex: number;
+ dateCustomClasses: DatepickerDateCustomClasses[];
}
export function flagDaysCalendar(
@@ -68,6 +70,13 @@ export function flagDaysCalendar(
const currentDate = new Date();
const isToday = !isOtherMonth && isSameDay(day.date, currentDate);
+ const customClasses = options.dateCustomClasses && options.dateCustomClasses
+ .map(dcc => isSameDay(day.date, dcc.date) ? dcc.classes : [])
+ .reduce((previousValue, currentValue) => previousValue.concat(currentValue), [])
+ .join(' ')
+ || "";
+
+
// decide update or not
const newDay = Object.assign({}, day, {
isOtherMonth,
@@ -77,7 +86,8 @@ export function flagDaysCalendar(
isSelectionEnd,
isInRange,
isDisabled,
- isToday
+ isToday,
+ customClasses
});
if (
@@ -87,7 +97,8 @@ export function flagDaysCalendar(
day.isSelectionStart !== newDay.isSelectionStart ||
day.isSelectionEnd !== newDay.isSelectionEnd ||
day.isDisabled !== newDay.isDisabled ||
- day.isInRange !== newDay.isInRange
+ day.isInRange !== newDay.isInRange ||
+ day.customClasses !== newDay.customClasses
) {
week.days[dayIndex] = newDay;
}
diff --git a/src/datepicker/models/index.ts b/src/datepicker/models/index.ts
index 731bb4f40a..c6ff22bab1 100644
--- a/src/datepicker/models/index.ts
+++ b/src/datepicker/models/index.ts
@@ -30,6 +30,7 @@ export interface DayViewModel extends CalendarCellViewModel {
isSelectionEnd?: boolean;
isSelected?: boolean;
isToday?: boolean;
+ customClasses?: string;
// day index
monthIndex?: number;
weekIndex?: number;
@@ -101,6 +102,11 @@ export interface DatepickerRenderOptions {
displayMonths?: number;
}
+export interface DatepickerDateCustomClasses {
+ date: Date;
+ classes: string[];
+}
+
/** *************** */
// events
/** *************** */
diff --git a/src/datepicker/public_api.ts b/src/datepicker/public_api.ts
index 242e6d7c57..166b5918f7 100644
--- a/src/datepicker/public_api.ts
+++ b/src/datepicker/public_api.ts
@@ -1,4 +1,4 @@
-export { BsDatepickerConfig } from './bs-datepicker.config';
+export { BsDatepickerConfig, BsDatepickerDateCustomClasses } from './bs-datepicker.config';
export { BsDatepickerDirective } from './bs-datepicker.component';
export { BsDatepickerInlineConfig } from './bs-datepicker-inline.config';
export { BsDatepickerInlineDirective } from './bs-datepicker-inline.component';
diff --git a/src/datepicker/reducer/bs-datepicker.actions.ts b/src/datepicker/reducer/bs-datepicker.actions.ts
index d53eb3cefb..d9bc7f898b 100644
--- a/src/datepicker/reducer/bs-datepicker.actions.ts
+++ b/src/datepicker/reducer/bs-datepicker.actions.ts
@@ -5,7 +5,8 @@ import {
BsDatepickerViewMode,
BsViewNavigationEvent,
CellHoverEvent,
- DatepickerRenderOptions
+ DatepickerRenderOptions,
+ DatepickerDateCustomClasses
} from '../models';
@Injectable()
@@ -24,6 +25,7 @@ export class BsDatepickerActions {
static readonly SET_MAX_DATE = '[datepicker] set max date';
static readonly SET_DAYSDISABLED = '[datepicker] set days disabled';
static readonly SET_IS_DISABLED = '[datepicker] set is disabled';
+ static readonly SET_DATE_CUSTOM_CLASSES = '[datepicker] set date custom classes';
static readonly SET_LOCALE = '[datepicker] set datepicker locale';
@@ -119,6 +121,13 @@ export class BsDatepickerActions {
};
}
+ setDateCustomClasses(value: DatepickerDateCustomClasses[]): Action {
+ return {
+ type: BsDatepickerActions.SET_DATE_CUSTOM_CLASSES,
+ payload: value
+ };
+ }
+
setLocale(locale: string): Action {
return {
type: BsDatepickerActions.SET_LOCALE,
diff --git a/src/datepicker/reducer/bs-datepicker.effects.ts b/src/datepicker/reducer/bs-datepicker.effects.ts
index 4218934f67..c1c7206541 100644
--- a/src/datepicker/reducer/bs-datepicker.effects.ts
+++ b/src/datepicker/reducer/bs-datepicker.effects.ts
@@ -17,6 +17,7 @@ import {
CalendarCellViewModel,
CellHoverEvent,
DatepickerRenderOptions,
+ DatepickerDateCustomClasses,
DaysCalendarViewModel,
DayViewModel,
MonthsCalendarViewModel,
@@ -78,6 +79,12 @@ export class BsDatepickerEffects {
return this;
}
+ setDateCustomClasses(value: DatepickerDateCustomClasses[]): BsDatepickerEffects {
+ this._store.dispatch(this._actions.setDateCustomClasses(value));
+
+ return this;
+ }
+
/* Set rendering options */
setOptions(_config: BsDatepickerConfig): BsDatepickerEffects {
const _options = Object.assign({locale: this._localeService.currentLocale}, _config);
@@ -253,6 +260,16 @@ export class BsDatepickerEffects {
.subscribe(hoveredDate => this._store.dispatch(this._actions.flag()))
);
+ // date custom classes
+ this._subs.push(
+ this._store
+ .select(state => state.dateCustomClasses)
+ .pipe(
+ filter(dateCustomClasses => !!dateCustomClasses)
+ )
+ .subscribe(dateCustomClasses => this._store.dispatch(this._actions.flag()))
+ );
+
// on locale change
this._subs.push(
this._localeService.localeChange
diff --git a/src/datepicker/reducer/bs-datepicker.reducer.ts b/src/datepicker/reducer/bs-datepicker.reducer.ts
index 6c0739becb..d572b79f3b 100644
--- a/src/datepicker/reducer/bs-datepicker.reducer.ts
+++ b/src/datepicker/reducer/bs-datepicker.reducer.ts
@@ -155,6 +155,11 @@ export function bsDatepickerReducer(state = initialDatepickerState,
isDisabled: action.payload
});
}
+ case BsDatepickerActions.SET_DATE_CUSTOM_CLASSES: {
+ return Object.assign({}, state, {
+ dateCustomClasses: action.payload
+ });
+ }
default:
return state;
@@ -291,6 +296,7 @@ function flagReducer(state: BsDatepickerState,
selectedDate: state.selectedDate,
selectedRange: state.selectedRange,
displayMonths: state.displayMonths,
+ dateCustomClasses: state.dateCustomClasses,
monthIndex
})
);
diff --git a/src/datepicker/reducer/bs-datepicker.state.ts b/src/datepicker/reducer/bs-datepicker.state.ts
index f3c09e9470..d9c245daf3 100644
--- a/src/datepicker/reducer/bs-datepicker.state.ts
+++ b/src/datepicker/reducer/bs-datepicker.state.ts
@@ -2,6 +2,7 @@ import {
BsDatepickerViewMode,
DatepickerFormatOptions,
DatepickerRenderOptions,
+ DatepickerDateCustomClasses,
DaysCalendarModel,
DaysCalendarViewModel,
MonthsCalendarViewModel,
@@ -32,6 +33,7 @@ export class BsDatepickerState
maxDate?: Date;
daysDisabled?: number[];
minMode?: BsDatepickerViewMode;
+ dateCustomClasses?: DatepickerDateCustomClasses[];
hoveredDate?: Date;
hoveredMonth?: Date;
diff --git a/src/datepicker/themes/bs/bs-datepicker-day-decorator.directive.ts b/src/datepicker/themes/bs/bs-datepicker-day-decorator.directive.ts
index ea9b327887..7c53d06369 100644
--- a/src/datepicker/themes/bs/bs-datepicker-day-decorator.directive.ts
+++ b/src/datepicker/themes/bs/bs-datepicker-day-decorator.directive.ts
@@ -14,6 +14,7 @@ import { DayViewModel } from '../../models';
selector: '[bsDatepickerDayDecorator]',
changeDetection: ChangeDetectionStrategy.OnPush,
host: {
+ '[class]': 'day.customClasses',
'[class.disabled]': 'day.isDisabled',
'[class.is-highlighted]': 'day.isHovered',
'[class.is-other-month]': 'day.isOtherMonth',
diff --git a/src/datepicker/themes/bs/bs-datepicker-day-decorator.spec.ts b/src/datepicker/themes/bs/bs-datepicker-day-decorator.spec.ts
index 70f82eb0ce..8717bdc9e3 100644
--- a/src/datepicker/themes/bs/bs-datepicker-day-decorator.spec.ts
+++ b/src/datepicker/themes/bs/bs-datepicker-day-decorator.spec.ts
@@ -61,6 +61,8 @@ describe('datepicker: [bsDatepickerDayDecorator]', () => {
expect(el).not.toHaveCssClass('select-start');
expect(el).not.toHaveCssClass('select-end');
expect(el).not.toHaveCssClass('selected');
+ expect(el).not.toHaveCssClass('custom1');
+ expect(el).not.toHaveCssClass('custom2');
});
it('should add classes corresponding to day state', () => {
@@ -82,5 +84,30 @@ describe('datepicker: [bsDatepickerDayDecorator]', () => {
expect(el).toHaveCssClass('select-start');
expect(el).toHaveCssClass('select-end');
expect(el).toHaveCssClass('selected');
+ expect(el).not.toHaveCssClass('custom1');
+ expect(el).not.toHaveCssClass('custom2');
+ });
+
+ it('should add custom and state classes corresponding to day state', () => {
+ setDay(fixture, {
+ isDisabled: true,
+ isHovered: true,
+ isOtherMonth: true,
+ isInRange: true,
+ isSelectionStart: true,
+ isSelectionEnd: true,
+ isSelected: true,
+ customClasses: "custom1 custom2"
+ });
+ const el = getDayElement(fixture);
+ expect(el).toHaveCssClass('disabled');
+ expect(el).toHaveCssClass('is-highlighted');
+ expect(el).toHaveCssClass('is-other-month');
+ expect(el).toHaveCssClass('in-range');
+ expect(el).toHaveCssClass('select-start');
+ expect(el).toHaveCssClass('select-end');
+ expect(el).toHaveCssClass('selected');
+ expect(el).toHaveCssClass('custom1');
+ expect(el).toHaveCssClass('custom2');
});
});
diff --git a/src/index.ts b/src/index.ts
index 301aa76f29..9cf52dcb16 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -60,7 +60,8 @@ export {
DatepickerModule,
DayPickerComponent,
MonthPickerComponent,
- YearPickerComponent
+ YearPickerComponent,
+ BsDatepickerDateCustomClasses
} from './datepicker/index';
export {