import { Component, Input, Output, EventEmitter, ElementRef, ExistingProvider, forwardRef, OnChanges, AfterViewInit, ViewChild } from '@angular/core';
import { RdLib } from "../../base/rdLib";
import { AppComponent } from "../../app.component";
import { InputBase } from './inputBase';
import { CustomDatePopover } from './inputDatePopover';
const provider: ExistingProvider = { provide: InputBase, useExisting: forwardRef(() => InputDateBootstrap) }
export enum ArilDateTimePickerZoomLevel {
Minute,
Hour,
Day,
Month,
Year
}
export enum CustomDates {
Current = "current()",
Today = "today()",
Yesterday = "yesterday()",
Tomorrow = "tomorrow()",
StartHour = "startHour()",
EndOfHour = "endOfHour()",
StartOfWeek = "startOfWeek()",
OneWeekAgo = "oneWeekAgo()",
StartOfMonth = "startOfMonth()",
EndOfMonth = "endOfMonth()",
OneMonthAgo = "oneMonthAgo()",
StartOfYear = "startOfYear()",
StartOfPeriod = "startOfPeriod()"
}
@Component({
selector: "rd-input-date-bts",
template: `
`,
providers: [provider]
})
export class InputDateBootstrap extends InputBase implements OnChanges, AfterViewInit {
constructor(private element: ElementRef) { super(); }
@Input("rd-model") selectedDate: number;
@Output("rd-modelChange") modelChange: EventEmitter = new EventEmitter();
@Output("rd-change") changeEvent: EventEmitter = new EventEmitter();
@Input("rd-zoom-level") zoomLevel: number = ArilDateTimePickerZoomLevel.Minute;
@Input("rd-start-view") startView: number = 2;
@Input("rd-default") default: number;
@Input("rd-disabled") disabled: boolean;
@Input("rd-required") required: boolean = false;
@Input("rd-custom-date") customDateActive: boolean = false;
@Input("rd-group-date") groupDate: boolean = true;
@Input("rd-form-key") formKey: string;
@Input("rd-form-key-isValid") formKeyIsValid: boolean = true;
@Input("rd-min") minDate: number = 19500101000000;
@Input("rd-max") maxDate: number;
format: string;
level: string;
container: any;
selectedDateStr: string = "";
CustomDatePopover = CustomDatePopover;
@ViewChild("formInput") formInput;
ngAfterViewInit() {
this.container = this.jQuery(this.element.nativeElement).find('#datetimepicker');
this.zoomLevelOptions();
if (this.default) this.selectedDate = this.default;
this.setDate();
this.setTimePicker();
}
ngOnChanges(changes) {
if (!this.container) return;
if (changes.selectedDate) this.setDate();
if (changes.minDate && !isNaN(this.minDate)) this.container.datetimepicker('setStartDate', RdLib.typeOperations.longToString(this.minDate, 'yyyy-MM-dd hh:mm'));
if (changes.maxDate && !isNaN(this.maxDate)) this.container.datetimepicker('setEndDate', RdLib.typeOperations.longToString(this.maxDate, 'yyyy-MM-dd hh:mm'));
if (changes.disabled) this.jQuery(this.container).attr("disabled", this.disabled);
if (changes.zoomLevel || changes.startView) {
this.zoomLevelOptions();
this.container.datetimepicker("remove");
this.setTimePicker();
this.container.datetimepicker("update");
}
}
ngOnDestroy() {
this.container.datetimepicker("remove");
}
setDate() {
if (this.selectedDate) {
if (!isNaN(this.selectedDate)) {
this.selectedDateStr = RdLib.typeOperations.longToString(this.selectedDate, this.level);
this.changeEvent.emit(this.selectedDate);
}
else if (typeof this.selectedDate == "string") this.setCustomDate(this.selectedDate);
}
else if (this.selectedDateStr) this.container.datetimepicker("reset");
}
setTimePicker() {
this.container.datetimepicker({
pickTime: false,
language: AppComponent.user.language,
autoclose: true,
weekStart: 1,
minuteStep: 15,
startDate: RdLib.typeOperations.longToDate(this.minDate),
endDate: RdLib.typeOperations.longToDate(this.maxDate),
pickerPosition: "bottom-left",
todayBtn: true,
clearBtn: true,
startView: this.startView,
minView: this.zoomLevel,
todayHighlight: true,
format: this.format,
isInline: false
});
this.container.datetimepicker().on('changeDate', function (e) {
if (e.date && e.date.valueOf())
var dateValue = RdLib.typeOperations.dateToLong(e.date, this.level);
else dateValue = null;
this.selectedDate = dateValue;
this.onChange(dateValue);
}.bind(this));
this.container.datetimepicker().on('show', (e) => { // when dateTimePicker showed customDate clear
if (this.customDateActive && Object.values(CustomDates).includes(e.target.defaultValue)) {
let formatedCurrentDateLong = RdLib.typeOperations.dateToLong(new Date(), this.level);
this.container.datetimepicker('update', RdLib.typeOperations.longToDate(formatedCurrentDateLong));
}
})
}
zoomLevelOptions() {
switch (this.zoomLevel) {
case ArilDateTimePickerZoomLevel.Minute:
this.format = "dd/MM/yyyy hh:ii";
this.startView = 2;
this.level = "minute";
break;
case ArilDateTimePickerZoomLevel.Hour:
this.format = "dd/MM/yyyy hh";
this.startView = 2;
this.level = "hour";
break;
case ArilDateTimePickerZoomLevel.Day:
this.format = "dd/MM/yyyy";
this.startView = 2;
this.level = "day";
break;
case ArilDateTimePickerZoomLevel.Month:
this.format = "MM/yyyy";
this.startView = 3;
this.level = "month";
break;
case ArilDateTimePickerZoomLevel.Year:
this.format = "yyyy";
this.startView = 4;
this.level = "year";
break;
default:
this.format = "dd/MM/yyyy hh:ii";
this.startView = 2;
this.level = "minute";
break;
}
}
setCustomDate(date) {
this.selectedDate = date;
this.selectedDateStr = date;
this.jQuery(this.container).val(!!date.match("=") ? date : RdLib.localization.translateEn(date));
this.onChange(date);
}
}