From d65e1e604e28bb9bbdb9e442db84696eee89ac23 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Thu, 7 Sep 2017 15:22:38 -0700 Subject: [PATCH] Squashed commit of the following: commit f1dc1ce152e186da0d10c8e77d920ac0a76c9bc2 Author: Victor Woeltjen Date: Thu Sep 7 14:35:38 2017 -0700 [Timers] Rewrite JSDoc for FollowTimerAction https://github.com/nasa/openmct/pull/1694/files#r137604769 commit 7ab0693cc983f8a04ac8ee9002f4d776b06a869a Author: Victor Woeltjen Date: Thu Sep 7 14:27:53 2017 -0700 [Timer] Expect domain objects from FollowIndicator test commit ff89c0849d16ab451bfd2fddd9202cf36940f599 Author: Victor Woeltjen Date: Thu Sep 7 14:26:28 2017 -0700 [Timer] Add JSDoc for new method commit 2a0343352eca241dfc28a4aa0b3832e3e6928864 Author: Victor Woeltjen Date: Thu Sep 7 14:24:59 2017 -0700 [Timeline] Update TOI tests ...to account for refactoring out of tick handling. commit 01cbaafc72870fab4ada5894637ae5721214933d Author: Victor Woeltjen Date: Thu Sep 7 14:17:25 2017 -0700 [Timeline] Update dependencies for TOI test commit 6bd5c378566362dce331e7c200dea87f0b08ecc6 Author: Victor Woeltjen Date: Thu Sep 7 14:15:21 2017 -0700 [Timers] Update timerService tests with dependencies commit b0793865c5131e17a58786ec356d67f2f2bba4c5 Author: Victor Woeltjen Date: Thu Sep 7 14:09:54 2017 -0700 [Timers] Declare vars to satisfy JSHint commit 9d2a63f7fe61dadf68255d795512ec55f532c533 Author: Victor Woeltjen Date: Thu Sep 7 14:07:12 2017 -0700 [Timeline] Handle stopped timer commit 30871270514730f3f2f12482075e5140bb97fa1f Author: Victor Woeltjen Date: Thu Sep 7 13:59:08 2017 -0700 [Timer] Tweak refactored timer logic commit 53ad127ba7cf679377dc865301612a1d78399324 Author: Victor Woeltjen Date: Thu Sep 7 13:53:36 2017 -0700 [Timer] Convert times from timerService ...to reduce resposibilities for TOI controller. commit f8341133cf23df383b8f6e4815b88e0066ebd2bc Author: Victor Woeltjen Date: Thu Sep 7 13:03:37 2017 -0700 [Timeline] Factor out timer knowledge commit aebd9e0ac223971b868b03343dbe4c61c6eb4849 Author: Victor Woeltjen Date: Thu Sep 7 12:34:58 2017 -0700 [Timeline] Consistently use this commit 48ac427a20c5c343aecdbd54b068d8691f7830b6 Author: Victor Woeltjen Date: Thu Sep 7 12:33:57 2017 -0700 [Timeline] Remove unused tick binding/call commit ea62f0a15ba4ab5de53213bbed14599eaf878d70 Author: Victor Woeltjen Date: Thu Sep 7 12:10:59 2017 -0700 [Timeline] Retrieve timestamp on demand commit f53bd04b5e343b22ea52b431785ade891577bb6a Author: Victor Woeltjen Date: Thu Sep 7 12:07:55 2017 -0700 [Timeline] Update clocks on bounds events https://github.com/nasa/openmct/pull/1694/files#r137603081 commit 51d8e376ee46aafa13cd9a969c6f03885e10dafb Author: Victor Woeltjen Date: Thu Sep 7 11:40:33 2017 -0700 [Timeline] Don't listen for non-existing tick events commit 5cc40c488cec5e7453c2fe1dea5e5a4fa3509ecd Author: Victor Woeltjen Date: Thu Sep 7 11:39:21 2017 -0700 [Time] Revert Time API changes https://github.com/nasa/openmct/pull/1694/files#r137603081 commit c55c8bc627bf0a7f3cfd04b604b82d15ff469ab9 Author: Victor Woeltjen Date: Thu Sep 7 11:37:40 2017 -0700 [Timeline] Finish testing TOI controller commit af5cea5f2f172a309568d477dfdf11b8d45e74bb Author: Victor Woeltjen Date: Thu Sep 7 11:06:47 2017 -0700 [Timeline] Test TOI controller commit ba64db68b132fa431e8ccdb533024bf2850f9712 Author: Victor Woeltjen Date: Thu Sep 7 10:06:41 2017 -0700 [Timers] Test timerService commit 247e663b326ec5b8145b832af9b26086204baea3 Author: Victor Woeltjen Date: Thu Sep 7 10:05:24 2017 -0700 [Timers] Remove unused timerService method commit 8d741ad5744e1b7deb669dbaa0f3d30e4eb5866e Author: Victor Woeltjen Date: Thu Sep 7 09:59:32 2017 -0700 [Timers] Remove unused timerService dependency commit b59c8917bdef5ec3e54c8857d993d86547cfe177 Author: Victor Woeltjen Date: Thu Sep 7 09:58:10 2017 -0700 [Timers] Remove unused timerService event commit f15dd9827f835a814dc40a6201c90268a60ed64a Author: Victor Woeltjen Date: Thu Sep 7 09:49:09 2017 -0700 [Timers] Test timer-following indicator commit 2501f11af8c0b2aed9ebf16ffd28c0003b2701c2 Author: Victor Woeltjen Date: Thu Sep 7 09:42:54 2017 -0700 [Timer] Complete test coverage for FollowTimerAction commit aa2be83fc15cd68ee6de4d9f8205dc2fcba8c35b Author: Victor Woeltjen Date: Thu Sep 7 09:35:37 2017 -0700 [Timers] Begin testing Follow Timer action commit d9062e0b0ff351b141dcb646972053ec72292d53 Author: Victor Woeltjen Date: Wed Sep 6 16:45:18 2017 -0700 [Timeline] Remove unused variables commit 79ebe4dd2b2aefc1e83ea8142588ed0715b3c269 Author: Victor Woeltjen Date: Wed Sep 6 16:39:22 2017 -0700 [Timeline] JSDoc for TOI controller commit 330f6b465188555e8e59f4eaf8ce1875b5335846 Author: Victor Woeltjen Date: Wed Sep 6 16:30:58 2017 -0700 [Timeline] Use different icon to follow time bounds commit f0a3b628e6d1d843324085edd563b68997f5a215 Author: Victor Woeltjen Date: Wed Sep 6 16:30:46 2017 -0700 [Timeline] Simplify TOI following initialization commit e76f3d1d525e0d19845b4c5b457995e60c416ad0 Author: Victor Woeltjen Date: Wed Sep 6 16:27:07 2017 -0700 [Timeline] Add toggle to follow time bounds commit 8ec072c0a2a953c074e0c327430dd68f27894ffb Author: Victor Woeltjen Date: Wed Sep 6 16:19:25 2017 -0700 [Timeline] Follow TC bounds based on boolean commit 206a26734dedc267af6d298a77658aa261ca4fea Author: Victor Woeltjen Date: Wed Sep 6 15:37:12 2017 -0700 [Timeline] Tune bounds following commit 19563bdf53a036c7bf09c52924425a1902b243bb Author: Victor Woeltjen Date: Wed Sep 6 15:19:19 2017 -0700 [Timeline] Remove unused method commit 293981ec55ad115d7bd90b92f5bd090df64bd7c2 Author: Victor Woeltjen Date: Wed Sep 6 15:18:59 2017 -0700 [Timeline] Only update timestamp on tick Leave bounds-following to the bounds event commit 9180e15971d2043f0999a16f0aa8794273bcfc74 Author: Victor Woeltjen Date: Wed Sep 6 14:43:01 2017 -0700 [Time] Document tick event commit c7b163dff0d94aaea86b76647501f21623b353e1 Author: Victor Woeltjen Date: Wed Sep 6 14:39:57 2017 -0700 [Timeline] Stop listening on destroy ...from the TOI controller. commit ca7def3cf98e1eaf6c3aeb16cf9fd79452c86bd0 Author: Victor Woeltjen Date: Wed Sep 6 14:32:40 2017 -0700 [Timeline] Remove surplus watches commit 367e7afa94ae1ed448e39f13be804c62e2bfcf00 Author: Victor Woeltjen Date: Wed Sep 6 14:30:14 2017 -0700 [Timeline] Very deltas are valid before panning commit 7ee94f316e90d046015266a2a9168e349ff73345 Author: Victor Woeltjen Date: Wed Sep 6 14:28:10 2017 -0700 [Timeline] Scroll with TOI only while in view commit 9d7bb431119b7bc6ddc86f0058718e4385478518 Author: Victor Woeltjen Date: Wed Sep 6 10:36:46 2017 -0700 [Timeline] Utilize zoomController.bounds commit f151b9e8adfd235c31e32bef5fddab835efa7c8f Author: Victor Woeltjen Date: Wed Sep 6 10:35:57 2017 -0700 [Timeline] Add methods to set zoom bounds commit c3d0b9876ab79c18003838ed3315045c5fb2ddbb Author: Victor Woeltjen Date: Wed Sep 6 10:32:08 2017 -0700 [Timelines] Observe bounds changes ...to synchronize zoom with Time Conductor, #1688 commit 58adafc46f231b0fd92827d10c377131166ff39c Author: Victor Woeltjen Date: Wed Sep 6 09:37:07 2017 -0700 [Timers] JSDoc for TimerService commit a325a8d5085bf1a4c9aa3ab20771308d4789765a Author: Victor Woeltjen Date: Wed Sep 6 09:12:50 2017 -0700 [Timeline] Re-tweak follow scroll calculations ...for visibility. commit 41e4bf153607b081aaf92253fa2b21300e2f0ea7 Author: Victor Woeltjen Date: Wed Sep 6 09:03:45 2017 -0700 [Timeline] Tweak follow scroll calculations ...for visibility. commit 08a5b9f14ab629a310dc27a3771ca454f1187327 Author: Victor Woeltjen Date: Wed Sep 6 08:59:45 2017 -0700 [Timeline] Replace debug output with scroll updates commit 26585ecd61341b4ee89abd8ee866e705a02bbc9a Author: Victor Woeltjen Date: Wed Sep 6 08:59:07 2017 -0700 [Timeline] Move TOI to scrollable area commit 654eda027c3c67a3a0ff33136109ca27d14762ba Author: Victor Woeltjen Date: Wed Sep 6 08:56:07 2017 -0700 [Timeline] Begin implementing TOI following commit 552f67a11ce439be58ab7ca7884c46241a25adee Author: Victor Woeltjen Date: Wed Sep 6 08:55:51 2017 -0700 [Timeline] At zoom-to-time method For use by time-of-interest controller, #1688 commit 37acbfd458740b2c3176875f83d37f0fdf57e727 Author: Victor Woeltjen Date: Wed Aug 30 12:46:33 2017 -0700 [Timeline] Remove other excess $apply calls ...although this should make us nervy about those callbacks being invoked in different ways. commit 0e72847c9ba59f957efa2d412cb77c024afa9e63 Author: Victor Woeltjen Date: Wed Aug 30 12:44:27 2017 -0700 [Timeline] Remove $apply from $watch callback ...to avoid an infinite digest loop. commit bade0fd9f60101d5b1b782cd28e608af493c9076 Author: Victor Woeltjen Date: Wed Aug 30 12:42:18 2017 -0700 [Timeline] Begin adding TOI line to template commit f94034a3b4136f6b174155397084f8cdb22ce544 Author: Victor Woeltjen Date: Wed Aug 30 12:11:25 2017 -0700 [Timers] Add missing semicolon, satisfy JSHint commit cb465b94011e7432cc7e4d9e815641f97dc61d7a Author: Victor Woeltjen Date: Wed Aug 30 12:08:45 2017 -0700 [Time] Verify that tick event is emitted commit 7c84a86a33ceb73ba6a06801374ea3f89793c450 Author: Victor Woeltjen Date: Wed Aug 30 11:59:06 2017 -0700 [Time] Emit tick events from Time API https://github.com/nasa/openmct/pull/1694 commit d319a783fcd882c03eb7d9a81fec33898016384e Author: Victor Woeltjen Date: Wed Aug 30 11:56:28 2017 -0700 [Timeline] Sketch in TOI controller ...to position/follow time-of-interest, relative to the active timer. commit 2dbdb2627450039d69dbfd10eed2c100207e061a Author: Victor Woeltjen Date: Tue Aug 29 12:57:47 2017 -0700 [Timers] Use timerService ...to coordinate between action and indicator commit f94a2358eaf0366bd4da2b44e69ccb62b153c5db Author: Victor Woeltjen Date: Tue Aug 29 12:52:22 2017 -0700 [Timers] Use TimerService from Follow Timer action commit a720c2ec2cda4a300d26167f4717f0571bedcbfd Author: Victor Woeltjen Date: Tue Aug 29 12:50:31 2017 -0700 [Timers] Expose TimerService through bundle commit e32bbc3e232d25f7c5dba98674781e4f263c4870 Author: Victor Woeltjen Date: Tue Aug 29 12:49:03 2017 -0700 [Timers] Sketch in timer service ...which will keep track of the active timer used to interpret SET for Timelines. commit a038c2b1d8fd34c2874fa8fc0421fa7ba53e11ab Author: Victor Woeltjen Date: Tue Aug 29 12:41:05 2017 -0700 [Timers] Register indicator commit 0e93ae87a1cccc4f3a0636844625b64ccb77a7ae Author: Victor Woeltjen Date: Tue Aug 29 12:39:21 2017 -0700 [Timers] Skeleton for time following indicator commit e806386891639740e9fe3d8641c2f60ab5a88eac Author: Victor Woeltjen Date: Tue Aug 29 09:37:14 2017 -0700 [Timers] Register the Follow Timer action commit 008aa95932070459dcc6fa1d918a23dac8df7592 Author: Victor Woeltjen Date: Tue Aug 29 09:35:08 2017 -0700 [Timers] Skeleton for Follow Timer action ...to synchronize the time conductor with a particular Timer. #1688 --- platform/features/clock/bundle.js | 25 ++++ .../clock/src/actions/FollowTimerAction.js | 54 +++++++ .../clock/src/indicators/FollowIndicator.js | 57 ++++++++ .../clock/src/services/TimerService.js | 102 +++++++++++++ .../test/actions/FollowTimerActionSpec.js | 80 ++++++++++ .../test/indicators/FollowIndicatorSpec.js | 60 ++++++++ .../clock/test/services/TimerServiceSpec.js | 64 ++++++++ platform/features/timeline/bundle.js | 11 ++ .../timeline/res/templates/timeline.html | 19 ++- .../src/controllers/TimelineTOIController.js | 111 ++++++++++++++ .../src/controllers/TimelineZoomController.js | 22 ++- .../controllers/TimelineTOIControllerSpec.js | 138 ++++++++++++++++++ 12 files changed, 735 insertions(+), 8 deletions(-) create mode 100644 platform/features/clock/src/actions/FollowTimerAction.js create mode 100644 platform/features/clock/src/indicators/FollowIndicator.js create mode 100644 platform/features/clock/src/services/TimerService.js create mode 100644 platform/features/clock/test/actions/FollowTimerActionSpec.js create mode 100644 platform/features/clock/test/indicators/FollowIndicatorSpec.js create mode 100644 platform/features/clock/test/services/TimerServiceSpec.js create mode 100644 platform/features/timeline/src/controllers/TimelineTOIController.js create mode 100644 platform/features/timeline/test/controllers/TimelineTOIControllerSpec.js diff --git a/platform/features/clock/bundle.js b/platform/features/clock/bundle.js index d3f98426bf..54908385c0 100644 --- a/platform/features/clock/bundle.js +++ b/platform/features/clock/bundle.js @@ -23,10 +23,13 @@ define([ "moment-timezone", "./src/indicators/ClockIndicator", + "./src/indicators/FollowIndicator", "./src/services/TickerService", + "./src/services/TimerService", "./src/controllers/ClockController", "./src/controllers/TimerController", "./src/controllers/RefreshingController", + "./src/actions/FollowTimerAction", "./src/actions/StartTimerAction", "./src/actions/RestartTimerAction", "./src/actions/StopTimerAction", @@ -37,10 +40,13 @@ define([ ], function ( MomentTimezone, ClockIndicator, + FollowIndicator, TickerService, + TimerService, ClockController, TimerController, RefreshingController, + FollowTimerAction, StartTimerAction, RestartTimerAction, StopTimerAction, @@ -80,6 +86,11 @@ define([ "CLOCK_INDICATOR_FORMAT" ], "priority": "preferred" + }, + { + "implementation": FollowIndicator, + "depends": ["timerService"], + "priority": "fallback" } ], "services": [ @@ -90,6 +101,11 @@ define([ "$timeout", "now" ] + }, + { + "key": "timerService", + "implementation": TimerService, + "depends": ["openmct"] } ], "controllers": [ @@ -134,6 +150,15 @@ define([ } ], "actions": [ + { + "key": "timer.follow", + "implementation": FollowTimerAction, + "depends": ["timerService"], + "category": "contextual", + "name": "Follow Timer", + "cssClass": "icon-clock", + "priority": "optional" + }, { "key": "timer.start", "implementation": StartTimerAction, diff --git a/platform/features/clock/src/actions/FollowTimerAction.js b/platform/features/clock/src/actions/FollowTimerAction.js new file mode 100644 index 0000000000..723fd05fcb --- /dev/null +++ b/platform/features/clock/src/actions/FollowTimerAction.js @@ -0,0 +1,54 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2009-2016, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +define( + [], + function () { + + /** + * Designates a specific timer for following. Timelines, for example, + * use the actively followed timer to display a time-of-interest line + * and interpret time conductor bounds in the Timeline's relative + * time frame. + * + * @implements {Action} + * @memberof platform/features/clock + * @constructor + * @param {ActionContext} context the context for this action + */ + function FollowTimerAction(timerService, context) { + var domainObject = context.domainObject; + this.perform = + timerService.setTimer.bind(timerService, domainObject); + } + + FollowTimerAction.appliesTo = function (context) { + var model = + (context.domainObject && context.domainObject.getModel()) || + {}; + + return model.type === 'timer'; + }; + + return FollowTimerAction; + } +); diff --git a/platform/features/clock/src/indicators/FollowIndicator.js b/platform/features/clock/src/indicators/FollowIndicator.js new file mode 100644 index 0000000000..7574cb4201 --- /dev/null +++ b/platform/features/clock/src/indicators/FollowIndicator.js @@ -0,0 +1,57 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2009-2016, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +define( + ['moment'], + function (moment) { + var NO_TIMER = "No timer being followed."; + + /** + * Indicator that displays the active timer, as well as its + * current state. + * @implements {Indicator} + * @memberof platform/features/clock + */ + function FollowIndicator(timerService) { + this.timerService = timerService; + } + + FollowIndicator.prototype.getGlyphClass = function () { + return ""; + }; + + FollowIndicator.prototype.getCssClass = function () { + return "icon-clock"; + }; + + FollowIndicator.prototype.getText = function () { + var timer = this.timerService.getTimer(); + return timer ? timer.getModel().name : NO_TIMER; + }; + + FollowIndicator.prototype.getDescription = function () { + return ""; + }; + + return FollowIndicator; + } +); diff --git a/platform/features/clock/src/services/TimerService.js b/platform/features/clock/src/services/TimerService.js new file mode 100644 index 0000000000..81ea8eb281 --- /dev/null +++ b/platform/features/clock/src/services/TimerService.js @@ -0,0 +1,102 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2009-2016, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +define(['EventEmitter'], function (EventEmitter) { + + /** + * Tracks the currently-followed Timer object. Used by + * timelines et al to synchronize to a particular timer. + * + * The TimerService emits `change` events when the active timer + * is changed. + */ + function TimerService(openmct) { + EventEmitter.apply(this); + this.time = openmct.time; + } + + TimerService.prototype = Object.create(EventEmitter.prototype); + + /** + * Set (or clear, if `timer` is undefined) the currently active timer. + * @param {DomainObject} timer the new active timer + * @emits change + */ + TimerService.prototype.setTimer = function (timer) { + this.timer = timer; + this.emit('change'); + }; + + /** + * Get the currently active timer. + * @return {DomainObject} the active timer + * @emits change + */ + TimerService.prototype.getTimer = function () { + return this.timer; + }; + + + /** + * Check if there is a currently active timer. + * @return {boolean} true if there is a timer + */ + TimerService.prototype.hasTimer = function () { + return !!this.timer; + }; + + /** + * Convert the provided timestamp to milliseconds relative to + * the active timer. + * @return {number} milliseconds since timer start + */ + TimerService.prototype.convert = function (timestamp) { + var clock = this.time.clock(); + var canConvert = this.hasTimer() && + !!clock && + this.timer.getModel().timerState !== 'stopped'; + + if (!canConvert) { + return undefined; + } + + var now = clock.currentValue(); + var model = this.timer.getModel(); + var delta = model.timerState === 'paused' ? now - model.pausedTime : 0; + var epoch = model.timestamp; + + return timestamp - epoch - delta; + }; + + /** + * Get the value of the active clock, adjusted to be relative to the active + * timer. If there is no clock or no active timer, this will return + * `undefined`. + * @return {number} milliseconds since the start of the active timer + */ + TimerService.prototype.now = function () { + var clock = this.time.clock(); + return clock && this.convert(clock.currentValue()); + }; + + return TimerService; +}); diff --git a/platform/features/clock/test/actions/FollowTimerActionSpec.js b/platform/features/clock/test/actions/FollowTimerActionSpec.js new file mode 100644 index 0000000000..18219ddc56 --- /dev/null +++ b/platform/features/clock/test/actions/FollowTimerActionSpec.js @@ -0,0 +1,80 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2009-2016, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +define([ + "../../src/actions/FollowTimerAction" +], function (FollowTimerAction) { + var TIMER_SERVICE_METHODS = + ['setTimer', 'getTimer', 'clearTimer', 'on', 'off']; + + describe("The Follow Timer action", function () { + var testContext; + var testModel; + + beforeEach(function () { + testModel = {}; + testContext = { domainObject: { getModel: function () { + return testModel; + } } }; + }); + + it("is applicable to timers", function () { + testModel.type = "timer"; + expect(FollowTimerAction.appliesTo(testContext)).toBe(true); + }); + + it("is inapplicable to non-timers", function () { + testModel.type = "folder"; + expect(FollowTimerAction.appliesTo(testContext)).toBe(false); + }); + + describe("when instantiated", function () { + var mockTimerService; + var action; + + beforeEach(function () { + mockTimerService = jasmine.createSpyObj( + 'timerService', + TIMER_SERVICE_METHODS + ); + action = new FollowTimerAction(mockTimerService, testContext); + }); + + it("does not interact with the timer service", function () { + TIMER_SERVICE_METHODS.forEach(function (method) { + expect(mockTimerService[method]).not.toHaveBeenCalled(); + }); + }); + + describe("and performed", function () { + beforeEach(function () { + action.perform(); + }); + + it("sets the active timer", function () { + expect(mockTimerService.setTimer) + .toHaveBeenCalledWith(testContext.domainObject); + }); + }); + }); + }); +}); diff --git a/platform/features/clock/test/indicators/FollowIndicatorSpec.js b/platform/features/clock/test/indicators/FollowIndicatorSpec.js new file mode 100644 index 0000000000..f158d07ec3 --- /dev/null +++ b/platform/features/clock/test/indicators/FollowIndicatorSpec.js @@ -0,0 +1,60 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2009-2016, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +define(["../../src/indicators/FollowIndicator"], function (FollowIndicator) { + var TIMER_SERVICE_METHODS = + ['setTimer', 'getTimer', 'clearTimer', 'on', 'off']; + + describe("The timer-following indicator", function () { + var mockTimerService; + var indicator; + + beforeEach(function () { + mockTimerService = + jasmine.createSpyObj('timerService', TIMER_SERVICE_METHODS); + indicator = new FollowIndicator(mockTimerService); + }); + + it("implements the Indicator interface", function () { + expect(indicator.getGlyphClass()).toEqual(jasmine.any(String)); + expect(indicator.getCssClass()).toEqual(jasmine.any(String)); + expect(indicator.getText()).toEqual(jasmine.any(String)); + expect(indicator.getDescription()).toEqual(jasmine.any(String)); + }); + + describe("when a timer is set", function () { + var testModel; + var mockDomainObject; + + beforeEach(function () { + testModel = { name: "some timer!" }; + mockDomainObject = jasmine.createSpyObj('timer', ['getModel']); + mockDomainObject.getModel.andReturn(testModel); + mockTimerService.getTimer.andReturn(mockDomainObject); + }); + + it("display's the timer's name", function () { + expect(indicator.getText()).toEqual(testModel.name); + }); + }); + }); +}); diff --git a/platform/features/clock/test/services/TimerServiceSpec.js b/platform/features/clock/test/services/TimerServiceSpec.js new file mode 100644 index 0000000000..fe137a4877 --- /dev/null +++ b/platform/features/clock/test/services/TimerServiceSpec.js @@ -0,0 +1,64 @@ +/***************************************************************************** + * Open MCT, Copyright (c) 2009-2016, United States Government + * as represented by the Administrator of the National Aeronautics and Space + * Administration. All rights reserved. + * + * Open MCT is licensed under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * Open MCT includes source code licensed under additional open source + * licenses. See the Open Source Licenses file (LICENSES.md) included with + * this source code distribution or the Licensing information page available + * at runtime from the About dialog for additional information. + *****************************************************************************/ + +define([ + '../../src/services/TimerService' +], function (TimerService) { + describe("TimerService", function () { + var callback; + var mockClock; + var mockmct; + var timerService; + + beforeEach(function () { + callback = jasmine.createSpy('callback'); + mockmct = { time: { clock: jasmine.createSpy('clock') } }; + timerService = new TimerService(mockmct); + timerService.on('change', callback); + }); + + it("initially emits no change events", function () { + expect(callback).not.toHaveBeenCalled(); + }); + + it("reports no current timer", function () { + expect(timerService.getTimer()).toBeUndefined(); + }); + + describe("setTimer", function () { + var testTimer; + + beforeEach(function () { + testTimer = { name: "I am some timer; you are nobody." }; + timerService.setTimer(testTimer); + }); + + it("emits a change event", function () { + expect(callback).toHaveBeenCalled(); + }); + + it("reports the current timer", function () { + expect(timerService.getTimer()).toBe(testTimer); + }); + }); + }); +}); diff --git a/platform/features/timeline/bundle.js b/platform/features/timeline/bundle.js index 82646b55e9..eec6113054 100644 --- a/platform/features/timeline/bundle.js +++ b/platform/features/timeline/bundle.js @@ -29,6 +29,7 @@ define([ "./src/controllers/TimelineTickController", "./src/controllers/TimelineTableController", "./src/controllers/TimelineGanttController", + "./src/controllers/TimelineTOIController", "./src/controllers/ActivityModeValuesController", "./src/capabilities/ActivityTimespanCapability", "./src/capabilities/TimelineTimespanCapability", @@ -59,6 +60,7 @@ define([ TimelineTickController, TimelineTableController, TimelineGanttController, + TimelineTOIController, ActivityModeValuesController, ActivityTimespanCapability, TimelineTimespanCapability, @@ -502,6 +504,15 @@ define([ "TIMELINE_MAXIMUM_OFFSCREEN" ] }, + { + "key": "TimelineTOIController", + "implementation": TimelineTOIController, + "depends": [ + "openmct", + "timerService", + "$scope" + ] + }, { "key": "ActivityModeValuesController", "implementation": ActivityModeValuesController, diff --git a/platform/features/timeline/res/templates/timeline.html b/platform/features/timeline/res/templates/timeline.html index d4c022f150..16b899494c 100644 --- a/platform/features/timeline/res/templates/timeline.html +++ b/platform/features/timeline/res/templates/timeline.html @@ -101,22 +101,29 @@ class="abs split-pane-component l-timeline-pane l-pane-r t-pane-v"> -
+
+ + + @@ -132,6 +139,10 @@ toMillis: zoomController.toMillis }"> +
+
+