├── .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 | ![Dependencies](https://david-dm.org/fragaria/angular-daterangepicker.png) 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 | ![Date Range Picker screenshot](http://i.imgur.com/zDjBqiS.png) 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 | [![Throughput Graph](https://graphs.waffle.io/fragaria/angular-daterangepicker/throughput.svg)](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 |
85 |
86 |
87 | 88 |
89 | 93 |
94 |

Invalid date.

95 |

Range is required.

96 |
97 |
{{date}}
98 | {{dateForm.dateSimple.$error}} 99 |
100 |
101 |
102 | 103 |
104 | 110 |
111 |

Start date must be at least {{page.pickerMinMax.minDate}}.

112 |

End date must be at most {{page.pickerMinMax.maxDate}}.

113 |

Invalid date.

114 |

Range is required.

115 |
116 |
{{dateMinMax}}
117 |
118 |
119 |
120 | 121 |
122 | 127 |
128 |

Start date must be at least {{optsValidation.options.minDate}}.

129 |

End date must be at most {{optsValidation.options.maxDate}}.

130 |

Range is required.

131 |
132 |
{{optsValidation.date}}
133 |
{{dateForm.daterangeValidate.$error}}
134 |
135 |
136 |
137 | 138 |
139 | 142 |
{{date2}}
143 |
144 |
145 |
146 | 147 |
148 | 151 |
{{date2}}
152 |
153 |
154 |
155 | 156 |
157 | 160 |
161 |

Start date must be at least {{optsUnlinked.minDate}}.

162 |

End date must be at most {{optsUnlinked.maxDate}}.

163 |

Range is required.

164 |
165 |
{{date2}}
166 |
167 |
168 |
169 | 170 | 171 |
172 |
173 | 174 |
175 | 179 |
180 |

To low. Date must be between {{optsSingle.minDate}} && {{optsSingle.maxDate}}.

181 |

To high. Date must be between {{optsSingle.minDate}} && {{optsSingle.maxDate}}.

182 |

Range is required.

183 |

Date is invalid.

184 |
185 |
{{dateSingle}}
186 |
187 |
188 |
189 | 190 |
191 | 194 |
{{dateFormatted}}
195 |
196 |
197 |
198 |
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":"CAAA,WACE,GAAIA,EAEJA,GAAeC,QAAQC,OAAO,sBAE9BF,EAAaG,SAAS,yBACpBC,sBAAsB,EACtBC,QACEC,UAAW,MACXC,OAAQ,aACRC,WAAY,WAIhBR,EAAaS,UAAU,mBAAoB,WAAY,WAAY,SAAU,wBAAyB,SAASC,EAAUC,EAAUC,EAAQC,GACzI,OACEC,QAAS,UACTC,SAAU,IACVC,OACEC,IAAK,IACLC,IAAK,IACLC,OAAQ,KACRC,MAAO,WACPC,KAAM,WACNC,UAAW,KAEbC,KAAM,SAASC,EAAQC,EAASC,EAAOC,GACrC,GAAIC,GAAQC,EAAOC,EAAoBC,EAAYC,EAASC,EAAeC,EAAaC,EAAeC,EAAgBC,EAAcC,EAAYC,EAAIC,EAAcnB,CAgUnK,OA/TAU,GAAa,WACX,GAAIU,GAAQC,CAQZ,OAPAA,GAAezC,QAAQwC,OAAOE,MAAM1C,QAAS2C,MAAMC,UAAUC,MAAMC,KAAKC,WAAWC,IAAI,SAASC,GAC9F,MAAc,OAAPA,EAAcA,EAAI7C,WAAS,KACjC8C,OAAO,SAASD,GACjB,QAASA,KAEXT,EAASxC,QAAQwC,OAAOE,MAAM1C,QAAS+C,WACvCP,EAAOpC,OAASqC,EACTD,GAETF,EAAKa,EAAE3B,GACPc,EAAGc,KAAK,UAAW,SACnB3B,EAAM4B,OAAS,QACfjB,GAAe,EACI,WACjB,GAAIkB,GAASC,CAQb,IAPI7B,EAAU8B,UAAoD,kBAAjC9B,GAAU8B,SAASC,WAClDF,EAAW7B,EAAU8B,SAASC,UAAU,YACxCrB,IAAiBV,EAAU8B,SAASC,UAAU,kBAE9CF,EAAY7B,EAAU8B,UAAY9B,EAAU8B,SAASD,UAAa,GAClEnB,KAAkBV,EAAU8B,WAAY9B,EAAU8B,SAASpB,gBAExDmB,EAASG,SAAS,UACrB,MAA+C,kBAApChC,GAAUiC,uBACnBJ,GAAY,UACL7B,EAAUiC,uBACfC,IAAK,WACLL,SAAUA,MAGZA,GAAY,UACZA,EAASM,QAAQ,WAAY,KAC7BP,EAAUtD,QAAQ8D,KAAKpC,EAAU8B,cACjCF,EAAQC,SAAWA,EACnBD,EAAQS,iBAAkB,EACnBrC,EAAU8B,SAAWF,MAIlCjB,EAAad,EAAOH,KACpBA,EAAOU,KAAe9B,QAAQ8D,KAAKlD,GAAwByB,GAC3DN,EAAU,KACVJ,EAAS,WACP,GAAII,EAEF,MADAA,GAAQiC,eACDjC,EAAQkC,cAGnBjC,EAAgB,SAASkC,GACvB,MAAO,UAASC,GACd,GAAIA,KAAcC,OAAOC,SAASF,IAAaA,EAASG,WAKxD,MAJEH,GAAWC,OAAOD,GAIhBpC,EACKmC,EAAOC,OADhB,KAKJjC,EAAgBF,EAAc,SAASuC,GAKrC,MAJIA,IAAQxC,EAAQyC,QAAUD,GAC5BxC,EAAQkC,WAAWM,GAErBxC,EAAQiC,aAAaO,GACdnD,EAAKqD,UAAY1C,EAAQ0C,YAElCxC,EAAcD,EAAc,SAASuC,GACnC,MAAIA,IAAQxC,EAAQ0C,UAAYF,GAC9BxC,EAAQkC,WAAWlC,EAAQ0C,WAC3BrD,EAAKoD,QAAUzC,EAAQyC,QACvBzC,EAAQiC,aAAaO,GACdnD,EAAKqD,UAAY1C,EAAQ0C,YAEhC1C,EAAQkC,WAAWM,GACZnD,EAAKoD,QAAUzC,EAAQyC,WAGlCjC,EAAe,SAASpB,GACtB,GAAIuD,EAeJ,OAdAA,GAAI,SAASH,GACX,MAAKH,QAAOC,SAASE,GAGZA,EAAKjE,OAAOc,EAAKhB,OAAOE,QAFxB8D,OAAOG,GAAMjE,OAAOc,EAAKhB,OAAOE,SAKvCc,EAAKuD,kBAAoBxD,EACfuD,EAAEvD,GACLA,IAAUA,EAAMsD,WAAatD,EAAMqD,UAC/BE,EAAEvD,EAAMsD,WAAYC,EAAEvD,EAAMqD,UAAUI,KAAKxD,EAAKhB,OAAOC,WAExD,IAIhBqB,EAAUmD,YAAYC,KAAK,SAASC,GAClC,MAAOxC,GAAawC,KAEtBrD,EAAUsD,gBAAkBtD,EAAUuD,QACtCvD,EAAUuD,QAAU,WAUlB,GATIvD,EAAUwD,aAAe9D,EAAKuD,kBAChCzC,EAAcR,EAAUwD,aACxBjD,EAAYP,EAAUwD,cACbxD,EAAUwD,cAAgBxD,EAAUwD,YAAYT,WAAa/C,EAAUwD,YAAYV,UAC5FtC,EAAcR,EAAUwD,YAAYT,WACpCxC,EAAYP,EAAUwD,YAAYV,UAElC7C,IAEED,EAAUyD,OACZ,MAAOzD,GAAUsD,mBAGrBtD,EAAU0D,SAASN,KAAK,SAASO,GAC/B,GAAIX,GAAGY,EAAUC,CAmBjB,OAlBAb,GAAI,SAASc,GACX,GAAIjB,EAEJ,OADAA,GAAOH,OAAOoB,EAAOpE,EAAKhB,OAAOE,QACzBiE,EAAKD,WAAaC,GAAS,MAErCe,EAAWlE,EAAKuD,iBAAmB,MACjCF,UAAW,KACXD,QAAS,MAEPxE,QAAQyF,SAASJ,IAAcA,EAAUK,OAAS,IAChDtE,EAAKuD,iBACPW,EAAWZ,EAAEW,IAEbE,EAAIF,EAAUM,MAAMvE,EAAKhB,OAAOC,WAAW2C,IAAI0B,GAC/CY,EAASb,UAAYc,EAAE,GAAKA,EAAE,GAAGK,QAAQ,OAAS,KAClDN,EAASd,QAAUe,EAAE,GAAKA,EAAE,GAAGM,MAAM,OAAS,OAG3CP,IAET5D,EAAUoE,SAAW,SAASC,GAC5B,QAAS/F,QAAQyF,SAASM,IAAQA,EAAIL,OAAS,IAEjD9D,EAAQ,WACN,GAAIoE,EACJ1D,GAAG2D,gBAAgBjG,QAAQwC,OAAOpB,GAChC8E,iBAAiB,IACf,SAASzB,EAAWD,EAAS2B,GAC/B,MAAO5E,GAAO6E,OAAO,WACnB,GAAmC,kBAAxBhF,GAAKiF,eACd,MAAOjF,GAAKiF,eAAe3D,MAAM4D,KAAMvD,eAI7ChB,EAAUO,EAAGiE,KAAK,mBAClBhF,EAAOL,OAASa,EAChBA,EAAQyE,UAAUC,OAClB1E,EAAQyE,UAAUE,UAAUtF,EAAKuF,eAAiB,IAAM,KAAOlF,EAAqB,eAAK,KACzFa,EAAGsE,GAAG,uBAAwB,SAASC,EAAI3F,GAEzC,MADAoB,GAAGoE,SAAS,eACLnF,EAAO6E,OAAO,WACfhF,EAAKuD,iBACFzD,EAAOuD,UAAUqC,OAAOvF,EAAOJ,SAClCe,EAAcX,EAAOJ,OACrBc,EAAYV,EAAOJ,SAGjBI,EAAOJ,QAAUD,EAAOuD,UAAUqC,OAAOvF,EAAOJ,MAAMsD,YACxDvC,EAAcX,EAAOJ,MAAMsD,WAEzBlD,EAAOJ,QAAUD,EAAOsD,QAAQsC,OAAOvF,EAAOJ,MAAMqD,UACtDvC,EAAYV,EAAOJ,MAAMqD,UAG7BtD,EAAO6F,iBAGXzE,EAAGsE,GAAG,uBAAwB,SAASC,EAAI3F,GACzC,MAAOoB,GAAG0E,YAAY,iBAExB1E,EAAGsE,GAAG,wBAAyB,SAASC,EAAI3F,GAC1C,MAAOK,GAAO6E,OAAO,WACfhF,EAAKuD,iBACFzD,EAAOuD,UAEAvD,EAAOuD,UAAUqC,OAAOvF,EAAOJ,SACzCI,EAAOJ,MAAQD,EAAOuD,WAFtBlD,EAAOJ,MAAQ,KAIPD,EAAOuD,UAAUqC,OAAO5F,EAAO+F,eAAkB/F,EAAOsD,QAAQsC,OAAO5F,EAAOgG,aAAgB3F,EAAOJ,OAAUD,EAAOuD,UAAUqC,OAAOvF,EAAOJ,MAAMsD,YAAevD,EAAOsD,QAAQsC,OAAOvF,EAAOJ,MAAMqD,WAChNjD,EAAOJ,OACLsD,UAAWvD,EAAOuD,UAClBD,QAAStD,EAAOsD,QAChB2B,MAAOjF,EAAOiG,kBAKtB7E,EAAGsE,GAAG,+BAAgC,SAASC,EAAI3F,GACjD,MAAIE,GAAKjB,qBACAoB,EAAO6E,OAAO,WAEnB,MADAlF,GAAOkG,gBAAiB,EACjBlG,EAAOmG,gBAGTnG,EAAOoG,cAGlB,KAAKtB,IAAa5E,GAAKmG,cACrBjF,EAAGsE,GAAGZ,EAAW,SAASa,EAAI3F,GAC5B,GAAIsG,EAEJ,OADAA,GAAYX,EAAGY,KAAO,IAAMZ,EAAGa,UACxBnG,EAAOoG,WAAWvG,EAAKmG,cAAcC,KAIhD,IADA9F,EAAUkG,aACLrG,EAAOJ,MACV,MAAOmB,GAAGuF,QAAQ,WAGtBtG,EAAOuG,OAAO,WACZ,MAAOvF,GAAahB,EAAOJ,QACzB,SAASkE,GACX,MAA4C,kBAAjC3D,GAAUqG,oBACnBrG,EAAUqG,qBACHrG,EAAUuD,YAE6B,kBAAnCvD,GAAUsG,sBACnBtG,EAAUsG,qBAAqB3C,GAEjC3D,EAAUuG,WAAavG,EAAUwG,yBAA2B7C,EACrD3D,EAAUuD,aAGrBvD,EAAUyG,YAAqB,QAAI,SAAS3C,EAAOH,GACjD,GAAI+C,GAAYC,CAOhB,OANAD,GAAa3G,EAAM6G,WAAa5G,EAAUoE,SAAST,GAEjDgD,EADEjH,EAAKuD,iBACCa,GAASA,EAAMlB,UAEfkB,GAASA,EAAMf,WAAae,EAAMf,UAAUH,WAAakB,EAAMhB,SAAWgB,EAAMhB,QAAQF,WAE1F8D,KAAgBC,GAE1BlG,EAAiB,SAASoC,EAAMvD,EAAKC,GACnC,GAAIsH,EACJ,QAAIhE,IAASvD,IAAOC,IAClBsH,GAAOhE,EAAMvD,EAAKC,GAAK+B,IAAI,SAASwF,GAClC,MAAIA,GACKpE,OAAOoE,GAEPA,IAEPjE,EAAOgE,EAAI,GAAIvH,EAAMuH,EAAI,GAAItH,EAAMsH,EAAI,KAClCvH,GAAOA,EAAIyH,SAASlE,IAASvD,EAAI8F,OAAOvC,EAAM,WAAatD,GAAOA,EAAI6F,OAAOvC,EAAM,QAAUtD,EAAIyH,QAAQnE,MAKtH1C,EAAqB,SAAS8G,EAAOC,EAAWC,EAAYC,GAe1D,GAdApH,EAAUyG,YAAYQ,GAAS,SAASnD,GACtC,OAAKpE,EAAK0H,KAGN1H,EAAKuD,iBACO,QAAVgE,GACMnD,GAASoD,EAAUpD,EAAOpE,EAAc,QAAGoE,GAChC,QAAVmD,GACDnD,GAASoD,EAAUpD,EAAOA,EAAOpE,EAAc,aADlD,GAIAoE,GAASoD,EAAUpD,EAAMqD,GAAazH,EAAc,QAAGA,EAAc,WAG5EK,EAAMkH,GACR,MAAOpH,GAAOuG,OAAOa,EAAO,SAASpE,GAEnC,GADAnD,EAAK0H,KAAWvE,GAAOH,OAAOG,GAC1BxC,EAEF,MADAA,GAAQ+G,GAAW1H,EAAK0H,GACjBpI,EAAS,WACd,MAAOgB,GAAUkG,iBAM3B/F,EAAmB,MAAOM,EAAgB,YAAa,WACvDN,EAAmB,MAAOM,EAAgB,UAAW,WACrDZ,EAAOuG,OAAO,OAAQ,SAASiB,GAK7B,MAJe,OAAXA,IACFA,MAEF3H,EAAOU,EAAWV,EAAM2H,GACjBnH,MACN,GACCH,EAAMJ,WACRE,EAAOuG,OAAO,YAAa,SAASkB,GASlC,GARIA,IACF5H,EAAOU,EAAWV,GAChBhB,QACE6I,YAAa7H,EAAKhB,OAAOG,eAI/BqB,IACIoH,EACF,MAAO1G,GAAGsE,GAAG,yBAA0B,SAASC,EAAI3F,GASlD,MARKA,GAAOkG,iBACV7F,EAAOJ,MAAQC,EAAKuD,iBAAmB,MACrCF,UAAW,KACXD,QAAS,MAEXlC,EAAGyD,IAAI,KAET7E,EAAOkG,eAAiB,KACjB1G,EAAS,WACd,MAAOa,GAAO6E,eAMjB7E,EAAO2H,IAAI,WAAY,WAC5B,MAAkB,OAAXnH,EAAkBA,EAAQoH,aAAW,YAMnDrG,KAAKwD","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 | --------------------------------------------------------------------------------