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 {