Author: [email protected]
Date: Tue Jan 3 15:47:25 2012
New Revision: 1883
Log:
[AMDATUOPENSOCIAL-118] Implemented user preferences dialog using jQuery.
Currently it supports UserPref fields of type string, bool, hidden and enum.
List must still be implemented.
Added:
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/EnumValuePairBean.java
Modified:
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/UserPrefBean.java
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/appdatauserprefstore.js
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/shindig-container.js
Added:
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/EnumValuePairBean.java
==============================================================================
--- (empty file)
+++
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/EnumValuePairBean.java
Tue Jan 3 15:47:25 2012
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2010, 2011 The Amdatu Foundation
+ *
+ * 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.
+ */
+package org.amdatu.opensocial.gadgetmanagement;
+
+/**
+ * This bean represents an enumeration value used in a UserPref of type ENUM.
+ *
+ * @author <a href="mailto:[email protected]">Amdatu Project
Team</a>
+ */
+public class EnumValuePairBean {
+ private String m_value;
+ private String m_displayValue;
+
+ public EnumValuePairBean() {
+ }
+
+ public EnumValuePairBean(String value, String displayValue) {
+ m_value = value;
+ m_displayValue = displayValue;
+ }
+
+ public String getValue() {
+ return m_value;
+ }
+
+ public void setValue(String value) {
+ m_value = value;
+ }
+
+ public String getDisplayValue() {
+ return m_displayValue;
+ }
+
+ public void setDisplayValue(String displayValue) {
+ m_displayValue = displayValue;
+ }
+}
Modified:
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/UserPrefBean.java
==============================================================================
---
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/UserPrefBean.java
(original)
+++
trunk/amdatu-opensocial/opensocial-gadgetmanagement/src/main/java/org/amdatu/opensocial/gadgetmanagement/UserPrefBean.java
Tue Jan 3 15:47:25 2012
@@ -15,6 +15,10 @@
*/
package org.amdatu.opensocial.gadgetmanagement;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
/**
* This bean holds the properties of a UserPref according to the open social
* specification. See
http://code.google.com/apis/gadgets/docs/reference.html#Userprefs_Ref
@@ -29,47 +33,70 @@
private boolean m_required;
private String m_value;
private String m_default_value;
+ private List<EnumValuePairBean> m_enumValues;
public String getName() {
return m_name;
}
+
public void setName(String name) {
m_name = name;
}
+
public String getDisplay_name() {
return m_display_name;
}
+
public void setDisplay_name(String display_name) {
m_display_name = display_name;
}
+
public String getUrlparam() {
return m_urlparam;
}
+
public void setUrlparam(String urlparam) {
m_urlparam = urlparam;
}
+
public String getDatatype() {
return m_datatype;
}
+
public void setDatatype(String datatype) {
m_datatype = datatype;
}
+
public boolean isRequired() {
return m_required;
}
+
public void setRequired(boolean required) {
m_required = required;
}
+
public String getValue() {
return m_value;
}
+
public void setValue(String value) {
m_value = value;
}
+
public String getDefault_value() {
return m_default_value;
}
+
public void setDefault_value(String default_value) {
m_default_value = default_value;
}
+
+ @XmlElement(name = "enumValues")
+ public List<EnumValuePairBean> getEnumValues() {
+ return m_enumValues;
+ }
+
+ public void setEnumValues(List<EnumValuePairBean> enumValues) {
+ m_enumValues = enumValues;
+ }
}
Modified:
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
==============================================================================
---
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
(original)
+++
trunk/amdatu-opensocial/opensocial-shindig/src/main/java/org/amdatu/opensocial/shindig/service/ShindigOpenSocialContainerImpl.java
Tue Jan 3 15:47:25 2012
@@ -15,6 +15,16 @@
*/
package org.amdatu.opensocial.shindig.service;
+import org.amdatu.auth.tokenprovider.InvalidTokenException;
+import org.amdatu.auth.tokenprovider.TokenProvider;
+import org.amdatu.auth.tokenprovider.TokenProviderException;
+import org.amdatu.core.tenant.Tenant;
+import org.amdatu.opensocial.gadgetmanagement.EnumValuePairBean;
+import org.amdatu.opensocial.gadgetmanagement.OpenSocialContainer;
+import org.amdatu.opensocial.gadgetmanagement.UserPrefBean;
+import org.amdatu.opensocial.gadgetmanagement.UserPrefsBean;
+import org.amdatu.opensocial.shindig.osgi.Activator;
+
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
@@ -30,14 +40,6 @@
import javax.servlet.http.HttpServletRequest;
-import org.amdatu.auth.tokenprovider.InvalidTokenException;
-import org.amdatu.auth.tokenprovider.TokenProvider;
-import org.amdatu.auth.tokenprovider.TokenProviderException;
-import org.amdatu.core.tenant.Tenant;
-import org.amdatu.opensocial.gadgetmanagement.OpenSocialContainer;
-import org.amdatu.opensocial.gadgetmanagement.UserPrefBean;
-import org.amdatu.opensocial.gadgetmanagement.UserPrefsBean;
-import org.amdatu.opensocial.shindig.osgi.Activator;
import org.apache.felix.dm.Component;
import org.apache.felix.dm.DependencyManager;
import org.apache.felix.dm.ServiceDependency;
@@ -60,6 +62,7 @@
import org.apache.shindig.gadgets.spec.MessageBundle;
import org.apache.shindig.gadgets.spec.SpecParserException;
import org.apache.shindig.gadgets.spec.UserPref;
+import org.apache.shindig.gadgets.spec.UserPref.EnumValuePair;
import org.apache.shindig.gadgets.variables.Substitutions;
import org.apache.shindig.gadgets.variables.UserPrefSubstituter;
import org.osgi.framework.Constants;
@@ -261,6 +264,15 @@
} else {
up.setValue(pref.getDefaultValue());
}
+ if ("enum".equalsIgnoreCase(up.getDatatype())) {
+ List<EnumValuePair> enumValues =
pref.getOrderedEnumValues();
+ List<EnumValuePairBean> enumValueBeans = new
ArrayList<EnumValuePairBean>();
+ for (EnumValuePair enumValue : enumValues) {
+ enumValueBeans.add(new
EnumValuePairBean(enumValue.getValue(), enumValue.getDisplayValue()));
+ }
+ up.setEnumValues(enumValueBeans);
+ }
+
userPrefsBean.addUserPref(up);
}
return userPrefsBean;
Modified:
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/appdatauserprefstore.js
==============================================================================
---
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/appdatauserprefstore.js
(original)
+++
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/appdatauserprefstore.js
Tue Jan 3 15:47:25 2012
@@ -35,38 +35,6 @@
shindig.AppDataBasedUserPrefStore.prototype.USER_PREFS_PREFIX =
'gadgetUserPrefs-';
-// Loads the user specific preferences and sets them in the provide userPrefs
-shindig.AppDataBasedUserPrefStore.prototype.loadUserPrefs = function(gadget,
userPrefs) {
- // We cannot use the OpenSocial API to retrieve appdata, since we must do
synchronous
- // calls here (by the definition of Shindigs UserPrefStore API).
-
- // TODO: this URL should be prefixed by the contextpath
- var url = "/rpc?st=" + gadget.secureToken;
-
- var postdata = '{"method":"appdata.get","id":"appdata.get","params":{';
- postdata += '"appId":"userprefs.' + gadget.serviceName + '"';
- postdata += ',"userId":"@me","fields":"@all","groupId":"@self"}}';
-
- jQuery.ajax({
- url: url,
- type: "POST",
- contentType: "application/json",
- data: postdata,
- dataType: "json",
- async:false,
- success: function(response) {
- var result = response.result;
- $.each(result, function(username, user) {
- $.each(user, function(prefname, pref) {
- userPrefs[prefname] = pref;
- });
- });
- },
- error: function(request, textStatus, errorThrown) {
- }
- });
-};
-
shindig.AppDataBasedUserPrefStore.prototype.getPrefs = function(gadget) {
// We cannot use the OpenSocial API to retrieve appdata, since we must do
synchronous
// calls here (by the definition of Shindigs UserPrefStore API).
@@ -87,7 +55,7 @@
var result = response.UserPrefs;
$.each(result, function(UserPref, prefObj) {
$.each(prefObj, function (index, pref) {
- userPrefs[pref.name] = pref.value;
+ userPrefs[pref.name] = pref;
});
});
},
@@ -99,6 +67,11 @@
}
shindig.AppDataBasedUserPrefStore.prototype.savePrefs = function(gadget) {
+ var userPrefValues = {};
+ for (var key in gadget.getUserPrefs()) {
+ userPrefValues[key] = gadget.getUserPrefs()[key].value;
+ }
+
// Set the security token on the auth context before making the call.
// Decode it first, since it is already URL encoded and the
updateSecurityToken
// does it again.
@@ -106,7 +79,7 @@
osapi.appdata.update({
appId: "userprefs." + gadget.serviceName,
userId: "@me",
- data: gadget.getUserPrefs() }).execute();
+ data: userPrefValues }).execute();
};
shindig.Container.prototype.userPrefStore =
Modified:
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/shindig-container.js
==============================================================================
---
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/shindig-container.js
(original)
+++
trunk/amdatu-opensocial/opensocial-shindig/src/main/resources/features/shindig.container/shindig-container.js
Tue Jan 3 15:47:25 2012
@@ -377,7 +377,7 @@
shindig.Gadget.prototype.getUserPrefValue = function(name) {
var pref = this.userPrefs[name];
- return typeof(pref) != 'undefined' && pref != null ? pref : '';
+ return typeof(pref) != 'undefined' && pref != null ? pref.value : '';
};
shindig.Gadget.prototype.render = function(chrome) {
@@ -540,29 +540,99 @@
if (this.userPrefsDialogContentLoaded) {
this.showUserPrefsDialog();
} else {
- var gadget = this;
- var igCallbackName = 'ig_callback_' + this.id;
- window[igCallbackName] = function(userPrefsDialogContent) {
- gadget.userPrefsDialogContentLoaded = true;
- gadget.buildUserPrefsDialog(userPrefsDialogContent);
- gadget.showUserPrefsDialog();
- };
-
- var script = document.createElement('script');
- script.src = 'http://www.gmodules.com/ig/gadgetsettings?mid=' + this.id +
- '&output=js' + this.getUserPrefsParams() + '&url=' + this.specUrl;
- document.body.appendChild(script);
+ this.renderUserPrefsDialog();
}
};
-shindig.BaseIfrGadget.prototype.buildUserPrefsDialog = function(content) {
+shindig.BaseIfrGadget.prototype.renderUserPrefsDialog = function() {
+ // create the table shell
+ var prefs = this.getUserPrefs();
+ var prefCount = 0;
+ for (var key in prefs) {
+ prefCount++;
+ }
+ var elPrefix = 'm_' + this.id + '_';
var userPrefsDialog = document.getElementById(this.getUserPrefsDialogId());
- userPrefsDialog.innerHTML = content +
- '<div class="' + this.cssClassGadgetUserPrefsDialogActionBar +
- '"><input type="button" value="Save"
onclick="shindig.container.getGadget(' +
- this.id + ').handleSaveUserPrefs()"> <input type="button" value="Cancel"
onclick="shindig.container.getGadget(' +
- this.id + ').handleCancelUserPrefs()"></div>';
- userPrefsDialog.childNodes[0].style.display = '';
+
+ // Append div
+ var prefsDiv =
$('<div/>').addClass(this.cssClassGadgetUserPrefsDialogActionBar);
+ $(userPrefsDialog).append(prefsDiv);
+
+ // Append numfields hidden input field
+ $('<input/>').attr('type', 'hidden').attr('id', elPrefix +
'numfields').attr('value', prefCount).appendTo(prefsDiv);
+
+ // Append table
+ var prefsTable = $('<table/>').attr('width', '100%');
+ $(prefsDiv).append(prefsTable);
+
+ // Add the preference rows to the table
+ var i = 0;
+ for (var key in prefs) {
+ var pref = this.getUserPrefs()[key];
+ if (pref.datatype != 'hidden' && pref.datatype != 'HIDDEN') {
+ this.createRow(prefsTable, pref, i++);
+ }
+ }
+
+ var gadgetId = this.serviceName;
+
+ // Append the save button (saves the user preferences)
+ var saveButton = $('<input/>').attr('type', 'button').attr('value', 'Save');
+ saveButton.click(function(){
+ var gadget = shindig.container.getGadgetFromId(gadgetId);
+ gadget.handleSaveUserPrefs();
+ });
+ $(prefsDiv).append(saveButton);
+
+ // Append the cancel button (closes the dialog)
+ var cancelButton = $('<input/>').attr('type', 'button').attr('value',
'Cancel');
+ cancelButton.click(function(){
+ var gadget = shindig.container.getGadgetFromId(gadgetId);
+ gadget.hideUserPrefsDialog();
+ });
+ $(prefsDiv).append(cancelButton);
+
+ this.userPrefsDialogContentLoaded = true;
+};
+
+shindig.BaseIfrGadget.prototype.createRow = function(table, pref, i) {
+ var tr = $('<tr/>');
+ $(table).append(tr);
+
+ // Append label TD
+ var ltd = $('<td/>').attr('align', 'left').text(pref.display_name);
+ $(tr).append(ltd);
+
+ var elPrefix = 'm_' + this.id + '_';
+ var id = elPrefix + i;
+ var name = elPrefix + pref.name;
+
+ // Append field
+ var field = '';
+ var rtd = $('<td/>').attr('align', 'left');
+ $(tr).append(rtd);
+
+ if ("bool" == pref.datatype.toLowerCase()) {
+ field = $('<input/>').attr('type', 'checkbox').attr('name',
name).attr('id', id);
+ if (pref.value == 1 || pref.value == "true" || pref.value == "TRUE") {
+ field.prop("checked", true);
+ }
+ } else if ("enum" == pref.datatype.toLowerCase()) {
+ field = $('<select/>').attr('name', name).attr('id', id);
+ var enumValues = pref.enumValues;
+ for (var i=0; i<enumValues.length; i++) {
+ var option = $('<option/>').attr('value',
enumValues[i].value).text(enumValues[i].displayValue);
+ // Select the selected option
+ if (enumValues[i].value == pref.value) {
+ option.prop("selected", true);
+ };
+ $(field).append(option);
+ }
+ } else if ("string" == pref.datatype.toLowerCase()) {
+ field = $('<input/>').attr('type', 'edit').attr('name', name).attr('id',
id).attr('value', pref.value);
+ }
+
+ $(rtd).append(field);
};
shindig.BaseIfrGadget.prototype.showUserPrefsDialog = function(opt_show) {
@@ -582,10 +652,14 @@
'_numfields').value;
for (var i = 0; i < numFields; i++) {
var input = document.getElementById('m_' + this.id + '_' + i);
- var userPrefNamePrefix = 'm_' + this.id + '_up_';
+ var userPrefNamePrefix = 'm_' + this.id + '_';
var userPrefName = input.name.substring(userPrefNamePrefix.length);
var userPrefValue = input.value;
- this.userPrefs[userPrefName] = userPrefValue;
+ if (input.type == 'checkbox') {
+ this.userPrefs[userPrefName].value = input.checked ? "1" : "0";
+ } else {
+ this.userPrefs[userPrefName].value = userPrefValue;
+ }
}
this.saveUserPrefs();
_______________________________________________
Amdatu-commits mailing list
[email protected]
http://lists.amdatu.org/mailman/listinfo/amdatu-commits