Skip to content

Commit

Permalink
Merge pull request #77 from ryanjbaxter/move-preferences-widget-out-o…
Browse files Browse the repository at this point in the history
…f-toolbar

Move preferences widget out of toolbar
  • Loading branch information
ryanjbaxter committed Nov 1, 2013
2 parents 5cbb01b + bb5b578 commit df8d6ae
Show file tree
Hide file tree
Showing 10 changed files with 165 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,5 +14,4 @@
</div>
</div>
</div>
<div data-dojo-type="explorer/widgets/gadgetarea/PreferencesDialog" data-dojo-attach-point='prefDialog'></div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@
<div class="clear"></div>
</div>
<div data-dojo-attach-point="loginModal" data-dojo-type="explorer/widgets/login/LoginDialog"></div>
<div data-dojo-type="explorer/widgets/gadgetarea/PreferencesDialog" data-dojo-attach-point='prefDialog'></div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
}
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
},

/**
Expand All @@ -173,19 +172,26 @@ 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);
oDataModel.gadget = url;
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;
},

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -54,26 +53,14 @@ 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.
*/
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;
},

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ define(['explorer/widgets/login/LoginDialog', 'dojo/query',
getProviders : function(callbacks) {
var data = {
testPlatform: {
imageUrl: "testImageUrl",
imageUrl: "",
name: "testName",
url: "testUrl"
}
Expand All @@ -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");
Expand Down
Original file line number Diff line number Diff line change
@@ -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"});
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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"
});
Expand All @@ -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"
});
Expand Down Expand Up @@ -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"
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down

0 comments on commit df8d6ae

Please sign in to comment.