Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(datepicker): enable to listen for viewchanges #6426

Open
wants to merge 1 commit into
base: development
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions apps/ngx-bootstrap-docs/src/ng-api-doc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -838,6 +838,10 @@ export const ngdoc: any = {
{
"name": "bsValueChange",
"description": "<p>Emits when datepicker value has been changed</p>\n"
},
{
"name": "bsViewChange",
"description": "<p>Emits when datepicker view has been changed</p>\n"
}
],
"properties": [],
Expand Down Expand Up @@ -971,6 +975,10 @@ export const ngdoc: any = {
"name": "bsValueChange",
"description": "<p>Emits when datepicker value has been changed</p>\n"
},
{
"name": "bsViewChange",
"description": "<p>Emits when datepicker view has been changed</p>\n"
},
{
"name": "onHidden",
"description": "<p>Emits an event when the datepicker is hidden</p>\n"
Expand Down Expand Up @@ -1390,6 +1398,10 @@ export const ngdoc: any = {
"name": "bsValueChange",
"description": "<p>Emits when daterangepicker value has been changed</p>\n"
},
{
"name": "bsViewChange",
"description": "<p>Emits when datepicker view has been changed</p>\n"
},
{
"name": "onHidden",
"description": "<p>Emits an event when the daterangepicker is hidden</p>\n"
Expand Down
14 changes: 14 additions & 0 deletions libs/doc-pages/datepicker/src/lib/datepicker-section.list.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import { DemoDatepickerClearButtonComponent } from './demos/clear-button/clear-b
import { DemoDatepickerStartViewComponent } from "./demos/start-view/start-view";
import { DemoDatepickerPreventChangeToNextMonthComponent } from './demos/prevent-change-to-next-month/prevent-change-to-next-month.component';
import { DemoDatepickerWithTimepickerComponent } from './demos/with-timepicker/with-timepicker';
import { DemoDatepickerViewChangeEventComponent } from './demos/view-change-event/view-change-event';

export const demoComponentContent: ContentSection[] = [
{
Expand Down Expand Up @@ -320,6 +321,14 @@ export const demoComponentContent: ContentSection[] = [
description: `<p>You can subscribe to datepicker's value change event (<code>bsValueChange</code>).</p>`,
outlet: DemoDatepickerValueChangeEventComponent
},
{
title: 'View change event',
anchor: 'view-change-event',
component: require('!!raw-loader!./demos/view-change-event/view-change-event.ts'),
html: require('!!raw-loader!./demos/view-change-event/view-change-event.html'),
description: `<p>You can subscribe to datepicker's view change event (<code>bsViewChange</code>).</p>`,
outlet: DemoDatepickerViewChangeEventComponent
},
{
title: 'Config properties',
anchor: 'config-object',
Expand Down Expand Up @@ -624,6 +633,11 @@ export const demoComponentContent: ContentSection[] = [
anchor: 'value-change-event-ex',
outlet: DemoDatepickerValueChangeEventComponent
},
{
title: 'View change event',
anchor: 'view-change-event-ex',
outlet: DemoDatepickerViewChangeEventComponent
},
{
title: 'Config properties',
anchor: 'config-object-ex',
Expand Down
2 changes: 2 additions & 0 deletions libs/doc-pages/datepicker/src/lib/demos/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ import { DemoDatePickerSelectWeekRangeComponent } from './select-week-range/sele
import { DemoDatepickerTriggersCustomComponent } from './triggers-custom/triggers-custom';
import { DemoDatepickerTriggersManualComponent } from './triggers-manual/triggers-manual';
import { DemoDatepickerValueChangeEventComponent } from './value-change-event/value-change-event';
import { DemoDatepickerViewChangeEventComponent } from './view-change-event/view-change-event';
import { DemoDatePickerVisibilityEventsComponent } from './visibility-events/visibility-events';
import { DemoDatePickerQuickSelectRangesComponent } from './quick-select-ranges/quick-select-ranges';
import { DemoDateRangePickerShowPreviousMonth } from './daterangepicker-show-previous-month/show-previous-month';
Expand Down Expand Up @@ -77,6 +78,7 @@ export const DEMO_COMPONENTS = [
DemoDatepickerTriggersCustomComponent,
DemoDatepickerTriggersManualComponent,
DemoDatepickerValueChangeEventComponent,
DemoDatepickerViewChangeEventComponent,
DemoDateRangePickerShowPreviousMonth,
DemoDateRangePickerDisplayOneMonth,
DemoDatePickerVisibilityEventsComponent,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<div class="row">
<div class="col-xs-12 col-12 col-sm-6 col-md-4 form-group mb-3">
<div class="mb-3 card card-block card-header" *ngIf="view">
<div class="mb-2"><code>$event.date</code>: {{view.date | date}}</div>
<div><code>$event.mode</code>: {{view.mode}}</div>
</div>
<input class="form-control"
placeholder="Datepicker"
bsDatepicker
(bsViewChange)="onViewChange($event)">
</div>
</div>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { Component } from '@angular/core';
import { BsDatepickerViewState } from 'src/datepicker/reducer/bs-datepicker.state';

@Component({
// eslint-disable-next-line @angular-eslint/component-selector
selector: 'demo-datepicker-view-change-event',
templateUrl: './view-change-event.html'
})
export class DemoDatepickerViewChangeEventComponent {
view?: BsDatepickerViewState;

onViewChange(view: BsDatepickerViewState): void {
this.view = view;
}
}
4 changes: 4 additions & 0 deletions src/datepicker/base/bs-datepicker-container.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ import {
WeekViewModel,
YearsCalendarViewModel
} from '../models';
import { EventEmitter } from '@angular/core';
import { BsDatepickerViewState } from '../reducer/bs-datepicker.state';

export abstract class BsDatepickerAbstractComponent {
containerClass = '';
Expand All @@ -37,6 +39,8 @@ export abstract class BsDatepickerAbstractComponent {
isRangePicker?: boolean;
withTimepicker?: boolean;

viewChange: EventEmitter<BsDatepickerViewState> = new EventEmitter<BsDatepickerViewState>();

set minDate(value: Date|undefined) {
this._effects?.setMinDate(value);
}
Expand Down
20 changes: 15 additions & 5 deletions src/datepicker/bs-datepicker-inline.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { DatepickerDateCustomClasses, DatepickerDateTooltipText } from './models
import { BsDatepickerInlineContainerComponent } from './themes/bs/bs-datepicker-inline-container.component';
import { copyTime } from './utils/copy-time-utils';
import { checkBsValue, setCurrentTimeOnDateSelect } from './utils/bs-calendar-utils';
import { BsDatepickerViewState } from './reducer/bs-datepicker.state';

@Directive({
selector: 'bs-datepicker-inline',
Expand Down Expand Up @@ -61,6 +62,10 @@ export class BsDatepickerInlineDirective implements OnInit, OnDestroy, OnChanges
* Enable specific dates
*/
@Input() datesDisabled?: Date[];
/**
* Emits when datepicker view has been changed
*/
@Output() bsViewChange: EventEmitter<BsDatepickerViewState> = new EventEmitter();
/**
* Emits when datepicker value has been changed
*/
Expand Down Expand Up @@ -96,14 +101,14 @@ export class BsDatepickerInlineDirective implements OnInit, OnDestroy, OnChanges
return;
}

if (!this._bsValue && value && !this._config.withTimepicker) {
const now = new Date();
copyTime(value, now);
}
if (!this._bsValue && value && !this._config.withTimepicker) {
const now = new Date();
copyTime(value, now);
}

if (value && this.bsConfig?.initCurrentTime) {
value = setCurrentTimeOnDateSelect(value);
}
}

this._bsValue = value;
this.bsValueChange.emit(value);
Expand All @@ -130,6 +135,11 @@ export class BsDatepickerInlineDirective implements OnInit, OnDestroy, OnChanges
this.bsValue = value;
})
);
this._subs.push(
this._datepickerRef.instance.viewChange.subscribe((view: BsDatepickerViewState) => {
this.bsViewChange.emit(view);
})
);
}
}

Expand Down
18 changes: 14 additions & 4 deletions src/datepicker/bs-datepicker.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ import { BsDatepickerViewMode, DatepickerDateCustomClasses, DatepickerDateToolti
import { BsDatepickerContainerComponent } from './themes/bs/bs-datepicker-container.component';
import { copyTime } from './utils/copy-time-utils';
import { checkBsValue, setCurrentTimeOnDateSelect } from './utils/bs-calendar-utils';
import { BsDatepickerViewState } from './reducer/bs-datepicker.state';

@Directive({
selector: '[bsDatepicker]',
Expand Down Expand Up @@ -92,6 +93,10 @@ export class BsDatepickerDirective implements OnInit, OnDestroy, OnChanges, Afte
* Date tooltip text
*/
@Input() dateTooltipTexts?: DatepickerDateTooltipText[];
/**
* Emits when datepicker view has been changed
*/
@Output() bsViewChange: EventEmitter<BsDatepickerViewState> = new EventEmitter();
/**
* Emits when datepicker value has been changed
*/
Expand All @@ -102,10 +107,10 @@ export class BsDatepickerDirective implements OnInit, OnDestroy, OnChanges, Afte
private readonly _dateInputFormat$ = new Subject<string | undefined>();

constructor(public _config: BsDatepickerConfig,
private _elementRef: ElementRef,
private _renderer: Renderer2,
_viewContainerRef: ViewContainerRef,
cis: ComponentLoaderFactory) {
private _elementRef: ElementRef,
private _renderer: Renderer2,
_viewContainerRef: ViewContainerRef,
cis: ComponentLoaderFactory) {
// todo: assign only subset of fields
Object.assign(this, this._config);
this._datepicker = cis.createLoader<BsDatepickerContainerComponent>(
Expand Down Expand Up @@ -242,6 +247,11 @@ export class BsDatepickerDirective implements OnInit, OnDestroy, OnChanges, Afte
this.hide();
})
);
this._subs.push(
this._datepickerRef.instance.viewChange.subscribe((view: BsDatepickerViewState) => {
this.bsViewChange.emit(view);
})
);
}
}

Expand Down
10 changes: 10 additions & 0 deletions src/datepicker/bs-daterangepicker-inline.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import {
checkRangesWithMaxDate,
setDateRangesCurrentTimeOnDateSelect
} from './utils/bs-calendar-utils';
import { BsDatepickerViewState } from './reducer/bs-datepicker.state';

@Directive({
selector: 'bs-daterangepicker-inline',
Expand Down Expand Up @@ -73,6 +74,10 @@ export class BsDaterangepickerInlineDirective implements OnInit, OnDestroy, OnCh
* Disable specific dates
*/
@Input() datesEnabled?: Date[];
/**
* Emits when datepicker view has been changed
*/
@Output() bsViewChange: EventEmitter<BsDatepickerViewState> = new EventEmitter();
/**
* Emits when daterangepicker value has been changed
*/
Expand Down Expand Up @@ -201,6 +206,11 @@ export class BsDaterangepickerInlineDirective implements OnInit, OnDestroy, OnCh
this.bsValue = value;
})
);
this._subs.push(
this._datepickerRef.instance.viewChange.subscribe((view: BsDatepickerViewState) => {
this.bsViewChange.emit(view);
})
);
}
}

Expand Down
27 changes: 19 additions & 8 deletions src/datepicker/bs-daterangepicker.component.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { AfterViewInit, ComponentRef,
import {
AfterViewInit, ComponentRef,
Directive, ElementRef, EventEmitter,
Input, OnChanges, OnDestroy, OnInit,
Output, Renderer2, SimpleChanges,
Expand All @@ -16,6 +17,7 @@ import {
checkRangesWithMaxDate,
setDateRangesCurrentTimeOnDateSelect
} from './utils/bs-calendar-utils';
import { BsDatepickerViewState } from './reducer/bs-datepicker.state';

@Directive({
selector: '[bsDaterangepicker]',
Expand Down Expand Up @@ -64,15 +66,15 @@ export class BsDaterangepickerDirective
*/
@Output() onHidden: EventEmitter<unknown>;

_bsValue?: (Date|undefined)[];
_bsValue?: (Date | undefined)[];
isOpen$: BehaviorSubject<boolean>;
isDestroy$ = new Subject();

/**
* Initial value of daterangepicker
*/
@Input()
set bsValue(value: (Date|undefined)[] | undefined) {
set bsValue(value: (Date | undefined)[] | undefined) {
if (this._bsValue === value) {
return;
}
Expand Down Expand Up @@ -118,10 +120,14 @@ export class BsDaterangepickerDirective
* Enable specific dates
*/
@Input() datesEnabled?: Date[];
/**
* Emits when datepicker view has been changed
*/
@Output() bsViewChange: EventEmitter<BsDatepickerViewState> = new EventEmitter();
/**
* Emits when daterangepicker value has been changed
*/
@Output() bsValueChange = new EventEmitter<((Date|undefined)[]|undefined)>();
@Output() bsValueChange = new EventEmitter<((Date | undefined)[] | undefined)>();

get rangeInputFormat$(): Observable<string> {
return this._rangeInputFormat$;
Expand All @@ -133,10 +139,10 @@ export class BsDaterangepickerDirective
private readonly _rangeInputFormat$ = new Subject<string>();

constructor(public _config: BsDaterangepickerConfig,
private _elementRef: ElementRef,
private _renderer: Renderer2,
_viewContainerRef: ViewContainerRef,
cis: ComponentLoaderFactory) {
private _elementRef: ElementRef,
private _renderer: Renderer2,
_viewContainerRef: ViewContainerRef,
cis: ComponentLoaderFactory) {
this._datepicker = cis.createLoader<BsDaterangepickerContainerComponent>(
_elementRef,
_viewContainerRef,
Expand Down Expand Up @@ -251,6 +257,11 @@ export class BsDaterangepickerDirective
this.hide();
})
);
this._subs.push(
this._datepickerRef.instance.viewChange.subscribe((view: BsDatepickerViewState) => {
this.bsViewChange.emit(view);
})
);
}
}

Expand Down
Loading