diff --git a/platform/commonUI/browse/bundle.json b/platform/commonUI/browse/bundle.json index 9478213a0b..602884c09f 100644 --- a/platform/commonUI/browse/bundle.json +++ b/platform/commonUI/browse/bundle.json @@ -27,7 +27,9 @@ }, { "key": "BrowseTreeController", - "implementation": "BrowseTreeController.js" + "implementation": "BrowseTreeController.js", + "priority": "preferred", + "depends": [ "$scope", "navigationService", "agentService" ] }, { "key": "BrowseObjectController", diff --git a/platform/commonUI/browse/src/BrowseTreeController.js b/platform/commonUI/browse/src/BrowseTreeController.js index 1ad50b8c1e..a5a408c747 100644 --- a/platform/commonUI/browse/src/BrowseTreeController.js +++ b/platform/commonUI/browse/src/BrowseTreeController.js @@ -21,19 +21,39 @@ *****************************************************************************/ /*global define,Promise*/ + define( [], function () { "use strict"; - /** * Controller to provide the ability to show/hide the tree in * Browse mode. * @constructor * @memberof platform/commonUI/browse */ - function BrowseTreeController() { + function BrowseTreeController($scope, navigationService, agentService) { + var object = navigationService.getNavigation(), + self = this; + + // Collapse tree when navigation changes + function changeObject(newObject) { + if (newObject !== object && agentService.isPortrait()) { + object = newObject; + self.state = false; + } + } + + // On phones, trees should collapse in portrait mode + // when something is navigated-to. + if (agentService.isPhone()) { + navigationService.addListener(changeObject); + $scope.$on("$destroy", function () { + navigationService.removeListener(changeObject); + }); + } + this.state = true; } diff --git a/platform/commonUI/browse/test/BrowseTreeControllerSpec.js b/platform/commonUI/browse/test/BrowseTreeControllerSpec.js index 4c605dd7b4..341a76c82d 100644 --- a/platform/commonUI/browse/test/BrowseTreeControllerSpec.js +++ b/platform/commonUI/browse/test/BrowseTreeControllerSpec.js @@ -25,19 +25,99 @@ define( ["../src/BrowseTreeController"], function (BrowseTreeController) { 'use strict'; + describe("The BrowseTreeController", function () { - var controller = new BrowseTreeController(); + var mockScope, + mockNavigationService, + mockAgentService, + mockDomainObjects, + controller; + + // We want to reinstantiate for each test case + // because device state can influence constructor-time behavior + function instantiateController() { + return new BrowseTreeController( + mockScope, + mockNavigationService, + mockAgentService + ); + } + + beforeEach(function () { + mockScope = jasmine.createSpyObj("$scope", [ "$on" ]); + mockNavigationService = jasmine.createSpyObj( + "navigationService", + [ "getNavigation", "addListener", "removeListener" ] + ); + mockDomainObjects = ['a', 'b'].map(function (id) { + var mockDomainObject = jasmine.createSpyObj( + 'domainObject-' + id, + [ 'getId', 'getModel', 'getCapability' ] + ); + + mockDomainObject.getId.andReturn(id); + mockDomainObject.getModel.andReturn({}); + + return mockDomainObject; + }); + mockAgentService = jasmine.createSpyObj( + "agentService", + [ "isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape" ] + ); + + mockNavigationService.getNavigation.andReturn(mockDomainObjects[0]); + }); it("is initially visible", function () { - expect(controller.visible()).toBeTruthy(); + expect(instantiateController().visible()).toBeTruthy(); }); it("allows visibility to be toggled", function () { + controller = instantiateController(); controller.toggle(); expect(controller.visible()).toBeFalsy(); controller.toggle(); expect(controller.visible()).toBeTruthy(); }); + + it("collapses on navigation changes on portrait-oriented phones", function () { + mockAgentService.isMobile.andReturn(true); + mockAgentService.isPhone.andReturn(true); + mockAgentService.isPortrait.andReturn(true); + controller = instantiateController(); + expect(controller.visible()).toBeTruthy(); + + // Simulate a navigation change + mockNavigationService.getNavigation.andReturn(mockDomainObjects[1]); + mockNavigationService.addListener.calls.forEach(function (call) { + call.args[0](mockDomainObjects[1]); + }); + + // Tree should have collapsed + expect(controller.visible()).toBeFalsy(); + }); + + it("detaches registered listeners when the scope is destroyed", function () { + mockAgentService.isMobile.andReturn(true); + mockAgentService.isPhone.andReturn(true); + mockAgentService.isPortrait.andReturn(true); + controller = instantiateController(); + + // Verify precondition + expect(mockNavigationService.removeListener) + .not.toHaveBeenCalled(); + + mockScope.$on.calls.forEach(function (call) { + if (call.args[0] === '$destroy') { + call.args[1](); + } + }); + + expect(mockNavigationService.removeListener) + .toHaveBeenCalledWith( + mockNavigationService.addListener.mostRecentCall.args[0] + ); + }); }); } ); diff --git a/platform/commonUI/mobile/bundle.json b/platform/commonUI/mobile/bundle.json index 0037a45259..1ac308a84b 100644 --- a/platform/commonUI/mobile/bundle.json +++ b/platform/commonUI/mobile/bundle.json @@ -1,13 +1,5 @@ { "extensions": { - "controllers": [ - { - "key": "BrowseTreeController", - "implementation": "MobileBrowseTreeController.js", - "priority": "preferred", - "depends": [ "$scope", "navigationService", "agentService" ] - } - ], "directives": [ { "key": "mctDevice", diff --git a/platform/commonUI/mobile/src/MobileBrowseTreeController.js b/platform/commonUI/mobile/src/MobileBrowseTreeController.js deleted file mode 100644 index 9cb31fcc5a..0000000000 --- a/platform/commonUI/mobile/src/MobileBrowseTreeController.js +++ /dev/null @@ -1,65 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web 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 Web 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. - *****************************************************************************/ -/*global define,Promise*/ - -/** - * This bundle implements Browse mode. - * @namespace platform/commonUI/browse - */ -define( - [], - function () { - "use strict"; - - function MobileBrowseTreeController($scope, navigationService, agentService) { - var object = navigationService.getNavigation(), - self = this; - - // Collapse tree when navigation changes - function changeObject(newObject) { - if (newObject !== object && agentService.isPortrait()) { - object = newObject; - self.state = false; - } - } - - if (agentService.isPhone()) { - navigationService.addListener(changeObject); - $scope.$on("$destroy", function () { - navigationService.removeListener(changeObject); - }); - } - - this.state = true; - } - - MobileBrowseTreeController.prototype.toggle = function () { - this.state = !this.state; - }; - - MobileBrowseTreeController.prototype.visible = function () { - return this.state; - }; - - return MobileBrowseTreeController; - } -); diff --git a/platform/commonUI/mobile/test/MobileBrowseTreeControllerSpec.js b/platform/commonUI/mobile/test/MobileBrowseTreeControllerSpec.js deleted file mode 100644 index a3be9b0652..0000000000 --- a/platform/commonUI/mobile/test/MobileBrowseTreeControllerSpec.js +++ /dev/null @@ -1,123 +0,0 @@ -/***************************************************************************** - * Open MCT Web, Copyright (c) 2014-2015, United States Government - * as represented by the Administrator of the National Aeronautics and Space - * Administration. All rights reserved. - * - * Open MCT Web 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 Web 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. - *****************************************************************************/ -/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/ - -define( - ["../src/MobileBrowseTreeController"], - function (MobileBrowseTreeController) { - 'use strict'; - - describe("The mobile variant of the BrowseTreeController", function () { - var mockScope, - mockNavigationService, - mockAgentService, - mockDomainObjects, - controller; - - // We want to reinstantiate for each test case - // because device state can influence constructor-time behavior - function instantiateController() { - return new MobileBrowseTreeController( - mockScope, - mockNavigationService, - mockAgentService - ); - } - - beforeEach(function () { - mockScope = jasmine.createSpyObj("$scope", [ "$on" ]); - mockNavigationService = jasmine.createSpyObj( - "navigationService", - [ "getNavigation", "addListener", "removeListener" ] - ); - mockDomainObjects = ['a', 'b'].map(function (id) { - var mockDomainObject = jasmine.createSpyObj( - 'domainObject-' + id, - [ 'getId', 'getModel', 'getCapability' ] - ); - - mockDomainObject.getId.andReturn(id); - mockDomainObject.getModel.andReturn({}); - - return mockDomainObject; - }); - mockAgentService = jasmine.createSpyObj( - "agentService", - [ "isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape" ] - ); - - mockNavigationService.getNavigation.andReturn(mockDomainObjects[0]); - }); - - it("is initially visible", function () { - expect(instantiateController().visible()).toBeTruthy(); - }); - - it("allows visibility to be toggled", function () { - controller = instantiateController(); - controller.toggle(); - expect(controller.visible()).toBeFalsy(); - controller.toggle(); - expect(controller.visible()).toBeTruthy(); - }); - - it("collapses on navigation changes on portrait-oriented phones", function () { - mockAgentService.isMobile.andReturn(true); - mockAgentService.isPhone.andReturn(true); - mockAgentService.isPortrait.andReturn(true); - controller = instantiateController(); - expect(controller.visible()).toBeTruthy(); - - // Simulate a navigation change - mockNavigationService.getNavigation.andReturn(mockDomainObjects[1]); - mockNavigationService.addListener.calls.forEach(function (call) { - call.args[0](mockDomainObjects[1]); - }); - - // Tree should have collapsed - expect(controller.visible()).toBeFalsy(); - }); - - it("detaches registered listeners when the scope is destroyed", function () { - mockAgentService.isMobile.andReturn(true); - mockAgentService.isPhone.andReturn(true); - mockAgentService.isPortrait.andReturn(true); - controller = instantiateController(); - - // Verify precondition - expect(mockNavigationService.removeListener) - .not.toHaveBeenCalled(); - - mockScope.$on.calls.forEach(function (call) { - if (call.args[0] === '$destroy') { - call.args[1](); - } - }); - - expect(mockNavigationService.removeListener) - .toHaveBeenCalledWith( - mockNavigationService.addListener.mostRecentCall.args[0] - ); - }); - }); - } -); diff --git a/platform/commonUI/mobile/test/suite.json b/platform/commonUI/mobile/test/suite.json index 4858ba366e..b56625efb4 100644 --- a/platform/commonUI/mobile/test/suite.json +++ b/platform/commonUI/mobile/test/suite.json @@ -1,5 +1,4 @@ [ "AgentService", - "MCTDevice", - "MobileBrowseTreeController" + "MCTDevice" ]