diff --git a/README.md b/README.md index 59d36a9..0d5c51d 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ Check demo page for live example. + ``` Parsing errors @@ -103,6 +104,9 @@ Todos Changelog --------- +* next + - jump on the next segment on pressing next separator key + - customizable separator key * 3.0.1 (Apr 9, 2016) - Fix validator and datetime-model bug. [#27](https://github.com/eight04/angular-datetime/issues/27) * 3.0.0 (Apr 1, 2016) diff --git a/example/demo-angular-1.5.html b/example/demo-angular-1.5.html index 641d76a..c66b782 100644 --- a/example/demo-angular-1.5.html +++ b/example/demo-angular-1.5.html @@ -134,5 +134,12 @@

Other tests

{{data.myDateString2 | json}}
+

Custom separator

+

Used to jump on the next segment when pressing separator key. In this example angular-datetime will jump on the next segment when pressing `.` or `,`.

+
+ +
diff --git a/example/demo.html b/example/demo.html index 4f3c5fe..f6fb17b 100644 --- a/example/demo.html +++ b/example/demo.html @@ -135,5 +135,12 @@

Other tests

{{data.myDateString2 | json}}
+

Custom separator

+

Used to jump on the next segment when pressing separator key. In this example angular-datetime will jump on the next segment when pressing . or ,.

+
+ +
diff --git a/src/directive.js b/src/directive.js index c0841d6..17e6370 100644 --- a/src/directive.js +++ b/src/directive.js @@ -192,8 +192,14 @@ angular.module("datetime").directive("datetime", function(datetime, $log, $docum node: null, start: 0, end: 0 - }; - + }, + lastError; + var datetimeSeparator; + + if (angular.isDefined(attrs.datetimeSeparator)) { + datetimeSeparator = attrs.datetimeSeparator; + } + if (angular.isDefined(attrs.datetimeUtc)) { parser.setTimezone("+0000"); if (modelParser) { @@ -262,9 +268,12 @@ angular.module("datetime").directive("datetime", function(datetime, $log, $docum return null; } + ngModel.$setValidity("tooShort", true); + try { parser.parse(viewValue); } catch (err) { + lastError = err; $log.error(err); ngModel.$setValidity("datetime", false); @@ -312,6 +321,8 @@ angular.module("datetime").directive("datetime", function(datetime, $log, $docum return undefined; } + lastError = null; + ngModel.$setValidity("datetime", true); if (ngModel.$validate || validMinMax(parser.getDate())) { @@ -446,7 +457,29 @@ angular.module("datetime").directive("datetime", function(datetime, $log, $docum break; case "keypress": - if (isPrintableKey(e)) { + var nextSeparatorKeyCode; + // check for separator only when there is a next node which is static string + if (range.node.next && range.node.next.token.name === "string" && range.node.next.token.type === "static") { + nextSeparatorKeyCode = range.node.next.viewValue.charCodeAt(0); + } + + if (e.keyCode === nextSeparatorKeyCode || (datetimeSeparator && e.keyCode == datetimeSeparator.charCodeAt(0))) { + e.preventDefault(); + if (!ngModel.$error.datetime) { + selectRange(range, "next"); + } + else if (lastError && lastError.code == "NUMBER_TOOSHORT") { + parser.nodeParseValue(lastError.node, lastError.properValue); + ngModel.$setViewValue(parser.getText()); + ngModel.$setValidity("tooShort", true); + ngModel.$render(); + scope.$apply(); + selectRange(range, "next"); + } else { + selectRange(errorRange); + } + } + else if (isPrintableKey(e)) { setTimeout(function(){ range = getRange(element, parser.nodes, range.node); if (isRangeAtEnd(range)) { diff --git a/src/factory.js b/src/factory.js index 913aa34..5e41fa4 100644 --- a/src/factory.js +++ b/src/factory.js @@ -509,7 +509,8 @@ angular.module("datetime").factory("datetime", function($locale){ text: text, node: p, pos: pos, - match: value + match: value, + properValue: num2str(+value, p.token.minLength, p.token.maxLength) }; }