Author: lindner Date: Tue Oct 27 22:19:41 2009 New Revision: 830372 URL: http://svn.apache.org/viewvc?rev=830372&view=rev Log: SHINDIG-1211 | Patch from Benjamin McCann | Only show settings menu in sample gadget if there are user editable prefs
Modified: incubator/shindig/trunk/javascript/container/gadgets.js incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js Modified: incubator/shindig/trunk/javascript/container/gadgets.js URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/container/gadgets.js?rev=830372&r1=830371&r2=830372&view=diff ============================================================================== --- incubator/shindig/trunk/javascript/container/gadgets.js (original) +++ incubator/shindig/trunk/javascript/container/gadgets.js Tue Oct 27 22:19:41 2009 @@ -206,11 +206,10 @@ value) { var id = gadgets.container.gadgetService.getGadgetIdFromModuleId(this.f); var gadget = gadgets.container.getGadget(id); - var prefs = gadget.getUserPrefs() || {}; for (var i = 1, j = arguments.length; i < j; i += 2) { - prefs[arguments[i]] = arguments[i + 1]; + this.userPrefs[arguments[i]].value = arguments[i + 1]; } - gadget.setUserPrefs(prefs); + gadget.saveUserPrefs(); }; /** @@ -373,6 +372,8 @@ * "private": Whether gadget spec is accessible only privately, which means * browser can load it but not gadget server * "spec": Gadget Specification in XML + * "userPrefs": a javascript object containing attribute value pairs of user + * preferences for this gadget with the value being a preference object * "viewParams": a javascript object containing attribute value pairs * for this gadgets * "secureToken": an encoded token that is passed on the URL hash @@ -386,7 +387,7 @@ * javascript */ gadgets.Gadget = function(params) { - this.userPrefs_ = {}; + this.userPrefs = {}; if (params) { for (var name in params) if (params.hasOwnProperty(name)) { @@ -401,21 +402,17 @@ }; gadgets.Gadget.prototype.getUserPrefs = function() { - return this.userPrefs_; + return this.userPrefs; }; -gadgets.Gadget.prototype.setUserPrefs = function(userPrefs) { - this.userPrefs_ = userPrefs; +gadgets.Gadget.prototype.saveUserPrefs = function() { gadgets.container.userPrefStore.savePrefs(this); }; -gadgets.Gadget.prototype.getUserPref = function(name) { - return this.userPrefs_[name]; -}; - -gadgets.Gadget.prototype.setUserPref = function(name, value) { - this.userPrefs_[name] = value; - gadgets.container.userPrefStore.savePrefs(this); +gadgets.Gadget.prototype.getUserPrefValue = function(name) { + var pref = this.userPrefs[name]; + return typeof(pref.value) != 'undefined' && pref.value != null ? + pref.value : pref['default']; }; gadgets.Gadget.prototype.render = function(chrome) { @@ -423,7 +420,7 @@ var gadget = this; this.getContent(function(content) { chrome.innerHTML = content; - window.frames[gadget.getIframeId()].location = gadget.getIframeUrl(); + window.frames[gadget.getIframeId()].location = gadget.getIframeUrl(); }); } }; @@ -501,15 +498,18 @@ gadgets.IfrGadget.prototype.rpcRelay = 'files/container/rpc_relay.html'; gadgets.IfrGadget.prototype.getTitleBarContent = function(continuation) { + var settingsButton = this.hasViewablePrefs_() ? + '<a href="#" onclick="gadgets.container.getGadget(' + this.id + + ').handleOpenUserPrefsDialog();return false;" class="' + this.cssClassTitleButton + + '">settings</a> ' + : ''; continuation('<div id="' + this.cssClassTitleBar + '-' + this.id + '" class="' + this.cssClassTitleBar + '"><span id="' + this.getIframeId() + '_title" class="' + this.cssClassTitle + '">' + (this.title ? this.title : 'Title') + '</span> | <span class="' + - this.cssClassTitleButtonBar + - '"><a href="#" onclick="gadgets.container.getGadget(' + this.id + - ').handleOpenUserPrefsDialog();return false;" class="' + this.cssClassTitleButton + - '">settings</a> <a href="#" onclick="gadgets.container.getGadget(' + - this.id + ').handleToggle();return false;" class="' + this.cssClassTitleButton + + this.cssClassTitleButtonBar + '">' + settingsButton + + '<a href="#" onclick="gadgets.container.getGadget(' + this.id + + ').handleToggle();return false;" class="' + this.cssClassTitleButton + '">toggle</a></span></div>'); }; @@ -570,12 +570,9 @@ gadgets.IfrGadget.prototype.getUserPrefsParams = function() { var params = ''; - if (this.getUserPrefs()) { - for(var name in this.getUserPrefs()) { - var value = this.getUserPref(name); - params += '&up_' + encodeURIComponent(name) + '=' + - encodeURIComponent(value); - } + for(var name in this.getUserPrefs()) { + params += '&up_' + encodeURIComponent(name) + '=' + + encodeURIComponent(this.getUserPrefValue(name)); } return params; }; @@ -589,6 +586,18 @@ } }; + +gadgets.IfrGadget.prototype.hasViewablePrefs_ = function() { + for(var name in this.getUserPrefs()) { + var pref = this.userPrefs[name]; + if (pref.type != 'hidden') { + return true; + } + } + return false; +}; + + gadgets.IfrGadget.prototype.handleOpenUserPrefsDialog = function() { if (this.userPrefsDialogContentLoaded) { this.showUserPrefsDialog(); @@ -631,20 +640,19 @@ gadgets.IfrGadget.prototype.handleSaveUserPrefs = function() { this.hideUserPrefsDialog(); - var prefs = {}; var numFields = document.getElementById('m_' + this.id + '_numfields').value; for (var i = 0; i < numFields; i++) { var input = document.getElementById('m_' + this.id + '_' + i); - if (input.type == 'hidden') { + if (input.type != 'hidden') { var userPrefNamePrefix = 'm_' + this.id + '_up_'; var userPrefName = input.name.substring(userPrefNamePrefix.length); var userPrefValue = input.value; - prefs[userPrefName] = userPrefValue; + this.userPrefs[userPrefName].value = userPrefValue; } } - this.setUserPrefs(prefs); + this.saveUserPrefs(); this.refresh(); }; @@ -734,7 +742,6 @@ gadgets.Container.prototype.addGadget = function(gadget) { gadget.id = this.getNextGadgetInstanceId(); - gadget.setUserPrefs(this.userPrefStore.getPrefs(gadget)); this.gadgets_[this.getGadgetKey_(gadget.id)] = gadget; }; Modified: incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js?rev=830372&r1=830371&r2=830372&view=diff ============================================================================== --- incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js (original) +++ incubator/shindig/trunk/javascript/samplecontainer/samplecontainer.js Tue Oct 27 22:19:41 2009 @@ -149,8 +149,8 @@ gadgets.container.view_ = current_view; gadgets.container.gadgets_ = {}; for (var i = 0; i < metadata.gadgets.length; i++) { - gadget = gadgets.container.createGadget( - {'specUrl': metadata.gadgets[i].url, 'title': metadata.gadgets[i].title}); + gadget = gadgets.container.createGadget({'specUrl': metadata.gadgets[i].url, + 'title': metadata.gadgets[i].title, 'userPrefs': metadata.gadgets[i].userPrefs}); // Shindigs rpc code uses direct javascript calls when running on the same domain // to simulate cross-domain when running sample container we replace // 'localhost' with '127.0.0.1' @@ -170,10 +170,10 @@ function refreshGadgets(metadata) { // TODO: The gadget.js file should really have a getGadgets method for (var gadget in gadgets.container.gadgets_) { - var newtitle = metadata.gadgets[0].title; - var specUrl = metadata.gadgets[0].url; - gadgets.container.gadgets_[gadget].title = newtitle; - gadgets.container.gadgets_[gadget].specUrl = specUrl; + var gadgetMetadata = metadata.gadgets[0]; + gadgets.container.gadgets_[gadget].title = gadgetMetadata.title; + gadgets.container.gadgets_[gadget].specUrl = gadgetMetadata.url; + gadgets.container.gadgets_[gadget].userPrefs = gadgetMetadata.userPrefs; gadgets.container.gadgets_[gadget].secureToken = escape(generateSecureToken()); } reloadStateFile(function() {