diff --git a/dist/mdPickers.js b/dist/mdPickers.js index 7757000d..5b360d94 100644 --- a/dist/mdPickers.js +++ b/dist/mdPickers.js @@ -381,10 +381,12 @@ module.directive("mdpDatePicker", ["$mdpDatePicker", "$timeout", function($mdpDa scope.autoSwitch = scope.autoSwitch || false; scope.getValue = function() { - var strVal = moment(ngModel.$modelValue).format(scope.dateFormat); - inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue)); - - return strVal; + if(angular.isDate(ngModel.$modelValue)) { + var strVal = moment(ngModel.$modelValue).format(scope.dateFormat); + inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue)); + + return strVal; + } else return ""; }; scope.$watch(function() { return ngModel.$error }, function(newValue, oldValue) { @@ -727,10 +729,12 @@ module.directive("mdpTimePicker", ["$mdpTimePicker", "$timeout", function($mdpTi }, true); scope.getValue = function() { - var strVal = moment(ngModel.$modelValue).format(scope.timeFormat); - inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue)); - - return strVal; + if(angular.isDate(ngModel.$modelValue)) { + var strVal = moment(ngModel.$modelValue).format(scope.timeFormat); + inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue)); + + return strVal; + } else return ""; }; ngModel.$validators.format = function(modelValue, viewValue) { diff --git a/dist/mdPickers.min.js b/dist/mdPickers.min.js index a2743130..e5afbe6b 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 o=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.displayFormat=r.displayFormat||"ddd, MMM DD",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:o.minDate?o.minDate.year():1900,END:o.maxDate?o.maxDate.year():0,getItemAtIndex:function(t){return this.currentIndex_a&&(a=this.weekDays.length-1);for(var i=[],n=1;a+t>=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,n){var r=this;this.VIEW_HOURS=1,this.VIEW_MINUTES=2,this.currentView=this.VIEW_HOURS,this.time=moment(a),this.autoSwitch=!!i,console.log(i),this.clockHours=parseInt(this.time.format("h")),this.clockMinutes=parseInt(this.time.minutes()),t.$mdMedia=n,this.switchView=function(){r.currentView=r.currentView==r.VIEW_HOURS?r.VIEW_MINUTES:r.VIEW_HOURS},this.setAM=function(){r.time.hours()>=12&&r.time.hour(r.time.hour()-12)},this.setPM=function(){r.time.hours()<12&&r.time.hour(r.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:''},{id:"mdp-access-time",url:"mdp-access-time.svg",svg:''},{id:"mdp-event",url:"mdp-event.svg",svg:''}]),n.directive("ngMessage",["$mdUtil",function(t){return{restrict:"EA",priority:101,compile:function(e){var a=t.getClosest(e,"mdp-time-picker",!0)||t.getClosest(e,"mdp-date-picker",!0);if(a)return e.toggleClass("md-input-message-animation",!0),{}}}}]),n.provider("$mdpDatePicker",function(){var e="OK",a="Cancel",i="ddd, MMM DD";this.setDisplayFormat=function(t){i=t},this.setOKButtonLabel=function(t){e=t},this.setCancelButtonLabel=function(t){a=t},this.$get=["$mdDialog",function(n){var r=function(r,o){return angular.isDate(r)||(r=Date.now()),angular.isObject(o)||(o={}),o.displayFormat=i,n.show({controller:["$scope","$mdDialog","$mdMedia","$timeout","currentDate","options",t],controllerAs:"datepicker",clickOutsideToClose:!0,template:'
{{ datepicker.date.format(\'YYYY\') }}{{ datepicker.date.format(datepicker.displayFormat) }}
{{ item }}
'+a+''+e+"
",targetEvent:o.targetEvent,locals:{currentDate:r,options:o},skipHide:!0})};return r}]}),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:"E",require:"ngModel",transclude:!0,template:'
',scope:{minDate:"@min",maxDate:"@max",dateFilter:"=mdpDateFilter",dateFormat:"@mdpFormat",placeholder:"@mdpPlaceholder"},link:function(e,a,i,n,r){function o(t){var a=moment(t,angular.isDate(t)?null:e.dateFormat,!0),i=a.format(e.dateFormat);a.isValid()?(s[0].size=i.length,n.$setViewValue(i)):(n.$pristine&&n.$invalid&&l.setInvalid(!0),n.$setViewValue(t)),!n.$pristine&&d.hasClass("md-auto-hide")&&c.hasClass("md-input-invalid")&&d.removeClass("md-auto-hide"),n.$render()}var s=angular.element(a[0].querySelector("input")),c=angular.element(a[0].querySelector("md-input-container")),l=c.controller("mdInputContainer");r(function(t){c.append(t)});var d=angular.element(c[0].querySelector("[ng-messages]"));e.type=e.dateFormat?"text":"date",e.dateFormat=e.dateFormat||"YYYY-MM-DD",e.placeholder=e.placeholder||e.dateFormat,e.autoSwitch=e.autoSwitch||!1,e.getValue=function(){var t=moment(n.$modelValue).format(e.dateFormat);return l.setHasValue(!n.$isEmpty(n.$modelValue)),t},e.$watch(function(){return n.$error},function(t,e){l.setInvalid(!n.$pristine&&!!Object.keys(n.$error).length)},!0),n.$validators.format=function(t,a){return!a||angular.isDate(a)||moment(a,e.dateFormat,!0).isValid()},n.$parsers.unshift(function(t){var a=moment(t,e.dateFormat,!0);if(a.isValid()){if(angular.isDate(n.$modelValue)){var i=moment(n.$modelValue);i.year(a.year()),i.month(a.month()),i.date(a.date()),a=i}return a.toDate()}return angular.isDate(n.$modelValue)?n.$modelValue:null}),e.showPicker=function(a){t(n.$modelValue,{minDate:e.minDate,maxDate:e.maxDate,dateFilter:e.dateFilter,targetEvent:a}).then(o)},s.on("input blur",function(t){o(t.target.value)}),e.$on("$destroy",function(){})}}}]),n.directive("mdpClock",["$animate","$timeout",function(t,e){return{restrict:"E",bindToController:{type:"@?",time:"=",autoSwitch:"=?"},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),o=function(t){var a=t.currentTarget.getClientRects()[0],i=t.currentTarget.offsetWidth/2-(t.pageX-a.left),o=t.pageY-a.top-t.currentTarget.offsetHeight/2,s=Math.round(Math.atan2(i,o)*(180/Math.PI));e(function(){n.setTimeByDeg(s+180),n.autoSwitch&&-1!==["mouseup","click"].indexOf(t.type)&&r&&r.switchView()})};a.on("mousedown",function(){a.on("mousemove",o)}),a.on("mouseup",function(t){a.off("mousemove",o)}),a.on("click",o),t.$on("$destroy",function(){a.off("click",o),a.off("mousemove",o)})}}}]),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","time","autoSwitch","$mdMedia",a],controllerAs:"timepicker",clickOutsideToClose:!0,template:'
{{ timepicker.time.format("h") }}:{{ timepicker.time.format("mm") }}
AMPM
'+e+''+t+"
",targetEvent:r.targetEvent,locals:{time:n,autoSwitch:r.autoSwitch},skipHide:!0})};return n}]}),n.directive("mdpTimePicker",["$mdpTimePicker","$timeout",function(t,e){return{restrict:"E",require:"ngModel",transclude:!0,template:'
',scope:{timeFormat:"@mdpFormat",placeholder:"@mdpPlaceholder",autoSwitch:"=?mdpAutoSwitch"},link:function(e,a,i,n,r){function o(t,a){var i=moment(t,angular.isDate(t)?null:e.timeFormat,!0),r=i.format(e.timeFormat);i.isValid()?(a&&s.val(r),s[0].size=r.length,n.$setViewValue(r)):(n.$pristine&&l.setInvalid(!0),n.$setViewValue(t)),!n.$pristine&&d.hasClass("md-auto-hide")&&c.hasClass("md-input-invalid")&&d.removeClass("md-auto-hide"),l.setHasValue(n.$isEmpty()),n.$render()}var s=angular.element(a[0].querySelector("input")),c=angular.element(a[0].querySelector("md-input-container")),l=c.controller("mdInputContainer");r(function(t){c.append(t)});var d=angular.element(c[0].querySelector("[ng-messages]"));e.type=e.timeFormat?"text":"time",e.timeFormat=e.timeFormat||"HH:mm",e.placeholder=e.placeholder||e.timeFormat,e.autoSwitch=e.autoSwitch||!1,e.$watch(function(){return n.$error},function(t,e){l.setInvalid(!n.$pristine&&!!Object.keys(n.$error).length)},!0),e.getValue=function(){var t=moment(n.$modelValue).format(e.timeFormat);return l.setHasValue(!n.$isEmpty(n.$modelValue)),t},n.$validators.format=function(t,a){return!a||angular.isDate(a)||moment(a,e.timeFormat,!0).isValid()},n.$parsers.unshift(function(t){var a=moment(t,e.timeFormat,!0);if(a.isValid()){if(angular.isDate(n.$modelValue)){var i=moment(n.$modelValue);i.minutes(a.minutes()),i.hours(a.hours()),i.seconds(a.seconds()),a=i}return a.toDate()}return angular.isDate(n.$modelValue)?n.$modelValue:null}),e.showPicker=function(a){t(n.$modelValue,{targetEvent:a,autoSwitch:e.autoSwitch}).then(function(t){o(t,!0)})},s.on("input blur",function(t){o(t.target.value)}),e.$on("$destroy",function(){})}}}])}(); +!function(){"use strict";function t(t,e,a,i,n,r){var o=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.displayFormat=r.displayFormat||"ddd, MMM DD",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:o.minDate?o.minDate.year():1900,END:o.maxDate?o.maxDate.year():0,getItemAtIndex:function(t){return this.currentIndex_a&&(a=this.weekDays.length-1);for(var i=[],n=1;a+t>=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,n){var r=this;this.VIEW_HOURS=1,this.VIEW_MINUTES=2,this.currentView=this.VIEW_HOURS,this.time=moment(a),this.autoSwitch=!!i,console.log(i),this.clockHours=parseInt(this.time.format("h")),this.clockMinutes=parseInt(this.time.minutes()),t.$mdMedia=n,this.switchView=function(){r.currentView=r.currentView==r.VIEW_HOURS?r.VIEW_MINUTES:r.VIEW_HOURS},this.setAM=function(){r.time.hours()>=12&&r.time.hour(r.time.hour()-12)},this.setPM=function(){r.time.hours()<12&&r.time.hour(r.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:''},{id:"mdp-access-time",url:"mdp-access-time.svg",svg:''},{id:"mdp-event",url:"mdp-event.svg",svg:''}]),n.directive("ngMessage",["$mdUtil",function(t){return{restrict:"EA",priority:101,compile:function(e){var a=t.getClosest(e,"mdp-time-picker",!0)||t.getClosest(e,"mdp-date-picker",!0);if(a)return e.toggleClass("md-input-message-animation",!0),{}}}}]),n.provider("$mdpDatePicker",function(){var e="OK",a="Cancel",i="ddd, MMM DD";this.setDisplayFormat=function(t){i=t},this.setOKButtonLabel=function(t){e=t},this.setCancelButtonLabel=function(t){a=t},this.$get=["$mdDialog",function(n){var r=function(r,o){return angular.isDate(r)||(r=Date.now()),angular.isObject(o)||(o={}),o.displayFormat=i,n.show({controller:["$scope","$mdDialog","$mdMedia","$timeout","currentDate","options",t],controllerAs:"datepicker",clickOutsideToClose:!0,template:'
{{ datepicker.date.format(\'YYYY\') }}{{ datepicker.date.format(datepicker.displayFormat) }}
{{ item }}
'+a+''+e+"
",targetEvent:o.targetEvent,locals:{currentDate:r,options:o},skipHide:!0})};return r}]}),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:"E",require:"ngModel",transclude:!0,template:'
',scope:{minDate:"@min",maxDate:"@max",dateFilter:"=mdpDateFilter",dateFormat:"@mdpFormat",placeholder:"@mdpPlaceholder"},link:function(e,a,i,n,r){function o(t){var a=moment(t,angular.isDate(t)?null:e.dateFormat,!0),i=a.format(e.dateFormat);a.isValid()?(s[0].size=i.length,n.$setViewValue(i)):(n.$pristine&&n.$invalid&&l.setInvalid(!0),n.$setViewValue(t)),!n.$pristine&&d.hasClass("md-auto-hide")&&c.hasClass("md-input-invalid")&&d.removeClass("md-auto-hide"),n.$render()}var s=angular.element(a[0].querySelector("input")),c=angular.element(a[0].querySelector("md-input-container")),l=c.controller("mdInputContainer");r(function(t){c.append(t)});var d=angular.element(c[0].querySelector("[ng-messages]"));e.type=e.dateFormat?"text":"date",e.dateFormat=e.dateFormat||"YYYY-MM-DD",e.placeholder=e.placeholder||e.dateFormat,e.autoSwitch=e.autoSwitch||!1,e.getValue=function(){if(angular.isDate(n.$modelValue)){var t=moment(n.$modelValue).format(e.dateFormat);return l.setHasValue(!n.$isEmpty(n.$modelValue)),t}return""},e.$watch(function(){return n.$error},function(t,e){l.setInvalid(!n.$pristine&&!!Object.keys(n.$error).length)},!0),n.$validators.format=function(t,a){return!a||angular.isDate(a)||moment(a,e.dateFormat,!0).isValid()},n.$parsers.unshift(function(t){var a=moment(t,e.dateFormat,!0);if(a.isValid()){if(angular.isDate(n.$modelValue)){var i=moment(n.$modelValue);i.year(a.year()),i.month(a.month()),i.date(a.date()),a=i}return a.toDate()}return angular.isDate(n.$modelValue)?n.$modelValue:null}),e.showPicker=function(a){t(n.$modelValue,{minDate:e.minDate,maxDate:e.maxDate,dateFilter:e.dateFilter,targetEvent:a}).then(o)},s.on("input blur",function(t){o(t.target.value)}),e.$on("$destroy",function(){})}}}]),n.directive("mdpClock",["$animate","$timeout",function(t,e){return{restrict:"E",bindToController:{type:"@?",time:"=",autoSwitch:"=?"},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),o=function(t){var a=t.currentTarget.getClientRects()[0],i=t.currentTarget.offsetWidth/2-(t.pageX-a.left),o=t.pageY-a.top-t.currentTarget.offsetHeight/2,s=Math.round(Math.atan2(i,o)*(180/Math.PI));e(function(){n.setTimeByDeg(s+180),n.autoSwitch&&-1!==["mouseup","click"].indexOf(t.type)&&r&&r.switchView()})};a.on("mousedown",function(){a.on("mousemove",o)}),a.on("mouseup",function(t){a.off("mousemove",o)}),a.on("click",o),t.$on("$destroy",function(){a.off("click",o),a.off("mousemove",o)})}}}]),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","time","autoSwitch","$mdMedia",a],controllerAs:"timepicker",clickOutsideToClose:!0,template:'
{{ timepicker.time.format("h") }}:{{ timepicker.time.format("mm") }}
AMPM
'+e+''+t+"
",targetEvent:r.targetEvent,locals:{time:n,autoSwitch:r.autoSwitch},skipHide:!0})};return n}]}),n.directive("mdpTimePicker",["$mdpTimePicker","$timeout",function(t,e){return{restrict:"E",require:"ngModel",transclude:!0,template:'
',scope:{timeFormat:"@mdpFormat",placeholder:"@mdpPlaceholder",autoSwitch:"=?mdpAutoSwitch"},link:function(e,a,i,n,r){function o(t,a){var i=moment(t,angular.isDate(t)?null:e.timeFormat,!0),r=i.format(e.timeFormat);i.isValid()?(a&&s.val(r),s[0].size=r.length,n.$setViewValue(r)):(n.$pristine&&l.setInvalid(!0),n.$setViewValue(t)),!n.$pristine&&d.hasClass("md-auto-hide")&&c.hasClass("md-input-invalid")&&d.removeClass("md-auto-hide"),l.setHasValue(n.$isEmpty()),n.$render()}var s=angular.element(a[0].querySelector("input")),c=angular.element(a[0].querySelector("md-input-container")),l=c.controller("mdInputContainer");r(function(t){c.append(t)});var d=angular.element(c[0].querySelector("[ng-messages]"));e.type=e.timeFormat?"text":"time",e.timeFormat=e.timeFormat||"HH:mm",e.placeholder=e.placeholder||e.timeFormat,e.autoSwitch=e.autoSwitch||!1,e.$watch(function(){return n.$error},function(t,e){l.setInvalid(!n.$pristine&&!!Object.keys(n.$error).length)},!0),e.getValue=function(){if(angular.isDate(n.$modelValue)){var t=moment(n.$modelValue).format(e.timeFormat);return l.setHasValue(!n.$isEmpty(n.$modelValue)),t}return""},n.$validators.format=function(t,a){return!a||angular.isDate(a)||moment(a,e.timeFormat,!0).isValid()},n.$parsers.unshift(function(t){var a=moment(t,e.timeFormat,!0);if(a.isValid()){if(angular.isDate(n.$modelValue)){var i=moment(n.$modelValue);i.minutes(a.minutes()),i.hours(a.hours()),i.seconds(a.seconds()),a=i}return a.toDate()}return angular.isDate(n.$modelValue)?n.$modelValue:null}),e.showPicker=function(a){t(n.$modelValue,{targetEvent:a,autoSwitch:e.autoSwitch}).then(function(t){o(t,!0)})},s.on("input blur",function(t){o(t.target.value)}),e.$on("$destroy",function(){})}}}])}(); //# sourceMappingURL=mdPickers.min.js.map diff --git a/dist/mdPickers.min.js.map b/dist/mdPickers.min.js.map index 2000982f..a75da4cf 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","displayFormat","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","dow","localeData","firstDayOfWeek","weekDays","concat","weekdaysMin","slice","daysInMonth","getDaysInMonth","days","firstDay","day","length","arr","i","value","enabled","isDayEnabled","push","selectDate","dom","nextMonth","prevMonth","subtract","updateDaysInMonth","$watch","unix","newValue","oldValue","TimePickerCtrl","time","autoSwitch","VIEW_HOURS","VIEW_MINUTES","currentView","console","log","clockHours","parseInt","format","clockMinutes","minutes","switchView","setAM","hours","hour","setPM","ClockCtrl","TYPE_HOURS","TYPE_MINUTES","STEP_DEG","steps","CLOCK_TYPES","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","directive","$mdUtil","restrict","priority","compile","element","inputContainer","getClosest","toggleClass","provider","LABEL_OK","LABEL_CANCEL","DISPLAY_FORMAT","setDisplayFormat","setOKButtonLabel","label","setCancelButtonLabel","$get","datePicker","isDate","Date","now","isObject","show","controller","controllerAs","clickOutsideToClose","template","targetEvent","locals","skipHide","$animate","bindToController","link","scope","attrs","ctrl","animElements","querySelector","map","a","direction","addClass","removeClass","$mdpDatePicker","require","transclude","dateFormat","placeholder","ngModel","$transclude","updateDate","strValue","inputElement","size","$setViewValue","$pristine","$invalid","inputContainerCtrl","setInvalid","messages","hasClass","$render","clone","append","getValue","strVal","$modelValue","setHasValue","$isEmpty","$error","Object","keys","$validators","modelValue","viewValue","$parsers","unshift","parsed","originalModel","month","showPicker","ev","on","event","target","$on","replace","timepickerCtrl","$parent","timepicker","onEvent","containerCoords","currentTarget","getClientRects","x","offsetWidth","pageX","left","y","pageY","top","offsetHeight","atan2","PI","indexOf","e","off","timePicker","$mdpTimePicker","timeFormat","updateTime","updateInput","val","seconds"],"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 id: 'mdp-access-time',\n url: 'mdp-access-time.svg',\n svg: ''\n },\n {\n id: 'mdp-event',\n url: 'mdp-event.svg',\n svg: ''\n }\n]);\nmodule.directive(\"ngMessage\", [\"$mdUtil\", function($mdUtil) {\n return {\n restrict: \"EA\",\n priority: 101,\n compile: function(element) {\n var inputContainer = $mdUtil.getClosest(element, \"mdp-time-picker\", true) ||\n $mdUtil.getClosest(element, \"mdp-date-picker\", true);\n \n // If we are not a child of an input container, don't do anything\n if (!inputContainer) return;\n \n // Add our animation class\n element.toggleClass('md-input-message-animation', true);\n \n return {};\n }\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.displayFormat = options.displayFormat || \"ddd, MMM DD\";\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 DISPLAY_FORMAT = \"ddd, MMM DD\";\n \n this.setDisplayFormat = function(format) {\n DISPLAY_FORMAT = format; \n };\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 options.displayFormat = DISPLAY_FORMAT;\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(datepicker.displayFormat) }} ' +\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 skipHide: true\n });\n };\n \n return datePicker;\n }];\n});\n\nfunction CalendarCtrl($scope) {\n\tvar self = this;\n\tthis.dow = moment.localeData().firstDayOfWeek();\n\t\n this.weekDays = [].concat(\n moment.weekdaysMin().slice(\n this.dow\n ),\n moment.weekdaysMin().slice(\n 0, \n this.dow\n )\n );\n \n this.daysInMonth = [];\n \n this.getDaysInMonth = function() {\n var days = self.date.daysInMonth(),\n firstDay = moment(self.date).date(1).day() - this.dow;\n \n if(firstDay < 0) firstDay = this.weekDays.length - 1;\n \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: 'E',\n require: 'ngModel',\n transclude: true,\n template: '
' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
',\n scope: {\n \"minDate\": \"@min\",\n \"maxDate\": \"@max\",\n \"dateFilter\": \"=mdpDateFilter\",\n \"dateFormat\": \"@mdpFormat\",\n \"placeholder\": \"@mdpPlaceholder\"\n },\n link: function(scope, element, attrs, ngModel, $transclude) {\n var inputElement = angular.element(element[0].querySelector('input')),\n inputContainer = angular.element(element[0].querySelector('md-input-container')),\n inputContainerCtrl = inputContainer.controller(\"mdInputContainer\");\n \n $transclude(function(clone) {\n inputContainer.append(clone); \n });\n \n var messages = angular.element(inputContainer[0].querySelector(\"[ng-messages]\"));\n \n scope.type = scope.dateFormat ? \"text\" : \"date\"\n scope.dateFormat = scope.dateFormat || \"YYYY-MM-DD\";\n scope.placeholder = scope.placeholder || scope.dateFormat;\n scope.autoSwitch = scope.autoSwitch || false;\n \n scope.getValue = function() {\n var strVal = moment(ngModel.$modelValue).format(scope.dateFormat);\n inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue));\n \n return strVal;\n };\n \n scope.$watch(function() { return ngModel.$error }, function(newValue, oldValue) {\n inputContainerCtrl.setInvalid(!ngModel.$pristine && !!Object.keys(ngModel.$error).length);\n }, true);\n \n ngModel.$validators.format = function(modelValue, viewValue) {\n return !viewValue || angular.isDate(viewValue) || moment(viewValue, scope.dateFormat, true).isValid();\n };\n \n ngModel.$parsers.unshift(function(value) {\n var parsed = moment(value, scope.dateFormat, true);\n if(parsed.isValid()) {\n if(angular.isDate(ngModel.$modelValue)) {\n var originalModel = moment(ngModel.$modelValue);\n originalModel.year(parsed.year());\n originalModel.month(parsed.month());\n originalModel.date(parsed.date());\n \n parsed = originalModel;\n }\n return parsed.toDate(); \n } else\n return angular.isDate(ngModel.$modelValue) ? ngModel.$modelValue : null;\n });\n \n function updateDate(date) {\n var value = moment(date, angular.isDate(date) ? null : scope.dateFormat, true),\n strValue = value.format(scope.dateFormat);\n\n if(value.isValid()) {\n inputElement[0].size = strValue.length;\n ngModel.$setViewValue(strValue);\n } else {\n if(ngModel.$pristine && ngModel.$invalid) inputContainerCtrl.setInvalid(true);\n ngModel.$setViewValue(date);\n }\n if(!ngModel.$pristine && messages.hasClass(\"md-auto-hide\") && inputContainer.hasClass(\"md-input-invalid\")) messages.removeClass(\"md-auto-hide\");\n \n \tngModel.$render();\n }\n \n scope.showPicker = function(ev) {\n $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(updateDate);\n };\n \n inputElement.on(\"input blur\", function(event) {\n updateDate(event.target.value);\n });\n \n scope.$on(\"$destroy\", function() {\n })\n }\n };\n}]);\n/* global moment, angular */\n\nfunction TimePickerCtrl($scope, $mdDialog, time, autoSwitch, $mdMedia) {\n\tvar self = this;\n this.VIEW_HOURS = 1;\n this.VIEW_MINUTES = 2;\n this.currentView = this.VIEW_HOURS;\n this.time = moment(time);\n this.autoSwitch = !!autoSwitch;\n console.log(autoSwitch);\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.hours() >= 12)\n self.time.hour(self.time.hour() - 12);\n\t};\n \n this.setPM = function() {\n if(self.time.hours() < 12)\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 'autoSwitch': '=?'\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(ctrl.autoSwitch && [\"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(time, options) {\n if(!angular.isDate(time)) time = Date.now();\n if (!angular.isObject(options)) options = {};\n \n return $mdDialog.show({\n controller: ['$scope', '$mdDialog', 'time', 'autoSwitch', '$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 '= 12 }\">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 time: time,\n autoSwitch: options.autoSwitch\n },\n skipHide: true\n });\n };\n \n return timePicker;\n }];\n});\n\nmodule.directive(\"mdpTimePicker\", [\"$mdpTimePicker\", \"$timeout\", function($mdpTimePicker, $timeout) {\n return {\n restrict: 'E',\n require: 'ngModel',\n transclude: true,\n template: '
' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
',\n scope: {\n \"timeFormat\": \"@mdpFormat\",\n \"placeholder\": \"@mdpPlaceholder\",\n \"autoSwitch\": \"=?mdpAutoSwitch\",\n },\n link: function(scope, element, attrs, ngModel, $transclude) {\n var inputElement = angular.element(element[0].querySelector('input')),\n inputContainer = angular.element(element[0].querySelector('md-input-container')),\n inputContainerCtrl = inputContainer.controller(\"mdInputContainer\");\n \n $transclude(function(clone) {\n inputContainer.append(clone); \n });\n \n var messages = angular.element(inputContainer[0].querySelector(\"[ng-messages]\"));\n \n scope.type = scope.timeFormat ? \"text\" : \"time\"\n scope.timeFormat = scope.timeFormat || \"HH:mm\";\n scope.placeholder = scope.placeholder || scope.timeFormat;\n scope.autoSwitch = scope.autoSwitch || false;\n \n scope.$watch(function() { return ngModel.$error }, function(newValue, oldValue) {\n inputContainerCtrl.setInvalid(!ngModel.$pristine && !!Object.keys(ngModel.$error).length);\n }, true);\n \n scope.getValue = function() {\n var strVal = moment(ngModel.$modelValue).format(scope.timeFormat);\n inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue));\n \n return strVal;\n };\n \n ngModel.$validators.format = function(modelValue, viewValue) {\n return !viewValue || angular.isDate(viewValue) || moment(viewValue, scope.timeFormat, true).isValid();\n };\n \n ngModel.$parsers.unshift(function(value) {\n var parsed = moment(value, scope.timeFormat, true);\n if(parsed.isValid()) {\n if(angular.isDate(ngModel.$modelValue)) {\n var originalModel = moment(ngModel.$modelValue);\n originalModel.minutes(parsed.minutes());\n originalModel.hours(parsed.hours());\n originalModel.seconds(parsed.seconds());\n \n parsed = originalModel;\n }\n return parsed.toDate(); \n } else\n return angular.isDate(ngModel.$modelValue) ? ngModel.$modelValue : null;\n });\n \n function updateTime(time, updateInput) {\n var value = moment(time, angular.isDate(time) ? null : scope.timeFormat, true),\n strValue = value.format(scope.timeFormat);\n\n if(value.isValid()) {\n if(updateInput) inputElement.val(strValue);\n inputElement[0].size = strValue.length;\n ngModel.$setViewValue(strValue);\n } else {\n if(ngModel.$pristine) inputContainerCtrl.setInvalid(true);\n ngModel.$setViewValue(time);\n }\n if(!ngModel.$pristine && messages.hasClass(\"md-auto-hide\") && inputContainer.hasClass(\"md-input-invalid\")) messages.removeClass(\"md-auto-hide\");\n \n inputContainerCtrl.setHasValue(ngModel.$isEmpty());\n \n \tngModel.$render();\n }\n \n scope.showPicker = function(ev) {\n $mdpTimePicker(ngModel.$modelValue, {\n targetEvent: ev,\n autoSwitch: scope.autoSwitch\n }).then(function(time) {\n updateTime(time, true);\n });\n };\n \n inputElement.on(\"input blur\", function(event) {\n updateTime(event.target.value);\n });\n \n scope.$on(\"$destroy\", function() {\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","displayFormat","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","dow","localeData","firstDayOfWeek","weekDays","concat","weekdaysMin","slice","daysInMonth","getDaysInMonth","days","firstDay","day","length","arr","i","value","enabled","isDayEnabled","push","selectDate","dom","nextMonth","prevMonth","subtract","updateDaysInMonth","$watch","unix","newValue","oldValue","TimePickerCtrl","time","autoSwitch","VIEW_HOURS","VIEW_MINUTES","currentView","console","log","clockHours","parseInt","format","clockMinutes","minutes","switchView","setAM","hours","hour","setPM","ClockCtrl","TYPE_HOURS","TYPE_MINUTES","STEP_DEG","steps","CLOCK_TYPES","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","directive","$mdUtil","restrict","priority","compile","element","inputContainer","getClosest","toggleClass","provider","LABEL_OK","LABEL_CANCEL","DISPLAY_FORMAT","setDisplayFormat","setOKButtonLabel","label","setCancelButtonLabel","$get","datePicker","isDate","Date","now","isObject","show","controller","controllerAs","clickOutsideToClose","template","targetEvent","locals","skipHide","$animate","bindToController","link","scope","attrs","ctrl","animElements","querySelector","map","a","direction","addClass","removeClass","$mdpDatePicker","require","transclude","dateFormat","placeholder","ngModel","$transclude","updateDate","strValue","inputElement","size","$setViewValue","$pristine","$invalid","inputContainerCtrl","setInvalid","messages","hasClass","$render","clone","append","getValue","$modelValue","strVal","setHasValue","$isEmpty","$error","Object","keys","$validators","modelValue","viewValue","$parsers","unshift","parsed","originalModel","month","showPicker","ev","on","event","target","$on","replace","timepickerCtrl","$parent","timepicker","onEvent","containerCoords","currentTarget","getClientRects","x","offsetWidth","pageX","left","y","pageY","top","offsetHeight","atan2","PI","indexOf","e","off","timePicker","$mdpTimePicker","timeFormat","updateTime","updateInput","val","seconds"],"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 id: 'mdp-access-time',\n url: 'mdp-access-time.svg',\n svg: ''\n },\n {\n id: 'mdp-event',\n url: 'mdp-event.svg',\n svg: ''\n }\n]);\nmodule.directive(\"ngMessage\", [\"$mdUtil\", function($mdUtil) {\n return {\n restrict: \"EA\",\n priority: 101,\n compile: function(element) {\n var inputContainer = $mdUtil.getClosest(element, \"mdp-time-picker\", true) ||\n $mdUtil.getClosest(element, \"mdp-date-picker\", true);\n \n // If we are not a child of an input container, don't do anything\n if (!inputContainer) return;\n \n // Add our animation class\n element.toggleClass('md-input-message-animation', true);\n \n return {};\n }\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.displayFormat = options.displayFormat || \"ddd, MMM DD\";\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 DISPLAY_FORMAT = \"ddd, MMM DD\";\n \n this.setDisplayFormat = function(format) {\n DISPLAY_FORMAT = format; \n };\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 options.displayFormat = DISPLAY_FORMAT;\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(datepicker.displayFormat) }} ' +\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 skipHide: true\n });\n };\n \n return datePicker;\n }];\n});\n\nfunction CalendarCtrl($scope) {\n\tvar self = this;\n\tthis.dow = moment.localeData().firstDayOfWeek();\n\t\n this.weekDays = [].concat(\n moment.weekdaysMin().slice(\n this.dow\n ),\n moment.weekdaysMin().slice(\n 0, \n this.dow\n )\n );\n \n this.daysInMonth = [];\n \n this.getDaysInMonth = function() {\n var days = self.date.daysInMonth(),\n firstDay = moment(self.date).date(1).day() - this.dow;\n \n if(firstDay < 0) firstDay = this.weekDays.length - 1;\n \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: 'E',\n require: 'ngModel',\n transclude: true,\n template: '
' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
',\n scope: {\n \"minDate\": \"@min\",\n \"maxDate\": \"@max\",\n \"dateFilter\": \"=mdpDateFilter\",\n \"dateFormat\": \"@mdpFormat\",\n \"placeholder\": \"@mdpPlaceholder\"\n },\n link: function(scope, element, attrs, ngModel, $transclude) {\n var inputElement = angular.element(element[0].querySelector('input')),\n inputContainer = angular.element(element[0].querySelector('md-input-container')),\n inputContainerCtrl = inputContainer.controller(\"mdInputContainer\");\n \n $transclude(function(clone) {\n inputContainer.append(clone); \n });\n \n var messages = angular.element(inputContainer[0].querySelector(\"[ng-messages]\"));\n \n scope.type = scope.dateFormat ? \"text\" : \"date\"\n scope.dateFormat = scope.dateFormat || \"YYYY-MM-DD\";\n scope.placeholder = scope.placeholder || scope.dateFormat;\n scope.autoSwitch = scope.autoSwitch || false;\n \n scope.getValue = function() {\n if(angular.isDate(ngModel.$modelValue)) {\n var strVal = moment(ngModel.$modelValue).format(scope.dateFormat);\n inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue));\n \n return strVal;\n } else return \"\";\n };\n \n scope.$watch(function() { return ngModel.$error }, function(newValue, oldValue) {\n inputContainerCtrl.setInvalid(!ngModel.$pristine && !!Object.keys(ngModel.$error).length);\n }, true);\n \n ngModel.$validators.format = function(modelValue, viewValue) {\n return !viewValue || angular.isDate(viewValue) || moment(viewValue, scope.dateFormat, true).isValid();\n };\n \n ngModel.$parsers.unshift(function(value) {\n var parsed = moment(value, scope.dateFormat, true);\n if(parsed.isValid()) {\n if(angular.isDate(ngModel.$modelValue)) {\n var originalModel = moment(ngModel.$modelValue);\n originalModel.year(parsed.year());\n originalModel.month(parsed.month());\n originalModel.date(parsed.date());\n \n parsed = originalModel;\n }\n return parsed.toDate(); \n } else\n return angular.isDate(ngModel.$modelValue) ? ngModel.$modelValue : null;\n });\n \n function updateDate(date) {\n var value = moment(date, angular.isDate(date) ? null : scope.dateFormat, true),\n strValue = value.format(scope.dateFormat);\n\n if(value.isValid()) {\n inputElement[0].size = strValue.length;\n ngModel.$setViewValue(strValue);\n } else {\n if(ngModel.$pristine && ngModel.$invalid) inputContainerCtrl.setInvalid(true);\n ngModel.$setViewValue(date);\n }\n if(!ngModel.$pristine && messages.hasClass(\"md-auto-hide\") && inputContainer.hasClass(\"md-input-invalid\")) messages.removeClass(\"md-auto-hide\");\n \n \tngModel.$render();\n }\n \n scope.showPicker = function(ev) {\n $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(updateDate);\n };\n \n inputElement.on(\"input blur\", function(event) {\n updateDate(event.target.value);\n });\n \n scope.$on(\"$destroy\", function() {\n })\n }\n };\n}]);\n/* global moment, angular */\n\nfunction TimePickerCtrl($scope, $mdDialog, time, autoSwitch, $mdMedia) {\n\tvar self = this;\n this.VIEW_HOURS = 1;\n this.VIEW_MINUTES = 2;\n this.currentView = this.VIEW_HOURS;\n this.time = moment(time);\n this.autoSwitch = !!autoSwitch;\n console.log(autoSwitch);\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.hours() >= 12)\n self.time.hour(self.time.hour() - 12);\n\t};\n \n this.setPM = function() {\n if(self.time.hours() < 12)\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 'autoSwitch': '=?'\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(ctrl.autoSwitch && [\"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(time, options) {\n if(!angular.isDate(time)) time = Date.now();\n if (!angular.isObject(options)) options = {};\n \n return $mdDialog.show({\n controller: ['$scope', '$mdDialog', 'time', 'autoSwitch', '$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 '= 12 }\">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 time: time,\n autoSwitch: options.autoSwitch\n },\n skipHide: true\n });\n };\n \n return timePicker;\n }];\n});\n\nmodule.directive(\"mdpTimePicker\", [\"$mdpTimePicker\", \"$timeout\", function($mdpTimePicker, $timeout) {\n return {\n restrict: 'E',\n require: 'ngModel',\n transclude: true,\n template: '
' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '
',\n scope: {\n \"timeFormat\": \"@mdpFormat\",\n \"placeholder\": \"@mdpPlaceholder\",\n \"autoSwitch\": \"=?mdpAutoSwitch\",\n },\n link: function(scope, element, attrs, ngModel, $transclude) {\n var inputElement = angular.element(element[0].querySelector('input')),\n inputContainer = angular.element(element[0].querySelector('md-input-container')),\n inputContainerCtrl = inputContainer.controller(\"mdInputContainer\");\n \n $transclude(function(clone) {\n inputContainer.append(clone); \n });\n \n var messages = angular.element(inputContainer[0].querySelector(\"[ng-messages]\"));\n \n scope.type = scope.timeFormat ? \"text\" : \"time\"\n scope.timeFormat = scope.timeFormat || \"HH:mm\";\n scope.placeholder = scope.placeholder || scope.timeFormat;\n scope.autoSwitch = scope.autoSwitch || false;\n \n scope.$watch(function() { return ngModel.$error }, function(newValue, oldValue) {\n inputContainerCtrl.setInvalid(!ngModel.$pristine && !!Object.keys(ngModel.$error).length);\n }, true);\n \n scope.getValue = function() {\n if(angular.isDate(ngModel.$modelValue)) {\n var strVal = moment(ngModel.$modelValue).format(scope.timeFormat);\n inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue));\n \n return strVal;\n } else return \"\";\n };\n \n ngModel.$validators.format = function(modelValue, viewValue) {\n return !viewValue || angular.isDate(viewValue) || moment(viewValue, scope.timeFormat, true).isValid();\n };\n \n ngModel.$parsers.unshift(function(value) {\n var parsed = moment(value, scope.timeFormat, true);\n if(parsed.isValid()) {\n if(angular.isDate(ngModel.$modelValue)) {\n var originalModel = moment(ngModel.$modelValue);\n originalModel.minutes(parsed.minutes());\n originalModel.hours(parsed.hours());\n originalModel.seconds(parsed.seconds());\n \n parsed = originalModel;\n }\n return parsed.toDate(); \n } else\n return angular.isDate(ngModel.$modelValue) ? ngModel.$modelValue : null;\n });\n \n function updateTime(time, updateInput) {\n var value = moment(time, angular.isDate(time) ? null : scope.timeFormat, true),\n strValue = value.format(scope.timeFormat);\n\n if(value.isValid()) {\n if(updateInput) inputElement.val(strValue);\n inputElement[0].size = strValue.length;\n ngModel.$setViewValue(strValue);\n } else {\n if(ngModel.$pristine) inputContainerCtrl.setInvalid(true);\n ngModel.$setViewValue(time);\n }\n if(!ngModel.$pristine && messages.hasClass(\"md-auto-hide\") && inputContainer.hasClass(\"md-input-invalid\")) messages.removeClass(\"md-auto-hide\");\n \n inputContainerCtrl.setHasValue(ngModel.$isEmpty());\n \n \tngModel.$render();\n }\n \n scope.showPicker = function(ev) {\n $mdpTimePicker(ngModel.$modelValue, {\n targetEvent: ev,\n autoSwitch: scope.autoSwitch\n }).then(function(time) {\n updateTime(time, true);\n });\n };\n \n inputElement.on(\"input blur\", function(event) {\n updateTime(event.target.value);\n });\n \n scope.$on(\"$destroy\", function() {\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 d33e3d67..31e344ee 100644 --- a/src/components/mdpDatePicker/mdpDatePicker.js +++ b/src/components/mdpDatePicker/mdpDatePicker.js @@ -320,10 +320,12 @@ module.directive("mdpDatePicker", ["$mdpDatePicker", "$timeout", function($mdpDa scope.autoSwitch = scope.autoSwitch || false; scope.getValue = function() { - var strVal = moment(ngModel.$modelValue).format(scope.dateFormat); - inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue)); - - return strVal; + if(angular.isDate(ngModel.$modelValue)) { + var strVal = moment(ngModel.$modelValue).format(scope.dateFormat); + inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue)); + + return strVal; + } else return ""; }; scope.$watch(function() { return ngModel.$error }, function(newValue, oldValue) { diff --git a/src/components/mdpTimePicker/mdpTimePicker.js b/src/components/mdpTimePicker/mdpTimePicker.js index cc7d8cae..bd6c6c65 100644 --- a/src/components/mdpTimePicker/mdpTimePicker.js +++ b/src/components/mdpTimePicker/mdpTimePicker.js @@ -280,10 +280,12 @@ module.directive("mdpTimePicker", ["$mdpTimePicker", "$timeout", function($mdpTi }, true); scope.getValue = function() { - var strVal = moment(ngModel.$modelValue).format(scope.timeFormat); - inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue)); - - return strVal; + if(angular.isDate(ngModel.$modelValue)) { + var strVal = moment(ngModel.$modelValue).format(scope.timeFormat); + inputContainerCtrl.setHasValue(!ngModel.$isEmpty(ngModel.$modelValue)); + + return strVal; + } else return ""; }; ngModel.$validators.format = function(modelValue, viewValue) {