diff --git a/opensocial-explorer-webcontent/src/main/javascript/modules/templates/GadgetToolbar.html b/opensocial-explorer-webcontent/src/main/javascript/modules/templates/GadgetToolbar.html index 8cefbd55..d5b79c9e 100644 --- a/opensocial-explorer-webcontent/src/main/javascript/modules/templates/GadgetToolbar.html +++ b/opensocial-explorer-webcontent/src/main/javascript/modules/templates/GadgetToolbar.html @@ -14,5 +14,4 @@ -
\ No newline at end of file diff --git a/opensocial-explorer-webcontent/src/main/javascript/modules/templates/MainContainer.html b/opensocial-explorer-webcontent/src/main/javascript/modules/templates/MainContainer.html index 814c7b5f..d02130bf 100644 --- a/opensocial-explorer-webcontent/src/main/javascript/modules/templates/MainContainer.html +++ b/opensocial-explorer-webcontent/src/main/javascript/modules/templates/MainContainer.html @@ -8,4 +8,5 @@
+
\ No newline at end of file diff --git a/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/MainContainer.js b/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/MainContainer.js index 16318873..16d0b53c 100644 --- a/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/MainContainer.js +++ b/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/MainContainer.js @@ -29,38 +29,60 @@ * @see {@link http://dojotoolkit.org/reference-guide/1.8/dijit/_WidgetsInTemplateMixin.html|WidgetsInTemplateMixin Documentation} */ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dijit/_WidgetsInTemplateMixin', - 'explorer/widgets/login/LoginDialog', 'dojo/query', 'dojo/on', 'dojo/text!./../templates/MainContainer.html'], + 'explorer/widgets/login/LoginDialog', 'dojo/query', 'dojo/on', 'dojo/text!./../templates/MainContainer.html', + 'explorer/widgets/sidebar/SidebarNav', 'explorer/widgets/gadgetarea/GadgetArea', 'explorer/widgets/editorarea/EditorArea', + 'explorer/widgets/gadgetarea/PreferencesDialog', 'explorer/widgets/login/LoginDialog'], function(declare, WidgetBase, TemplatedMixin, WidgetsInTemplateMixin, LoginDialog, query, on, template) { return declare('MainContainerWidget', [ WidgetBase, TemplatedMixin, WidgetsInTemplateMixin ], { templateString : template, - + /** - * Called right before widget is added to the dom. See link for more information. + * Called right after widget is added to the dom. See link for more information. * * @memberof module:explorer/widgets/MainContainer# * @see {@link http://dojotoolkit.org/reference-guide/1.8/dijit/_WidgetBase.html|Dojo Documentation} */ - postCreate: function() { + startup: function() { + this.inherited(arguments); var self = this; - on(this.sidebarNav, 'show', function(node) { self.editorArea.displaySpec(node.id); self.editorArea.setTitle(node.name); }); on(this.editorArea, 'renderGadget', function(id) { - self.gadgetArea.renderGadget(document.location.protocol + '//' + document.location.host + self.editorArea.getContextRoot() + '/gadgetspec/' + id + '/' + self.editorArea.getGadgetSpec().gadgetResource.name); + var url = document.location.protocol + '//' + document.location.host + self.editorArea.getContextRoot() + '/gadgetspec/' + id + '/' + self.editorArea.getGadgetSpec().gadgetResource.name; + self.gadgetArea.renderGadget(url).then(function(metadata) { + if(metadata && metadata[url]) { + self.prefDialog.addPrefsToUI(metadata[url].userPrefs); + } + }); self.sidebarNav.setNewId(id); }); on(this.editorArea, 'renderEE', function(id) { - self.gadgetArea.renderEmbeddedExperience(document.location.protocol + '//' + document.location.host + self.editorArea.getContextRoot() + '/gadgetspec/' + id + '/' + self.editorArea.getGadgetSpec().gadgetResource.name, self.editorArea.getGadgetSpec().eeResource.content); + var url = document.location.protocol + '//' + document.location.host + self.editorArea.getContextRoot() + '/gadgetspec/' + id + '/' + self.editorArea.getGadgetSpec().gadgetResource.name; + self.gadgetArea.renderEmbeddedExperience(url, self.editorArea.getGadgetSpec().eeResource.content).then(function(results) { + if(results.metadata && results.metadata[url]) { + self.prefDialog.addPrefsToUI(results.metadata[url].userPrefs); + } + }); self.sidebarNav.setNewId(id); }); + on(this.gadgetArea.getExplorerContainer(), 'setpreferences', function(site, url, prefs) { + self.prefDialog.setPrefs(prefs); + }); + query('#login').on('click', function(e) { self.loginModal.show(); }); + + this.prefDialog.addPrefsChangedListener(function(prefs) { + var params = {}; + params[osapi.container.RenderParam.USER_PREFS] = prefs; + self.gadgetArea.reRenderGadget(params); + }); } }); }); \ No newline at end of file diff --git a/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/gadgetarea/GadgetArea.js b/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/gadgetarea/GadgetArea.js index bd7a6391..ac57e349 100644 --- a/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/gadgetarea/GadgetArea.js +++ b/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/gadgetarea/GadgetArea.js @@ -28,10 +28,12 @@ */ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'dojo/topic', 'dojo/_base/array', 'dojo/text!./../../templates/GadgetArea.html', './GadgetToolbar', - 'dojo/dom-construct','../Loading', '../../opensocial-data', './GadgetModalDialog', - 'dojo/_base/window', 'dojo/dom', 'dojo/json', '../../ExplorerContainer', 'dojo/on', './LocationMenuItem'], + 'dojo/dom-construct','../Loading', '../../opensocial-data', './GadgetModalDialog', + 'dojo/_base/window', 'dojo/dom', 'dojo/json', '../../ExplorerContainer', 'dojo/on', 'dojo/Deferred', + './LocationMenuItem'], function(declare, WidgetBase, TemplatedMixin, topic, arrayUtil, template, GadgetToolbar, - domConstruct, Loading, osData, GadgetModalDialog, win, dom, JSON, ExplorerContainer, on, LocationMenuItem) { + domConstruct, Loading, osData, GadgetModalDialog, win, dom, JSON, ExplorerContainer, on, Deferred, + LocationMenuItem) { return declare('GadgetAreaWidget', [ WidgetBase, TemplatedMixin ], { templateString : template, containerToken : null, @@ -52,11 +54,6 @@ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'doj this.gadgetToolbar.startup(); this.addMenuItems(); var self = this; - this.gadgetToolbar.getPrefDialog().addPrefsChangedListener(function(prefs) { - var params = {}; - params[osapi.container.RenderParam.USER_PREFS] = prefs; - self.reRenderGadget(params); - }); this.loadingWidget = new Loading(); domConstruct.place(this.loadingWidget.domNode, this.domNode); this.loadingWidget.startup(); @@ -93,10 +90,6 @@ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'doj on(this.getExplorerContainer(), 'gadgetrendered', function(gadgetUrl, siteId) { self.loadingWidget.hide(); }); - - on(this.getExplorerContainer(), 'setpreferences', function(site, url, prefs) { - self.gadgetToolbar.getPrefDialog().setPrefs(prefs); - }); on(this.getExplorerContainer(), 'addaction', function(action) { self.gadgetToolbar.addAction(action); @@ -152,17 +145,23 @@ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'doj * @param {Object=} opt_renderParams - Optional parameter used by the container, see the * {@link http://opensocial.github.io/spec/2.5/Core-Container.xml#RenderConfiguration|OpenSocial spec} * for more details about how this object should be constructed. + * @returns {module:dojo/promise/Promise} Returns a + * {@link http://dojotoolkit.org/reference-guide/1.8/dojo/promise/Promise.html#dojo-promise-promise|Dojo Promise}. + * Call the then method of this Promise with a function that takes in one parameter, the gadget metadata. */ renderGadget : function(url, opt_renderParams) { this.closeOpenSite(); this.loadingWidget.show(); this.site = this.createSite(); var self = this; + var deferred = new Deferred(); this.getExplorerContainer().renderGadget(url, this.site, opt_renderParams).then(function(metadata) { if(metadata && metadata[url]) { self.gadgetToolbar.setGadgetMetadata(metadata[url]); } + deferred.resolve(metadata); }); + return deferred; }, /** @@ -173,6 +172,10 @@ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'doj * @param {String} dataModel - A stringified JSON object containing just the context property * from the {@link http://opensocial.github.io/spec/2.5/Core-Gadget.xml#Embedded-Experiences|embedded experiences data model}. * The gadget property of the embedded experiences data model will be the URL parameter. + * @returns {module:dojo/promise/Promise} Returns a + * {@link http://dojotoolkit.org/reference-guide/1.8/dojo/promise/Promise.html#dojo-promise-promise|Dojo Promise}. + * Call the then method of this Promise with a function that takes in one parameter, the gadget metadata and the + * {@link http://opensocial.github.io/spec/2.5/Core-Container.xml#osapi.container.GadgetSite|osapi.container.GadgetSite|gadget site}. */ renderEmbeddedExperience : function(url, dataModel) { var oDataModel = JSON.parse(dataModel); @@ -180,12 +183,15 @@ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', 'doj this.closeOpenSite(); this.loadingWidget.show(); var self = this; + var deferred = new Deferred(); this.getExplorerContainer().renderEmbeddedExperience(oDataModel, this.createNodeForSite()).then(function(results) { self.site = results.site; if(results.metadata && results.metadata[oDataModel.gadget]) { self.gadgetToolbar.setGadgetMetadata(results.metadata[oDataModel.gadget]); } + deferred.resolve(results); }); + return deferred; }, /** diff --git a/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/gadgetarea/GadgetToolbar.js b/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/gadgetarea/GadgetToolbar.js index 318d4fc0..659c72f3 100644 --- a/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/gadgetarea/GadgetToolbar.js +++ b/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/gadgetarea/GadgetToolbar.js @@ -29,10 +29,9 @@ * @see {@link http://dojotoolkit.org/reference-guide/1.8/dijit/_WidgetsInTemplateMixin.html|WidgetsInTemplateMixin Documentation} */ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', - 'dojo/query', 'dojo/text!./../../templates/GadgetToolbar.html', - './GadgetMenuButton', './PreferencesDialog', + 'dojo/query', 'dojo/text!./../../templates/GadgetToolbar.html', './GadgetMenuButton', 'dojo/dom-construct', 'dijit/_WidgetsInTemplateMixin', 'dojo/NodeList-manipulate', 'dojo/NodeList-dom'], - function(declare, WidgetBase, TemplatedMixin, query, template, GadgetMenuButton, PreferencesDialog, domConstruct, + function(declare, WidgetBase, TemplatedMixin, query, template, GadgetMenuButton, domConstruct, WidgetsInTemplateMixin) { return declare('GadgetToolbarWidget', [ WidgetBase, TemplatedMixin, WidgetsInTemplateMixin ], { templateString : template, @@ -54,8 +53,7 @@ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', }, /** - * Takes the gadget's metadata and sets the GadgetToolbar's title, constructs the GadgetDropDownMenu, - * and adds the gadget's preferences to the PreferencesDialog. + * Takes the gadget's metadata and sets the GadgetToolbar's title, constructs the GadgetDropDownMenu. * * @memberof module:explorer/widgets/gadgetarea/GadgetToolbar# * @param {Object} metadata - Object with the gadget's metadata. @@ -63,17 +61,6 @@ define(['dojo/_base/declare', 'dijit/_WidgetBase', 'dijit/_TemplatedMixin', setGadgetMetadata : function(metadata) { query('.brand', this.domNode).innerHTML(this.getTitle(metadata)); this.gadgetMenuButton.constructMenu(metadata); - this.prefDialog.addPrefsToUI(metadata.userPrefs); - }, - - /** - * Getter method for the PreferencesDialog. - * - * @memberof module:explorer/widgets/gadgetarea/GadgetToolbar# - * @returns {PreferencesDialog} - The PreferencesDialog object. - */ - getPrefDialog : function() { - return this.prefDialog; }, /** diff --git a/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/login/LoginDialog.js b/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/login/LoginDialog.js index b36a2554..9b72ddc9 100644 --- a/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/login/LoginDialog.js +++ b/opensocial-explorer-webcontent/src/main/javascript/modules/widgets/login/LoginDialog.js @@ -116,7 +116,8 @@ define(['dojo/_base/declare', 'explorer/widgets/ModalDialog', 'dijit/_WidgetsIn /** * Destroys this widget. * - * @memberof module:explorer/widgets/login/LoginDialog# + * @memberof module:explorer/widgets/login/LoginDialog# + * @see {@link http://dojotoolkit.org/reference-guide/1.8/dijit/_WidgetBase.html|Dojo Documentation} */ destroy: function() { this.inherited(arguments); diff --git a/opensocial-explorer-webcontent/src/test/javascript/LoginDialogTest.js b/opensocial-explorer-webcontent/src/test/javascript/LoginDialogTest.js index a9c90bdc..25ffa113 100644 --- a/opensocial-explorer-webcontent/src/test/javascript/LoginDialogTest.js +++ b/opensocial-explorer-webcontent/src/test/javascript/LoginDialogTest.js @@ -40,7 +40,7 @@ define(['explorer/widgets/login/LoginDialog', 'dojo/query', getProviders : function(callbacks) { var data = { testPlatform: { - imageUrl: "testImageUrl", + imageUrl: "", name: "testName", url: "testUrl" } @@ -50,7 +50,7 @@ define(['explorer/widgets/login/LoginDialog', 'dojo/query', }); loginDialog.show(); - expect(loginDialog.providers.testPlatform.imageUrl).toBe("testImageUrl"); + expect(loginDialog.providers.testPlatform.imageUrl).toBe(""); expect(loginDialog.providers.testPlatform.name).toBe("testName"); expect(loginDialog.providers.testPlatform.url).toBe("testUrl"); expect(query("a", loginDialog.domNode).innerHTML()).toBe("testName"); diff --git a/opensocial-explorer-webcontent/src/test/javascript/MainContainerTest.js b/opensocial-explorer-webcontent/src/test/javascript/MainContainerTest.js new file mode 100644 index 00000000..a85f31e4 --- /dev/null +++ b/opensocial-explorer-webcontent/src/test/javascript/MainContainerTest.js @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +define(['explorer/widgets/MainContainer', 'dojo/_base/declare', 'dojo/Evented', 'dojo/dom-class', 'dojo/query', + 'dojo/topic', 'explorer/gadget-spec-service'], + function(MainContainer, declare, Evented, domClass, query, topic, gadgetSpecService){ + describe('An MainContainer widget', function() { + + var MockContainer = declare([Evented], { + fireSetPreferences : function(site, url, preferences) { + this.emit('setpreferences', site, url, preferences); + } + }); + + var prefs = { + "hello_pref": { + "name": "hello_pref", + "defaultValue": "World", + "displayName": "Name", + "dataType": "STRING", + "required": true, + "orderedEnumValues": [] + }, + "number_pref": { + "name": "number_pref", + "defaultValue": "0", + "displayName": "Number", + "dataType": "STRING", + "required": true, + "orderedEnumValues": [] + }, + "list_pref": { + "name": "list_pref", + "defaultValue": "foo|bar|foobar", + "displayName": "List", + "dataType": "LIST", + "required": true, + "orderedEnumValues": [] + }, + "boolean_pref": { + "name": "boolean_pref", + "defaultValue": "false", + "displayName": "Boolean", + "dataType": "BOOL", + "required": true, + "orderedEnumValues": [] + }, + "enum_pref": { + "name": "enum_pref", + "defaultValue": "Red", + "displayName": "Enum", + "dataType": "ENUM", + "required": true, + "orderedEnumValues": [{"value": "Red", "displayValue": "Red"}, {"value": "Green", "displayValue": "Green"}, + {"value": "Blue", "displayValue": "Blue"}, {"value": "Gray", "displayValue": "Gray"}, + {"value": "Purple", "displayValue": "Purple"},{"value": "Black", "displayValue": "Black"}] + } + }; + + beforeEach(function() { + var div = document.createElement("div"); + div.style.display = 'none'; + div.id = 'testDiv'; + document.body.appendChild(div); + mainContainer = new MainContainer(); + spyOn(gadgetSpecService, 'getSpecTree').andReturn(undefined); + spyOn(gadgetSpecService, 'getDefaultGadgetSpec').andReturn(undefined); + mockContainer = new MockContainer(); + spyOn(mainContainer.gadgetArea, 'getExplorerContainer').andReturn(mockContainer); + document.getElementById('testDiv').appendChild(mainContainer.domNode); + mainContainer.startup(); + }); + + afterEach(function() { + document.body.removeChild(document.getElementById('testDiv')); + mainContainer.destroy(); + }); + + it("handle preferences changing", function() { + mainContainer.prefDialog.addPrefsToUI(prefs); + spyOn(mainContainer.gadgetArea, 'reRenderGadget').andReturn(undefined); + mainContainer.prefDialog.notifyPrefsChangedListeners(); + expect(mainContainer.gadgetArea.reRenderGadget.calls.length).toEqual(1); + }); + + it("handles the setpreferences event", function() { + spyOn(mainContainer.prefDialog, 'setPrefs').andCallThrough(); + mockContainer.fireSetPreferences(jasmine.createSpy('site'), 'http://example.com/gadget.xml', {"set_pref" : "1234"}); + expect(mainContainer.prefDialog.setPrefs).toHaveBeenCalledWith({"set_pref" : "1234"}); + }); + }); +}); \ No newline at end of file diff --git a/opensocial-explorer-webcontent/src/test/javascript/OAuthLoginTest.js b/opensocial-explorer-webcontent/src/test/javascript/OAuthLoginTest.js index 349ac2ec..849dacc1 100644 --- a/opensocial-explorer-webcontent/src/test/javascript/OAuthLoginTest.js +++ b/opensocial-explorer-webcontent/src/test/javascript/OAuthLoginTest.js @@ -35,7 +35,7 @@ define(['explorer/widgets/login/OAuthLogin', 'dojo/query', 'dojo/topic', it("can toggle a popup", function() { var oAuthLogin = new OAuthLogin({ - imageUrl: "testImageUrl", + imageUrl: "", name: "testName", endpoint: "testEndpoint" }); @@ -59,7 +59,7 @@ define(['explorer/widgets/login/OAuthLogin', 'dojo/query', 'dojo/topic', it("listens for the security token from the server and updates the welcome text", function() { var oAuthLogin = new OAuthLogin({ - imageUrl: "testImageUrl", + imageUrl: "", name: "testName", endpoint: "testEndpoint" }); @@ -93,7 +93,7 @@ define(['explorer/widgets/login/OAuthLogin', 'dojo/query', 'dojo/topic', it("closes removes the event listener if the user closes the window without logging in", function() { var oAuthLogin = new OAuthLogin({ - imageUrl: "testImageUrl", + imageUrl: "", name: "testName", endpoint: "testEndpoint" }); diff --git a/opensocial-explorer-webcontent/src/test/javascript/gadgetarea/GadgetAreaTest.js b/opensocial-explorer-webcontent/src/test/javascript/gadgetarea/GadgetAreaTest.js index 5ff748cf..d7b294f5 100644 --- a/opensocial-explorer-webcontent/src/test/javascript/gadgetarea/GadgetAreaTest.js +++ b/opensocial-explorer-webcontent/src/test/javascript/gadgetarea/GadgetAreaTest.js @@ -92,12 +92,6 @@ define(['explorer/widgets/gadgetarea/GadgetArea', 'dojo/_base/declare', 'dojo/Ev expect(domClass.contains(loading, 'hide')).toEqual(true); }); - it("handles the setpreferences event", function() { - spyOn(gadgetArea.gadgetToolbar.getPrefDialog(), 'setPrefs').andCallThrough(); - mockContainer.fireSetPreferences(jasmine.createSpy('site'), 'http://example.com/gadget.xml', {"set_pref" : "1234"}); - expect(gadgetArea.gadgetToolbar.getPrefDialog().setPrefs).toHaveBeenCalledWith({"set_pref" : "1234"}); - }); - it("handles the addaction event", function() { spyOn(gadgetArea.gadgetToolbar, 'addAction').andCallThrough(); var action = {