// Simple wrapper around $.crmDatepicker.
// example with no time input: <input crm-ui-datepicker="{time: false}" ng-model="myobj.datefield"/>
// example with custom date format: <input crm-ui-datepicker="{date: 'm/d/y'}" ng-model="myobj.datefield"/>
- .directive('crmUiDatepicker', function () {
+ .directive('crmUiDatepicker', function ($timeout) {
return {
restrict: 'AE',
require: 'ngModel',
element
.crmDatepicker(scope.crmUiDatepicker)
.on('change', function() {
- var requiredLength = 19;
- if (scope.crmUiDatepicker && scope.crmUiDatepicker.time === false) {
- requiredLength = 10;
- }
- if (scope.crmUiDatepicker && scope.crmUiDatepicker.date === false) {
- requiredLength = 8;
- }
- ngModel.$setValidity('incompleteDateTime', !($(this).val().length && $(this).val().length !== requiredLength));
+ // Because change gets triggered from the $render function we could be either inside or outside the $digest cycle
+ $timeout(function() {
+ var requiredLength = 19;
+ if (scope.crmUiDatepicker && scope.crmUiDatepicker.time === false) {
+ requiredLength = 10;
+ }
+ if (scope.crmUiDatepicker && scope.crmUiDatepicker.date === false) {
+ requiredLength = 8;
+ }
+ ngModel.$setValidity('incompleteDateTime', !(element.val().length && element.val().length !== requiredLength));
+ });
});
}
};
model.the_date = ' ';
$rootScope.$digest();
+ $timeout.flush();
expect($rootScope.myForm.$valid).toBe(false);
expect(element.find('.radio-now').prop('checked')).toBe(false);
expect(element.find('.radio-at').prop('checked')).toBe(true);
model.the_date = '2014-01-01';
$rootScope.$digest();
+ $timeout.flush();
expect($rootScope.myForm.$valid).toBe(false);
expect(element.find('.radio-now').prop('checked')).toBe(false);
expect(element.find('.radio-at').prop('checked')).toBe(true);
model.the_date = '02:03:00';
$rootScope.$digest();
+ $timeout.flush();
expect($rootScope.myForm.$valid).toBe(false);
expect(element.find('.radio-now').prop('checked')).toBe(false);
expect(element.find('.radio-at').prop('checked')).toBe(true);
var ndate = new Date(year, month-1, day, 0, 0, 0);
model.the_date = currentDate;
+ $timeout.flush();
$rootScope.$digest();
expect($rootScope.myForm.$valid).toBe(true);
expect(element.find('.radio-now').prop('checked')).toBe(false);
element.find('.radio-now').click().trigger('click').trigger('change');
element.find('.crm-form-date').datepicker('setDate', $.datepicker.parseDate('yy-mm-dd', '2014-01-03')).trigger('change');
+ $timeout.flush();
$rootScope.$digest();
expect(model.the_date).toBe('2014-01-03');
expect($rootScope.myForm.$valid).toBe(false);
expect(element.find('.radio-at').prop('checked')).toBe(true);
element.find('.crm-form-date').datepicker('setDate', '').trigger('change');
+ $timeout.flush();
$rootScope.$digest();
expect(model.the_date).toBe('04:05:00');
expect($rootScope.myForm.$valid).toBe(false);
expect(element.find('.radio-at').prop('checked')).toBe(true);
element.find('.radio-now').click().trigger('click').trigger('change');
+ $timeout.flush();
$rootScope.$digest();
expect(model.the_date).toBe(null);
expect($rootScope.myForm.$valid).toBe(true);