From c0311be1921c39578757977020077410317fa8b4 Mon Sep 17 00:00:00 2001 From: Henry Date: Mon, 20 Jun 2016 15:49:04 -0700 Subject: [PATCH] [Browse] Inspector shown when object switched to edit mode. Fixes #1031 --- platform/commonUI/browse/bundle.js | 13 +++ .../commonUI/browse/res/templates/browse.html | 2 +- .../browse/src/InspectorPaneController.js | 79 +++++++++++++++ .../test/InspectorPaneControllerSpec.js | 96 +++++++++++++++++++ 4 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 platform/commonUI/browse/src/InspectorPaneController.js create mode 100644 platform/commonUI/browse/test/InspectorPaneControllerSpec.js diff --git a/platform/commonUI/browse/bundle.js b/platform/commonUI/browse/bundle.js index 9fb7015456..8f62473b54 100644 --- a/platform/commonUI/browse/bundle.js +++ b/platform/commonUI/browse/bundle.js @@ -23,6 +23,7 @@ define([ "./src/BrowseController", "./src/PaneController", + "./src/InspectorPaneController", "./src/BrowseObjectController", "./src/MenuArrowController", "./src/navigation/NavigationService", @@ -44,6 +45,7 @@ define([ ], function ( BrowseController, PaneController, + InspectorPaneController, BrowseObjectController, MenuArrowController, NavigationService, @@ -124,6 +126,17 @@ define([ "depends": [ "$scope" ] + }, + { + "key": "InspectorPaneController", + "implementation": InspectorPaneController, + "priority": "preferred", + "depends": [ + "$scope", + "agentService", + "$window", + "navigationService" + ] } ], "representations": [ diff --git a/platform/commonUI/browse/res/templates/browse.html b/platform/commonUI/browse/res/templates/browse.html index 75fcaaeb0a..b5e9561b15 100644 --- a/platform/commonUI/browse/res/templates/browse.html +++ b/platform/commonUI/browse/res/templates/browse.html @@ -57,7 +57,7 @@ ng-class="{ collapsed : !modelPaneTree.visible() }">
diff --git a/platform/commonUI/browse/src/InspectorPaneController.js b/platform/commonUI/browse/src/InspectorPaneController.js new file mode 100644 index 0000000000..ef8e3883f7 --- /dev/null +++ b/platform/commonUI/browse/src/InspectorPaneController.js @@ -0,0 +1,79 @@ +/***************************************************************************** + * 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. + *****************************************************************************/ + + +define( + ["./PaneController"], + function (PaneController) { + + /** + * Pane controller that reveals inspector, if hidden, when object + * switches to edit mode. + * + * @param $scope + * @param agentService + * @param $window + * @param navigationService + * @constructor + */ + function InspectorPaneController($scope, agentService, $window, navigationService) { + PaneController.call(this, $scope, agentService, $window); + + var statusListener, + self = this; + + function showInspector(statuses) { + if (statuses.indexOf('editing') !== -1 && !self.visible()) { + self.toggle(); + } + } + + function attachStatusListener(domainObject) { + // Remove existing status listener if existing + if (statusListener) { + statusListener(); + } + + if (domainObject.hasCapability("status")) { + statusListener = domainObject.getCapability("status").listen(showInspector); + } + return statusListener; + } + + var domainObject = navigationService.getNavigation(); + if (domainObject) { + attachStatusListener(domainObject); + } + + var navigationListener = navigationService.addListener(attachStatusListener); + + $scope.$on("$destroy", function () { + statusListener(); + navigationListener(); + }); + } + + InspectorPaneController.prototype = Object.create(PaneController.prototype); + + return InspectorPaneController; + } +); diff --git a/platform/commonUI/browse/test/InspectorPaneControllerSpec.js b/platform/commonUI/browse/test/InspectorPaneControllerSpec.js new file mode 100644 index 0000000000..635396902b --- /dev/null +++ b/platform/commonUI/browse/test/InspectorPaneControllerSpec.js @@ -0,0 +1,96 @@ +/***************************************************************************** + * 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. + *****************************************************************************/ + +define( + ["../src/InspectorPaneController"], + function (InspectorPaneController) { + + describe("The InspectorPaneController", function () { + var mockScope, + mockAgentService, + mockDomainObject, + mockWindow, + mockStatusCapability, + mockNavigationService, + mockNavigationUnlistener, + mockStatusUnlistener, + controller; + + beforeEach(function () { + mockScope = jasmine.createSpyObj("$scope", ["$on"]); + mockWindow = jasmine.createSpyObj("$window", ["open"]); + mockAgentService = jasmine.createSpyObj( + "agentService", + ["isMobile", "isPhone", "isTablet", "isPortrait", "isLandscape"] + ); + + mockNavigationUnlistener = jasmine.createSpy("navigationUnlistener"); + mockNavigationService = jasmine.createSpyObj( + "navigationService", + ["getNavigation", "addListener"] + ); + mockNavigationService.addListener.andReturn(mockNavigationUnlistener); + + mockStatusUnlistener = jasmine.createSpy("statusUnlistener"); + mockStatusCapability = jasmine.createSpyObj( + "statusCapability", + ["listen"] + ); + mockStatusCapability.listen.andReturn(mockStatusUnlistener); + + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + [ + 'getId', + 'getModel', + 'getCapability', + 'hasCapability' + ] + ); + mockDomainObject.getId.andReturn("domainObject"); + mockDomainObject.getModel.andReturn({}); + mockDomainObject.hasCapability.andReturn(true); + mockDomainObject.getCapability.andReturn(mockStatusCapability); + + controller = new InspectorPaneController(mockScope, mockAgentService, mockWindow, mockNavigationService); + }); + + it("listens for changes to navigation and attaches a status" + + " listener", function () { + expect(mockNavigationService.addListener).toHaveBeenCalledWith(jasmine.any(Function)); + mockNavigationService.addListener.mostRecentCall.args[0](mockDomainObject); + expect(mockStatusCapability.listen).toHaveBeenCalledWith(jasmine.any(Function)); + }); + + it("if hidden, shows the inspector when domain object switches to" + + " edit mode", function () { + controller.toggle(); + // test pre-condition that inspector is hidden + expect(controller.visible()).toBe(false); + mockNavigationService.addListener.mostRecentCall.args[0](mockDomainObject); + mockStatusCapability.listen.mostRecentCall.args[0](["editing"]); + expect(controller.visible()).toBe(true); + }); + + }); + } +);