Skip to content

Commit 0a31db8

Browse files
committed
Merge pull request fragaria#121 from shanesmith/master
Fix input showing "invalid date" when startDate/endDate is null
2 parents 7e69d09 + 6f2f404 commit 0a31db8

4 files changed

+51
-71
lines changed

coffee/angular-daterangepicker.coffee

+15-28
Original file line numberDiff line numberDiff line change
@@ -50,26 +50,6 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
5050
_picker.setStartDate(m)
5151
_picker.setEndDate(m)
5252

53-
# Formats the obj into the string for the element input
54-
_format = (objValue) ->
55-
f = (date) ->
56-
if not moment.isMoment(date)
57-
then moment(date).format(opts.locale.format)
58-
else date.format(opts.locale.format)
59-
60-
if objValue
61-
if opts.singleDatePicker
62-
then f(objValue.startDate)
63-
else [f(objValue.startDate), f(objValue.endDate)].join(opts.locale.separator)
64-
else ''
65-
66-
# Sets the viewValue as well as updating the input element's value
67-
# Note: This is necessary as we don't allow the date picker to update the text (using autoUpdateInput: false)
68-
_setViewValue = (objValue) ->
69-
value = _format(objValue)
70-
el.val(value)
71-
modelCtrl.$setViewValue(value)
72-
7353
# Validation for our min/max
7454
_validate = (validator) ->
7555
(boundary, actual) ->
@@ -82,7 +62,17 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
8262

8363
# Formatter should return just the string value of the input
8464
# It is used for comparison of if we should re-render
85-
modelCtrl.$formatters.push _format
65+
modelCtrl.$formatters.push (objValue) ->
66+
f = (date) ->
67+
if not moment.isMoment(date)
68+
then moment(date).format(opts.locale.format)
69+
else date.format(opts.locale.format)
70+
71+
if opts.singleDatePicker and objValue
72+
f(objValue)
73+
else if objValue.startDate
74+
[f(objValue.startDate), f(objValue.endDate)].join(opts.locale.separator)
75+
else ''
8676

8777
# Render should update the date picker start/end dates as necessary
8878
# It should also set the input element's val with $viewValue as we don't let the rangepicker do this
@@ -121,7 +111,7 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
121111
# disable autoUpdateInput, can't handle empty values without it. Our callback here will
122112
# update our $viewValue, which triggers the $parsers
123113
el.daterangepicker angular.extend(opts, {autoUpdateInput: false}), (start, end) ->
124-
_setViewValue({startDate: start, endDate: end})
114+
$scope.model = if opts.singleDatePicker then start else {startDate: start, endDate: end}
125115

126116
# Needs to be after daterangerpicker has been created, otherwise
127117
# watchers that reinit will be attached to old daterangepicker instance.
@@ -141,10 +131,8 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
141131
# Update the date picker, and set a new viewValue of the model
142132
$scope.$watch 'model.startDate', (n) ->
143133
_setStartDate(n)
144-
_setViewValue($scope.model)
145134
$scope.$watch 'model.endDate', (n) ->
146135
_setEndDate(n)
147-
_setViewValue($scope.model)
148136

149137
# Add validation/watchers for our min/max fields
150138
_initBoundaryField = (field, validator, modelField, optName) ->
@@ -171,10 +159,9 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
171159
if newClearable
172160
opts = _mergeOpts(opts, {locale: {cancelLabel: opts.clearLabel}})
173161
_init()
174-
el.on 'cancel.daterangepicker', (
175-
if newClearable
176-
then _setViewValue.bind(this, {startDate: null, endDate: null})
177-
else null)
162+
if newClearable
163+
el.on 'cancel.daterangepicker', () ->
164+
$scope.model = if opts.singleDatePicker then null else {startDate: null, endDate: null}
178165

179166
$scope.$on '$destroy', ->
180167
_picker?.remove()

js/angular-daterangepicker.js

+34-41
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
clearable: '='
2424
},
2525
link: function($scope, element, attrs, modelCtrl) {
26-
var customOpts, el, opts, _clear, _format, _init, _initBoundaryField, _mergeOpts, _picker, _setDatePoint, _setEndDate, _setStartDate, _setViewValue, _validate, _validateMax, _validateMin;
26+
var _clear, _init, _initBoundaryField, _mergeOpts, _picker, _setDatePoint, _setEndDate, _setStartDate, _validate, _validateMax, _validateMin, customOpts, el, opts;
2727
_mergeOpts = function() {
2828
var extend, localeExtend;
2929
localeExtend = angular.extend.apply(angular, Array.prototype.slice.call(arguments).map(function(opt) {
@@ -62,31 +62,6 @@
6262
}
6363
return _picker.setEndDate(m);
6464
});
65-
_format = function(objValue) {
66-
var f;
67-
f = function(date) {
68-
if (!moment.isMoment(date)) {
69-
return moment(date).format(opts.locale.format);
70-
} else {
71-
return date.format(opts.locale.format);
72-
}
73-
};
74-
if (objValue) {
75-
if (opts.singleDatePicker) {
76-
return f(objValue.startDate);
77-
} else {
78-
return [f(objValue.startDate), f(objValue.endDate)].join(opts.locale.separator);
79-
}
80-
} else {
81-
return '';
82-
}
83-
};
84-
_setViewValue = function(objValue) {
85-
var value;
86-
value = _format(objValue);
87-
el.val(value);
88-
return modelCtrl.$setViewValue(value);
89-
};
9065
_validate = function(validator) {
9166
return function(boundary, actual) {
9267
if (boundary && actual) {
@@ -102,7 +77,23 @@
10277
_validateMax = _validate(function(max, end) {
10378
return max.isAfter(end) || max.isSame(end, 'day');
10479
});
105-
modelCtrl.$formatters.push(_format);
80+
modelCtrl.$formatters.push(function(objValue) {
81+
var f;
82+
f = function(date) {
83+
if (!moment.isMoment(date)) {
84+
return moment(date).format(opts.locale.format);
85+
} else {
86+
return date.format(opts.locale.format);
87+
}
88+
};
89+
if (opts.singleDatePicker && objValue) {
90+
return f(objValue);
91+
} else if (objValue.startDate) {
92+
return [f(objValue.startDate), f(objValue.endDate)].join(opts.locale.separator);
93+
} else {
94+
return '';
95+
}
96+
});
10697
modelCtrl.$render = function() {
10798
if (modelCtrl.$modelValue && modelCtrl.$modelValue.startDate) {
10899
_setStartDate(modelCtrl.$modelValue.startDate);
@@ -136,34 +127,32 @@
136127
return !(angular.isString(val) && val.length > 0);
137128
};
138129
_init = function() {
139-
var eventType, _results;
130+
var eventType, results;
140131
el.daterangepicker(angular.extend(opts, {
141132
autoUpdateInput: false
142133
}), function(start, end) {
143-
return _setViewValue({
134+
return $scope.model = opts.singleDatePicker ? start : {
144135
startDate: start,
145136
endDate: end
146-
});
137+
};
147138
});
148139
_picker = el.data('daterangepicker');
149-
_results = [];
140+
results = [];
150141
for (eventType in opts.eventHandlers) {
151-
_results.push(el.on(eventType, function(e) {
142+
results.push(el.on(eventType, function(e) {
152143
var eventName;
153144
eventName = e.type + '.' + e.namespace;
154145
return $scope.$evalAsync(opts.eventHandlers[eventName]);
155146
}));
156147
}
157-
return _results;
148+
return results;
158149
};
159150
_init();
160151
$scope.$watch('model.startDate', function(n) {
161-
_setStartDate(n);
162-
return _setViewValue($scope.model);
152+
return _setStartDate(n);
163153
});
164154
$scope.$watch('model.endDate', function(n) {
165-
_setEndDate(n);
166-
return _setViewValue($scope.model);
155+
return _setEndDate(n);
167156
});
168157
_initBoundaryField = function(field, validator, modelField, optName) {
169158
if (attrs[field]) {
@@ -194,10 +183,14 @@
194183
});
195184
}
196185
_init();
197-
return el.on('cancel.daterangepicker', (newClearable ? _setViewValue.bind(this, {
198-
startDate: null,
199-
endDate: null
200-
}) : null));
186+
if (newClearable) {
187+
return el.on('cancel.daterangepicker', function() {
188+
return $scope.model = opts.singleDatePicker ? null : {
189+
startDate: null,
190+
endDate: null
191+
};
192+
});
193+
}
201194
});
202195
}
203196
return $scope.$on('$destroy', function() {

js/angular-daterangepicker.min.js

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)