From 604dd349f5337a1edd5175e7374f2a6f63f8ff15 Mon Sep 17 00:00:00 2001 From: Jose Date: Mon, 21 Mar 2016 00:39:49 +0000 Subject: [PATCH] Allow to define the timezone Allow to define the timezone [Time: 1h] --- bower.json | 2 +- demo/index.html | 11 +++++++++++ package.json | 2 +- readme.md | 3 ++- source/ngComboDatePicker.js | 30 ++++++++++++++++++++---------- source/ngComboDatePicker.min.js | 4 ++-- 6 files changed, 37 insertions(+), 15 deletions(-) diff --git a/bower.json b/bower.json index 4f8540b..d704006 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "ngComboDatePicker", - "version": "1.1.2", + "version": "1.2.0", "authors": [ "jfmdev " ], diff --git a/demo/index.html b/demo/index.html index 31ef50b..e4398a0 100644 --- a/demo/index.html +++ b/demo/index.html @@ -125,6 +125,17 @@

Change years order

Choose a date:

Current selection is: {{ yearsOrder }} + + +

Timezones

+
+

Choose a date:

+

Current selection is: {{ timezone1 }} +

Choose a date:

+

Current selection is: {{ timezone2 }} +

Choose a date:

+

Current selection is: {{ timezone3 }} +

diff --git a/package.json b/package.json index c71184b..3fc524b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ng-combo-date-picker", - "version": "1.1.2", + "version": "1.2.0", "description": "An Angular directive to select dates using combo boxes", "main": "source/ngComboDatePicker.js", "scripts": { diff --git a/readme.md b/readme.md index 01174f1..37b86ee 100644 --- a/readme.md +++ b/readme.md @@ -53,7 +53,8 @@ Name | Description `ngAttrsDate` | A JSON object with the attributes to add to the `select` element for the date. `ngAttrsMonth` | A JSON object with the attributes to add to the `select` element for the month. `ngAttrsYear` | A JSON object with the attributes to add to the `select` element for the year. -`ngYearOrder` | A _string_ indicating of the years must be sorted in "ascending" or "descending" order. +`ngYearOrder` | A _string_ indicating if the years must be sorted in "ascending" or "descending" order. +`ngTimezone` | A _number_ indicating timezone to be used. By default the timezone of the client is used. License ------- diff --git a/source/ngComboDatePicker.js b/source/ngComboDatePicker.js index bd17abf..c1ac179 100644 --- a/source/ngComboDatePicker.js +++ b/source/ngComboDatePicker.js @@ -1,5 +1,5 @@ /* - * ngComboDatePicker v1.1.2 + * ngComboDatePicker v1.2.0 * http://github.com/jfmdev/ngComboDatePicker * «Copyright 2015 Jose F. Maldonado» * License: LGPLv3 (http://www.gnu.org/licenses/lgpl-3.0.html) @@ -22,24 +22,35 @@ angular.module("ngComboDatePicker", []) ngAttrsDate: '@', ngAttrsMonth: '@', ngAttrsYear: '@', - ngYearOrder: '@' + ngYearOrder: '@', + ngTimezone: '@' }, controller: ['$scope', function($scope) { // Define function for parse dates. - function parseDate(myDate) { + function parseDate(myDate, myTimezone) { var res = null; if(myDate !== undefined && myDate !== null) { if(myDate instanceof Date) { res = myDate; } else { if(typeof myDate == 'number' || typeof myDate == 'string') { + // Parse date. res = new Date(isNaN(myDate)? myDate : parseInt(myDate, 10)); + + // Adjust timezone. + res = adjustTimezone(res, myTimezone); } } } return res; }; + // Define function for adjust timezone. + function adjustTimezone(myDate, myTimezone) { + var offset = isNaN(myTimezone)? new Date().getTimezoneOffset() : parseFloat(myTimezone)*60; + return new Date(myDate.getTime() + offset*60*1000); + } + // Define fuction for getting the maximum date for a month. function maxDate(month, year) { var res = 31; @@ -65,7 +76,7 @@ angular.module("ngComboDatePicker", []) } // Initialize model. - $scope.ngModel = parseDate($scope.ngModel); + $scope.ngModel = parseDate($scope.ngModel, $scope.ngTimezone); // Initialize attributes variables. $scope.ngAttrsDate = parseJsonPlus($scope.ngAttrsDate); @@ -73,7 +84,7 @@ angular.module("ngComboDatePicker", []) $scope.ngAttrsYear = parseJsonPlus($scope.ngAttrsYear); // Verify if initial date was defined. - var initDate = parseDate($scope.ngDate); + var initDate = parseDate($scope.ngDate, $scope.ngTimezone); if(initDate != null) $scope.ngModel = initDate; // Initialize order. @@ -84,15 +95,15 @@ angular.module("ngComboDatePicker", []) } // Initialize minimal and maximum values. - $scope.minDate = parseDate($scope.ngMinDate); + $scope.minDate = parseDate($scope.ngMinDate, $scope.ngTimezone); if($scope.ngMinDate == null) { - var now = new Date(); + var now = adjustTimezone(new Date(), $scope.ngTimezone); $scope.minDate = new Date(now.getFullYear()-100, now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds()); } - $scope.maxDate = parseDate($scope.ngMaxDate); + $scope.maxDate = parseDate($scope.ngMaxDate, $scope.ngTimezone); if($scope.maxDate == null) { - $scope.maxDate = new Date(); + $scope.maxDate = adjustTimezone(new Date(), $scope.ngTimezone); } // Verify if selected date is in the valid range. @@ -156,7 +167,6 @@ angular.module("ngComboDatePicker", []) } }; - // When the model is updated, update the combo boxes. $scope.modelUpdated = function() { // Update combo boxes. diff --git a/source/ngComboDatePicker.min.js b/source/ngComboDatePicker.min.js index 224e551..a31c3c3 100644 --- a/source/ngComboDatePicker.min.js +++ b/source/ngComboDatePicker.min.js @@ -1,7 +1,7 @@ /* - * ngComboDatePicker v1.1.1 + * ngComboDatePicker v1.2.0 * http://github.com/jfmdev/ngComboDatePicker * «Copyright 2015 Jose F. Maldonado» * License: LGPLv3 (http://www.gnu.org/licenses/lgpl-3.0.html) */ -angular.module("ngComboDatePicker",[]).directive("ngComboDatePicker",function(){return{restrict:"AEC",scope:{ngModel:"=",ngDate:"@",ngMinDate:"@",ngMaxDate:"@",ngMonths:"@",ngOrder:"@",ngAttrsDate:"@",ngAttrsMonth:"@",ngAttrsYear:"@",ngYearOrder:"@"},controller:["$scope",function(e){function n(e){var n=null;return void 0!==e&&null!==e&&(e instanceof Date?n=e:("number"==typeof e||"string"==typeof e)&&(n=new Date(isNaN(e)?e:parseInt(e,10)))),n}function t(e,n){var t=31;return null!=e&&((4==e||6==e||9==e||11==e)&&(t=30),null!=n&&2==e&&(t=n%4==0&&n%100!=0?29:28)),t}function a(e){var n=null;if(null!=e){try{n=JSON.parse(e)}catch(t){}if(null==n)try{n=JSON.parse(e.replace(/'/g,'"'))}catch(t){}}return n}e.ngModel=n(e.ngModel),e.ngAttrsDate=a(e.ngAttrsDate),e.ngAttrsMonth=a(e.ngAttrsMonth),e.ngAttrsYear=a(e.ngAttrsYear);var l=n(e.ngDate);if(null!=l&&(e.ngModel=l),"string"!=typeof e.ngOrder?e.ngOrder="dmy":e.ngOrder=e.ngOrder.toLowerCase(),e.minDate=n(e.ngMinDate),null==e.ngMinDate){var r=new Date;e.minDate=new Date(r.getFullYear()-100,r.getMonth(),r.getDate(),r.getHours(),r.getMinutes(),r.getSeconds(),r.getMilliseconds())}e.maxDate=n(e.ngMaxDate),null==e.maxDate&&(e.maxDate=new Date),e.ngModele.maxDate&&(e.ngModel=e.maxDate),e.years=[];for(var g=e.minDate.getFullYear();g<=e.maxDate.getFullYear();g++)e.years.push(g);"string"==typeof e.ngYearOrder&&0==e.ngYearOrder.indexOf("des")&&e.years.reverse();var o=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];if(void 0!==e.ngMonths&&null!==e.ngMonths){if("string"==typeof e.ngMonths){var d=e.ngMonths.split(",");12==d.length&&(o=d)}Array.isArray(e.ngMonths)&&12==e.ngMonths.length&&(o=e.ngMonths)}e.updateMonthList=function(){var n=null!=e.ngModel&&e.ngModel.getFullYear()==e.minDate.getFullYear()?e.minDate.getMonth():0,t=null!=e.ngModel&&e.ngModel.getFullYear()==e.maxDate.getFullYear()?e.maxDate.getMonth():11;e.months=[];for(var a=n;t>=a;a++)e.months.push({index:a,name:o[a]})},e.updateDateList=function(){var n=1;null!=e.ngModel&&e.ngModel.getMonth()==e.minDate.getMonth()&&e.ngModel.getFullYear()==e.minDate.getFullYear()&&(n=e.minDate.getDate());var a=null!=e.ngModel?t(e.ngModel.getMonth()+1,e.ngModel.getFullYear()):t(null,null);null!=e.ngModel&&e.ngModel.getMonth()==e.maxDate.getMonth()&&e.ngModel.getFullYear()==e.maxDate.getFullYear()&&(a=e.maxDate.getDate()),e.dates=[];for(var l=n;a>=l;l++)e.dates.push(l)},e.modelUpdated=function(){e.date=null!=e.ngModel?e.ngModel.getDate():null,e.month=null!=e.ngModel?e.ngModel.getMonth():null,e.year=null!=e.ngModel?e.ngModel.getFullYear():null,e.updateMonthList(),e.updateDateList()},e.$watch("ngModel",function(){e.modelUpdated()}),e.onChange=function(n){if(null!=e.date&&null!=e.month&&null!=e.year){var a=t(e.month+1,e.year),l=0,r=0,g=0,o=0;null!=e.ngModel&&(l=e.ngModel.getHours(),r=e.ngModel.getMinutes(),g=e.ngModel.getSeconds(),o=e.ngModel.getMilliseconds()),e.ngModel=new Date(e.year,e.month,e.date>a?a:e.date,l,r,g,o)}e.updateMonthList(),e.updateDateList()},e.getSomething=function(){return"color:red;"}}],link:function(e,n,t){var a=angular.element,l=a(n[0]).children(),r=e.ngOrder.split("");null!=e.ngAttrsDate&&a(l[0]).attr(e.ngAttrsDate),null!=e.ngAttrsMonth&&a(l[1]).attr(e.ngAttrsMonth),null!=e.ngAttrsYear&&a(l[2]).attr(e.ngAttrsYear);for(var g=0;g';return e}}}); +angular.module("ngComboDatePicker",[]).directive("ngComboDatePicker",function(){return{restrict:"AEC",scope:{ngModel:"=",ngDate:"@",ngMinDate:"@",ngMaxDate:"@",ngMonths:"@",ngOrder:"@",ngAttrsDate:"@",ngAttrsMonth:"@",ngAttrsYear:"@",ngYearOrder:"@",ngTimezone:"@"},controller:["$scope",function(e){function n(e,n){var a=null;return void 0!==e&&null!==e&&(e instanceof Date?a=e:("number"==typeof e||"string"==typeof e)&&(a=new Date(isNaN(e)?e:parseInt(e,10)),a=t(a,n))),a}function t(e,n){var t=isNaN(n)?(new Date).getTimezoneOffset():60*parseFloat(n);return new Date(e.getTime()+60*t*1e3)}function a(e,n){var t=31;return null!=e&&((4==e||6==e||9==e||11==e)&&(t=30),null!=n&&2==e&&(t=n%4==0&&n%100!=0?29:28)),t}function l(e){var n=null;if(null!=e){try{n=JSON.parse(e)}catch(t){}if(null==n)try{n=JSON.parse(e.replace(/'/g,'"'))}catch(t){}}return n}e.ngModel=n(e.ngModel,e.ngTimezone),e.ngAttrsDate=l(e.ngAttrsDate),e.ngAttrsMonth=l(e.ngAttrsMonth),e.ngAttrsYear=l(e.ngAttrsYear);var g=n(e.ngDate,e.ngTimezone);if(null!=g&&(e.ngModel=g),"string"!=typeof e.ngOrder?e.ngOrder="dmy":e.ngOrder=e.ngOrder.toLowerCase(),e.minDate=n(e.ngMinDate,e.ngTimezone),null==e.ngMinDate){var o=t(new Date,e.ngTimezone);e.minDate=new Date(o.getFullYear()-100,o.getMonth(),o.getDate(),o.getHours(),o.getMinutes(),o.getSeconds(),o.getMilliseconds())}e.maxDate=n(e.ngMaxDate,e.ngTimezone),null==e.maxDate&&(e.maxDate=t(new Date,e.ngTimezone)),e.ngModele.maxDate&&(e.ngModel=e.maxDate),e.years=[];for(var r=e.minDate.getFullYear();r<=e.maxDate.getFullYear();r++)e.years.push(r);"string"==typeof e.ngYearOrder&&0==e.ngYearOrder.indexOf("des")&&e.years.reverse();var d=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];if(void 0!==e.ngMonths&&null!==e.ngMonths){if("string"==typeof e.ngMonths){var u=e.ngMonths.split(",");12==u.length&&(d=u)}Array.isArray(e.ngMonths)&&12==e.ngMonths.length&&(d=e.ngMonths)}e.updateMonthList=function(){var n=null!=e.ngModel&&e.ngModel.getFullYear()==e.minDate.getFullYear()?e.minDate.getMonth():0,t=null!=e.ngModel&&e.ngModel.getFullYear()==e.maxDate.getFullYear()?e.maxDate.getMonth():11;e.months=[];for(var a=n;t>=a;a++)e.months.push({index:a,name:d[a]})},e.updateDateList=function(){var n=1;null!=e.ngModel&&e.ngModel.getMonth()==e.minDate.getMonth()&&e.ngModel.getFullYear()==e.minDate.getFullYear()&&(n=e.minDate.getDate());var t=null!=e.ngModel?a(e.ngModel.getMonth()+1,e.ngModel.getFullYear()):a(null,null);null!=e.ngModel&&e.ngModel.getMonth()==e.maxDate.getMonth()&&e.ngModel.getFullYear()==e.maxDate.getFullYear()&&(t=e.maxDate.getDate()),e.dates=[];for(var l=n;t>=l;l++)e.dates.push(l)},e.modelUpdated=function(){e.date=null!=e.ngModel?e.ngModel.getDate():null,e.month=null!=e.ngModel?e.ngModel.getMonth():null,e.year=null!=e.ngModel?e.ngModel.getFullYear():null,e.updateMonthList(),e.updateDateList()},e.$watch("ngModel",function(){e.modelUpdated()}),e.onChange=function(n){if(null!=e.date&&null!=e.month&&null!=e.year){var t=a(e.month+1,e.year),l=0,g=0,o=0,r=0;null!=e.ngModel&&(l=e.ngModel.getHours(),g=e.ngModel.getMinutes(),o=e.ngModel.getSeconds(),r=e.ngModel.getMilliseconds()),e.ngModel=new Date(e.year,e.month,e.date>t?t:e.date,l,g,o,r)}e.updateMonthList(),e.updateDateList()},e.getSomething=function(){return"color:red;"}}],link:function(e,n,t){var a=angular.element,l=a(n[0]).children(),g=e.ngOrder.split("");null!=e.ngAttrsDate&&a(l[0]).attr(e.ngAttrsDate),null!=e.ngAttrsMonth&&a(l[1]).attr(e.ngAttrsMonth),null!=e.ngAttrsYear&&a(l[2]).attr(e.ngAttrsYear);for(var o=0;o';return e}}});