From a937a3193b494cb1542852633cf0bd0468a56e94 Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 20 May 2015 09:57:04 -0700 Subject: [PATCH 1/2] [Windowing] Show title of navigated object Show title of navigated object in window, WTD-1200. --- platform/commonUI/browse/bundle.json | 6 ++ .../commonUI/browse/src/BrowseController.js | 1 + .../src/navigation/NavigationService.js | 10 ++-- .../browse/src/windowing/WindowTitler.js | 30 ++++++++++ .../test/navigation/NavigationServiceSpec.js | 10 ++++ platform/commonUI/browse/test/suite.json | 3 +- .../browse/test/windowing/WindowTitlerSpec.js | 59 +++++++++++++++++++ 7 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 platform/commonUI/browse/src/windowing/WindowTitler.js create mode 100644 platform/commonUI/browse/test/windowing/WindowTitlerSpec.js diff --git a/platform/commonUI/browse/bundle.json b/platform/commonUI/browse/bundle.json index ca7a4a41e3..ca3e4e8052 100644 --- a/platform/commonUI/browse/bundle.json +++ b/platform/commonUI/browse/bundle.json @@ -121,6 +121,12 @@ "depends": [ "typeService", "dialogService", "creationService", "policyService" ] } ], + "runs": [ + { + "implementation": "windowing/WindowTitler.js", + "depends": [ "navigationService", "$rootScope", "$document" ] + } + ], "licenses": [ { "name": "screenfull.js", diff --git a/platform/commonUI/browse/src/BrowseController.js b/platform/commonUI/browse/src/BrowseController.js index 0d0e07781c..822444a8d4 100644 --- a/platform/commonUI/browse/src/BrowseController.js +++ b/platform/commonUI/browse/src/BrowseController.js @@ -25,6 +25,7 @@ define( function setNavigation(domainObject) { $scope.navigatedObject = domainObject; $scope.treeModel.selectedObject = domainObject; + navigationService.setNavigation(domainObject); } // Load the root object, put it in the scope. diff --git a/platform/commonUI/browse/src/navigation/NavigationService.js b/platform/commonUI/browse/src/navigation/NavigationService.js index 3f8e9f41ab..ba8d6fb439 100644 --- a/platform/commonUI/browse/src/navigation/NavigationService.js +++ b/platform/commonUI/browse/src/navigation/NavigationService.js @@ -24,10 +24,12 @@ define( // Setter for navigation; invokes callbacks function setNavigation(value) { - navigated = value; - callbacks.forEach(function (callback) { - callback(value); - }); + if (navigated !== value) { + navigated = value; + callbacks.forEach(function (callback) { + callback(value); + }); + } } // Adds a callback diff --git a/platform/commonUI/browse/src/windowing/WindowTitler.js b/platform/commonUI/browse/src/windowing/WindowTitler.js new file mode 100644 index 0000000000..e1381c2f14 --- /dev/null +++ b/platform/commonUI/browse/src/windowing/WindowTitler.js @@ -0,0 +1,30 @@ +/*global define,Promise*/ + +define( + [], + function () { + "use strict"; + + /** + * + * @constructor + */ + function WindowTitler(navigationService, $rootScope, $document) { + // Look up name of the navigated domain object... + function getNavigatedObjectName() { + var navigatedObject = navigationService.getNavigation(); + return navigatedObject && navigatedObject.getModel().name; + } + + // Set the window title... + function setTitle(name) { + $document[0].title = name; + } + + // Watch the former, and invoke the latter + $rootScope.$watch(getNavigatedObjectName, setTitle); + } + + return WindowTitler; + } +); \ No newline at end of file diff --git a/platform/commonUI/browse/test/navigation/NavigationServiceSpec.js b/platform/commonUI/browse/test/navigation/NavigationServiceSpec.js index ae757158b0..1bef7411a7 100644 --- a/platform/commonUI/browse/test/navigation/NavigationServiceSpec.js +++ b/platform/commonUI/browse/test/navigation/NavigationServiceSpec.js @@ -41,6 +41,16 @@ define( expect(callback).toHaveBeenCalledWith(testObject); }); + it("does not notify listeners when no changes occur", function () { + var testObject = { someKey: 42 }, + callback = jasmine.createSpy("callback"); + + navigationService.addListener(callback); + navigationService.setNavigation(testObject); + navigationService.setNavigation(testObject); + expect(callback.calls.length).toEqual(1); + }); + it("stops notifying listeners after removal", function () { var testObject = { someKey: 42 }, callback = jasmine.createSpy("callback"); diff --git a/platform/commonUI/browse/test/suite.json b/platform/commonUI/browse/test/suite.json index 2c74311faa..21d76dae05 100644 --- a/platform/commonUI/browse/test/suite.json +++ b/platform/commonUI/browse/test/suite.json @@ -8,5 +8,6 @@ "creation/LocatorController", "navigation/NavigateAction", "navigation/NavigationService", - "windowing/FullscreenAction" + "windowing/FullscreenAction", + "windowing/WindowTitler" ] \ No newline at end of file diff --git a/platform/commonUI/browse/test/windowing/WindowTitlerSpec.js b/platform/commonUI/browse/test/windowing/WindowTitlerSpec.js new file mode 100644 index 0000000000..cc08be51f8 --- /dev/null +++ b/platform/commonUI/browse/test/windowing/WindowTitlerSpec.js @@ -0,0 +1,59 @@ +/*global define,Promise,describe,it,expect,beforeEach,waitsFor,jasmine*/ + +/** + * WindowTitlerSpec. Created by vwoeltje on 11/6/14. + */ +define( + ["../../src/windowing/WindowTitler"], + function (WindowTitler) { + "use strict"; + + describe("The window titler", function () { + var mockNavigationService, + mockRootScope, + mockDocument, + mockDomainObject, + titler; + + beforeEach(function () { + mockNavigationService = jasmine.createSpyObj( + 'navigationService', + [ 'getNavigation' ] + ); + mockRootScope = jasmine.createSpyObj( + '$rootScope', + [ '$watch' ] + ); + mockDomainObject = jasmine.createSpyObj( + 'domainObject', + ['getModel'] + ); + mockDocument = [{}]; + + mockDomainObject.getModel.andReturn({ name: 'Test name' }); + mockNavigationService.getNavigation.andReturn(mockDomainObject); + + titler = new WindowTitler( + mockNavigationService, + mockRootScope, + mockDocument + ); + }); + + it("listens for changes to the name of the navigated object", function () { + expect(mockRootScope.$watch).toHaveBeenCalledWith( + jasmine.any(Function), + jasmine.any(Function) + ); + expect(mockRootScope.$watch.mostRecentCall.args[0]()) + .toEqual('Test name'); + }); + + it("sets the title to the name of the navigated object", function () { + mockRootScope.$watch.mostRecentCall.args[1]("Some name"); + expect(mockDocument[0].title).toEqual("Some name"); + }); + + }); + } +); \ No newline at end of file From ce2b48981a65573dca42dead534a6fc3ae08859c Mon Sep 17 00:00:00 2001 From: Victor Woeltjen Date: Wed, 20 May 2015 10:06:59 -0700 Subject: [PATCH 2/2] [Windowing] Add in-line documentation WTD-1200. --- platform/commonUI/browse/src/windowing/WindowTitler.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform/commonUI/browse/src/windowing/WindowTitler.js b/platform/commonUI/browse/src/windowing/WindowTitler.js index e1381c2f14..49a121df90 100644 --- a/platform/commonUI/browse/src/windowing/WindowTitler.js +++ b/platform/commonUI/browse/src/windowing/WindowTitler.js @@ -6,7 +6,8 @@ define( "use strict"; /** - * + * Updates the title of the current window to reflect the name + * of the currently navigated-to domain object. * @constructor */ function WindowTitler(navigationService, $rootScope, $document) {