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

Reply via email to