1
1
picker = angular .module (' daterangepicker' , [])
2
2
3
3
picker .constant (' dateRangePickerConfig' ,
4
+ clearLabel : ' Clear'
4
5
locale :
5
6
separator : ' - '
6
7
format : ' YYYY-MM-DD'
@@ -10,9 +11,9 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
10
11
require : ' ngModel'
11
12
restrict : ' A'
12
13
scope :
13
- dateMin : ' =min '
14
- dateMax : ' =max '
15
- model : ' =ngModel '
14
+ min : ' ='
15
+ max : ' ='
16
+ model : ' =ngmodel '
16
17
opts : ' =options'
17
18
clearable : ' ='
18
19
link : ($scope , element , attrs , modelCtrl ) ->
@@ -24,17 +25,13 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
24
25
clear = ->
25
26
_picker .setStartDate ()
26
27
_picker .setEndDate ()
27
- el .val (' ' )
28
28
29
29
_setDatePoint = (setter ) ->
30
30
(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))
38
35
39
36
_setStartDate = _setDatePoint (m ) ->
40
37
if (_picker .endDate < m)
@@ -57,9 +54,8 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
57
54
else date .format (opts .locale .format )
58
55
59
56
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 )
63
59
64
60
_parse = (value ) ->
65
61
f = (val ) ->
@@ -68,61 +64,44 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
68
64
then f (value)
69
65
else value .split (opts .locale .separator ).map (f)
70
66
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' )
85
75
86
76
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 ' '
93
80
94
81
modelCtrl .$parsers .push (val) ->
95
82
# 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
99
86
if angular .isString (val) and val .length > 0
100
87
x = _parse (val)
101
88
value .startDate = x[0 ]
102
89
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
110
91
111
92
modelCtrl .$isEmpty = (val ) ->
112
93
# modelCtrl is empty if val is invalid or any of the ranges are not set.
113
94
not val or val .startDate == null or val .endDate == null
114
95
115
96
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 ()
119
102
120
103
_init = ->
121
- el .daterangepicker opts, (start , end ) ->
122
- $timeout ->
123
- modelCtrl .$setViewValue ({startDate : start, endDate : end})
124
- modelCtrl .$render ()
125
-
104
+ el .daterangepicker opts
126
105
127
106
# Needs to be after daterangerpicker has been created, otherwise
128
107
# watchers that reinit will be attached to old daterangepicker instance.
@@ -145,32 +124,20 @@ picker.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePicker
145
124
146
125
_init ()
147
126
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])
159
131
$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
166
133
_init ()
167
134
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' )
170
137
171
138
if attrs .options
172
139
$scope .$watch ' opts' , (newOpts ) ->
173
- opts = angular .merge (opts, newOpts)
140
+ opts = angular .merge (opts, newOpts, { autoUpdateInput : false } )
174
141
_init ()
175
142
, true
176
143
0 commit comments