Skip to content

Commit 16fdd99

Browse files
committed
Some updates to better reflect the angular ngmodelcontroller flow
1 parent f6c4f3e commit 16fdd99

File tree

1 file changed

+39
-72
lines changed

1 file changed

+39
-72
lines changed

coffee/angular-daterangepicker.coffee

+39-72
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
picker = angular.module('daterangepicker', [])
22

33
picker.constant('dateRangePickerConfig',
4+
clearLabel: 'Clear'
45
locale:
56
separator: ' - '
67
format: 'YYYY-MM-DD'
@@ -10,9 +11,9 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
1011
require: 'ngModel'
1112
restrict: 'A'
1213
scope:
13-
dateMin: '=min'
14-
dateMax: '=max'
15-
model: '=ngModel'
14+
min: '='
15+
max: '='
16+
model: '=ngmodel'
1617
opts: '=options'
1718
clearable: '='
1819
link: ($scope, element, attrs, modelCtrl) ->
@@ -24,17 +25,13 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
2425
clear = ->
2526
_picker.setStartDate()
2627
_picker.setEndDate()
27-
el.val('')
2828

2929
_setDatePoint = (setter) ->
3030
(newValue) ->
31-
$timeout ->
32-
if (_picker)
33-
if not newValue
34-
clear()
35-
else
36-
m = moment(newValue)
37-
setter(m)
31+
if (_picker)
32+
if not newValue
33+
then clear()
34+
else setter(moment(newValue))
3835

3936
_setStartDate = _setDatePoint (m) ->
4037
if (_picker.endDate < m)
@@ -57,9 +54,8 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
5754
else date.format(opts.locale.format)
5855

5956
if opts.singleDatePicker
60-
f(viewVal.startDate)
61-
else
62-
[f(viewVal.startDate), f(viewVal.endDate)].join(opts.locale.separator)
57+
then f(viewVal.startDate)
58+
else [f(viewVal.startDate), f(viewVal.endDate)].join(opts.locale.separator)
6359

6460
_parse = (value) ->
6561
f = (val) ->
@@ -68,61 +64,44 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
6864
then f(value)
6965
else value.split(opts.locale.separator).map(f)
7066

71-
_validate = (field, validator) ->
72-
(expected, actual) ->
73-
if expected and actual
74-
expected = moment(expected)
75-
actual = moment(actual)
76-
valid = validator(expected, actual)
77-
modelCtrl.$setValidity(field, valid)
78-
valid
79-
else
80-
modelCtrl.$setValidity(field, true)
81-
true
82-
83-
_validateMin = _validate 'min', (min, start) -> min.isBefore(start) or min.isSame(start, 'day')
84-
_validateMax = _validate 'max', (max, end) -> max.isAfter(end) or max.isSame(end, 'day')
67+
_validate = (validator) ->
68+
(boundary, actual) ->
69+
if boundary and actual
70+
then validator(moment(boundary), moment(actual))
71+
else true
72+
73+
_validateMin = _validate (min, start) -> min.isBefore(start) or min.isSame(start, 'day')
74+
_validateMax = _validate (max, end) -> max.isAfter(end) or max.isSame(end, 'day')
8575

8676
modelCtrl.$formatters.push (val) ->
87-
if val and val.startDate and val.endDate
88-
# Update datepicker dates according to val before rendering.
89-
_setStartDate(val.startDate)
90-
_setEndDate(val.endDate)
91-
return val
92-
''
77+
if val and val.startDate
78+
then _format(val)
79+
else ''
9380

9481
modelCtrl.$parsers.push (val) ->
9582
# Check if input is valid.
96-
value = {}
97-
if angular.isObject(val) and val.hasOwnProperty('startDate') and val.hasOwnProperty('endDate')
98-
value = val
83+
value =
84+
startDate: null
85+
endDate: null
9986
if angular.isString(val) and val.length > 0
10087
x = _parse(val)
10188
value.startDate = x[0]
10289
value.endDate = x[1]
103-
104-
if value.startDate or value.endDate
105-
_validateMin($scope.dateMin, value.startDate)
106-
_validateMax($scope.dateMax, value.endDate)
107-
return value
108-
109-
modelCtrl.$modelValue
90+
value
11091

11192
modelCtrl.$isEmpty = (val) ->
11293
# modelCtrl is empty if val is invalid or any of the ranges are not set.
11394
not val or val.startDate == null or val.endDate == null
11495

11596
modelCtrl.$render = ->
116-
if not modelCtrl.$modelValue or modelCtrl.$modelValue.startDate == null
117-
then el.val('')
118-
else el.val(_format(modelCtrl.$modelValue))
97+
if modelCtrl.$modelValue and modelCtrl.$modelValue.startDate != null
98+
_setStartDate(modelCtrl.$modelValue.startDate)
99+
_setEndDate(modelCtrl.$modelValue.endDate)
100+
else
101+
clear()
119102

120103
_init = ->
121-
el.daterangepicker opts, (start, end) ->
122-
$timeout ->
123-
modelCtrl.$setViewValue({startDate: start, endDate: end})
124-
modelCtrl.$render()
125-
104+
el.daterangepicker opts
126105

127106
# Needs to be after daterangerpicker has been created, otherwise
128107
# watchers that reinit will be attached to old daterangepicker instance.
@@ -145,32 +124,20 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
145124

146125
_init()
147126

148-
# If input is cleared manually, set dates to null.
149-
el.change ->
150-
if $.trim(el.val()) == ''
151-
$timeout ()->
152-
modelCtrl.$setViewValue(
153-
startDate: null
154-
endDate: null
155-
)
156-
157-
_initDateField = (field, attribute, validator, modelName, optName) ->
158-
if attrs[attribute]
127+
_initBoundaryField = (field, validator, modelField, optName) ->
128+
if attrs[field]
129+
modelCtrl.$validators[field] = (value) ->
130+
validator(opts[optName], value[modelField])
159131
$scope.$watch field, (date) ->
160-
if date
161-
if not modelCtrl.$isEmpty(modelCtrl.$modelValue)
162-
validator(date, modelCtrl.$modelValue[modelName])
163-
opts[optName] = moment(date)
164-
else
165-
opts[optName] = false
132+
opts[optName] = if date then moment(date) else false
166133
_init()
167134

168-
_initDateField('dateMin', 'min', _validateMin, 'startDate', 'minDate')
169-
_initDateField('dateMax', 'max', _validateMax, 'endDate', 'maxDate')
135+
_initBoundaryField('min', _validateMin, 'startDate', 'minDate')
136+
_initBoundaryField('max', _validateMax, 'endDate', 'maxDate')
170137

171138
if attrs.options
172139
$scope.$watch 'opts', (newOpts) ->
173-
opts = angular.merge(opts, newOpts)
140+
opts = angular.merge(opts, newOpts, {autoUpdateInput: false})
174141
_init()
175142
, true
176143

0 commit comments

Comments
 (0)