import {Component, OnInit, ElementRef, EventEmitter} from '@angular/core'; import {CORE_DIRECTIVES} from '@angular/common'; import * as $ from 'jquery'; @Component({ selector: BdDatePicker.toString(), directives: [CORE_DIRECTIVES], inputs: ['date', 'params', 'label', 'disabled'], outputs: ['dateChange'], template: `
` }) export class BdDatePicker implements OnInit { public date: Date = null; public label: String = 'date'; public disabled: boolean = false; public dateChange: EventEmitter; public params: Object = null; public static DEFAULT_PARAMS: Object = { container: document.body }; private picker: any; constructor(public elementRef: ElementRef) { this.dateChange = new EventEmitter(); } ngOnInit() { let element: Element = this.elementRef.nativeElement; this.registerAsDatePicker(element.querySelector('input')); } private registerAsDatePicker(element) { let mergedParams = {}; Object.assign(mergedParams, BdDatePicker.DEFAULT_PARAMS, this.params, { onSet: (result) => this.onDateChange(result), onClose: () => element.blur() }); this.initializeDatePickerWithStartingValue(element, mergedParams, this.date); } private initializeDatePickerWithStartingValue(element: Element, mergedParams: Object, date: Date) { let dateInput: any = $(element).pickadate(mergedParams); this.picker = dateInput.pickadate('picker'); this.picker.set('select', date); } private onDateChange(dateChangeResult: DatePickerChanges) { switch (Object.keys(dateChangeResult)[0]) { case 'highlight': return; case 'select': let selectedDate: Date = dateChangeResult.select ? this.extractDate(dateChangeResult.select) : null; this.dateChange.emit(selectedDate); break; case 'clear': this.dateChange.emit(null); } } private extractDate(selectedDate: number) { let newDate = new Date(selectedDate); if (this.date) { newDate.setHours(this.date.getHours(), this.date.getMinutes(), this.date.getSeconds(), this.date.getMilliseconds()); } return newDate; } private open() { this.picker.open(); } public static toString(): string { return 'bd-date-picker'; } } interface DatePickerChanges { highlight: { pick: number; }; select: number; clear: number; }