ember-cli-bootstrap-datepicker
Version:
Datepicker component for Ember CLI based on bootstrap-datepicker. It doesn't have any external dependency except bootstrap-datepicker, supports popup and inline modes.
128 lines (109 loc) • 3.63 kB
JavaScript
import Ember from 'ember';
export default Ember.Mixin.create({
mustUpdateInput: true,
value: null,
setupBootstrapDatepicker: Ember.on('didInsertElement', function() {
var self = this;
this.$().
datepicker({
autoclose: this.get('autoclose'),
calendarWeeks: this.get('calendarWeeks'),
clearBtn: this.get('clearBtn'),
container: this.get('widgetContainer'),
daysOfWeekDisabled: this.get('daysOfWeekDisabled'),
defaultViewDate: this.get('defaultViewDate'),
disableTouchKeyboard: this.get('disableTouchKeyboard'),
enableOnReadonly: this.get('enableOnReadonly'),
endDate: this.get('endDate'),
forceParse: this.get('forceParse'),
format: this.get('format'),
immediateUpdates: this.get('immediateUpdates'),
keyboardNavigation: this.get('keyboardNavigation'),
language: this.get('language'),
maxViewMode: this.get('maxViewMode'),
minViewMode: this.get('minViewMode'),
multidate: this.get('multidate'),
multidateSeparator: this.get('multidateSeparator'),
orientation: this.get('orientation'),
showOnFocus: this.get('showOnFocus'),
startDate: this.get('startDate'),
startView: this.get('startView'),
todayBtn: this.get('todayBtn'),
todayHighlight: this.get('todayHighlight'),
toggleActive: this.get('toggleActive'),
weekStart: this.get('weekStart')
}).
on('changeDate', function(event) {
Ember.run(function() {
self._didChangeDate(event);
});
});
this._updateDatepicker();
}),
teardownBootstrapDatepicker: Ember.on('willDestroyElement', function() {
this.$().datepicker('remove');
}),
didChangeValue: Ember.observer('value', function() {
this._updateDatepicker();
}),
_didChangeDate: function(event) {
var value = null;
if (event.date) {
if (this.get('multidate')) {
value = this.$().datepicker('getDates');
} else {
value = this.$().datepicker('getDate');
}
}
this.set('mustUpdateInput', false);
this.set('value', value);
this.sendAction('changeDate', value);
},
_didChangeLanguage: Ember.observer('language', function() {
this.$().datepicker('remove');
this.setupBootstrapDatepicker();
}),
_updateStartDate: Ember.observer('startDate', function() {
this.$().datepicker('setStartDate', this.get('startDate'));
this._updateDatepicker();
}),
_updateEndDate: Ember.observer('endDate', function() {
this.$().datepicker('setEndDate', this.get('endDate'));
this._updateDatepicker();
}),
_updateDatepicker: function() {
var self = this,
element = this.$(),
value = this.get('value'),
dates = [];
if (!this.get('mustUpdateInput')) {
this.set('mustUpdateInput', true);
return;
}
switch (Ember.typeOf(value)) {
case 'array':
dates = value;
break;
case 'date':
dates = [value];
break;
default:
dates = [null];
}
dates = dates.map(function(date) {
return (Ember.isNone(date)) ? null : self._resetTime(date);
});
element.datepicker
.apply(element, Array.prototype.concat.call(['update'], dates));
},
// HACK: Have to reset time to 00:00:00 because of the bug in
// bootstrap-datepicker
// Issue: http://git.io/qH7Hlg
_resetTime: function(date) {
date.setHours(0);
date.setMinutes(0);
date.setSeconds(0);
date.setMilliseconds(0);
return date;
}
});