From 07c407edea24825b15001ecad96026ecdf6d53ad Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 11 Jan 2016 15:18:26 -0800 Subject: [PATCH 01/11] [Time Conductor] Validate numeric date-time fields Allow injection of a validator for numeric values of the date-time fields, to allow for these to be displayed as invalid in cases where the text itself may be parsed but the resulting value is not valid (e.g. when start is greater than end.) https://github.com/nasa/openmctweb/issues/325 --- .../templates/controls/datetime-field.html | 2 +- .../controllers/DateTimeFieldController.js | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/platform/commonUI/general/res/templates/controls/datetime-field.html b/platform/commonUI/general/res/templates/controls/datetime-field.html index e9b394c530..187bac6dd2 100644 --- a/platform/commonUI/general/res/templates/controls/datetime-field.html +++ b/platform/commonUI/general/res/templates/controls/datetime-field.html @@ -24,7 +24,7 @@ + ng-class="{ error: textInvalid, test: valueInvalid }"> Date: Mon, 11 Jan 2016 15:08:56 -0800 Subject: [PATCH 02/11] [Time Conductor] Validate start/end times --- .../res/templates/controls/time-controller.html | 4 ++-- .../general/src/controllers/TimeRangeController.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/platform/commonUI/general/res/templates/controls/time-controller.html b/platform/commonUI/general/res/templates/controls/time-controller.html index 335dee61c3..bd07659f8e 100644 --- a/platform/commonUI/general/res/templates/controls/time-controller.html +++ b/platform/commonUI/general/res/templates/controls/time-controller.html @@ -25,7 +25,7 @@ C = $scope.ngModel.outer.start + outerMinimumSpan; + } + $scope.startLeftDrag = startLeftDrag; $scope.startRightDrag = startRightDrag; $scope.startMiddleDrag = startMiddleDrag; @@ -249,6 +257,9 @@ define( $scope.updateBoundsFromForm = updateBoundsFromForm; + $scope.validateStart = validateStart; + $scope.validateEnd = validateEnd; + $scope.ticks = []; // Initialize scope to defaults From e6d0537e5ee15be2bb79aaf6a30aa01d58d6bac6 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 11 Jan 2016 15:23:21 -0800 Subject: [PATCH 03/11] Revert "[Time Conductor] Validate numeric date-time fields" This reverts commit 07c407edea24825b15001ecad96026ecdf6d53ad. --- .../templates/controls/datetime-field.html | 2 +- .../controllers/DateTimeFieldController.js | 19 ++++--------------- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/platform/commonUI/general/res/templates/controls/datetime-field.html b/platform/commonUI/general/res/templates/controls/datetime-field.html index 187bac6dd2..e9b394c530 100644 --- a/platform/commonUI/general/res/templates/controls/datetime-field.html +++ b/platform/commonUI/general/res/templates/controls/datetime-field.html @@ -24,7 +24,7 @@ + ng-class="{ error: textInvalid }"> Date: Mon, 11 Jan 2016 15:29:43 -0800 Subject: [PATCH 04/11] [Time Conductor] Display invalid state ...when text value can be parsed in a date-time field, but numeric value violates externally-imposed validation --- .../general/res/templates/controls/datetime-field.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/platform/commonUI/general/res/templates/controls/datetime-field.html b/platform/commonUI/general/res/templates/controls/datetime-field.html index e9b394c530..51bfe979b7 100644 --- a/platform/commonUI/general/res/templates/controls/datetime-field.html +++ b/platform/commonUI/general/res/templates/controls/datetime-field.html @@ -24,7 +24,10 @@ + ng-class="{ + error: textInvalid, + test: structure.validate && !structure.validate(ngModel[field]) + }"> Date: Mon, 11 Jan 2016 16:41:20 -0800 Subject: [PATCH 05/11] [Time Conductor] Test additions to TimeRangeController Add test cases to cover validators added to display start/end time violations. --- .../controllers/TimeRangeControllerSpec.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js index 861f28ed45..993b56252b 100644 --- a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js +++ b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js @@ -91,6 +91,24 @@ define( .toHaveBeenCalledWith("ngModel", jasmine.any(Function)); }); + it("exposes start time validator", function () { + var testValue = 42000000; + mockScope.ngModel.outer = { end: testValue }; + expect(mockScope.validateStart(testValue + 1)) + .toBe(false); + expect(mockScope.validateStart(testValue - 60 * 60 * 1000 - 1)) + .toBe(true); + }); + + it("exposes end time validator", function () { + var testValue = 42000000; + mockScope.ngModel.outer = { start: testValue }; + expect(mockScope.validateEnd(testValue - 1)) + .toBe(false); + expect(mockScope.validateEnd(testValue + 60 * 60 * 1000 + 1)) + .toBe(true); + }); + describe("when changes are made via form entry", function () { beforeEach(function () { mockScope.ngModel = { From 5beb1de805183d26649a2df3584377ad7d085ccd Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 11 Jan 2016 16:56:58 -0800 Subject: [PATCH 06/11] [Time Conductor] Display validation errors consistently --- .../general/res/templates/controls/datetime-field.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/platform/commonUI/general/res/templates/controls/datetime-field.html b/platform/commonUI/general/res/templates/controls/datetime-field.html index 51bfe979b7..5aa4ea29ee 100644 --- a/platform/commonUI/general/res/templates/controls/datetime-field.html +++ b/platform/commonUI/general/res/templates/controls/datetime-field.html @@ -25,8 +25,7 @@ ng-model="textValue" ng-blur="restoreTextValue(); ngBlur()" ng-class="{ - error: textInvalid, - test: structure.validate && !structure.validate(ngModel[field]) + error: textInvalid || (structure.validate && !structure.validate(ngModel[field])) }"> Date: Mon, 11 Jan 2016 18:16:07 -0800 Subject: [PATCH 07/11] [Time Conductor] Don't update invalid bounds Don't enforce minimum time span when bounds are invalid; https://github.com/nasa/openmctweb/issues/325#issuecomment-170755787 --- .../src/controllers/TimeRangeController.js | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/platform/commonUI/general/src/controllers/TimeRangeController.js b/platform/commonUI/general/src/controllers/TimeRangeController.js index 13db6313ef..f72a19b05b 100644 --- a/platform/commonUI/general/src/controllers/TimeRangeController.js +++ b/platform/commonUI/general/src/controllers/TimeRangeController.js @@ -185,13 +185,6 @@ define( function updateOuterStart(t) { var ngModel = $scope.ngModel; - ngModel.outer.start = t; - - ngModel.outer.end = Math.max( - ngModel.outer.start + outerMinimumSpan, - ngModel.outer.end - ); - ngModel.inner.start = Math.max(ngModel.outer.start, ngModel.inner.start); ngModel.inner.end = Math.max( @@ -207,13 +200,6 @@ define( function updateOuterEnd(t) { var ngModel = $scope.ngModel; - ngModel.outer.end = t; - - ngModel.outer.start = Math.min( - ngModel.outer.end - outerMinimumSpan, - ngModel.outer.start - ); - ngModel.inner.end = Math.min(ngModel.outer.end, ngModel.inner.end); ngModel.inner.start = Math.min( @@ -233,19 +219,20 @@ define( } function updateBoundsFromForm() { - $scope.ngModel = $scope.ngModel || {}; - $scope.ngModel.outer = { - start: $scope.formModel.start, - end: $scope.formModel.end - }; + var start = $scope.formModel.start, + end = $scope.formModel.end; + if (end >= start + outerMinimumSpan) { + $scope.ngModel = $scope.ngModel || {}; + $scope.ngModel.outer = { start: start, end: end }; + } } function validateStart(startValue) { - return startValue <= $scope.ngModel.outer.end - outerMinimumSpan; + return startValue <= $scope.formModel.end - outerMinimumSpan; } function validateEnd(endValue) { - return endValue >= $scope.ngModel.outer.start + outerMinimumSpan; + return endValue >= $scope.formModel.start + outerMinimumSpan; } $scope.startLeftDrag = startLeftDrag; From 3b5c1bf2e62cb012bdab8c7fafaedd7a3e307476 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 11 Jan 2016 18:28:44 -0800 Subject: [PATCH 08/11] [Time Conductor] Update spec Verify that validation occurs against state in formModel; remove obsolete test case for enforcing minimum outer span --- .../controllers/TimeRangeControllerSpec.js | 24 ++----------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js index 993b56252b..efff87651f 100644 --- a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js +++ b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js @@ -93,7 +93,7 @@ define( it("exposes start time validator", function () { var testValue = 42000000; - mockScope.ngModel.outer = { end: testValue }; + mockScope.formModel = { end: testValue }; expect(mockScope.validateStart(testValue + 1)) .toBe(false); expect(mockScope.validateStart(testValue - 60 * 60 * 1000 - 1)) @@ -102,7 +102,7 @@ define( it("exposes end time validator", function () { var testValue = 42000000; - mockScope.ngModel.outer = { start: testValue }; + mockScope.formModel = { start: testValue }; expect(mockScope.validateEnd(testValue - 1)) .toBe(false); expect(mockScope.validateEnd(testValue + 60 * 60 * 1000 + 1)) @@ -212,26 +212,6 @@ define( fireWatchCollection("ngModel", mockScope.ngModel); }); - it("enforces a minimum outer span", function () { - mockScope.ngModel.outer.end = - mockScope.ngModel.outer.start - DAY * 100; - fireWatch( - "ngModel.outer.end", - mockScope.ngModel.outer.end - ); - expect(mockScope.ngModel.outer.end) - .toBeGreaterThan(mockScope.ngModel.outer.start); - - mockScope.ngModel.outer.start = - mockScope.ngModel.outer.end + DAY * 100; - fireWatch( - "ngModel.outer.start", - mockScope.ngModel.outer.start - ); - expect(mockScope.ngModel.outer.end) - .toBeGreaterThan(mockScope.ngModel.outer.start); - }); - it("enforces a minimum inner span when outer span changes", function () { mockScope.ngModel.outer.end = mockScope.ngModel.outer.start - DAY * 100; From 9fe026a1f12aafdf388db043366dda1adb0b593b Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Mon, 11 Jan 2016 18:29:42 -0800 Subject: [PATCH 09/11] [Time Conductor] Decrease minimum outer span --- .../commonUI/general/src/controllers/TimeRangeController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/commonUI/general/src/controllers/TimeRangeController.js b/platform/commonUI/general/src/controllers/TimeRangeController.js index f72a19b05b..d29ee00d08 100644 --- a/platform/commonUI/general/src/controllers/TimeRangeController.js +++ b/platform/commonUI/general/src/controllers/TimeRangeController.js @@ -43,7 +43,7 @@ define( function TimeRangeController($scope, formatService, defaultFormat, now) { var tickCount = 2, innerMinimumSpan = 1000, // 1 second - outerMinimumSpan = 1000 * 60 * 60, // 1 hour + outerMinimumSpan = 1000, // 1 hour initialDragValue, formatter = formatService.getFormat(defaultFormat); From 3a26c864b8fd807b0aa93caa635aba3180ee2023 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 22 Jan 2016 15:22:54 -0800 Subject: [PATCH 10/11] [Time Conductor] Fix comment text Per code review feedback, #475 --- .../commonUI/general/src/controllers/TimeRangeController.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/commonUI/general/src/controllers/TimeRangeController.js b/platform/commonUI/general/src/controllers/TimeRangeController.js index d29ee00d08..f0e3da46d9 100644 --- a/platform/commonUI/general/src/controllers/TimeRangeController.js +++ b/platform/commonUI/general/src/controllers/TimeRangeController.js @@ -43,7 +43,7 @@ define( function TimeRangeController($scope, formatService, defaultFormat, now) { var tickCount = 2, innerMinimumSpan = 1000, // 1 second - outerMinimumSpan = 1000, // 1 hour + outerMinimumSpan = 1000, // 1 second initialDragValue, formatter = formatService.getFormat(defaultFormat); From 9e6da948785843bd75c2aa703e45a013be4cc637 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 22 Jan 2016 15:24:27 -0800 Subject: [PATCH 11/11] [Time Conductor] Reformat expression in template ...to use less line width, and to exhibit more normal indentation, per code review feedback from #475 --- .../general/res/templates/controls/datetime-field.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/platform/commonUI/general/res/templates/controls/datetime-field.html b/platform/commonUI/general/res/templates/controls/datetime-field.html index 5aa4ea29ee..18eb9ec46d 100644 --- a/platform/commonUI/general/res/templates/controls/datetime-field.html +++ b/platform/commonUI/general/res/templates/controls/datetime-field.html @@ -25,7 +25,9 @@ ng-model="textValue" ng-blur="restoreTextValue(); ngBlur()" ng-class="{ - error: textInvalid || (structure.validate && !structure.validate(ngModel[field])) + error: textInvalid || + (structure.validate && + !structure.validate(ngModel[field])) }">