diff --git a/dist/mdPickers.js b/dist/mdPickers.js index 99d9f4da..f73476c1 100644 --- a/dist/mdPickers.js +++ b/dist/mdPickers.js @@ -37,8 +37,8 @@ function DatePickerCtrl($scope, $mdDialog, $mdMedia, $timeout, currentDate, opti var self = this; this.date = moment(currentDate); - this.minDate = moment(options.minDate).isValid() ? moment(options.minDate) : null; - this.maxDate = moment(options.maxDate).isValid() ? moment(options.maxDate) : null; + this.minDate = options.minDate && moment(options.minDate).isValid() ? moment(options.minDate) : null; + this.maxDate = options.maxDate && moment(options.maxDate).isValid() ? moment(options.maxDate) : null; this.dateFilter = angular.isFunction(options.dateFilter) ? options.dateFilter : null; this.selectingYear = false; diff --git a/dist/mdPickers.min.js b/dist/mdPickers.min.js index df1aaba6..d9f6492d 100644 --- a/dist/mdPickers.min.js +++ b/dist/mdPickers.min.js @@ -1,2 +1,2 @@ -!function(){"use strict";function t(t,e,a,i,n,r){var c=this;this.date=moment(n),this.minDate=moment(r.minDate).isValid()?moment(r.minDate):null,this.maxDate=moment(r.maxDate).isValid()?moment(r.maxDate):null,this.dateFilter=angular.isFunction(r.dateFilter)?r.dateFilter:null,this.selectingYear=!1,this.minDate&&this.maxDate&&this.maxDate.isBefore(this.minDate)&&(this.maxDate=moment(this.minDate).add(1,"days")),this.date&&(this.minDate&&this.date.isBefore(this.minDate)&&(this.date=moment(this.minDate)),this.maxDate&&this.date.isAfter(this.maxDate)&&(this.date=moment(this.maxDate))),this.yearItems={currentIndex_:0,PAGE_SIZE:5,START:c.minDate?c.minDate.year():1900,END:c.maxDate?c.maxDate.year():0,getItemAtIndex:function(t){return this.currentIndex_=n;n++){var r=null;n>a&&(r={value:n-a,enabled:e.isDayEnabled(moment(e.date).date(n-a).toDate())}),i.push(r)}return i},this.isDayEnabled=function(t){return!(this.minDate&&!(this.minDate<=t)||this.maxDate&&!(this.maxDate>=t)||e.dateFilter&&e.dateFilter(t))},this.selectDate=function(t){e.date.date(t)},this.nextMonth=function(){e.date.add(1,"months")},this.prevMonth=function(){e.date.subtract(1,"months")},this.updateDaysInMonth=function(){e.daysInMonth=e.getDaysInMonth()},t.$watch(function(){return e.date.unix()},function(t,a){t&&t!==a&&e.updateDaysInMonth()}),e.updateDaysInMonth()}function a(t,e,a,i){var n=this;this.VIEW_HOURS=1,this.VIEW_MINUTES=2,this.currentDate=a,this.currentView=this.VIEW_HOURS,this.time=moment(n.currentDate),this.clockHours=parseInt(this.time.format("h")),this.clockMinutes=parseInt(this.time.minutes()),t.$mdMedia=i,this.switchView=function(){n.currentView=n.currentView==n.VIEW_HOURS?n.VIEW_MINUTES:n.VIEW_HOURS},this.setAM=function(){"PM"==n.time.format("A")&&n.time.hour(n.time.hour()-12)},this.setPM=function(){"AM"==n.time.format("A")&&n.time.hour(n.time.hour()+12)},this.cancel=function(){e.cancel()},this.confirm=function(){e.hide(this.time.toDate())}}function i(t){var e="hours",a="minutes",i=this;this.STEP_DEG=30,this.steps=[],this.CLOCK_TYPES={hours:{range:12},minutes:{range:60}},this.getPointerStyle=function(){var t=1;switch(i.type){case e:t=12;break;case a:t=60}var n=Math.round(i.selected*(360/t))-180;return{"-webkit-transform":"rotate("+n+"deg)","-ms-transform":"rotate("+n+"deg)",transform:"rotate("+n+"deg)"}},this.setTimeByDeg=function(t){t=t>=360?0:t;var n=0;switch(i.type){case e:n=12;break;case a:n=60}i.setTime(Math.round(n/360*t))},this.setTime=function(t,n){switch(this.selected=t,i.type){case e:"PM"==i.time.format("A")&&(t+=12),this.time.hours(t);break;case a:t>59&&(t-=60),this.time.minutes(t)}},this.init=function(){switch(i.type=i.type||"hours",i.type){case e:for(var t=1;12>=t;t++)i.steps.push(t);i.selected=i.time.hours()||0,i.selected>12&&(i.selected-=12);break;case a:for(var t=5;55>=t;t+=5)i.steps.push(t);i.steps.push(0),i.selected=i.time.minutes()||0}},this.init()}var n=angular.module("mdPickers",["ngMaterial","ngAnimate","ngAria"]);n.config(["$mdIconProvider","mdpIconsRegistry",function(t,e){angular.forEach(e,function(e,a){t.icon(e.id,e.url)})}]),n.run(["$templateCache","mdpIconsRegistry",function(t,e){angular.forEach(e,function(e,a){t.put(e.url,e.svg)})}]),n.constant("mdpIconsRegistry",[{id:"mdp-chevron-left",url:"mdp-chevron-left.svg",svg:''},{id:"mdp-chevron-right",url:"mdp-chevron-right.svg",svg:''}]),n.provider("$mdpDatePicker",function(){var e="OK",a="Cancel";this.setOKButtonLabel=function(t){e=t},this.setCancelButtonLabel=function(t){a=t},this.$get=["$mdDialog",function(i){var n=function(n,r){return angular.isDate(n)||(n=Date.now()),angular.isObject(r)||(r={}),i.show({controller:["$scope","$mdDialog","$mdMedia","$timeout","currentDate","options",t],controllerAs:"datepicker",clickOutsideToClose:!0,template:'
{{ datepicker.date.format(\'YYYY\') }}{{ datepicker.date.format("ddd, MMM DD") }}
{{ item }}
'+a+''+e+"
",targetEvent:r.targetEvent,locals:{currentDate:n,options:r}})};return n}]}),n.directive("mdpCalendar",["$animate",function(t){return{restrict:"E",bindToController:{date:"=",minDate:"=",maxDate:"=",dateFilter:"="},template:'
{{ calendar.date.format("MMMM YYYY") }}
{{ d }}
{{ day.value }}
',controller:["$scope",e],controllerAs:"calendar",link:function(e,a,i,n){var r=[a[0].querySelector(".mdp-calendar-week-days"),a[0].querySelector(".mdp-calendar-days"),a[0].querySelector(".mdp-calendar-monthyear")].map(function(t){return angular.element(t)});e.$watch(function(){return n.date.format("YYYYMM")},function(e,a){var i=null;if(e>a?i="mdp-animate-next":a>e&&(i="mdp-animate-prev"),i)for(var n in r)r[n].addClass(i),t.removeClass(r[n],i)})}}}]),n.directive("mdpDatePicker",["$mdpDatePicker","$timeout",function(t,e){return{restrict:"A",require:"?ngModel",scope:{minDate:"@min",maxDate:"@max",dateFilter:"=mdpDateFilter",dateFormat:"@mdpFormat"},link:function(a,i,n,r){var c=a.dateFormat||moment.defaultFormat;"undefined"!=typeof n.type&&r&&angular.element(i).on("click",function(i){i.preventDefault(),t(r.$modelValue,{minDate:a.minDate,maxDate:a.maxDate,dateFilter:a.dateFilter,targetEvent:i}).then(function(t){e(function(){switch(n.type){case"date":r.$setViewValue(moment(t).format("YYYY-MM-DD"));break;default:r.$setViewValue(moment(t).format(c))}r.$render()})})})}}}]),n.directive("mdpClock",["$animate","$timeout",function(t,e){return{restrict:"E",bindToController:{type:"@?",time:"="},replace:!0,template:'
{{ step }}
',controller:["$scope",i],controllerAs:"clock",link:function(t,a,i,n){var r=(angular.element(a[0].querySelector(".mdp-pointer")),t.$parent.timepicker),c=function(t){var a=t.currentTarget.getClientRects()[0],i=t.currentTarget.offsetWidth/2-(t.pageX-a.left),c=t.pageY-a.top-t.currentTarget.offsetHeight/2,o=Math.round(Math.atan2(i,c)*(180/Math.PI));e(function(){n.setTimeByDeg(o+180),-1!==["mouseup","click"].indexOf(t.type)&&r&&r.switchView()})};a.on("mousedown",function(){a.on("mousemove",c)}),a.on("mouseup",function(t){a.off("mousemove",c)}),a.on("click",c),t.$on("$destroy",function(){a.off("click",c),a.off("mousemove",c)})}}}]),n.provider("$mdpTimePicker",function(){var t="OK",e="Cancel";this.setOKButtonLabel=function(e){t=e},this.setCancelButtonLabel=function(t){e=t},this.$get=["$mdDialog",function(i){var n=function(n,r){return angular.isDate(n)||(n=Date.now()),angular.isObject(r)||(r={}),i.show({controller:["$scope","$mdDialog","currentDate","$mdMedia",a],controllerAs:"timepicker",clickOutsideToClose:!0,template:'
{{ timepicker.time.format("h") }}:{{ timepicker.time.format("mm") }}
AMPM
'+e+''+t+"
",targetEvent:r.targetEvent,locals:{currentDate:n}})};return n}]}),n.directive("mdpTimePicker",["$mdpTimePicker","$timeout",function(t,e){return{restrict:"A",require:"?ngModel",scope:{timeFormat:"@mdpFormat"},link:function(a,i,n,r){var c=a.timeFormat||"HH:mm";"undefined"!=typeof n.type&&r&&angular.element(i).on("click",function(a){a.preventDefault(),t(r.$modelValue,{targetEvent:a}).then(function(t){e(function(){switch(n.type){case"time":r.$setViewValue(moment(t).format("HH:mm"));break;default:r.$setViewValue(moment(t).format(c))}r.$render()})})})}}}])}(); +!function(){"use strict";function t(t,e,a,i,n,r){var c=this;this.date=moment(n),this.minDate=r.minDate&&moment(r.minDate).isValid()?moment(r.minDate):null,this.maxDate=r.maxDate&&moment(r.maxDate).isValid()?moment(r.maxDate):null,this.dateFilter=angular.isFunction(r.dateFilter)?r.dateFilter:null,this.selectingYear=!1,this.minDate&&this.maxDate&&this.maxDate.isBefore(this.minDate)&&(this.maxDate=moment(this.minDate).add(1,"days")),this.date&&(this.minDate&&this.date.isBefore(this.minDate)&&(this.date=moment(this.minDate)),this.maxDate&&this.date.isAfter(this.maxDate)&&(this.date=moment(this.maxDate))),this.yearItems={currentIndex_:0,PAGE_SIZE:5,START:c.minDate?c.minDate.year():1900,END:c.maxDate?c.maxDate.year():0,getItemAtIndex:function(t){return this.currentIndex_=n;n++){var r=null;n>a&&(r={value:n-a,enabled:e.isDayEnabled(moment(e.date).date(n-a).toDate())}),i.push(r)}return i},this.isDayEnabled=function(t){return!(this.minDate&&!(this.minDate<=t)||this.maxDate&&!(this.maxDate>=t)||e.dateFilter&&e.dateFilter(t))},this.selectDate=function(t){e.date.date(t)},this.nextMonth=function(){e.date.add(1,"months")},this.prevMonth=function(){e.date.subtract(1,"months")},this.updateDaysInMonth=function(){e.daysInMonth=e.getDaysInMonth()},t.$watch(function(){return e.date.unix()},function(t,a){t&&t!==a&&e.updateDaysInMonth()}),e.updateDaysInMonth()}function a(t,e,a,i){var n=this;this.VIEW_HOURS=1,this.VIEW_MINUTES=2,this.currentDate=a,this.currentView=this.VIEW_HOURS,this.time=moment(n.currentDate),this.clockHours=parseInt(this.time.format("h")),this.clockMinutes=parseInt(this.time.minutes()),t.$mdMedia=i,this.switchView=function(){n.currentView=n.currentView==n.VIEW_HOURS?n.VIEW_MINUTES:n.VIEW_HOURS},this.setAM=function(){"PM"==n.time.format("A")&&n.time.hour(n.time.hour()-12)},this.setPM=function(){"AM"==n.time.format("A")&&n.time.hour(n.time.hour()+12)},this.cancel=function(){e.cancel()},this.confirm=function(){e.hide(this.time.toDate())}}function i(t){var e="hours",a="minutes",i=this;this.STEP_DEG=30,this.steps=[],this.CLOCK_TYPES={hours:{range:12},minutes:{range:60}},this.getPointerStyle=function(){var t=1;switch(i.type){case e:t=12;break;case a:t=60}var n=Math.round(i.selected*(360/t))-180;return{"-webkit-transform":"rotate("+n+"deg)","-ms-transform":"rotate("+n+"deg)",transform:"rotate("+n+"deg)"}},this.setTimeByDeg=function(t){t=t>=360?0:t;var n=0;switch(i.type){case e:n=12;break;case a:n=60}i.setTime(Math.round(n/360*t))},this.setTime=function(t,n){switch(this.selected=t,i.type){case e:"PM"==i.time.format("A")&&(t+=12),this.time.hours(t);break;case a:t>59&&(t-=60),this.time.minutes(t)}},this.init=function(){switch(i.type=i.type||"hours",i.type){case e:for(var t=1;12>=t;t++)i.steps.push(t);i.selected=i.time.hours()||0,i.selected>12&&(i.selected-=12);break;case a:for(var t=5;55>=t;t+=5)i.steps.push(t);i.steps.push(0),i.selected=i.time.minutes()||0}},this.init()}var n=angular.module("mdPickers",["ngMaterial","ngAnimate","ngAria"]);n.config(["$mdIconProvider","mdpIconsRegistry",function(t,e){angular.forEach(e,function(e,a){t.icon(e.id,e.url)})}]),n.run(["$templateCache","mdpIconsRegistry",function(t,e){angular.forEach(e,function(e,a){t.put(e.url,e.svg)})}]),n.constant("mdpIconsRegistry",[{id:"mdp-chevron-left",url:"mdp-chevron-left.svg",svg:''},{id:"mdp-chevron-right",url:"mdp-chevron-right.svg",svg:''}]),n.provider("$mdpDatePicker",function(){var e="OK",a="Cancel";this.setOKButtonLabel=function(t){e=t},this.setCancelButtonLabel=function(t){a=t},this.$get=["$mdDialog",function(i){var n=function(n,r){return angular.isDate(n)||(n=Date.now()),angular.isObject(r)||(r={}),i.show({controller:["$scope","$mdDialog","$mdMedia","$timeout","currentDate","options",t],controllerAs:"datepicker",clickOutsideToClose:!0,template:'
{{ datepicker.date.format(\'YYYY\') }}{{ datepicker.date.format("ddd, MMM DD") }}
{{ item }}
'+a+''+e+"
",targetEvent:r.targetEvent,locals:{currentDate:n,options:r}})};return n}]}),n.directive("mdpCalendar",["$animate",function(t){return{restrict:"E",bindToController:{date:"=",minDate:"=",maxDate:"=",dateFilter:"="},template:'
{{ calendar.date.format("MMMM YYYY") }}
{{ d }}
{{ day.value }}
',controller:["$scope",e],controllerAs:"calendar",link:function(e,a,i,n){var r=[a[0].querySelector(".mdp-calendar-week-days"),a[0].querySelector(".mdp-calendar-days"),a[0].querySelector(".mdp-calendar-monthyear")].map(function(t){return angular.element(t)});e.$watch(function(){return n.date.format("YYYYMM")},function(e,a){var i=null;if(e>a?i="mdp-animate-next":a>e&&(i="mdp-animate-prev"),i)for(var n in r)r[n].addClass(i),t.removeClass(r[n],i)})}}}]),n.directive("mdpDatePicker",["$mdpDatePicker","$timeout",function(t,e){return{restrict:"A",require:"?ngModel",scope:{minDate:"@min",maxDate:"@max",dateFilter:"=mdpDateFilter",dateFormat:"@mdpFormat"},link:function(a,i,n,r){var c=a.dateFormat||moment.defaultFormat;"undefined"!=typeof n.type&&r&&angular.element(i).on("click",function(i){i.preventDefault(),t(r.$modelValue,{minDate:a.minDate,maxDate:a.maxDate,dateFilter:a.dateFilter,targetEvent:i}).then(function(t){e(function(){switch(n.type){case"date":r.$setViewValue(moment(t).format("YYYY-MM-DD"));break;default:r.$setViewValue(moment(t).format(c))}r.$render()})})})}}}]),n.directive("mdpClock",["$animate","$timeout",function(t,e){return{restrict:"E",bindToController:{type:"@?",time:"="},replace:!0,template:'
{{ step }}
',controller:["$scope",i],controllerAs:"clock",link:function(t,a,i,n){var r=(angular.element(a[0].querySelector(".mdp-pointer")),t.$parent.timepicker),c=function(t){var a=t.currentTarget.getClientRects()[0],i=t.currentTarget.offsetWidth/2-(t.pageX-a.left),c=t.pageY-a.top-t.currentTarget.offsetHeight/2,o=Math.round(Math.atan2(i,c)*(180/Math.PI));e(function(){n.setTimeByDeg(o+180),-1!==["mouseup","click"].indexOf(t.type)&&r&&r.switchView()})};a.on("mousedown",function(){a.on("mousemove",c)}),a.on("mouseup",function(t){a.off("mousemove",c)}),a.on("click",c),t.$on("$destroy",function(){a.off("click",c),a.off("mousemove",c)})}}}]),n.provider("$mdpTimePicker",function(){var t="OK",e="Cancel";this.setOKButtonLabel=function(e){t=e},this.setCancelButtonLabel=function(t){e=t},this.$get=["$mdDialog",function(i){var n=function(n,r){return angular.isDate(n)||(n=Date.now()),angular.isObject(r)||(r={}),i.show({controller:["$scope","$mdDialog","currentDate","$mdMedia",a],controllerAs:"timepicker",clickOutsideToClose:!0,template:'
{{ timepicker.time.format("h") }}:{{ timepicker.time.format("mm") }}
AMPM
'+e+''+t+"
",targetEvent:r.targetEvent,locals:{currentDate:n}})};return n}]}),n.directive("mdpTimePicker",["$mdpTimePicker","$timeout",function(t,e){return{restrict:"A",require:"?ngModel",scope:{timeFormat:"@mdpFormat"},link:function(a,i,n,r){var c=a.timeFormat||"HH:mm";"undefined"!=typeof n.type&&r&&angular.element(i).on("click",function(a){a.preventDefault(),t(r.$modelValue,{targetEvent:a}).then(function(t){e(function(){switch(n.type){case"time":r.$setViewValue(moment(t).format("HH:mm"));break;default:r.$setViewValue(moment(t).format(c))}r.$render()})})})}}}])}(); //# sourceMappingURL=mdPickers.min.js.map diff --git a/dist/mdPickers.min.js.map b/dist/mdPickers.min.js.map index 1ee24c44..be3234c2 100644 --- a/dist/mdPickers.min.js.map +++ b/dist/mdPickers.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["mdPickers.min.js"],"names":["DatePickerCtrl","$scope","$mdDialog","$mdMedia","$timeout","currentDate","options","self","this","date","moment","minDate","isValid","maxDate","dateFilter","angular","isFunction","selectingYear","isBefore","add","isAfter","yearItems","currentIndex_","PAGE_SIZE","START","year","END","getItemAtIndex","index","getLength","Math","min","floor","abs","selectYear","animate","showYear","yearTopIndex","showCalendar","cancel","confirm","hide","toDate","animating","noop","then","CalendarCtrl","weekDays","weekdaysMin","daysInMonth","getDaysInMonth","days","firstDay","day","arr","i","value","enabled","isDayEnabled","push","selectDate","dom","nextMonth","prevMonth","subtract","updateDaysInMonth","$watch","unix","newValue","oldValue","TimePickerCtrl","VIEW_HOURS","VIEW_MINUTES","currentView","time","clockHours","parseInt","format","clockMinutes","minutes","switchView","setAM","hour","setPM","ClockCtrl","TYPE_HOURS","TYPE_MINUTES","STEP_DEG","steps","CLOCK_TYPES","hours","range","getPointerStyle","divider","type","degrees","round","selected","-webkit-transform","-ms-transform","transform","setTimeByDeg","deg","setTime","init","module","config","$mdIconProvider","mdpIconsRegistry","forEach","icon","id","url","run","$templateCache","put","svg","constant","provider","LABEL_OK","LABEL_CANCEL","setOKButtonLabel","label","setCancelButtonLabel","$get","datePicker","isDate","Date","now","isObject","show","controller","controllerAs","clickOutsideToClose","template","targetEvent","locals","directive","$animate","restrict","bindToController","link","scope","element","attrs","ctrl","animElements","querySelector","map","a","direction","addClass","removeClass","$mdpDatePicker","require","dateFormat","ngModel","defaultFormat","on","ev","preventDefault","$modelValue","selectedDate","$setViewValue","$render","replace","timepickerCtrl","$parent","timepicker","onEvent","event","containerCoords","currentTarget","getClientRects","x","offsetWidth","pageX","left","y","pageY","top","offsetHeight","atan2","PI","indexOf","e","off","$on","timePicker","$mdpTimePicker","timeFormat"],"mappings":"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","file":"mdPickers.min.js","sourcesContent":["(function() {\n\"use strict\";\n/* global moment, angular */\n\nvar module = angular.module(\"mdPickers\", [\n\t\"ngMaterial\",\n\t\"ngAnimate\",\n\t\"ngAria\"\n]);\n\nmodule.config([\"$mdIconProvider\", \"mdpIconsRegistry\", function($mdIconProvider, mdpIconsRegistry) {\n\tangular.forEach(mdpIconsRegistry, function(icon, index) {\n\t\t$mdIconProvider.icon(icon.id, icon.url);\n\t});\n}]);\n\nmodule.run([\"$templateCache\", \"mdpIconsRegistry\", function($templateCache, mdpIconsRegistry) {\n\tangular.forEach(mdpIconsRegistry, function(icon, index) {\n\t\t$templateCache.put(icon.url, icon.svg);\n\t});\n}]);\nmodule.constant(\"mdpIconsRegistry\", [\n {\n id: 'mdp-chevron-left',\n url: 'mdp-chevron-left.svg',\n svg: ''\n },\n {\n id: 'mdp-chevron-right',\n url: 'mdp-chevron-right.svg',\n svg: ''\n }\n]);\n/* global moment, angular */\n\nfunction DatePickerCtrl($scope, $mdDialog, $mdMedia, $timeout, currentDate, options) {\n var self = this;\n\n this.date = moment(currentDate);\n this.minDate = moment(options.minDate).isValid() ? moment(options.minDate) : null;\n this.maxDate = moment(options.maxDate).isValid() ? moment(options.maxDate) : null;\n this.dateFilter = angular.isFunction(options.dateFilter) ? options.dateFilter : null;\n this.selectingYear = false;\n \n // validate min and max date\n\tif (this.minDate && this.maxDate) {\n\t\tif (this.maxDate.isBefore(this.minDate)) {\n\t\t\tthis.maxDate = moment(this.minDate).add(1, 'days');\n\t\t}\n\t}\n\t\n\tif (this.date) {\n\t\t// check min date\n \tif (this.minDate && this.date.isBefore(this.minDate)) {\n\t\t\tthis.date = moment(this.minDate);\n \t}\n \t\n \t// check max date\n \tif (this.maxDate && this.date.isAfter(this.maxDate)) {\n\t\t\tthis.date = moment(this.maxDate);\n \t}\n\t}\n\t\n\tthis.yearItems = {\n currentIndex_: 0,\n PAGE_SIZE: 5,\n START: (self.minDate ? self.minDate.year() : 1900),\n END: (self.maxDate ? self.maxDate.year() : 0),\n getItemAtIndex: function(index) {\n \tif(this.currentIndex_ < index)\n this.currentIndex_ = index;\n \t\n \treturn this.START + index;\n },\n getLength: function() {\n return Math.min(\n this.currentIndex_ + Math.floor(this.PAGE_SIZE / 2),\n Math.abs(this.START - this.END) + 1\n );\n }\n };\n\n $scope.$mdMedia = $mdMedia;\n $scope.year = this.date.year();\n\n\tthis.selectYear = function(year) {\n self.date.year(year);\n $scope.year = year;\n self.selectingYear = false;\n self.animate();\n };\n \n this.showYear = function() { \n self.yearTopIndex = (self.date.year() - self.yearItems.START) + Math.floor(self.yearItems.PAGE_SIZE / 2);\n self.yearItems.currentIndex_ = (self.date.year() - self.yearItems.START) + 1;\n self.selectingYear = true;\n };\n \n this.showCalendar = function() {\n self.selectingYear = false;\n };\n\n this.cancel = function() {\n $mdDialog.cancel();\n };\n\n this.confirm = function() {\n \tvar date = this.date;\n \t\n \tif (this.minDate && this.date.isBefore(this.minDate)) {\n \t\tdate = moment(this.minDate);\n \t}\n \t\n \tif (this.maxDate && this.date.isAfter(this.maxDate)) {\n \t\tdate = moment(this.maxDate);\n \t} \t\n \t\n $mdDialog.hide(date.toDate());\n };\n \n this.animate = function() {\n self.animating = true;\n $timeout(angular.noop).then(function() {\n self.animating = false;\n }) \n };\n}\n\nmodule.provider(\"$mdpDatePicker\", function() {\n var LABEL_OK = \"OK\",\n LABEL_CANCEL = \"Cancel\";\n \n this.setOKButtonLabel = function(label) {\n LABEL_OK = label;\n };\n \n this.setCancelButtonLabel = function(label) {\n LABEL_CANCEL = label;\n };\n \n this.$get = [\"$mdDialog\", function($mdDialog) {\n var datePicker = function(currentDate, options) {\n if (!angular.isDate(currentDate)) currentDate = Date.now();\n if (!angular.isObject(options)) options = {};\n \n return $mdDialog.show({\n controller: ['$scope', '$mdDialog', '$mdMedia', '$timeout', 'currentDate', 'options', DatePickerCtrl],\n controllerAs: 'datepicker',\n clickOutsideToClose: true,\n template: '' +\n '' +\n '
' +\n '' +\n '{{ datepicker.date.format(\\'YYYY\\') }}' +\n '{{ datepicker.date.format(\"ddd, MMM DD\") }} ' +\n '' + \n '
' + \n '
' + \n '
' +\n '' +\n '
' +\n '{{ item }}' +\n '
' +\n '
' +\n '
' +\n '' +\n '' +\n \t'' +\n '' + LABEL_CANCEL + '' +\n '' + LABEL_OK + '' +\n '' +\n '
' +\n '
' +\n '
',\n targetEvent: options.targetEvent,\n locals: {\n currentDate: currentDate,\n options: options\n }\n });\n };\n \n return datePicker;\n }];\n});\n\nfunction CalendarCtrl($scope) {\n\tvar self = this;\n this.weekDays = moment.weekdaysMin();\n this.daysInMonth = [];\n \n this.getDaysInMonth = function() {\n var days = self.date.daysInMonth(),\n firstDay = moment(self.date).date(1).day();\n\n var arr = [];\n for(var i = 1; i <= (firstDay + days); i++) {\n var day = null;\n if(i > firstDay) {\n day = {\n value: (i - firstDay),\n enabled: self.isDayEnabled(moment(self.date).date(i - firstDay).toDate())\n };\n }\n arr.push(day);\n }\n \n return arr;\n };\n \n this.isDayEnabled = function(day) {\n return (!this.minDate || this.minDate <= day) && \n (!this.maxDate || this.maxDate >= day) && \n (!self.dateFilter || !self.dateFilter(day));\n };\n \n this.selectDate = function(dom) {\n self.date.date(dom);\n };\n\n this.nextMonth = function() {\n self.date.add(1, 'months');\n };\n\n this.prevMonth = function() {\n self.date.subtract(1, 'months');\n };\n \n this.updateDaysInMonth = function() {\n self.daysInMonth = self.getDaysInMonth();\n };\n \n $scope.$watch(function() { return self.date.unix() }, function(newValue, oldValue) {\n if(newValue && newValue !== oldValue)\n self.updateDaysInMonth();\n })\n \n self.updateDaysInMonth();\n}\n\nmodule.directive(\"mdpCalendar\", [\"$animate\", function($animate) {\n return {\n restrict: 'E',\n bindToController: {\n \"date\": \"=\",\n \"minDate\": \"=\",\n \"maxDate\": \"=\",\n \"dateFilter\": \"=\"\n },\n template: '
' +\n '
' +\n '' +\n '
{{ calendar.date.format(\"MMMM YYYY\") }}
' +\n '' +\n '
' +\n '
' +\n '
{{ d }}
' +\n '
' +\n '
' +\n '
' +\n '{{ day.value }}' +\n '
' +\n '
' +\n '
' +\n '
',\n controller: [\"$scope\", CalendarCtrl],\n controllerAs: \"calendar\",\n link: function(scope, element, attrs, ctrl) {\n var animElements = [\n element[0].querySelector(\".mdp-calendar-week-days\"),\n element[0].querySelector('.mdp-calendar-days'),\n element[0].querySelector('.mdp-calendar-monthyear')\n ].map(function(a) {\n return angular.element(a); \n });\n \n scope.$watch(function() { return ctrl.date.format(\"YYYYMM\") }, function(newValue, oldValue) {\n var direction = null;\n \n if(newValue > oldValue)\n direction = \"mdp-animate-next\";\n else if(newValue < oldValue)\n direction = \"mdp-animate-prev\";\n \n if(direction) {\n for(var i in animElements) {\n animElements[i].addClass(direction);\n $animate.removeClass(animElements[i], direction);\n }\n }\n });\n }\n }\n}]);\n\nmodule.directive(\"mdpDatePicker\", [\"$mdpDatePicker\", \"$timeout\", function($mdpDatePicker, $timeout) {\n return {\n restrict: 'A',\n require: '?ngModel',\n scope: {\n \"minDate\": \"@min\",\n \"maxDate\": \"@max\",\n \"dateFilter\": \"=mdpDateFilter\",\n \"dateFormat\": \"@mdpFormat\"\n },\n link: function(scope, element, attrs, ngModel) {\n var dateFormat = scope.dateFormat || moment.defaultFormat;\n if ('undefined' !== typeof attrs.type && ngModel) {\n \n angular.element(element).on(\"click\", function(ev) {\n \tev.preventDefault();\n \t\n \t$mdpDatePicker(ngModel.$modelValue, {\n \t minDate: scope.minDate, \n \t maxDate: scope.maxDate,\n \t dateFilter: scope.dateFilter,\n \t targetEvent: ev\n \t }).then(function(selectedDate) {\n \t\t$timeout(function() {\n \t\t switch(attrs.type) {\n \t\t case \"date\":\n \t\t ngModel.$setViewValue(moment(selectedDate).format(\"YYYY-MM-DD\"));\n \t\t break;\n \t\t default:\n \t\t ngModel.$setViewValue(moment(selectedDate).format(dateFormat));\n \t\t break;\n \t\t }\n \t\t\t\n \t\t\tngModel.$render(); \n });\n });\n });\n }\n }\n };\n}]);\n/* global moment, angular */\n\nfunction TimePickerCtrl($scope, $mdDialog, currentDate, $mdMedia) {\n\tvar self = this;\n this.VIEW_HOURS = 1;\n this.VIEW_MINUTES = 2;\n this.currentDate = currentDate;\n this.currentView = this.VIEW_HOURS;\n this.time = moment(self.currentDate);\n \n this.clockHours = parseInt(this.time.format(\"h\"));\n this.clockMinutes = parseInt(this.time.minutes());\n \n\t$scope.$mdMedia = $mdMedia;\n\t\n\tthis.switchView = function() {\n\t self.currentView = self.currentView == self.VIEW_HOURS ? self.VIEW_MINUTES : self.VIEW_HOURS;\n\t};\n \n\tthis.setAM = function() {\n if(self.time.format(\"A\") == \"PM\")\n self.time.hour(self.time.hour() - 12);\n\t};\n \n this.setPM = function() {\n if(self.time.format(\"A\") == \"AM\")\n self.time.hour(self.time.hour() + 12);\n\t};\n \n this.cancel = function() {\n $mdDialog.cancel();\n };\n\n this.confirm = function() {\n $mdDialog.hide(this.time.toDate());\n };\n}\n\nfunction ClockCtrl($scope) {\n var TYPE_HOURS = \"hours\";\n var TYPE_MINUTES = \"minutes\";\n var self = this;\n \n this.STEP_DEG = 360 / 12;\n this.steps = [];\n \n this.CLOCK_TYPES = {\n \"hours\": {\n range: 12,\n },\n \"minutes\": {\n range: 60,\n }\n }\n \n this.getPointerStyle = function() {\n var divider = 1;\n switch(self.type) {\n case TYPE_HOURS:\n divider = 12;\n break;\n case TYPE_MINUTES:\n divider = 60;\n break;\n } \n var degrees = Math.round(self.selected * (360 / divider)) - 180;\n return { \n \"-webkit-transform\": \"rotate(\" + degrees + \"deg)\",\n \"-ms-transform\": \"rotate(\" + degrees + \"deg)\",\n \"transform\": \"rotate(\" + degrees + \"deg)\"\n }\n };\n \n this.setTimeByDeg = function(deg) {\n deg = deg >= 360 ? 0 : deg;\n var divider = 0;\n switch(self.type) {\n case TYPE_HOURS:\n divider = 12;\n break;\n case TYPE_MINUTES:\n divider = 60;\n break;\n } \n \n self.setTime(\n Math.round(divider / 360 * deg)\n );\n };\n \n this.setTime = function(time, type) {\n this.selected = time;\n \n switch(self.type) {\n case TYPE_HOURS:\n if(self.time.format(\"A\") == \"PM\") time += 12;\n this.time.hours(time);\n break;\n case TYPE_MINUTES:\n if(time > 59) time -= 60;\n this.time.minutes(time);\n break;\n }\n \n };\n \n this.init = function() {\n self.type = self.type || \"hours\";\n switch(self.type) {\n case TYPE_HOURS:\n for(var i = 1; i <= 12; i++)\n self.steps.push(i);\n self.selected = self.time.hours() || 0;\n if(self.selected > 12) self.selected -= 12;\n \n break;\n case TYPE_MINUTES:\n for(var i = 5; i <= 55; i+=5)\n self.steps.push(i);\n self.steps.push(0);\n self.selected = self.time.minutes() || 0;\n \n break;\n }\n };\n \n this.init();\n}\n\nmodule.directive(\"mdpClock\", [\"$animate\", \"$timeout\", function($animate, $timeout) {\n return {\n restrict: 'E',\n bindToController: {\n 'type': '@?',\n 'time': '='\n },\n replace: true,\n template: '
' +\n '
' +\n '' +\n '' +\n '' +\n '' +\n '{{ step }}' +\n '
' +\n '
',\n controller: [\"$scope\", ClockCtrl],\n controllerAs: \"clock\",\n link: function(scope, element, attrs, ctrl) {\n var pointer = angular.element(element[0].querySelector(\".mdp-pointer\")),\n timepickerCtrl = scope.$parent.timepicker;\n \n var onEvent = function(event) {\n var containerCoords = event.currentTarget.getClientRects()[0];\n var x = ((event.currentTarget.offsetWidth / 2) - (event.pageX - containerCoords.left)),\n y = ((event.pageY - containerCoords.top) - (event.currentTarget.offsetHeight / 2));\n\n var deg = Math.round((Math.atan2(x, y) * (180 / Math.PI)));\n $timeout(function() {\n ctrl.setTimeByDeg(deg + 180);\n if([\"mouseup\", \"click\"].indexOf(event.type) !== -1 && timepickerCtrl) timepickerCtrl.switchView();\n });\n }; \n \n element.on(\"mousedown\", function() {\n element.on(\"mousemove\", onEvent);\n });\n \n element.on(\"mouseup\", function(e) {\n element.off(\"mousemove\", onEvent);\n });\n \n element.on(\"click\", onEvent);\n scope.$on(\"$destroy\", function() {\n element.off(\"click\", onEvent);\n element.off(\"mousemove\", onEvent); \n });\n }\n }\n}]);\n\nmodule.provider(\"$mdpTimePicker\", function() {\n var LABEL_OK = \"OK\",\n LABEL_CANCEL = \"Cancel\";\n \n this.setOKButtonLabel = function(label) {\n LABEL_OK = label;\n };\n \n this.setCancelButtonLabel = function(label) {\n LABEL_CANCEL = label;\n };\n \n this.$get = [\"$mdDialog\", function($mdDialog) {\n var timePicker = function(currentDate, options) {\n if(!angular.isDate(currentDate)) currentDate = Date.now();\n if (!angular.isObject(options)) options = {};\n \n return $mdDialog.show({\n controller: ['$scope', '$mdDialog', 'currentDate', '$mdMedia', TimePickerCtrl],\n controllerAs: 'timepicker',\n clickOutsideToClose: true,\n template: '' +\n '' +\n '' +\n '
' +\n '{{ timepicker.time.format(\"h\") }}:' + \n '{{ timepicker.time.format(\"mm\") }}' +\n '
' +\n '
' + \n 'AM' +\n 'PM' +\n '
' + \n '
' +\n '
' +\n '
' +\n\t '' +\n\t '' +\n '
' +\n \n '' +\n\t \t'' +\n '' + LABEL_CANCEL + '' +\n '' + LABEL_OK + '' +\n '' +\n '
' +\n '
' +\n '
',\n targetEvent: options.targetEvent,\n locals: {\n currentDate: currentDate\n }\n });\n };\n \n return timePicker;\n }];\n});\n\nmodule.directive(\"mdpTimePicker\", [\"$mdpTimePicker\", \"$timeout\", function($mdpTimePicker, $timeout) {\n return {\n restrict: 'A',\n require: '?ngModel',\n scope: {\n \"timeFormat\": \"@mdpFormat\"\n },\n link: function(scope, element, attrs, ngModel) {\n var timeFormat = scope.timeFormat || \"HH:mm\";\n if ('undefined' !== typeof attrs.type && ngModel) {\n angular.element(element).on(\"click\", function(ev) {\n ev.preventDefault();\n $mdpTimePicker(ngModel.$modelValue, {\n targetEvent: ev\n }).then(function(selectedDate) {\n $timeout(function() { \n switch(attrs.type) {\n \t\t case \"time\":\n \t ngModel.$setViewValue(moment(selectedDate).format(\"HH:mm\")); \n \t break;\n \t default:\n \t ngModel.$setViewValue(moment(selectedDate).format(timeFormat));\n \t break;\n }\n \tngModel.$render(); \n });\n });\n });\n }\n }\n };\n}]);\n\n})();"],"sourceRoot":"/source/"} \ No newline at end of file +{"version":3,"sources":["mdPickers.min.js"],"names":["DatePickerCtrl","$scope","$mdDialog","$mdMedia","$timeout","currentDate","options","self","this","date","moment","minDate","isValid","maxDate","dateFilter","angular","isFunction","selectingYear","isBefore","add","isAfter","yearItems","currentIndex_","PAGE_SIZE","START","year","END","getItemAtIndex","index","getLength","Math","min","floor","abs","selectYear","animate","showYear","yearTopIndex","showCalendar","cancel","confirm","hide","toDate","animating","noop","then","CalendarCtrl","weekDays","weekdaysMin","daysInMonth","getDaysInMonth","days","firstDay","day","arr","i","value","enabled","isDayEnabled","push","selectDate","dom","nextMonth","prevMonth","subtract","updateDaysInMonth","$watch","unix","newValue","oldValue","TimePickerCtrl","VIEW_HOURS","VIEW_MINUTES","currentView","time","clockHours","parseInt","format","clockMinutes","minutes","switchView","setAM","hour","setPM","ClockCtrl","TYPE_HOURS","TYPE_MINUTES","STEP_DEG","steps","CLOCK_TYPES","hours","range","getPointerStyle","divider","type","degrees","round","selected","-webkit-transform","-ms-transform","transform","setTimeByDeg","deg","setTime","init","module","config","$mdIconProvider","mdpIconsRegistry","forEach","icon","id","url","run","$templateCache","put","svg","constant","provider","LABEL_OK","LABEL_CANCEL","setOKButtonLabel","label","setCancelButtonLabel","$get","datePicker","isDate","Date","now","isObject","show","controller","controllerAs","clickOutsideToClose","template","targetEvent","locals","directive","$animate","restrict","bindToController","link","scope","element","attrs","ctrl","animElements","querySelector","map","a","direction","addClass","removeClass","$mdpDatePicker","require","dateFormat","ngModel","defaultFormat","on","ev","preventDefault","$modelValue","selectedDate","$setViewValue","$render","replace","timepickerCtrl","$parent","timepicker","onEvent","event","containerCoords","currentTarget","getClientRects","x","offsetWidth","pageX","left","y","pageY","top","offsetHeight","atan2","PI","indexOf","e","off","$on","timePicker","$mdpTimePicker","timeFormat"],"mappings":"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","file":"mdPickers.min.js","sourcesContent":["(function() {\n\"use strict\";\n/* global moment, angular */\n\nvar module = angular.module(\"mdPickers\", [\n\t\"ngMaterial\",\n\t\"ngAnimate\",\n\t\"ngAria\"\n]);\n\nmodule.config([\"$mdIconProvider\", \"mdpIconsRegistry\", function($mdIconProvider, mdpIconsRegistry) {\n\tangular.forEach(mdpIconsRegistry, function(icon, index) {\n\t\t$mdIconProvider.icon(icon.id, icon.url);\n\t});\n}]);\n\nmodule.run([\"$templateCache\", \"mdpIconsRegistry\", function($templateCache, mdpIconsRegistry) {\n\tangular.forEach(mdpIconsRegistry, function(icon, index) {\n\t\t$templateCache.put(icon.url, icon.svg);\n\t});\n}]);\nmodule.constant(\"mdpIconsRegistry\", [\n {\n id: 'mdp-chevron-left',\n url: 'mdp-chevron-left.svg',\n svg: ''\n },\n {\n id: 'mdp-chevron-right',\n url: 'mdp-chevron-right.svg',\n svg: ''\n }\n]);\n/* global moment, angular */\n\nfunction DatePickerCtrl($scope, $mdDialog, $mdMedia, $timeout, currentDate, options) {\n var self = this;\n\n this.date = moment(currentDate);\n this.minDate = options.minDate && moment(options.minDate).isValid() ? moment(options.minDate) : null;\n this.maxDate = options.maxDate && moment(options.maxDate).isValid() ? moment(options.maxDate) : null;\n this.dateFilter = angular.isFunction(options.dateFilter) ? options.dateFilter : null;\n this.selectingYear = false;\n \n // validate min and max date\n\tif (this.minDate && this.maxDate) {\n\t\tif (this.maxDate.isBefore(this.minDate)) {\n\t\t\tthis.maxDate = moment(this.minDate).add(1, 'days');\n\t\t}\n\t}\n\t\n\tif (this.date) {\n\t\t// check min date\n \tif (this.minDate && this.date.isBefore(this.minDate)) {\n\t\t\tthis.date = moment(this.minDate);\n \t}\n \t\n \t// check max date\n \tif (this.maxDate && this.date.isAfter(this.maxDate)) {\n\t\t\tthis.date = moment(this.maxDate);\n \t}\n\t}\n\t\n\tthis.yearItems = {\n currentIndex_: 0,\n PAGE_SIZE: 5,\n START: (self.minDate ? self.minDate.year() : 1900),\n END: (self.maxDate ? self.maxDate.year() : 0),\n getItemAtIndex: function(index) {\n \tif(this.currentIndex_ < index)\n this.currentIndex_ = index;\n \t\n \treturn this.START + index;\n },\n getLength: function() {\n return Math.min(\n this.currentIndex_ + Math.floor(this.PAGE_SIZE / 2),\n Math.abs(this.START - this.END) + 1\n );\n }\n };\n\n $scope.$mdMedia = $mdMedia;\n $scope.year = this.date.year();\n\n\tthis.selectYear = function(year) {\n self.date.year(year);\n $scope.year = year;\n self.selectingYear = false;\n self.animate();\n };\n \n this.showYear = function() { \n self.yearTopIndex = (self.date.year() - self.yearItems.START) + Math.floor(self.yearItems.PAGE_SIZE / 2);\n self.yearItems.currentIndex_ = (self.date.year() - self.yearItems.START) + 1;\n self.selectingYear = true;\n };\n \n this.showCalendar = function() {\n self.selectingYear = false;\n };\n\n this.cancel = function() {\n $mdDialog.cancel();\n };\n\n this.confirm = function() {\n \tvar date = this.date;\n \t\n \tif (this.minDate && this.date.isBefore(this.minDate)) {\n \t\tdate = moment(this.minDate);\n \t}\n \t\n \tif (this.maxDate && this.date.isAfter(this.maxDate)) {\n \t\tdate = moment(this.maxDate);\n \t} \t\n \t\n $mdDialog.hide(date.toDate());\n };\n \n this.animate = function() {\n self.animating = true;\n $timeout(angular.noop).then(function() {\n self.animating = false;\n }) \n };\n}\n\nmodule.provider(\"$mdpDatePicker\", function() {\n var LABEL_OK = \"OK\",\n LABEL_CANCEL = \"Cancel\";\n \n this.setOKButtonLabel = function(label) {\n LABEL_OK = label;\n };\n \n this.setCancelButtonLabel = function(label) {\n LABEL_CANCEL = label;\n };\n \n this.$get = [\"$mdDialog\", function($mdDialog) {\n var datePicker = function(currentDate, options) {\n if (!angular.isDate(currentDate)) currentDate = Date.now();\n if (!angular.isObject(options)) options = {};\n \n return $mdDialog.show({\n controller: ['$scope', '$mdDialog', '$mdMedia', '$timeout', 'currentDate', 'options', DatePickerCtrl],\n controllerAs: 'datepicker',\n clickOutsideToClose: true,\n template: '' +\n '' +\n '
' +\n '' +\n '{{ datepicker.date.format(\\'YYYY\\') }}' +\n '{{ datepicker.date.format(\"ddd, MMM DD\") }} ' +\n '' + \n '
' + \n '
' + \n '
' +\n '' +\n '
' +\n '{{ item }}' +\n '
' +\n '
' +\n '
' +\n '' +\n '' +\n \t'' +\n '' + LABEL_CANCEL + '' +\n '' + LABEL_OK + '' +\n '' +\n '
' +\n '
' +\n '
',\n targetEvent: options.targetEvent,\n locals: {\n currentDate: currentDate,\n options: options\n }\n });\n };\n \n return datePicker;\n }];\n});\n\nfunction CalendarCtrl($scope) {\n\tvar self = this;\n this.weekDays = moment.weekdaysMin();\n this.daysInMonth = [];\n \n this.getDaysInMonth = function() {\n var days = self.date.daysInMonth(),\n firstDay = moment(self.date).date(1).day();\n\n var arr = [];\n for(var i = 1; i <= (firstDay + days); i++) {\n var day = null;\n if(i > firstDay) {\n day = {\n value: (i - firstDay),\n enabled: self.isDayEnabled(moment(self.date).date(i - firstDay).toDate())\n };\n }\n arr.push(day);\n }\n \n return arr;\n };\n \n this.isDayEnabled = function(day) {\n return (!this.minDate || this.minDate <= day) && \n (!this.maxDate || this.maxDate >= day) && \n (!self.dateFilter || !self.dateFilter(day));\n };\n \n this.selectDate = function(dom) {\n self.date.date(dom);\n };\n\n this.nextMonth = function() {\n self.date.add(1, 'months');\n };\n\n this.prevMonth = function() {\n self.date.subtract(1, 'months');\n };\n \n this.updateDaysInMonth = function() {\n self.daysInMonth = self.getDaysInMonth();\n };\n \n $scope.$watch(function() { return self.date.unix() }, function(newValue, oldValue) {\n if(newValue && newValue !== oldValue)\n self.updateDaysInMonth();\n })\n \n self.updateDaysInMonth();\n}\n\nmodule.directive(\"mdpCalendar\", [\"$animate\", function($animate) {\n return {\n restrict: 'E',\n bindToController: {\n \"date\": \"=\",\n \"minDate\": \"=\",\n \"maxDate\": \"=\",\n \"dateFilter\": \"=\"\n },\n template: '
' +\n '
' +\n '' +\n '
{{ calendar.date.format(\"MMMM YYYY\") }}
' +\n '' +\n '
' +\n '
' +\n '
{{ d }}
' +\n '
' +\n '
' +\n '
' +\n '{{ day.value }}' +\n '
' +\n '
' +\n '
' +\n '
',\n controller: [\"$scope\", CalendarCtrl],\n controllerAs: \"calendar\",\n link: function(scope, element, attrs, ctrl) {\n var animElements = [\n element[0].querySelector(\".mdp-calendar-week-days\"),\n element[0].querySelector('.mdp-calendar-days'),\n element[0].querySelector('.mdp-calendar-monthyear')\n ].map(function(a) {\n return angular.element(a); \n });\n \n scope.$watch(function() { return ctrl.date.format(\"YYYYMM\") }, function(newValue, oldValue) {\n var direction = null;\n \n if(newValue > oldValue)\n direction = \"mdp-animate-next\";\n else if(newValue < oldValue)\n direction = \"mdp-animate-prev\";\n \n if(direction) {\n for(var i in animElements) {\n animElements[i].addClass(direction);\n $animate.removeClass(animElements[i], direction);\n }\n }\n });\n }\n }\n}]);\n\nmodule.directive(\"mdpDatePicker\", [\"$mdpDatePicker\", \"$timeout\", function($mdpDatePicker, $timeout) {\n return {\n restrict: 'A',\n require: '?ngModel',\n scope: {\n \"minDate\": \"@min\",\n \"maxDate\": \"@max\",\n \"dateFilter\": \"=mdpDateFilter\",\n \"dateFormat\": \"@mdpFormat\"\n },\n link: function(scope, element, attrs, ngModel) {\n var dateFormat = scope.dateFormat || moment.defaultFormat;\n if ('undefined' !== typeof attrs.type && ngModel) {\n \n angular.element(element).on(\"click\", function(ev) {\n \tev.preventDefault();\n \t\n \t$mdpDatePicker(ngModel.$modelValue, {\n \t minDate: scope.minDate, \n \t maxDate: scope.maxDate,\n \t dateFilter: scope.dateFilter,\n \t targetEvent: ev\n \t }).then(function(selectedDate) {\n \t\t$timeout(function() {\n \t\t switch(attrs.type) {\n \t\t case \"date\":\n \t\t ngModel.$setViewValue(moment(selectedDate).format(\"YYYY-MM-DD\"));\n \t\t break;\n \t\t default:\n \t\t ngModel.$setViewValue(moment(selectedDate).format(dateFormat));\n \t\t break;\n \t\t }\n \t\t\t\n \t\t\tngModel.$render(); \n });\n });\n });\n }\n }\n };\n}]);\n/* global moment, angular */\n\nfunction TimePickerCtrl($scope, $mdDialog, currentDate, $mdMedia) {\n\tvar self = this;\n this.VIEW_HOURS = 1;\n this.VIEW_MINUTES = 2;\n this.currentDate = currentDate;\n this.currentView = this.VIEW_HOURS;\n this.time = moment(self.currentDate);\n \n this.clockHours = parseInt(this.time.format(\"h\"));\n this.clockMinutes = parseInt(this.time.minutes());\n \n\t$scope.$mdMedia = $mdMedia;\n\t\n\tthis.switchView = function() {\n\t self.currentView = self.currentView == self.VIEW_HOURS ? self.VIEW_MINUTES : self.VIEW_HOURS;\n\t};\n \n\tthis.setAM = function() {\n if(self.time.format(\"A\") == \"PM\")\n self.time.hour(self.time.hour() - 12);\n\t};\n \n this.setPM = function() {\n if(self.time.format(\"A\") == \"AM\")\n self.time.hour(self.time.hour() + 12);\n\t};\n \n this.cancel = function() {\n $mdDialog.cancel();\n };\n\n this.confirm = function() {\n $mdDialog.hide(this.time.toDate());\n };\n}\n\nfunction ClockCtrl($scope) {\n var TYPE_HOURS = \"hours\";\n var TYPE_MINUTES = \"minutes\";\n var self = this;\n \n this.STEP_DEG = 360 / 12;\n this.steps = [];\n \n this.CLOCK_TYPES = {\n \"hours\": {\n range: 12,\n },\n \"minutes\": {\n range: 60,\n }\n }\n \n this.getPointerStyle = function() {\n var divider = 1;\n switch(self.type) {\n case TYPE_HOURS:\n divider = 12;\n break;\n case TYPE_MINUTES:\n divider = 60;\n break;\n } \n var degrees = Math.round(self.selected * (360 / divider)) - 180;\n return { \n \"-webkit-transform\": \"rotate(\" + degrees + \"deg)\",\n \"-ms-transform\": \"rotate(\" + degrees + \"deg)\",\n \"transform\": \"rotate(\" + degrees + \"deg)\"\n }\n };\n \n this.setTimeByDeg = function(deg) {\n deg = deg >= 360 ? 0 : deg;\n var divider = 0;\n switch(self.type) {\n case TYPE_HOURS:\n divider = 12;\n break;\n case TYPE_MINUTES:\n divider = 60;\n break;\n } \n \n self.setTime(\n Math.round(divider / 360 * deg)\n );\n };\n \n this.setTime = function(time, type) {\n this.selected = time;\n \n switch(self.type) {\n case TYPE_HOURS:\n if(self.time.format(\"A\") == \"PM\") time += 12;\n this.time.hours(time);\n break;\n case TYPE_MINUTES:\n if(time > 59) time -= 60;\n this.time.minutes(time);\n break;\n }\n \n };\n \n this.init = function() {\n self.type = self.type || \"hours\";\n switch(self.type) {\n case TYPE_HOURS:\n for(var i = 1; i <= 12; i++)\n self.steps.push(i);\n self.selected = self.time.hours() || 0;\n if(self.selected > 12) self.selected -= 12;\n \n break;\n case TYPE_MINUTES:\n for(var i = 5; i <= 55; i+=5)\n self.steps.push(i);\n self.steps.push(0);\n self.selected = self.time.minutes() || 0;\n \n break;\n }\n };\n \n this.init();\n}\n\nmodule.directive(\"mdpClock\", [\"$animate\", \"$timeout\", function($animate, $timeout) {\n return {\n restrict: 'E',\n bindToController: {\n 'type': '@?',\n 'time': '='\n },\n replace: true,\n template: '
' +\n '
' +\n '' +\n '' +\n '' +\n '' +\n '{{ step }}' +\n '
' +\n '
',\n controller: [\"$scope\", ClockCtrl],\n controllerAs: \"clock\",\n link: function(scope, element, attrs, ctrl) {\n var pointer = angular.element(element[0].querySelector(\".mdp-pointer\")),\n timepickerCtrl = scope.$parent.timepicker;\n \n var onEvent = function(event) {\n var containerCoords = event.currentTarget.getClientRects()[0];\n var x = ((event.currentTarget.offsetWidth / 2) - (event.pageX - containerCoords.left)),\n y = ((event.pageY - containerCoords.top) - (event.currentTarget.offsetHeight / 2));\n\n var deg = Math.round((Math.atan2(x, y) * (180 / Math.PI)));\n $timeout(function() {\n ctrl.setTimeByDeg(deg + 180);\n if([\"mouseup\", \"click\"].indexOf(event.type) !== -1 && timepickerCtrl) timepickerCtrl.switchView();\n });\n }; \n \n element.on(\"mousedown\", function() {\n element.on(\"mousemove\", onEvent);\n });\n \n element.on(\"mouseup\", function(e) {\n element.off(\"mousemove\", onEvent);\n });\n \n element.on(\"click\", onEvent);\n scope.$on(\"$destroy\", function() {\n element.off(\"click\", onEvent);\n element.off(\"mousemove\", onEvent); \n });\n }\n }\n}]);\n\nmodule.provider(\"$mdpTimePicker\", function() {\n var LABEL_OK = \"OK\",\n LABEL_CANCEL = \"Cancel\";\n \n this.setOKButtonLabel = function(label) {\n LABEL_OK = label;\n };\n \n this.setCancelButtonLabel = function(label) {\n LABEL_CANCEL = label;\n };\n \n this.$get = [\"$mdDialog\", function($mdDialog) {\n var timePicker = function(currentDate, options) {\n if(!angular.isDate(currentDate)) currentDate = Date.now();\n if (!angular.isObject(options)) options = {};\n \n return $mdDialog.show({\n controller: ['$scope', '$mdDialog', 'currentDate', '$mdMedia', TimePickerCtrl],\n controllerAs: 'timepicker',\n clickOutsideToClose: true,\n template: '' +\n '' +\n '' +\n '
' +\n '{{ timepicker.time.format(\"h\") }}:' + \n '{{ timepicker.time.format(\"mm\") }}' +\n '
' +\n '
' + \n 'AM' +\n 'PM' +\n '
' + \n '
' +\n '
' +\n '
' +\n\t '' +\n\t '' +\n '
' +\n \n '' +\n\t \t'' +\n '' + LABEL_CANCEL + '' +\n '' + LABEL_OK + '' +\n '' +\n '
' +\n '
' +\n '
',\n targetEvent: options.targetEvent,\n locals: {\n currentDate: currentDate\n }\n });\n };\n \n return timePicker;\n }];\n});\n\nmodule.directive(\"mdpTimePicker\", [\"$mdpTimePicker\", \"$timeout\", function($mdpTimePicker, $timeout) {\n return {\n restrict: 'A',\n require: '?ngModel',\n scope: {\n \"timeFormat\": \"@mdpFormat\"\n },\n link: function(scope, element, attrs, ngModel) {\n var timeFormat = scope.timeFormat || \"HH:mm\";\n if ('undefined' !== typeof attrs.type && ngModel) {\n angular.element(element).on(\"click\", function(ev) {\n ev.preventDefault();\n $mdpTimePicker(ngModel.$modelValue, {\n targetEvent: ev\n }).then(function(selectedDate) {\n $timeout(function() { \n switch(attrs.type) {\n \t\t case \"time\":\n \t ngModel.$setViewValue(moment(selectedDate).format(\"HH:mm\")); \n \t break;\n \t default:\n \t ngModel.$setViewValue(moment(selectedDate).format(timeFormat));\n \t break;\n }\n \tngModel.$render(); \n });\n });\n });\n }\n }\n };\n}]);\n\n})();"],"sourceRoot":"/source/"} \ No newline at end of file diff --git a/src/components/mdpDatePicker/mdpDatePicker.js b/src/components/mdpDatePicker/mdpDatePicker.js index f784088b..293ecdf0 100644 --- a/src/components/mdpDatePicker/mdpDatePicker.js +++ b/src/components/mdpDatePicker/mdpDatePicker.js @@ -4,8 +4,8 @@ function DatePickerCtrl($scope, $mdDialog, $mdMedia, $timeout, currentDate, opti var self = this; this.date = moment(currentDate); - this.minDate = moment(options.minDate).isValid() ? moment(options.minDate) : null; - this.maxDate = moment(options.maxDate).isValid() ? moment(options.maxDate) : null; + this.minDate = options.minDate && moment(options.minDate).isValid() ? moment(options.minDate) : null; + this.maxDate = options.maxDate && moment(options.maxDate).isValid() ? moment(options.maxDate) : null; this.dateFilter = angular.isFunction(options.dateFilter) ? options.dateFilter : null; this.selectingYear = false;