From 3a49e5ca5b3155466d43e6a0b4a744747638ac67 Mon Sep 17 00:00:00 2001 From: Peter V Date: Thu, 30 Mar 2017 14:11:47 -0500 Subject: [PATCH] Implemented Moment.js Date formatting feature upgraded to be able to parse variety of formats. Moment.js is now required. --- .gitignore | 2 ++ README.md | 2 +- angularjs-datetime-picker.js | 23 +++-------------------- angularjs-datetime-picker.min.js | 2 +- bower.json | 5 +++-- package.json | 2 +- 6 files changed, 11 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 123ae94..74a8f08 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ build/Release # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules + +bower_components diff --git a/README.md b/README.md index 44c799b..fdfb6d7 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Simple DateTime Picker For AngularJS =================================== -No JQuery, No Bootstrap, Just AngularJS (ver. 1.3+) +No JQuery, No Bootstrap, Just AngularJS (ver. 1.3+) and Moment.js(Required) [DEMO](https://rawgit.com/kineticsocial/angularjs-datetime-picker/master/index.html) [![Imgur](http://i.imgur.com/UJfYMN6.png?1)](https://rawgit.com/kineticsocial/angularjs-datetime-picker/master/index.html) diff --git a/angularjs-datetime-picker.js b/angularjs-datetime-picker.js index e86247d..da11349 100644 --- a/angularjs-datetime-picker.js +++ b/angularjs-datetime-picker.js @@ -205,24 +205,7 @@ if (attrs.ngModel) { // need to parse date string var dateStr = ''+ctrl.triggerEl.scope().$eval(attrs.ngModel); if (dateStr) { - if (!dateStr.match(/[0-9]{2}:/)) { // if no time is given, add 00:00:00 at the end - dateStr += " 00:00:00"; - } - dateStr = dateStr.replace(/([0-9]{2}-[0-9]{2})-([0-9]{4})/,'$2-$1'); //mm-dd-yyyy to yyyy-mm-dd - dateStr = dateStr.replace(/([\/-][0-9]{2,4})\ ([0-9]{2}\:[0-9]{2}\:)/,'$1T$2'); //reformat for FF - dateStr = dateStr.replace(/EDT|EST|CDT|CST|MDT|PDT|PST|UT|GMT/g,''); //remove timezone - dateStr = dateStr.replace(/\s*\(\)\s*/,''); //remove timezone - dateStr = dateStr.replace(/[\-\+][0-9]{2}:?[0-9]{2}$/,''); //remove timezone - dateStr += getTimezoneOffset(dateStr); - var d = new Date(dateStr); - scope.selectedDate = new Date( - d.getFullYear(), - d.getMonth(), - d.getDate(), - d.getHours(), - d.getMinutes(), - d.getSeconds() - ); + scope.selectedDate = moment(dateStr, dateFormat).toDate(); } } @@ -272,9 +255,9 @@ //console.log('attrs.ngModel',attrs.ngModel); var elScope = ctrl.triggerEl.scope(), dateValue; if (elScope.$eval(attrs.ngModel) && elScope.$eval(attrs.ngModel).constructor.name === 'Date') { - dateValue = new Date(dateFilter(scope.selectedDate, dateFormat)); + dateValue = scope.selectedDate; } else { - dateValue = dateFilter(scope.selectedDate, dateFormat); + dateValue = moment(scope.selectedDate).format(dateFormat); } elScope.$eval(attrs.ngModel + '= date', {date: dateValue}); } diff --git a/angularjs-datetime-picker.min.js b/angularjs-datetime-picker.min.js index fe3a6bc..69a5df0 100644 --- a/angularjs-datetime-picker.min.js +++ b/angularjs-datetime-picker.min.js @@ -1 +1 @@ -!function(){"use strict";angular.module("angularjs-datetime-picker",[]);var e=function(e){"string"==typeof e&&(e=new Date(e));var t=new Date(e.getFullYear(),0,1),a=new Date(e.getFullYear(),6,1),n=Math.max(t.getTimezoneOffset(),a.getTimezoneOffset()),l=e.getTimezoneOffset()=0?"-":"+";return r+("0"+i/60).slice(-2)+":"+("0"+i%60).slice(-2)},t=function(e,t,a){var n=a("DatetimePickerCtrl");return{open:function(e){n.openDatetimePicker(e)},close:function(){n.closeDatetimePicker()}}};t.$inject=["$compile","$document","$controller"],angular.module("angularjs-datetime-picker").factory("DatetimePicker",t);var a=function(e,t){var a,n=this,l=function(e){e&&e.remove(),t[0].body.removeEventListener("click",n.closeDatetimePicker)};this.openDatetimePicker=function(n){this.closeDatetimePicker();var l=angular.element("
");n.dateFormat&&l.attr("date-format",n.dateFormat),n.ngModel&&l.attr("ng-model",n.ngModel),n.year&&l.attr("year",parseInt(n.year)),n.month&&l.attr("month",parseInt(n.month)),n.day&&l.attr("day",parseInt(n.day)),n.hour&&l.attr("hour",parseInt(n.hour)),n.minute&&l.attr("minute",parseInt(n.minute)),(""===n.dateOnly||n.dateOnly===!0)&&l.attr("date-only","true"),"false"===n.closeOnSelect&&l.attr("close-on-select","false");var i=n.triggerEl;n.scope=n.scope||angular.element(i).scope(),a=e(l)(n.scope)[0],a.triggerEl=n.triggerEl,t[0].body.appendChild(a);var r=i.getBoundingClientRect();n.scope.$apply();var o=a.getBoundingClientRect();a.style.position="absolute",a.style.left=r.width>o.width?r.left+r.width-o.width+window.scrollX+"px":r.left+window.scrollX+"px",a.style.top=r.top<300||window.innerHeight-r.bottom>300?r.bottom+window.scrollY+"px":r.top-o.height+window.scrollY+"px",t[0].body.addEventListener("click",this.closeDatetimePicker)},this.closeDatetimePicker=function(e){var a=e&&e.target,n=t[0].querySelector("div[datetime-picker-popup]");e&&a?a.hasAttribute("datetime-picker")||n&&n.contains(a)||l(n):l(n)}};a.$inject=["$compile","$document"],angular.module("angularjs-datetime-picker").controller("DatetimePickerCtrl",a);var n=['
','
',' ',' {{months[mv.month].shortName}} {{mv.year}}',' ',"
",'
','
{{::dayOfWeek.firstLetter}}
','
{{::day}}
','
'," {{::day}}","
",'
{{::day}}
',"
",'
',' {{("0"+inputHour).slice(-2)}} : {{("0"+inputMinute).slice(-2)}}
',' ',' ',"
","
"].join("\n"),l=function(t,a){var l,i,r,o,d=function(){l=[],i=[],r=[],o=0;for(var e=1;31>=e;e++)l.push(e);for(var e=0;12>e;e++)i.push({fullName:t.DATETIME_FORMATS.MONTH[e],shortName:t.DATETIME_FORMATS.SHORTMONTH[e]});for(var e=0;7>e;e++){var a=t.DATETIME_FORMATS.DAY[(e+o)%7];r.push({fullName:a,firstLetter:a.substr(0,1)})}o=0},s=function(e,t){t>11?e++:0>t&&e--,t=(t+12)%12;var a=new Date(e,t,1),n=new Date(e,t+1,0),i=new Date(e,t,0),r=n.getDate(),d=i.getDate(),s=a.getDay(),c=(s-o+7)%7||7,u=l.slice(0,42-(c+r));return u.length>7&&(u=u.slice(0,u.length-7)),{year:e,month:t,days:l.slice(0,r),leadingDays:l.slice(-c-(31-d),d),trailingDays:u}},c=function(t,n,l,o){d();var c=l.dateFormat||"short";t.months=i,t.daysOfWeek=r,t.inputHour,t.inputMinute,t.dateOnly===!0&&(n[0].querySelector("#adp-time").style.display="none"),t.$applyAsync(function(){if(o.triggerEl=angular.element(n[0].triggerEl),l.ngModel){var i=""+o.triggerEl.scope().$eval(l.ngModel);if(i){i.match(/[0-9]{2}:/)||(i+=" 00:00:00"),i=i.replace(/([0-9]{2}-[0-9]{2})-([0-9]{4})/,"$2-$1"),i=i.replace(/([\/-][0-9]{2,4})\ ([0-9]{2}\:[0-9]{2}\:)/,"$1T$2"),i=i.replace(/EDT|EST|CDT|CST|MDT|PDT|PST|UT|GMT/g,""),i=i.replace(/\s*\(\)\s*/,""),i=i.replace(/[\-\+][0-9]{2}:?[0-9]{2}$/,""),i+=e(i);var r=new Date(i);t.selectedDate=new Date(r.getFullYear(),r.getMonth(),r.getDate(),r.getHours(),r.getMinutes(),r.getSeconds())}}if(!t.selectedDate||isNaN(t.selectedDate.getTime())){var d=new Date,c=t.year||d.getFullYear(),u=t.month?t.month-1:d.getMonth(),m=t.day||d.getDate(),g=t.hour||d.getHours(),p=t.minute||d.getMinutes();t.selectedDate=new Date(c,u,m,g,p,0)}t.inputHour=t.selectedDate.getHours(),t.inputMinute=t.selectedDate.getMinutes(),t.mv=s(t.selectedDate.getFullYear(),t.selectedDate.getMonth()),t.today=a(new Date,"yyyy-M-d"),t.selectedDay=t.mv.year==t.selectedDate.getFullYear()&&t.mv.month==t.selectedDate.getMonth()?t.selectedDate.getDate():null}),t.addMonth=function(e){t.mv=s(t.mv.year,t.mv.month+e)},t.setDate=function(e){var a=angular.element(e.target)[0];-1!==a.className.indexOf("selectable")&&(t.updateNgModel(parseInt(a.innerHTML)),t.closeOnSelect!==!1&&o.closeDatetimePicker())},t.updateNgModel=function(e){if(e=e?e:t.selectedDate.getDate(),t.selectedDate=new Date(t.mv.year,t.mv.month,e,t.inputHour,t.inputMinute,0),t.selectedDay=t.selectedDate.getDate(),l.ngModel){var n,i=o.triggerEl.scope();n=i.$eval(l.ngModel)&&"Date"===i.$eval(l.ngModel).constructor.name?new Date(a(t.selectedDate,c)):a(t.selectedDate,c),i.$eval(l.ngModel+"= date",{date:n})}},t.$on("$destroy",o.closeDatetimePicker)};return{restrict:"A",template:n,controller:"DatetimePickerCtrl",replace:!0,scope:{year:"=",month:"=",day:"=",hour:"=",minute:"=",dateOnly:"=",closeOnSelect:"="},link:c}};l.$inject=["$locale","dateFilter"],angular.module("angularjs-datetime-picker").directive("datetimePickerPopup",l);var i=function(e,t){return{require:"ngModel",link:function(e,a,n,l){e.$watch(n.ngModel,function(e){if(e&&""!=e){var t=new Date(e);l.$setValidity("date",t?!0:!1);var a=new Date;n.hasOwnProperty("futureOnly")&&l.$setValidity("future-only",a>t?!1:!0)}}),a[0].addEventListener("click",function(){t.open({triggerEl:a[0],dateFormat:n.dateFormat,ngModel:n.ngModel,year:n.year,month:n.month,day:n.day,hour:n.hour,minute:n.minute,dateOnly:n.dateOnly,futureOnly:n.futureOnly,closeOnSelect:n.closeOnSelect})})}}};i.$inject=["$parse","DatetimePicker"],angular.module("angularjs-datetime-picker").directive("datetimePicker",i)}(); \ No newline at end of file +!function(){"use strict";angular.module("angularjs-datetime-picker",[]);var e=function(e,t,a){var n=a("DatetimePickerCtrl");return{open:function(e){n.openDatetimePicker(e)},close:function(){n.closeDatetimePicker()}}};e.$inject=["$compile","$document","$controller"],angular.module("angularjs-datetime-picker").factory("DatetimePicker",e);var t=function(e,t){var a,n=this,l=function(e){e&&e.remove(),t[0].body.removeEventListener("click",n.closeDatetimePicker)};this.openDatetimePicker=function(n){this.closeDatetimePicker();var l=angular.element("
");n.dateFormat&&l.attr("date-format",n.dateFormat),n.ngModel&&l.attr("ng-model",n.ngModel),n.year&&l.attr("year",parseInt(n.year)),n.month&&l.attr("month",parseInt(n.month)),n.day&&l.attr("day",parseInt(n.day)),n.hour&&l.attr("hour",parseInt(n.hour)),n.minute&&l.attr("minute",parseInt(n.minute)),""!==n.dateOnly&&n.dateOnly!==!0||l.attr("date-only","true"),"false"===n.closeOnSelect&&l.attr("close-on-select","false");var i=n.triggerEl;n.scope=n.scope||angular.element(i).scope(),a=e(l)(n.scope)[0],a.triggerEl=n.triggerEl,t[0].body.appendChild(a);var r=i.getBoundingClientRect();n.scope.$apply();var o=a.getBoundingClientRect();a.style.position="absolute",r.width>o.width?a.style.left=r.left+r.width-o.width+window.scrollX+"px":a.style.left=r.left+window.scrollX+"px",r.top<300||window.innerHeight-r.bottom>300?a.style.top=r.bottom+window.scrollY+"px":a.style.top=r.top-o.height+window.scrollY+"px",t[0].body.addEventListener("click",this.closeDatetimePicker)},this.closeDatetimePicker=function(e){var a=e&&e.target,n=t[0].querySelector("div[datetime-picker-popup]");e&&a?a.hasAttribute("datetime-picker")||n&&n.contains(a)||l(n):l(n)}};t.$inject=["$compile","$document"],angular.module("angularjs-datetime-picker").controller("DatetimePickerCtrl",t);var a=['
','
',' ',' {{months[mv.month].shortName}} {{mv.year}}',' ',"
",'
','
{{::dayOfWeek.firstLetter}}
','
{{::day}}
','
'," {{::day}}","
",'
{{::day}}
',"
",'
',' {{("0"+inputHour).slice(-2)}} : {{("0"+inputMinute).slice(-2)}}
',' ',' ',"
","
"].join("\n"),n=function(e,t){var n,l,i,r,o=function(){n=[],l=[],i=[],r=0;for(var t=1;t<=31;t++)n.push(t);for(var t=0;t<12;t++)l.push({fullName:e.DATETIME_FORMATS.MONTH[t],shortName:e.DATETIME_FORMATS.SHORTMONTH[t]});for(var t=0;t<7;t++){var a=e.DATETIME_FORMATS.DAY[(t+r)%7];i.push({fullName:a,firstLetter:a.substr(0,1)})}r=0},d=function(e,t){t>11?e++:t<0&&e--,t=(t+12)%12;var a=new Date(e,t,1),l=new Date(e,t+1,0),i=new Date(e,t,0),o=l.getDate(),d=i.getDate(),s=a.getDay(),c=(s-r+7)%7||7,u=n.slice(0,42-(c+o));return u.length>7&&(u=u.slice(0,u.length-7)),{year:e,month:t,days:n.slice(0,o),leadingDays:n.slice(-c-(31-d),d),trailingDays:u}},s=function(e,a,n,r){o();var s=n.dateFormat||"short";e.months=l,e.daysOfWeek=i,e.inputHour,e.inputMinute,e.dateOnly===!0&&(a[0].querySelector("#adp-time").style.display="none"),e.$applyAsync(function(){if(r.triggerEl=angular.element(a[0].triggerEl),n.ngModel){var l=""+r.triggerEl.scope().$eval(n.ngModel);l&&(e.selectedDate=moment(l,s).toDate())}if(!e.selectedDate||isNaN(e.selectedDate.getTime())){var i=new Date,o=e.year||i.getFullYear(),c=e.month?e.month-1:i.getMonth(),u=e.day||i.getDate(),m=e.hour||i.getHours(),g=e.minute||i.getMinutes();e.selectedDate=new Date(o,c,u,m,g,0)}e.inputHour=e.selectedDate.getHours(),e.inputMinute=e.selectedDate.getMinutes(),e.mv=d(e.selectedDate.getFullYear(),e.selectedDate.getMonth()),e.today=t(new Date,"yyyy-M-d"),e.mv.year==e.selectedDate.getFullYear()&&e.mv.month==e.selectedDate.getMonth()?e.selectedDay=e.selectedDate.getDate():e.selectedDay=null}),e.addMonth=function(t){e.mv=d(e.mv.year,e.mv.month+t)},e.setDate=function(t){var a=angular.element(t.target)[0];a.className.indexOf("selectable")!==-1&&(e.updateNgModel(parseInt(a.innerHTML)),e.closeOnSelect!==!1&&r.closeDatetimePicker())},e.updateNgModel=function(t){if(t=t?t:e.selectedDate.getDate(),e.selectedDate=new Date(e.mv.year,e.mv.month,t,e.inputHour,e.inputMinute,0),e.selectedDay=e.selectedDate.getDate(),n.ngModel){var a,l=r.triggerEl.scope();a=l.$eval(n.ngModel)&&"Date"===l.$eval(n.ngModel).constructor.name?e.selectedDate:moment(e.selectedDate).format(s),l.$eval(n.ngModel+"= date",{date:a})}},e.$on("$destroy",r.closeDatetimePicker)};return{restrict:"A",template:a,controller:"DatetimePickerCtrl",replace:!0,scope:{year:"=",month:"=",day:"=",hour:"=",minute:"=",dateOnly:"=",closeOnSelect:"="},link:s}};n.$inject=["$locale","dateFilter"],angular.module("angularjs-datetime-picker").directive("datetimePickerPopup",n);var l=function(e,t){return{require:"ngModel",link:function(e,a,n,l){e.$watch(n.ngModel,function(e){if(e&&""!=e){var t=new Date(e);l.$setValidity("date",!!t);var a=new Date;n.hasOwnProperty("futureOnly")&&l.$setValidity("future-only",!(t" ], @@ -23,6 +23,7 @@ "tests" ], "dependencies": { - "angular": "~1.4.4" + "angular": "~1.4.4", + "moment": "^2.18.1" } } diff --git a/package.json b/package.json index 64fac8b..3fc3fa0 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,6 @@ "gulp-strip-debug": "^1.0.2", "gulp-uglify": "^1.2.0", "run-sequence": "^1.1.0" - } + }, "homepage": "https://github.com/kineticsocial/angularjs-datetime-picker" }