├── .bowerrc
├── .gitignore
├── CONTRIBUTORS.md
├── Gruntfile.coffee
├── LICENSE.md
├── README.md
├── bower.json
├── coffee
└── angular-daterangepicker.coffee
├── coffeelint.json
├── example.html
├── index.js
├── js
├── angular-daterangepicker.js
├── angular-daterangepicker.min.js
├── angular-daterangepicker.min.js.map
└── angular-daterangepicker.min.map
└── package.json
/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "lib"
3 | }
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | lib
2 | node_modules
3 | .idea
4 | .DS_Store
5 |
--------------------------------------------------------------------------------
/CONTRIBUTORS.md:
--------------------------------------------------------------------------------
1 | # Contributors
2 | Many thanks to following folks (ordered by date of contribution):
3 |
4 | * [Ray Gerrard](https://github.com/raygerrard)
5 | * [Will Wu](https://github.com/wubin1989)
6 | * [Matt Traynham](https://github.com/mtraynham) (upgrade to Bootstrap Daterange picker 2.0)!
7 | * [Wojciech Frącz](https://github.com/fracz)
8 | * [Ondřej Plšek](https://github.com/ondrs)
9 | * [Ryan Dale](https://github.com/RyanDale)
10 | * [Steven](https://github.com/tcooc)
11 | * [Moshe Bildner](https://github.com/mbildner)
12 | * [klam](https://github.com/klam)
13 | * [Marcelo Eduardo de Andrade Jr.](https://github.com/marcelinhov2)
14 | * [Elmar](https://github.com/elm-)
15 | * [Eric Byers](https://github.com/EricByers)
16 | * [Chris Parton](https://github.com/chrisparton1991)
17 | * [Dawid Dominiak](https://github.com/dawiddominiak)
18 | * [Lior Chen](https://github.com/liorch88)
19 | * [Hung Le](https://github.com/lexhung)
20 | * [Adam Segal](https://github.com/phazei)
21 |
--------------------------------------------------------------------------------
/Gruntfile.coffee:
--------------------------------------------------------------------------------
1 | module.exports = (grunt) ->
2 | require('load-grunt-tasks')(grunt)
3 |
4 | # Project configuration.
5 | grunt.initConfig
6 | pkg: grunt.file.readJSON("package.json")
7 |
8 | coffeelint:
9 | options:
10 | configFile: 'coffeelint.json'
11 | source: ['coffee/angular-daterangepicker.coffee']
12 |
13 | coffee:
14 | compileJoined:
15 | options:
16 | join: true
17 | files:
18 | 'js/angular-daterangepicker.js': ['coffee/angular-daterangepicker.coffee']
19 |
20 | watch:
21 | files: ['example.html', 'coffee/*.coffee']
22 | tasks: ['default']
23 |
24 | uglify:
25 | options:
26 | sourceMap: true
27 | target:
28 | files:
29 | 'js/angular-daterangepicker.min.js': ['js/angular-daterangepicker.js']
30 |
31 | wiredep:
32 | target:
33 | src: [
34 | './example.html'
35 | ]
36 |
37 | ngAnnotate:
38 | options:
39 | singleQuotes: true
40 |
41 | daterangepicker:
42 | files:
43 | 'js/angular-daterangepicker.js': ['js/angular-daterangepicker.js']
44 |
45 |
46 | # Default task(s).
47 | grunt.registerTask "default", ["coffeelint", "coffee"]
48 | grunt.registerTask "develop", ["default", "watch"]
49 | grunt.registerTask "dist", ["default", "ngAnnotate", "uglify"]
50 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Fragaria, s.r.o.
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Date Range Picker for Angular and Bootstrap
2 | 
3 |
4 | Angular.js directive for Dan Grossmans's [Bootstrap Datepicker](https://github.com/dangrossman/bootstrap-daterangepicker).
5 |
6 | ## Maintainer needed!
7 | Hello, as you may noticed, we have troubles maintaining this repo. So if there is somebody willing to help merging PRs, testing and releasing, please contact me at lukas.marek(at)fragaria.cz.
8 | Thank you!
9 |
10 | [DEMO](http://fragaria.github.io/angular-daterangepicker/)
11 |
12 | **Beware: Use [Bootstrap Datepicker](https://github.com/dangrossman/bootstrap-daterangepicker) v 3.0.3 and newer!**
13 |
14 | 
15 |
16 | ## Installation via Bower
17 | The easiest way to install the picker is:
18 | ```
19 | bower install angular-daterangepicker --save
20 | ```
21 | ## Manual installation
22 | This directive depends on [Bootstrap Datepicker](https://github.com/dangrossman/bootstrap-daterangepicker), [Bootstrap](http://getbootstrap.com), [Moment.js](http://momentjs.com/) and [jQuery](http://jquery.com/).
23 | Download dependencies above and then use [minified](js/angular-daterangepicker.min.js) or [normal](angular-daterangepicker.js) version.
24 |
25 | ## Basic usage
26 | Assuming that bower installation directory is `bower_components`. In case of other installation directory, please update paths accordingly.
27 |
28 | ```
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | ```
37 |
38 | Declare dependency:
39 |
40 | ```
41 | App = angular.module('app', ['daterangepicker']);
42 | ```
43 |
44 | Prepare model in your controller. The model **must** have `startDate` and `endDate` attributes:
45 |
46 | ```
47 | exampleApp.controller('TestCtrl', function ($scope) {
48 | $scope.datePicker = { date: {startDate: null, endDate: null} };
49 | }
50 | ```
51 |
52 |
53 | Then in your HTML just add attribute `date-range-picker` to any input and bind it to model.
54 |
55 | ```
56 |
57 |
58 |
59 | ```
60 |
61 | See `example.html` for working demo.
62 |
63 | ### Mind the dot!
64 | Do not forget to add a dot (.) in your model object to avoid [issues with scope inheritance](https://github.com/angular/angular.js/wiki/Understanding-Scopes). E.g. use `$scope.datePicker.date` instead of `$scope.date`.
65 |
66 | ## Advanced usage
67 |
68 | ####**Extra Options**
69 | These are options beyond those provided in daterangepicker.
70 |
71 | `pickerClasses` : **string**
72 | -- additional classesadded to picker dropdown element
73 |
74 | `cancelOnOutsideClick` : **boolean** (default: true) (only applicable when autoApply==false)
75 | If true, then clicking outside of the picker, after value has been changed on calendar,
76 | will trigger clicking cancel rather than applying value to model.
77 | If false, apply will be triggered.
78 |
79 | `changeCallback` : **function(startDate, endDate, label)**
80 | This will be called in the second $.daterangepicker callback parameter
81 |
82 |
83 | ####**Optional Attributes**
84 |
85 | `picker` : **object**
86 | -- object to assign dateRangePicker data object to
87 |
88 | `options` : **object** (watched)
89 | -- all dateRangePicker options
90 |
91 | `clearable` : **boolean** (watched)
92 | -- will change cancel button to clear and use `options.locale.clearLabel` for text
93 |
94 | `min` & `max` : **moment** || *date string* (watched)
95 | -- sets min/max date values for picker
96 |
97 | `picker-classes` : **string**
98 | -- additional classes added to picker dropdown element
99 |
100 | ## Example element
101 | ```
102 |
111 | ```
112 |
113 |
114 | ## Example options
115 |
116 | ```
117 | $scope.dateRangePicker = {
118 | date: {startDate: moment().subtract(1, 'years'), endDate: moment().add(1, 'years')}
119 | picker: null,
120 | options: {
121 | pickerClasses: 'custom-display', //angular-daterangepicker extra
122 | buttonClasses: 'btn',
123 | applyButtonClasses: 'btn-primary',
124 | cancelButtonClasses: 'btn-danger',
125 | locale: {
126 | applyLabel: "Apply",
127 | cancelLabel: 'Cancel',
128 | customRangeLabel: 'Custom range',
129 | separator: ' - ',
130 | format: "YYYY-MM-DD", //will give you 2017-01-06
131 | //format: "D-MMM-YY", //will give you 6-Jan-17
132 | //format: "D-MMMM-YY", //will give you 6-January-17
133 | },
134 | ranges: {
135 | 'Last 7 Days': [moment().subtract(6, 'days'), moment()],
136 | 'Last 30 Days': [moment().subtract(29, 'days'), moment()]
137 | },
138 | eventHandlers: {
139 | 'apply.daterangepicker': function(event, picker) { console.log('applied'); }
140 | }
141 | }
142 | };
143 | ```
144 |
145 | ## Events
146 |
147 | Optionally, event handlers can be passed in through the `eventHandlers` attribute of `options`.
148 |
149 | ```
150 |
152 | ```
153 |
154 | All event handlers from the Bootstrap daterangepicker are supported. For reference, the complete list is below:
155 |
156 | `show.daterangepicker`: Triggered when the picker is shown
157 |
158 | `hide.daterangepicker`: Triggered when the picker is hidden
159 |
160 | `showCalendar.daterangepicker`: Triggered when the calendar is shown
161 |
162 | `hideCalendar.daterangepicker`: Triggered when the calendar is hidden
163 |
164 | `apply.daterangepicker`: Triggered when the apply button is clicked
165 |
166 | `cancel.daterangepicker`: Triggered when the cancel button is clicked
167 |
168 | ## Compatibility
169 | Version > 0.3.0 requires [Bootstrap Datepicker](https://github.com/dangrossman/bootstrap-daterangepicker) 3.0.3 and newer.
170 | Version > 0.2.0 requires [Bootstrap Datepicker](https://github.com/dangrossman/bootstrap-daterangepicker) 2.0.0 and newer.
171 | Version > 0.1.1 requires [Bootstrap Datepicker](https://github.com/dangrossman/bootstrap-daterangepicker) 1.3.3 and newer.
172 |
173 | ## Changes of note
174 | ####0.3.0
175 | `cancelOnOutsideClick` - enabled by default, was previously unhandled
176 |
177 |
178 | ## Links
179 | See [original documentation](https://github.com/dangrossman/bootstrap-daterangepicker).
180 |
181 | ## Issues and Pull Requests
182 | The PRs are more than welcome – thank you for those.
183 |
184 | Please send me PRs only for `*.coffee` code. **Please, do not include Javascript and minified Javascript into PRs.**
185 | Javascript and minified Javascript will be generated later with `grunt dist` command
186 | just before the release.
187 |
188 | [](https://waffle.io/fragaria/angular-daterangepicker/metrics)
189 |
190 | ## Contributors
191 | See [CONTRIBUTORS.md](https://github.com/fragaria/angular-daterangepicker/blob/master/CONTRIBUTORS.md) for all the great folks who contributed to this repo!
192 | Thank you, guys!
193 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-daterangepicker",
3 | "version": "0.3.0",
4 | "homepage": "https://github.com/fragaria/angular-daterangepicker",
5 | "main": "js/angular-daterangepicker.js",
6 | "authors": [
7 | "Filip Vařecha ",
8 | "Tibor Kulčár ",
9 | "Lukáš Marek "
10 | ],
11 | "description": "Angular.js wrapper for Dan Grosmann's bootstrap date range picker (https://github.com/dangrossman/bootstrap-daterangepicker).",
12 | "license": "MIT",
13 | "private": false,
14 | "ignore": [
15 | "**/.*",
16 | "node_modules",
17 | "bower_components",
18 | "test",
19 | "tests"
20 | ],
21 | "dependencies": {
22 | "angular": "^1.3.20",
23 | "bootstrap-daterangepicker": "^3.0.3"
24 | },
25 | "devDependencies": {
26 | "angular-messages": "^1.3.20"
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/coffee/angular-daterangepicker.coffee:
--------------------------------------------------------------------------------
1 | pickerModule = angular.module('daterangepicker', [])
2 |
3 | pickerModule.constant('dateRangePickerConfig',
4 | cancelOnOutsideClick: true
5 | locale:
6 | separator: ' - '
7 | format: 'YYYY-MM-DD'
8 | clearLabel: 'Clear'
9 | )
10 |
11 | pickerModule.directive 'dateRangePicker', ($compile, $timeout, $parse, dateRangePickerConfig) ->
12 | require: 'ngModel'
13 | restrict: 'A'
14 | scope:
15 | min: '='
16 | max: '='
17 | picker: '=?'
18 | model: '=ngModel'
19 | opts: '=options'
20 | clearable: '='
21 | link: ($scope, element, attrs, modelCtrl) ->
22 | # Custom angular extend function to extend locales, so they are merged instead of overwritten
23 | # angular.merge removes prototypes...
24 | _mergeOpts = () ->
25 | localeExtend = angular.extend.apply(angular,
26 | Array.prototype.slice.call(arguments).map((opt) -> opt?.locale).filter((opt) -> !!opt))
27 | extend = angular.extend.apply(angular, arguments)
28 | extend.locale = localeExtend
29 | extend
30 |
31 | el = $(element)
32 | # can interfere with local.separator & $parsers if startDate is empty
33 | el.attr('ng-trim','false')
34 | attrs.ngTrim = 'false'
35 |
36 | allowInvalid = false
37 | do setModelOptions = ->
38 | # must only update on change, otherwise in the middle of typing it will update the $viewValue
39 | if (modelCtrl.$options && typeof modelCtrl.$options.getOption == 'function')
40 | updateOn = modelCtrl.$options.getOption('updateOn')
41 | allowInvalid = !!modelCtrl.$options.getOption('allowInvalid')
42 | else # angular < 1.6
43 | updateOn = (modelCtrl.$options && modelCtrl.$options.updateOn) || ""
44 | allowInvalid = !!(modelCtrl.$options && modelCtrl.$options.allowInvalid)
45 |
46 | if (updateOn.indexOf("change") == -1)
47 | if (typeof modelCtrl.$overrideModelOptions == 'function')
48 | updateOn += " change"
49 | modelCtrl.$overrideModelOptions({'*':'$inherit', updateOn})
50 | else
51 | # angular < 1.6
52 | updateOn += " change"
53 | updateOn.replace(/default/g,' ')
54 | options = angular.copy(modelCtrl.$options) || {}
55 | options.updateOn = updateOn
56 | options.updateOnDefault = false
57 | modelCtrl.$options = options
58 |
59 | customOpts = $scope.opts
60 | opts = _mergeOpts({}, angular.copy(dateRangePickerConfig), customOpts)
61 | _picker = null
62 |
63 | _clear = ->
64 | # if no initial value given this will be called in $render before picker
65 | if (_picker)
66 | _picker.setStartDate()
67 | _picker.setEndDate()
68 |
69 | _setDatePoint = (setter) ->
70 | (newValue) ->
71 | if (newValue && (!moment.isMoment(newValue) || newValue.isValid()))
72 | newValue = moment(newValue)
73 | else
74 | # keep previous value if invalid
75 | # set newValue = {} to default it
76 | return
77 |
78 | if _picker
79 | setter(newValue)
80 |
81 | _setStartDate = _setDatePoint (date) ->
82 | if (date && _picker.endDate < date)
83 | # end's before start, so push end date out to start date
84 | _picker.setEndDate(date)
85 | _picker.setStartDate(date)
86 | opts.startDate = _picker.startDate #picker would have adjusted it to match max/mins
87 |
88 | _setEndDate = _setDatePoint (date) ->
89 | # this just flips start and end if they are reverse chronological
90 | if (date && _picker.startDate > date)
91 | # daterangepicker will set the end date to a clone of the start date if it's before start
92 | # so end will become what the start date is currently anyway
93 | _picker.setEndDate(_picker.startDate)
94 | opts.endDate = _picker.endDate #will be previous start date
95 |
96 | # the new start date is actually this lesser date
97 | _picker.setStartDate(date)
98 | opts.startDate = _picker.startDate #picker would have adjusted it to match max/mins
99 | else
100 | _picker.setEndDate(date)
101 | opts.endDate = _picker.endDate
102 |
103 | getViewValue =(model) ->
104 | f = (date) ->
105 | if not moment.isMoment(date)
106 | then moment(date).format(opts.locale.format)
107 | else date.format(opts.locale.format)
108 |
109 | if opts.singleDatePicker and model
110 | viewValue = f(model)
111 | else if model and (model.startDate || model.endDate)
112 | viewValue = [f(model.startDate), f(model.endDate)].join(opts.locale.separator)
113 | else
114 | viewValue = ''
115 | return viewValue
116 |
117 | # Formatter should return just the string value of the input
118 | # It is used for comparison of if we should re-render
119 | modelCtrl.$formatters.push (modelValue) ->
120 | getViewValue(modelValue)
121 |
122 | # Render should update the date picker start/end dates as necessary
123 | # It should also set the input element's val with $viewValue as we don't let the rangepicker do this
124 | modelCtrl.$renderOriginal = modelCtrl.$render
125 | modelCtrl.$render = () ->
126 | # Update the calendars
127 | if modelCtrl.$modelValue and opts.singleDatePicker
128 | _setStartDate(modelCtrl.$modelValue)
129 | _setEndDate(modelCtrl.$modelValue)
130 | else if modelCtrl.$modelValue and (modelCtrl.$modelValue.startDate || modelCtrl.$modelValue.endDate)
131 | _setStartDate(modelCtrl.$modelValue.startDate)
132 | _setEndDate(modelCtrl.$modelValue.endDate)
133 | else _clear()
134 |
135 | if (modelCtrl.$valid)
136 | # Update the input with the $viewValue (generated from $formatters)
137 | modelCtrl.$renderOriginal()
138 |
139 | # This should parse the string input into an updated model object
140 | modelCtrl.$parsers.push (viewValue) ->
141 | # Parse the string value
142 | f = (value) ->
143 | date = moment(value, opts.locale.format)
144 | return (date.isValid() && date) || null
145 |
146 | objValue = if opts.singleDatePicker then null else
147 | startDate: null
148 | endDate: null
149 |
150 | if angular.isString(viewValue) and viewValue.length > 0
151 | if opts.singleDatePicker
152 | objValue = f(viewValue)
153 | else
154 | x = viewValue.split(opts.locale.separator).map(f)
155 | # Use startOf/endOf day to comply with how daterangepicker works
156 | objValue.startDate = if x[0] then x[0].startOf('day') else null
157 | # selected value will always be 999ms off due to:
158 | # https://github.com/dangrossman/daterangepicker/issues/1890
159 | # can fix by adding .startOf('second') but then initial value will be off by 999ms
160 | objValue.endDate = if x[1] then x[1].endOf('day') else null
161 | return objValue
162 |
163 | modelCtrl.$isEmpty = (val) ->
164 | # modelCtrl is empty if val is empty string
165 | not (angular.isString(val) and val.length > 0)
166 |
167 | # _init has to be called anytime we make changes to the date picker options
168 | _init = ->
169 | # disable autoUpdateInput, can't handle empty values without it. Our callback here will
170 | # update our $viewValue, which triggers the $parsers
171 | el.daterangepicker angular.extend(opts, {autoUpdateInput: false}), (startDate, endDate, label) ->
172 | $scope.$apply () =>
173 | # this callback is triggered any time the calendar is changed, even if it wasn't applied
174 | # so a range is changed, but not applied and then clicked out of, this triggers when outsideClick calls hide
175 | # therefore can't assign to model here
176 | # https://github.com/dangrossman/daterangepicker/issues/1156
177 | # $scope.model = if opts.singleDatePicker then startDate else {startDate, endDate, label}
178 | if (typeof opts.changeCallback == "function")
179 | opts.changeCallback.apply(this, [startDate, endDate, label])
180 |
181 | # Needs to be after daterangerpicker has been created, otherwise
182 | # watchers that reinit will be attached to old daterangepicker instance.
183 | _picker = el.data('daterangepicker')
184 | $scope.picker = _picker
185 | # to set initial dropdown to inline hide for when default display isn't hidden (eg display: flex/grid)
186 | _picker.container.hide()
187 | _picker.container.addClass((opts.pickerClasses || "") + " " + (attrs['pickerClasses'] || ""))
188 |
189 | el.on 'show.daterangepicker', (ev, picker) ->
190 | el.addClass('picker-open')
191 |
192 | # there are some cases where daterangepicker is buggy and the date won't match
193 | # make sure it does here
194 | # (if doing it here, does it really need to be set in the $render? probably for consistency)
195 | $scope.$apply ->
196 | if (opts.singleDatePicker)
197 | if (!picker.startDate.isSame($scope.model))
198 | _setStartDate($scope.model)
199 | _setEndDate($scope.model)
200 | else
201 | if ($scope.model && !picker.startDate.isSame($scope.model.startDate))
202 | _setStartDate($scope.model.startDate)
203 | if ($scope.model && !picker.endDate.isSame($scope.model.endDate))
204 | _setEndDate($scope.model.endDate)
205 | picker.updateView()
206 | return
207 |
208 | el.on 'hide.daterangepicker', (ev, picker) ->
209 | el.removeClass('picker-open')
210 |
211 | el.on 'apply.daterangepicker', (ev, picker) ->
212 | $scope.$apply ->
213 | if opts.singleDatePicker
214 | if !picker.startDate
215 | $scope.model = null
216 | else if !picker.startDate.isSame($scope.model)
217 | $scope.model = picker.startDate
218 | else if ( !picker.startDate.isSame(picker.oldStartDate) || !picker.endDate.isSame(picker.oldEndDate) ||
219 | !$scope.model ||
220 | !picker.startDate.isSame($scope.model.startDate) || !picker.endDate.isSame($scope.model.endDate)
221 | )
222 | $scope.model = {
223 | startDate: picker.startDate
224 | endDate: picker.endDate
225 | label: picker.chosenLabel
226 | }
227 | return
228 |
229 | el.on 'outsideClick.daterangepicker', (ev, picker) ->
230 | if opts.cancelOnOutsideClick
231 | $scope.$apply ->
232 | # need to prevent clearing if option is on
233 | picker.cancelingClick = true
234 | picker.clickCancel()
235 | else
236 | picker.clickApply()
237 |
238 | # Ability to attach event handlers. See https://github.com/fragaria/angular-daterangepicker/pull/62
239 | # Revised
240 | for eventType of opts.eventHandlers
241 | el.on eventType, (ev, picker) ->
242 | eventName = ev.type + '.' + ev.namespace
243 | $scope.$evalAsync(opts.eventHandlers[eventName])
244 |
245 | # if model was already created and validation case changed this will catch that
246 | # and update the model if it was null from previous but no longer invalid
247 | modelCtrl.$validate()
248 | if (!$scope.model)
249 | el.trigger('change')
250 |
251 | # init will be called by opt watcher
252 | # _init()
253 |
254 | # Since model is an object whose parameters might not change while the value does,
255 | # need to handle what ngModelWatch doesn't
256 | $scope.$watch (-> getViewValue($scope.model)) , (viewValue) ->
257 | # if (modelCtrl.$invalid)
258 | # modelCtrl.$viewValue = null
259 | if (typeof modelCtrl.$processModelValue == "function")
260 | modelCtrl.$processModelValue()
261 | # will skip render if view wasn't updated, but view is skipped
262 | # the first time after a validation error since it's still $invalid
263 | # so need to make sure it's run again just in case
264 | modelCtrl.$render()
265 | else
266 | # maintain angular compatibility with < 1.7
267 | if (typeof modelCtrl.$$updateEmptyClasses == "function")
268 | modelCtrl.$$updateEmptyClasses(viewValue)
269 | # maintain angular compatibility with < 1.6
270 | modelCtrl.$viewValue = modelCtrl.$$lastCommittedViewValue = viewValue
271 | modelCtrl.$render()
272 |
273 |
274 | modelCtrl.$validators['invalid'] =(value, viewValue) ->
275 | applicable = attrs.required && !modelCtrl.$isEmpty(viewValue)
276 | if opts.singleDatePicker
277 | check = value && value.isValid()
278 | else
279 | check = value && value.startDate && value.startDate.isValid() && value.endDate && value.endDate.isValid()
280 | return !applicable || !!check
281 |
282 | # Validation for our min/max
283 | _validateRange = (date, min, max) ->
284 | if date and (min or max)
285 | [date, min, max] = [date, min, max].map (d) ->
286 | if (d)
287 | moment(d)
288 | else d
289 | return (!min or min.isBefore(date) or min.isSame(date, 'day')) and
290 | (!max or max.isSame(date, 'day') or max.isAfter(date))
291 | else true
292 |
293 | # Add validation/watchers for our min/max fields
294 | _initBoundaryField = (field, validator, modelField, optName) ->
295 | modelCtrl.$validators[field] = (value) ->
296 | # always have validator so if min/max change, this works
297 | # just return true if not set
298 | if (!opts[optName])
299 | return true
300 |
301 | if (opts.singleDatePicker)
302 | if field == 'min'
303 | !value || validator(value, opts['minDate'], value)
304 | else if field == 'max'
305 | !value || validator(value, value, opts['maxDate'])
306 | else
307 | value and validator(value[modelField], opts['minDate'], opts['maxDate'])
308 |
309 | if attrs[field]
310 | $scope.$watch field, (date) ->
311 | opts[optName] = if date then moment(date) else false
312 | if (_picker)
313 | _picker[optName] = opts[optName]
314 | $timeout -> modelCtrl.$validate()
315 |
316 |
317 | _initBoundaryField('min', _validateRange, 'startDate', 'minDate')
318 | _initBoundaryField('max', _validateRange, 'endDate', 'maxDate')
319 |
320 | # Watch our options
321 | $scope.$watch 'opts', (newOpts = {}) ->
322 | opts = _mergeOpts(opts, newOpts)
323 | _init()
324 | , true
325 |
326 | # Watch clearable flag
327 | if attrs.clearable
328 | $scope.$watch 'clearable', (newClearable) ->
329 | if newClearable
330 | opts = _mergeOpts(opts, {locale: {cancelLabel: opts.locale.clearLabel}})
331 | _init()
332 | if newClearable
333 | el.on 'cancel.daterangepicker', (ev, picker) ->
334 | if (!picker.cancelingClick)
335 | $scope.model = if opts.singleDatePicker then null else {startDate: null, endDate: null}
336 | el.val("")
337 | picker.cancelingClick = null
338 | $timeout -> $scope.$apply()
339 |
340 | $scope.$on '$destroy', ->
341 | _picker?.remove()
342 |
--------------------------------------------------------------------------------
/coffeelint.json:
--------------------------------------------------------------------------------
1 | {
2 | "arrow_spacing": {
3 | "level": "ignore"
4 | },
5 | "braces_spacing": {
6 | "level": "ignore",
7 | "spaces": 0
8 | },
9 | "camel_case_classes": {
10 | "level": "error"
11 | },
12 | "coffeescript_error": {
13 | "level": "error"
14 | },
15 | "colon_assignment_spacing": {
16 | "level": "ignore",
17 | "spacing": {
18 | "left": 0,
19 | "right": 0
20 | }
21 | },
22 | "cyclomatic_complexity": {
23 | "value": 10,
24 | "level": "ignore"
25 | },
26 | "duplicate_key": {
27 | "level": "error"
28 | },
29 | "empty_constructor_needs_parens": {
30 | "level": "ignore"
31 | },
32 | "ensure_comprehensions": {
33 | "level": "warn"
34 | },
35 | "indentation": {
36 | "value": 2,
37 | "level": "error"
38 | },
39 | "line_endings": {
40 | "level": "ignore",
41 | "value": "unix"
42 | },
43 | "max_line_length": {
44 | "value": 120,
45 | "level": "error",
46 | "limitComments": true
47 | },
48 | "missing_fat_arrows": {
49 | "level": "ignore"
50 | },
51 | "newlines_after_classes": {
52 | "value": 3,
53 | "level": "ignore"
54 | },
55 | "no_backticks": {
56 | "level": "error"
57 | },
58 | "no_debugger": {
59 | "level": "warn"
60 | },
61 | "no_empty_functions": {
62 | "level": "ignore"
63 | },
64 | "no_empty_param_list": {
65 | "level": "ignore"
66 | },
67 | "no_implicit_braces": {
68 | "level": "ignore",
69 | "strict": true
70 | },
71 | "no_implicit_parens": {
72 | "strict": true,
73 | "level": "ignore"
74 | },
75 | "no_interpolation_in_single_quotes": {
76 | "level": "ignore"
77 | },
78 | "no_plusplus": {
79 | "level": "ignore"
80 | },
81 | "no_stand_alone_at": {
82 | "level": "ignore"
83 | },
84 | "no_tabs": {
85 | "level": "error"
86 | },
87 | "no_throwing_strings": {
88 | "level": "error"
89 | },
90 | "no_trailing_semicolons": {
91 | "level": "error"
92 | },
93 | "no_trailing_whitespace": {
94 | "level": "error",
95 | "allowed_in_comments": false,
96 | "allowed_in_empty_lines": true
97 | },
98 | "no_unnecessary_double_quotes": {
99 | "level": "ignore"
100 | },
101 | "no_unnecessary_fat_arrows": {
102 | "level": "warn"
103 | },
104 | "non_empty_constructor_needs_parens": {
105 | "level": "ignore"
106 | },
107 | "prefer_english_operator": {
108 | "level": "ignore",
109 | "doubleNotLevel": "ignore"
110 | },
111 | "space_operators": {
112 | "level": "ignore"
113 | },
114 | "spacing_after_comma": {
115 | "level": "ignore"
116 | },
117 | "transform_messes_up_line_numbers": {
118 | "level": "warn"
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/example.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Daterange picker example
7 |
8 |
9 |
10 |
11 |
12 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
Daterange picker example
83 |
84 |
199 |
200 |
201 |
202 |
203 |
295 |
296 |
297 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | require('./js/angular-daterangepicker.js');
2 | module.exports = 'daterangepicker'
3 |
--------------------------------------------------------------------------------
/js/angular-daterangepicker.js:
--------------------------------------------------------------------------------
1 | (function() {
2 | var pickerModule;
3 |
4 | pickerModule = angular.module('daterangepicker', []);
5 |
6 | pickerModule.constant('dateRangePickerConfig', {
7 | cancelOnOutsideClick: true,
8 | locale: {
9 | separator: ' - ',
10 | format: 'YYYY-MM-DD',
11 | clearLabel: 'Clear'
12 | }
13 | });
14 |
15 | pickerModule.directive('dateRangePicker', ['$compile', '$timeout', '$parse', 'dateRangePickerConfig', function($compile, $timeout, $parse, dateRangePickerConfig) {
16 | return {
17 | require: 'ngModel',
18 | restrict: 'A',
19 | scope: {
20 | min: '=',
21 | max: '=',
22 | picker: '=?',
23 | model: '=ngModel',
24 | opts: '=options',
25 | clearable: '='
26 | },
27 | link: function($scope, element, attrs, modelCtrl) {
28 | var _clear, _init, _initBoundaryField, _mergeOpts, _picker, _setDatePoint, _setEndDate, _setStartDate, _validateRange, allowInvalid, customOpts, el, getViewValue, opts, setModelOptions;
29 | _mergeOpts = function() {
30 | var extend, localeExtend;
31 | localeExtend = angular.extend.apply(angular, Array.prototype.slice.call(arguments).map(function(opt) {
32 | return opt != null ? opt.locale : void 0;
33 | }).filter(function(opt) {
34 | return !!opt;
35 | }));
36 | extend = angular.extend.apply(angular, arguments);
37 | extend.locale = localeExtend;
38 | return extend;
39 | };
40 | el = $(element);
41 | el.attr('ng-trim', 'false');
42 | attrs.ngTrim = 'false';
43 | allowInvalid = false;
44 | (setModelOptions = function() {
45 | var options, updateOn;
46 | if (modelCtrl.$options && typeof modelCtrl.$options.getOption === 'function') {
47 | updateOn = modelCtrl.$options.getOption('updateOn');
48 | allowInvalid = !!modelCtrl.$options.getOption('allowInvalid');
49 | } else {
50 | updateOn = (modelCtrl.$options && modelCtrl.$options.updateOn) || "";
51 | allowInvalid = !!(modelCtrl.$options && modelCtrl.$options.allowInvalid);
52 | }
53 | if (updateOn.indexOf("change") === -1) {
54 | if (typeof modelCtrl.$overrideModelOptions === 'function') {
55 | updateOn += " change";
56 | return modelCtrl.$overrideModelOptions({
57 | '*': '$inherit',
58 | updateOn: updateOn
59 | });
60 | } else {
61 | updateOn += " change";
62 | updateOn.replace(/default/g, ' ');
63 | options = angular.copy(modelCtrl.$options) || {};
64 | options.updateOn = updateOn;
65 | options.updateOnDefault = false;
66 | return modelCtrl.$options = options;
67 | }
68 | }
69 | })();
70 | customOpts = $scope.opts;
71 | opts = _mergeOpts({}, angular.copy(dateRangePickerConfig), customOpts);
72 | _picker = null;
73 | _clear = function() {
74 | if (_picker) {
75 | _picker.setStartDate();
76 | return _picker.setEndDate();
77 | }
78 | };
79 | _setDatePoint = function(setter) {
80 | return function(newValue) {
81 | if (newValue && (!moment.isMoment(newValue) || newValue.isValid())) {
82 | newValue = moment(newValue);
83 | } else {
84 | return;
85 | }
86 | if (_picker) {
87 | return setter(newValue);
88 | }
89 | };
90 | };
91 | _setStartDate = _setDatePoint(function(date) {
92 | if (date && _picker.endDate < date) {
93 | _picker.setEndDate(date);
94 | }
95 | _picker.setStartDate(date);
96 | return opts.startDate = _picker.startDate;
97 | });
98 | _setEndDate = _setDatePoint(function(date) {
99 | if (date && _picker.startDate > date) {
100 | _picker.setEndDate(_picker.startDate);
101 | opts.endDate = _picker.endDate;
102 | _picker.setStartDate(date);
103 | return opts.startDate = _picker.startDate;
104 | } else {
105 | _picker.setEndDate(date);
106 | return opts.endDate = _picker.endDate;
107 | }
108 | });
109 | getViewValue = function(model) {
110 | var f, viewValue;
111 | f = function(date) {
112 | if (!moment.isMoment(date)) {
113 | return moment(date).format(opts.locale.format);
114 | } else {
115 | return date.format(opts.locale.format);
116 | }
117 | };
118 | if (opts.singleDatePicker && model) {
119 | viewValue = f(model);
120 | } else if (model && (model.startDate || model.endDate)) {
121 | viewValue = [f(model.startDate), f(model.endDate)].join(opts.locale.separator);
122 | } else {
123 | viewValue = '';
124 | }
125 | return viewValue;
126 | };
127 | modelCtrl.$formatters.push(function(modelValue) {
128 | return getViewValue(modelValue);
129 | });
130 | modelCtrl.$renderOriginal = modelCtrl.$render;
131 | modelCtrl.$render = function() {
132 | if (modelCtrl.$modelValue && opts.singleDatePicker) {
133 | _setStartDate(modelCtrl.$modelValue);
134 | _setEndDate(modelCtrl.$modelValue);
135 | } else if (modelCtrl.$modelValue && (modelCtrl.$modelValue.startDate || modelCtrl.$modelValue.endDate)) {
136 | _setStartDate(modelCtrl.$modelValue.startDate);
137 | _setEndDate(modelCtrl.$modelValue.endDate);
138 | } else {
139 | _clear();
140 | }
141 | if (modelCtrl.$valid) {
142 | return modelCtrl.$renderOriginal();
143 | }
144 | };
145 | modelCtrl.$parsers.push(function(viewValue) {
146 | var f, objValue, x;
147 | f = function(value) {
148 | var date;
149 | date = moment(value, opts.locale.format);
150 | return (date.isValid() && date) || null;
151 | };
152 | objValue = opts.singleDatePicker ? null : {
153 | startDate: null,
154 | endDate: null
155 | };
156 | if (angular.isString(viewValue) && viewValue.length > 0) {
157 | if (opts.singleDatePicker) {
158 | objValue = f(viewValue);
159 | } else {
160 | x = viewValue.split(opts.locale.separator).map(f);
161 | objValue.startDate = x[0] ? x[0].startOf('day') : null;
162 | objValue.endDate = x[1] ? x[1].endOf('day') : null;
163 | }
164 | }
165 | return objValue;
166 | });
167 | modelCtrl.$isEmpty = function(val) {
168 | return !(angular.isString(val) && val.length > 0);
169 | };
170 | _init = function() {
171 | var eventType;
172 | el.daterangepicker(angular.extend(opts, {
173 | autoUpdateInput: false
174 | }), function(startDate, endDate, label) {
175 | return $scope.$apply(function() {
176 | if (typeof opts.changeCallback === "function") {
177 | return opts.changeCallback.apply(this, arguments);
178 | }
179 | });
180 | });
181 | _picker = el.data('daterangepicker');
182 | $scope.picker = _picker;
183 | _picker.container.hide();
184 | _picker.container.addClass((opts.pickerClasses || "") + " " + (attrs['pickerClasses'] || ""));
185 | el.on('show.daterangepicker', function(ev, picker) {
186 | el.addClass('picker-open');
187 | return $scope.$apply(function() {
188 | if (opts.singleDatePicker) {
189 | if (!picker.startDate.isSame($scope.model)) {
190 | _setStartDate($scope.model);
191 | _setEndDate($scope.model);
192 | }
193 | } else {
194 | if ($scope.model && !picker.startDate.isSame($scope.model.startDate)) {
195 | _setStartDate($scope.model.startDate);
196 | }
197 | if ($scope.model && !picker.endDate.isSame($scope.model.endDate)) {
198 | _setEndDate($scope.model.endDate);
199 | }
200 | }
201 | picker.updateView();
202 | });
203 | });
204 | el.on('hide.daterangepicker', function(ev, picker) {
205 | return el.removeClass('picker-open');
206 | });
207 | el.on('apply.daterangepicker', function(ev, picker) {
208 | return $scope.$apply(function() {
209 | if (opts.singleDatePicker) {
210 | if (!picker.startDate) {
211 | $scope.model = null;
212 | } else if (!picker.startDate.isSame($scope.model)) {
213 | $scope.model = picker.startDate;
214 | }
215 | } else if (!picker.startDate.isSame(picker.oldStartDate) || !picker.endDate.isSame(picker.oldEndDate) || !$scope.model || !picker.startDate.isSame($scope.model.startDate) || !picker.endDate.isSame($scope.model.endDate)) {
216 | $scope.model = {
217 | startDate: picker.startDate,
218 | endDate: picker.endDate,
219 | label: picker.chosenLabel
220 | };
221 | }
222 | });
223 | });
224 | el.on('outsideClick.daterangepicker', function(ev, picker) {
225 | if (opts.cancelOnOutsideClick) {
226 | return $scope.$apply(function() {
227 | picker.cancelingClick = true;
228 | return picker.clickCancel();
229 | });
230 | } else {
231 | return picker.clickApply();
232 | }
233 | });
234 | for (eventType in opts.eventHandlers) {
235 | el.on(eventType, function(ev, picker) {
236 | var eventName;
237 | eventName = ev.type + '.' + ev.namespace;
238 | return $scope.$evalAsync(opts.eventHandlers[eventName]);
239 | });
240 | }
241 | modelCtrl.$validate();
242 | if (!$scope.model) {
243 | return el.trigger('change');
244 | }
245 | };
246 | $scope.$watch((function() {
247 | return getViewValue($scope.model);
248 | }), function(viewValue) {
249 | if (typeof modelCtrl.$processModelValue === "function") {
250 | modelCtrl.$processModelValue();
251 | return modelCtrl.$render();
252 | } else {
253 | if (typeof modelCtrl.$$updateEmptyClasses === "function") {
254 | modelCtrl.$$updateEmptyClasses(viewValue);
255 | }
256 | modelCtrl.$viewValue = modelCtrl.$$lastCommittedViewValue = viewValue;
257 | return modelCtrl.$render();
258 | }
259 | });
260 | modelCtrl.$validators['invalid'] = function(value, viewValue) {
261 | var applicable, check;
262 | applicable = attrs.required && !modelCtrl.$isEmpty(viewValue);
263 | if (opts.singleDatePicker) {
264 | check = value && value.isValid();
265 | } else {
266 | check = value && value.startDate && value.startDate.isValid() && value.endDate && value.endDate.isValid();
267 | }
268 | return !applicable || !!check;
269 | };
270 | _validateRange = function(date, min, max) {
271 | var ref;
272 | if (date && (min || max)) {
273 | ref = [date, min, max].map(function(d) {
274 | if (d) {
275 | return moment(d);
276 | } else {
277 | return d;
278 | }
279 | }), date = ref[0], min = ref[1], max = ref[2];
280 | return (!min || min.isBefore(date) || min.isSame(date, 'day')) && (!max || max.isSame(date, 'day') || max.isAfter(date));
281 | } else {
282 | return true;
283 | }
284 | };
285 | _initBoundaryField = function(field, validator, modelField, optName) {
286 | modelCtrl.$validators[field] = function(value) {
287 | if (!opts[optName]) {
288 | return true;
289 | }
290 | if (opts.singleDatePicker) {
291 | if (field === 'min') {
292 | return !value || validator(value, opts['minDate'], value);
293 | } else if (field === 'max') {
294 | return !value || validator(value, value, opts['maxDate']);
295 | }
296 | } else {
297 | return value && validator(value[modelField], opts['minDate'], opts['maxDate']);
298 | }
299 | };
300 | if (attrs[field]) {
301 | return $scope.$watch(field, function(date) {
302 | opts[optName] = date ? moment(date) : false;
303 | if (_picker) {
304 | _picker[optName] = opts[optName];
305 | return $timeout(function() {
306 | return modelCtrl.$validate();
307 | });
308 | }
309 | });
310 | }
311 | };
312 | _initBoundaryField('min', _validateRange, 'startDate', 'minDate');
313 | _initBoundaryField('max', _validateRange, 'endDate', 'maxDate');
314 | $scope.$watch('opts', function(newOpts) {
315 | if (newOpts == null) {
316 | newOpts = {};
317 | }
318 | opts = _mergeOpts(opts, newOpts);
319 | return _init();
320 | }, true);
321 | if (attrs.clearable) {
322 | $scope.$watch('clearable', function(newClearable) {
323 | if (newClearable) {
324 | opts = _mergeOpts(opts, {
325 | locale: {
326 | cancelLabel: opts.locale.clearLabel
327 | }
328 | });
329 | }
330 | _init();
331 | if (newClearable) {
332 | return el.on('cancel.daterangepicker', function(ev, picker) {
333 | if (!picker.cancelingClick) {
334 | $scope.model = opts.singleDatePicker ? null : {
335 | startDate: null,
336 | endDate: null
337 | };
338 | el.val("");
339 | }
340 | picker.cancelingClick = null;
341 | return $timeout(function() {
342 | return $scope.$apply();
343 | });
344 | });
345 | }
346 | });
347 | }
348 | return $scope.$on('$destroy', function() {
349 | return _picker != null ? _picker.remove() : void 0;
350 | });
351 | }
352 | };
353 | }]);
354 |
355 | }).call(this);
356 |
--------------------------------------------------------------------------------
/js/angular-daterangepicker.min.js:
--------------------------------------------------------------------------------
1 | (function(){var a;a=angular.module("daterangepicker",[]),a.constant("dateRangePickerConfig",{cancelOnOutsideClick:!0,locale:{separator:" - ",format:"YYYY-MM-DD",clearLabel:"Clear"}}),a.directive("dateRangePicker",["$compile","$timeout","$parse","dateRangePickerConfig",function(a,b,c,d){return{require:"ngModel",restrict:"A",scope:{min:"=",max:"=",picker:"=?",model:"=ngModel",opts:"=options",clearable:"="},link:function(a,c,e,f){var g,h,i,j,k,l,m,n,o,p,q,r,s,t;return j=function(){var a,b;return b=angular.extend.apply(angular,Array.prototype.slice.call(arguments).map(function(a){return null!=a?a.locale:void 0}).filter(function(a){return!!a})),a=angular.extend.apply(angular,arguments),a.locale=b,a},r=$(c),r.attr("ng-trim","false"),e.ngTrim="false",p=!1,function(){var a,b;if(f.$options&&"function"==typeof f.$options.getOption?(b=f.$options.getOption("updateOn"),p=!!f.$options.getOption("allowInvalid")):(b=f.$options&&f.$options.updateOn||"",p=!(!f.$options||!f.$options.allowInvalid)),!b.includes("change"))return"function"==typeof f.$overrideModelOptions?(b+=" change",f.$overrideModelOptions({"*":"$inherit",updateOn:b})):(b+=" change",b.replace(/default/g," "),a=angular.copy(f.$options)||{},a.updateOn=b,a.updateOnDefault=!1,f.$options=a)}(),q=a.opts,t=j({},angular.copy(d),q),k=null,g=function(){if(k)return k.setStartDate(),k.setEndDate()},l=function(a){return function(b){if(b&&(!moment.isMoment(b)||b.isValid()))return b=moment(b),k?a(b):void 0}},n=l(function(a){return a&&k.endDatea?(k.setEndDate(k.startDate),t.endDate=k.endDate,k.setStartDate(a),t.startDate=k.startDate):(k.setEndDate(a),t.endDate=k.endDate)}),s=function(a){var b;return b=function(a){return moment.isMoment(a)?a.format(t.locale.format):moment(a).format(t.locale.format)},t.singleDatePicker&&a?b(a):a&&(a.startDate||a.endDate)?[b(a.startDate),b(a.endDate)].join(t.locale.separator):""},f.$formatters.push(function(a){return s(a)}),f.$renderOriginal=f.$render,f.$render=function(){if(f.$modelValue&&t.singleDatePicker?(n(f.$modelValue),m(f.$modelValue)):f.$modelValue&&(f.$modelValue.startDate||f.$modelValue.endDate)?(n(f.$modelValue.startDate),m(f.$modelValue.endDate)):g(),f.$valid)return f.$renderOriginal()},f.$parsers.push(function(a){var b,c,d;return b=function(a){var b;return b=moment(a,t.locale.format),b.isValid()&&b||null},c=t.singleDatePicker?null:{startDate:null,endDate:null},angular.isString(a)&&a.length>0&&(t.singleDatePicker?c=b(a):(d=a.split(t.locale.separator).map(b),c.startDate=d[0]?d[0].startOf("day"):null,c.endDate=d[1]?d[1].endOf("day"):null)),c}),f.$isEmpty=function(a){return!(angular.isString(a)&&a.length>0)},h=function(){var b;r.daterangepicker(angular.extend(t,{autoUpdateInput:!1}),function(b,c,d){return a.$apply(function(){if("function"==typeof t.changeCallback)return t.changeCallback.apply(this,arguments)})}),k=r.data("daterangepicker"),a.picker=k,k.container.hide(),k.container.addClass((t.pickerClasses||"")+" "+(e.pickerClasses||"")),r.on("show.daterangepicker",function(b,c){return r.addClass("picker-open"),a.$apply(function(){t.singleDatePicker?c.startDate.isSame(a.model)||(n(a.model),m(a.model)):(a.model&&!c.startDate.isSame(a.model.startDate)&&n(a.model.startDate),a.model&&!c.endDate.isSame(a.model.endDate)&&m(a.model.endDate)),c.updateView()})}),r.on("hide.daterangepicker",function(a,b){return r.removeClass("picker-open")}),r.on("apply.daterangepicker",function(b,c){return a.$apply(function(){t.singleDatePicker?c.startDate?c.startDate.isSame(a.model)||(a.model=c.startDate):a.model=null:c.startDate.isSame(c.oldStartDate)&&c.endDate.isSame(c.oldEndDate)&&a.model&&c.startDate.isSame(a.model.startDate)&&c.endDate.isSame(a.model.endDate)||(a.model={startDate:c.startDate,endDate:c.endDate,label:c.chosenLabel})})}),r.on("outsideClick.daterangepicker",function(b,c){return t.cancelOnOutsideClick?a.$apply(function(){return c.cancelingClick=!0,c.clickCancel()}):c.clickApply()});for(b in t.eventHandlers)r.on(b,function(b,c){var d;return d=b.type+"."+b.namespace,a.$evalAsync(t.eventHandlers[d])});if(f.$validate(),!a.model)return r.trigger("change")},a.$watch(function(){return s(a.model)},function(a){return"function"==typeof f.$processModelValue?(f.$processModelValue(),f.$render()):("function"==typeof f.$$updateEmptyClasses&&f.$$updateEmptyClasses(a),f.$viewValue=f.$$lastCommittedViewValue=a,f.$render())}),f.$validators.invalid=function(a,b){var c,d;return c=e.required&&!f.$isEmpty(b),d=t.singleDatePicker?a&&a.isValid():a&&a.startDate&&a.startDate.isValid()&&a.endDate&&a.endDate.isValid(),!c||!!d},o=function(a,b,c){var d;return!a||!b&&!c||(d=[a,b,c].map(function(a){return a?moment(a):a}),a=d[0],b=d[1],c=d[2],(!b||b.isBefore(a)||b.isSame(a,"day"))&&(!c||c.isSame(a,"day")||c.isAfter(a)))},i=function(c,d,g,h){if(f.$validators[c]=function(a){return!t[h]||(t.singleDatePicker?"min"===c?!a||d(a,t.minDate,a):"max"===c?!a||d(a,a,t.maxDate):void 0:a&&d(a[g],t.minDate,t.maxDate))},e[c])return a.$watch(c,function(a){if(t[h]=!!a&&moment(a),k)return k[h]=t[h],b(function(){return f.$validate()})})},i("min",o,"startDate","minDate"),i("max",o,"endDate","maxDate"),a.$watch("opts",function(a){return null==a&&(a={}),t=j(t,a),h()},!0),e.clearable&&a.$watch("clearable",function(c){if(c&&(t=j(t,{locale:{cancelLabel:t.locale.clearLabel}})),h(),c)return r.on("cancel.daterangepicker",function(c,d){return d.cancelingClick||(a.model=t.singleDatePicker?null:{startDate:null,endDate:null},r.val("")),d.cancelingClick=null,b(function(){return a.$apply()})})}),a.$on("$destroy",function(){return null!=k?k.remove():void 0})}}}])}).call(this);
2 | //# sourceMappingURL=angular-daterangepicker.min.js.map
--------------------------------------------------------------------------------
/js/angular-daterangepicker.min.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"sources":["angular-daterangepicker.js"],"names":["pickerModule","angular","module","constant","cancelOnOutsideClick","locale","separator","format","clearLabel","directive","$compile","$timeout","$parse","dateRangePickerConfig","require","restrict","scope","min","max","picker","model","opts","clearable","link","$scope","element","attrs","modelCtrl","_clear","_init","_initBoundaryField","_mergeOpts","_picker","_setDatePoint","_setEndDate","_setStartDate","_validateRange","allowInvalid","customOpts","el","getViewValue","extend","localeExtend","apply","Array","prototype","slice","call","arguments","map","opt","filter","$","attr","ngTrim","options","updateOn","$options","getOption","includes","$overrideModelOptions","*","replace","copy","updateOnDefault","setStartDate","setEndDate","setter","newValue","moment","isMoment","isValid","date","endDate","startDate","f","singleDatePicker","join","$formatters","push","modelValue","$renderOriginal","$render","$modelValue","$valid","$parsers","viewValue","objValue","x","value","isString","length","split","startOf","endOf","$isEmpty","val","eventType","daterangepicker","autoUpdateInput","label","$apply","changeCallback","this","data","container","hide","addClass","pickerClasses","on","ev","isSame","updateView","removeClass","oldStartDate","oldEndDate","chosenLabel","cancelingClick","clickCancel","clickApply","eventHandlers","eventName","type","namespace","$evalAsync","$validate","trigger","$watch","$processModelValue","$$updateEmptyClasses","$viewValue","$$lastCommittedViewValue","$validators","applicable","check","required","ref","d","isBefore","isAfter","field","validator","modelField","optName","newOpts","newClearable","cancelLabel","$on","remove"],"mappings":"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","file":"angular-daterangepicker.min.js"}
--------------------------------------------------------------------------------
/js/angular-daterangepicker.min.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"angular-daterangepicker.min.js","sources":["angular-daterangepicker.js"],"names":["picker","angular","module","constant","separator","format","clearLabel","directive","$compile","$timeout","$parse","dateRangePickerConfig","require","restrict","scope","dateMin","dateMax","model","opts","clearable","link","$scope","element","attrs","modelCtrl","clear","customOpts","el","_formatted","_init","_picker","_setEndDate","_setStartDate","_validateMax","_validateMin","$","extend","setStartDate","setEndDate","val","newValue","m","moment","endDate","startDate","$watch","viewVal","f","date","isMoment","singleDatePicker","join","min","start","valid","isBefore","isSame","$setValidity","max","end","isAfter","$formatters","push","$parsers","isObject","hasOwnProperty","$modelValue","$isEmpty","$render","callbackFunction","eventType","locale","_ref","daterangepicker","$setViewValue","data","eventHandlers","on","cancelLabel","trigger","change","trim","options","newOpts","$on","remove","call","this"],"mappings":"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"}
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-daterangepicker",
3 | "version": "0.3.0",
4 | "homepage": "https://github.com/fragaria/angular-daterangepicker",
5 | "authors": [
6 | "Filip Vařecha ",
7 | "Tibor Kulčár ",
8 | "Lukáš Marek ",
9 | "Adam Segal "
10 | ],
11 | "description": "Angular.js wrapper for Dan Grosmann's bootstrap date range picker (https://github.com/dangrossman/bootstrap-daterangepicker).",
12 | "license": "MIT",
13 | "private": false,
14 | "dependencies": {
15 | "angular": "^1.2.17",
16 | "bootstrap-daterangepicker": "^3.0.3"
17 | },
18 | "main": "index.js",
19 | "devDependencies": {
20 | "coffeelint": "^1.12.1",
21 | "grunt": "~0.4.1",
22 | "grunt-coffeelint": "^0.0.13",
23 | "grunt-contrib-coffee": "^0.13.0",
24 | "grunt-contrib-uglify": "^0.9.2",
25 | "grunt-contrib-watch": "^0.6.1",
26 | "grunt-ng-annotate": "^1.0.1",
27 | "grunt-wiredep": "^2.0.0",
28 | "load-grunt-tasks": "^3.3.0"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------