From cc19a0acba672df57b417c002900a9bd34f5a1e2 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 8 Oct 2015 15:51:11 -0700 Subject: [PATCH 1/5] [Time Conductor] Enforce minimum inner span nasa/openmctweb#151. --- .../commonUI/general/src/controllers/TimeRangeController.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform/commonUI/general/src/controllers/TimeRangeController.js b/platform/commonUI/general/src/controllers/TimeRangeController.js index ac111ab1a9..60df6343bb 100644 --- a/platform/commonUI/general/src/controllers/TimeRangeController.js +++ b/platform/commonUI/general/src/controllers/TimeRangeController.js @@ -34,6 +34,7 @@ define( */ function TimeConductorController($scope, now) { var tickCount = 2, + innerMinimum = 1000, // 1 second initialDragValue; function formatTimestamp(ts) { @@ -139,7 +140,7 @@ define( $scope.ngModel.inner.start = clamp( initialDragValue + delta, $scope.ngModel.outer.start, - $scope.ngModel.inner.end + $scope.ngModel.inner.end - innerMinimum ); updateViewFromModel($scope.ngModel); } @@ -148,7 +149,7 @@ define( var delta = toMillis(pixels); $scope.ngModel.inner.end = clamp( initialDragValue + delta, - $scope.ngModel.inner.start, + $scope.ngModel.inner.start + innerMinimum, $scope.ngModel.outer.end ); updateViewFromModel($scope.ngModel); From f738f84075dd8509f6946dd7c9ed06aa5ccba8bf Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 8 Oct 2015 16:02:47 -0700 Subject: [PATCH 2/5] [Time Conductor] Enforce minimum outer span --- .../src/controllers/TimeRangeController.js | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/platform/commonUI/general/src/controllers/TimeRangeController.js b/platform/commonUI/general/src/controllers/TimeRangeController.js index 60df6343bb..c3ded37832 100644 --- a/platform/commonUI/general/src/controllers/TimeRangeController.js +++ b/platform/commonUI/general/src/controllers/TimeRangeController.js @@ -34,7 +34,8 @@ define( */ function TimeConductorController($scope, now) { var tickCount = 2, - innerMinimum = 1000, // 1 second + innerMinimumSpan = 1000, // 1 second + outerMinimumSpan = 1000 * 60 * 60, // 1 hour initialDragValue; function formatTimestamp(ts) { @@ -140,7 +141,7 @@ define( $scope.ngModel.inner.start = clamp( initialDragValue + delta, $scope.ngModel.outer.start, - $scope.ngModel.inner.end - innerMinimum + $scope.ngModel.inner.end - innerMinimumSpan ); updateViewFromModel($scope.ngModel); } @@ -149,7 +150,7 @@ define( var delta = toMillis(pixels); $scope.ngModel.inner.end = clamp( initialDragValue + delta, - $scope.ngModel.inner.start + innerMinimum, + $scope.ngModel.inner.start + innerMinimumSpan, $scope.ngModel.outer.end ); updateViewFromModel($scope.ngModel); @@ -175,8 +176,12 @@ define( function updateOuterStart(t) { var ngModel = $scope.ngModel; - ngModel.outer.end = - Math.max(ngModel.outer.start, ngModel.outer.end); + + 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 = @@ -189,8 +194,12 @@ define( function updateOuterEnd(t) { var ngModel = $scope.ngModel; - ngModel.outer.start = - Math.min(ngModel.outer.end, ngModel.outer.start); + + ngModel.outer.start = Math.min( + ngModel.outer.end - outerMinimumSpan, + ngModel.outer.start + ); + ngModel.inner.start = Math.min(ngModel.outer.end, ngModel.inner.start); ngModel.inner.end = From ebd8fdeee3f7818d4ba49db787d18d2c0b171eff Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 9 Oct 2015 07:32:46 -0700 Subject: [PATCH 3/5] [Time Conductor] Enforce inner minimums on outer changes --- .../general/src/controllers/TimeRangeController.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/platform/commonUI/general/src/controllers/TimeRangeController.js b/platform/commonUI/general/src/controllers/TimeRangeController.js index c3ded37832..78655a90ae 100644 --- a/platform/commonUI/general/src/controllers/TimeRangeController.js +++ b/platform/commonUI/general/src/controllers/TimeRangeController.js @@ -184,8 +184,10 @@ define( ngModel.inner.start = Math.max(ngModel.outer.start, ngModel.inner.start); - ngModel.inner.end = - Math.max(ngModel.outer.start, ngModel.inner.end); + ngModel.inner.end = Math.max( + ngModel.inner.start + innerMinimumSpan, + ngModel.inner.end + ); $scope.startOuterText = formatTimestamp(t); @@ -200,10 +202,12 @@ define( ngModel.outer.start ); - ngModel.inner.start = - Math.min(ngModel.outer.end, ngModel.inner.start); ngModel.inner.end = Math.min(ngModel.outer.end, ngModel.inner.end); + ngModel.inner.start = Math.min( + ngModel.inner.end - innerMinimumSpan, + ngModel.inner.start + ); $scope.endOuterText = formatTimestamp(t); From 7532db5f4960f705f4c0dd8f923b987029cebe96 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 9 Oct 2015 07:58:10 -0700 Subject: [PATCH 4/5] [Time Conductor] Add test cases Add test cases to TimeRangeController; testing existing functionality in the context of nasa/openmctweb#151 --- .../controllers/TimeRangeControllerSpec.js | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js index 48411756b0..2068b9bfdb 100644 --- a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js +++ b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js @@ -26,6 +26,11 @@ define( function (TimeRangeController) { "use strict"; + var SEC = 1000, + MIN = 60 * SEC, + HOUR = 60 * MIN, + DAY = 24 * HOUR; + describe("The TimeRangeController", function () { var mockScope, mockNow, @@ -61,6 +66,65 @@ define( .toHaveBeenCalledWith("ngModel", jasmine.any(Function)); }); + describe("when dragged", function () { + beforeEach(function () { + mockScope.ngModel = { + outer: { + start: DAY * 1000, + end: DAY * 1001 + }, + inner: { + start: DAY * 1000 + HOUR * 3, + end: DAY * 1001 - HOUR * 3 + } + }; + mockScope.spanWidth = 1000; + fireWatch("spanWidth", mockScope.spanWidth); + fireWatchCollection("ngModel", mockScope.ngModel); + }); + + it("updates the start time for left drags", function () { + mockScope.startLeftDrag(); + mockScope.leftDrag(250); + expect(mockScope.ngModel.inner.start) + .toEqual(DAY * 1000 + HOUR * 9); + }); + + it("updates the end time for right drags", function () { + mockScope.startRightDrag(); + mockScope.rightDrag(-250); + expect(mockScope.ngModel.inner.end) + .toEqual(DAY * 1000 + HOUR * 15); + }); + + it("updates both start and end for middle drags", function () { + mockScope.startMiddleDrag(); + mockScope.middleDrag(-125); + expect(mockScope.ngModel.inner).toEqual({ + start: DAY * 1000, + end: DAY * 1000 + HOUR * 18 + }); + mockScope.middleDrag(250); + expect(mockScope.ngModel.inner).toEqual({ + start: DAY * 1000 + HOUR * 6, + end: DAY * 1001 + }); + }); + }); + + + + it("enforces a minimum inner span", function () { + + }); + + it("enforces a minimum outer span", function () { + + }); + + it("enforces a minimum inner span when outer span changes", function () { + + }); }); } From 520d17f9db11ea4bed9b3aec90c0e4681a966edf Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Fri, 9 Oct 2015 09:27:59 -0700 Subject: [PATCH 5/5] [Time Conductor] Test span constraints Verify that inner and outer spans do not become zero when user input might otherwise cause this. --- .../controllers/TimeRangeControllerSpec.js | 60 ++++++++++++++++--- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js index 2068b9bfdb..9d7a6a9f52 100644 --- a/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js +++ b/platform/commonUI/general/test/controllers/TimeRangeControllerSpec.js @@ -110,20 +110,62 @@ define( end: DAY * 1001 }); }); + + it("enforces a minimum inner span", function () { + mockScope.startRightDrag(); + mockScope.rightDrag(-9999999); + expect(mockScope.ngModel.inner.end) + .toBeGreaterThan(mockScope.ngModel.inner.start); + }); }); + describe("when outer bounds are changed", function () { + beforeEach(function () { + mockScope.ngModel = { + outer: { + start: DAY * 1000, + end: DAY * 1001 + }, + inner: { + start: DAY * 1000 + HOUR * 3, + end: DAY * 1001 - HOUR * 3 + } + }; + mockScope.spanWidth = 1000; + fireWatch("spanWidth", mockScope.spanWidth); + 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); - it("enforces a minimum inner span", function () { - - }); - - it("enforces a minimum outer span", function () { - - }); - - it("enforces a minimum inner span when outer span changes", function () { + 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; + fireWatch( + "ngModel.outer.end", + mockScope.ngModel.outer.end + ); + expect(mockScope.ngModel.inner.end) + .toBeGreaterThan(mockScope.ngModel.inner.start); + }); }); });