angular-eonasdan-datetimepicker
Version:
A wrapper directive around the bootstrap-datetimepicker component.
72 lines (62 loc) • 2.92 kB
JavaScript
(function () {
'use strict';
var module = angular.module('ae-datetimepicker', []);
module.directive('datetimepicker', [
'$timeout',
function ($timeout) {
return {
restrict: 'EA',
require: 'ngModel',
scope: {
options: '=?',
onChange: '&?',
onClick: '&?'
},
link: function ($scope, $element, $attrs, ngModel) {
var dpElement = $element.parent().hasClass('input-group') ? $element.parent() : $element;
$scope.$watch('options', function (newValue) {
var dtp = dpElement.data('DateTimePicker');
$.map(newValue, function (value, key) {
dtp[key](value);
});
}, true);
ngModel.$render = function () {
// if value is undefined/null do not do anything, unless some date was set before
var currentDate = dpElement.data('DateTimePicker').date();
if (!ngModel.$viewValue && currentDate) {
dpElement.data('DateTimePicker').clear();
} else if (ngModel.$viewValue) {
// otherwise make sure it is moment object
if (!moment.isMoment(ngModel.$viewValue)) {
ngModel.$setViewValue(moment(ngModel.$viewValue));
}
dpElement.data('DateTimePicker').date(ngModel.$viewValue);
}
};
var isDateEqual = function (d1, d2) {
return moment.isMoment(d1) && moment.isMoment(d2) && d1.valueOf() === d2.valueOf();
};
dpElement.on('dp.change', function (e) {
if (!isDateEqual(e.date, ngModel.$viewValue)) {
var newValue = e.date === false ? null : e.date;
ngModel.$setViewValue(newValue);
$timeout(function () {
if (typeof $scope.onChange === 'function') {
$scope.onChange();
}
});
}
});
dpElement.on('click', function () {
$timeout(function () {
if (typeof $scope.onClick === 'function') {
$scope.onClick();
}
});
});
dpElement.datetimepicker($scope.options);
}
};
}
]);
})();