diff --git a/config/alfresco/templates/webscripts/org/alfresco/portlets/myspaces.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/portlets/myspaces.get.html.ftl
index fae5c63be8..5466ef68ec 100644
--- a/config/alfresco/templates/webscripts/org/alfresco/portlets/myspaces.get.html.ftl
+++ b/config/alfresco/templates/webscripts/org/alfresco/portlets/myspaces.get.html.ftl
@@ -90,7 +90,7 @@
<#-- populated via an AJAX call to 'myspacespanel' webscript -->
<#-- resolved path, filter and home.noderef required as arguments -->
-
+
diff --git a/source/java/org/alfresco/web/scripts/AbstractWebScript.java b/source/java/org/alfresco/web/scripts/AbstractWebScript.java
index b776a03ba1..e1279dd51e 100644
--- a/source/java/org/alfresco/web/scripts/AbstractWebScript.java
+++ b/source/java/org/alfresco/web/scripts/AbstractWebScript.java
@@ -206,11 +206,12 @@ public abstract class AbstractWebScript implements WebScript
* Create a model for script usage
*
* @param req web script request
+ * @param res web script response
* @param customModel custom model entries
*
* @return script model
*/
- final protected Map createScriptModel(WebScriptRequest req, Map customModel)
+ final protected Map createScriptModel(WebScriptRequest req, WebScriptResponse res, Map customModel)
{
// create script model
Map model = new HashMap(7, 1.0f);
@@ -235,7 +236,7 @@ public abstract class AbstractWebScript implements WebScript
// add web script context
model.put("args", createArgModel(req));
model.put("guest", req.isGuest());
- model.put("url", new URLModel(req));
+ model.put("url", new URLModel(req, res));
model.put("server", new ServerModel(descriptorService.getServerDescriptor()));
// add custom model
@@ -282,7 +283,7 @@ public abstract class AbstractWebScript implements WebScript
// add web script context
model.put("args", createArgModel(req));
model.put("guest", req.isGuest());
- model.put("url", new URLModel(req));
+ model.put("url", new URLModel(req, res));
model.put("server", new ServerModel(descriptorService.getServerDescriptor()));
// add template support
diff --git a/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java b/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java
index 8a327a4a9e..b8e7aa4b90 100644
--- a/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java
+++ b/source/java/org/alfresco/web/scripts/DeclarativeWebScript.java
@@ -109,7 +109,7 @@ public class DeclarativeWebScript extends AbstractWebScript
if (logger.isDebugEnabled())
logger.debug("Executing script " + executeScript);
- Map scriptModel = createScriptModel(req, model);
+ Map scriptModel = createScriptModel(req, res, model);
// add return model allowing script to add items to template model
Map returnModel = new ScriptableHashMap();
scriptModel.put("model", returnModel);
diff --git a/source/java/org/alfresco/web/scripts/URLModel.java b/source/java/org/alfresco/web/scripts/URLModel.java
index 5f7a2ef540..0b7198424f 100644
--- a/source/java/org/alfresco/web/scripts/URLModel.java
+++ b/source/java/org/alfresco/web/scripts/URLModel.java
@@ -33,15 +33,18 @@ package org.alfresco.web.scripts;
public class URLModel
{
private WebScriptRequest req;
+ private WebScriptResponse res;
/**
* Construct
*
* @param req
+ * @param res
*/
- URLModel(WebScriptRequest req)
+ URLModel(WebScriptRequest req, WebScriptResponse res)
{
this.req = req;
+ this.res = res;
}
/**
@@ -153,5 +156,16 @@ public class URLModel
{
return getExtension();
}
-
+
+ /**
+ * Gets the client url encoding function script
+ *
+ * @param name name of the function object to return
+ *
+ * @return script to encode urls on the client
+ */
+ public String getClientUrlFunction(String name)
+ {
+ return res.getEncodeScriptUrlFunction(name);
+ }
}
diff --git a/source/java/org/alfresco/web/scripts/WebScriptRequest.java b/source/java/org/alfresco/web/scripts/WebScriptRequest.java
index 342a4ff262..b68ff21253 100644
--- a/source/java/org/alfresco/web/scripts/WebScriptRequest.java
+++ b/source/java/org/alfresco/web/scripts/WebScriptRequest.java
@@ -166,5 +166,4 @@ public interface WebScriptRequest
* @return true => force return of 200, otherwise return status explicitly set
*/
public boolean forceSuccessStatus();
-
}
diff --git a/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java b/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java
index 29fa6cf824..637fe371b5 100644
--- a/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java
+++ b/source/java/org/alfresco/web/scripts/WebScriptRequestImpl.java
@@ -34,7 +34,6 @@ import org.alfresco.web.scripts.WebScriptDescription.FormatStyle;
*/
public abstract class WebScriptRequestImpl implements WebScriptRequest
{
-
/* (non-Javadoc)
* @see org.alfresco.web.scripts.WebScriptRequest#getExtensionPath()
*/
@@ -154,5 +153,4 @@ public abstract class WebScriptRequestImpl implements WebScriptRequest
{
return false;
}
-
}
diff --git a/source/java/org/alfresco/web/scripts/WebScriptResponse.java b/source/java/org/alfresco/web/scripts/WebScriptResponse.java
index 7b6aef5017..dffe39aea0 100644
--- a/source/java/org/alfresco/web/scripts/WebScriptResponse.java
+++ b/source/java/org/alfresco/web/scripts/WebScriptResponse.java
@@ -82,11 +82,19 @@ public interface WebScriptResponse
/**
* Encode a script URL
*
- * Note: Some Web Script Runtime environments (e.g. portal) require urls to be re-written.
+ * Note: Some Web Script Runtime environments (e.g. JSR-168, JSF) require urls to be re-written.
*
- * @param url url to encode
- * @return encoded url
+ * @param url to encode
+ * @return encoded url
*/
public String encodeScriptUrl(String url);
+ /**
+ * Return a client side javascript function to build urls to this service
+ *
+ * @param name Generated function name
+ *
+ * @return javascript function definition
+ */
+ public String getEncodeScriptUrlFunction(String name);
}
diff --git a/source/java/org/alfresco/web/scripts/WebScriptRuntime.java b/source/java/org/alfresco/web/scripts/WebScriptRuntime.java
index 623b9b6019..72f73006aa 100644
--- a/source/java/org/alfresco/web/scripts/WebScriptRuntime.java
+++ b/source/java/org/alfresco/web/scripts/WebScriptRuntime.java
@@ -204,7 +204,7 @@ public abstract class WebScriptRuntime
WebScriptResponse res = createResponse();
Map model = new HashMap();
model.put("status", status);
- model.put("url", new URLModel(req));
+ model.put("url", new URLModel(req, res));
// locate status template
// NOTE: search order...
diff --git a/source/java/org/alfresco/web/scripts/WebScriptServletResponse.java b/source/java/org/alfresco/web/scripts/WebScriptServletResponse.java
index dc622abfac..70067a257e 100644
--- a/source/java/org/alfresco/web/scripts/WebScriptServletResponse.java
+++ b/source/java/org/alfresco/web/scripts/WebScriptServletResponse.java
@@ -30,6 +30,8 @@ import java.io.Writer;
import javax.servlet.http.HttpServletResponse;
+import org.alfresco.web.ui.common.Utils;
+
/**
* HTTP Servlet Web Script Response
*
@@ -113,4 +115,13 @@ public class WebScriptServletResponse implements WebScriptResponse
return url;
}
+ /* (non-Javadoc)
+ * @see org.alfresco.web.scripts.WebScriptResponse#getEncodeScriptUrlFunction(java.lang.String)
+ */
+ public String getEncodeScriptUrlFunction(String name)
+ {
+ return Utils.encodeJavascript(ENCODE_FUNCTION.replace("$name$", name));
+ }
+
+ private static final String ENCODE_FUNCTION = "{ $name$: function(url) { return url; } }";
}
diff --git a/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java b/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java
index 2996466590..46ee24699a 100644
--- a/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java
+++ b/source/java/org/alfresco/web/scripts/WebScriptURLRequest.java
@@ -87,7 +87,6 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl
return urlParts;
}
-
/**
* Construct
*
@@ -199,6 +198,4 @@ public abstract class WebScriptURLRequest extends WebScriptRequestImpl
{
return queryArgs.get(name);
}
-
-
}
diff --git a/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFRequest.java b/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFRequest.java
index e8d29f0521..98b5493c40 100644
--- a/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFRequest.java
+++ b/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFRequest.java
@@ -38,7 +38,6 @@ import org.alfresco.web.scripts.WebScriptURLRequest;
*/
public class WebScriptJSFRequest extends WebScriptURLRequest
{
-
/**
* Constructor
*
@@ -85,5 +84,4 @@ public class WebScriptJSFRequest extends WebScriptURLRequest
// NOTE: unknown in the JSF environment
return null;
}
-
}
diff --git a/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFResponse.java b/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFResponse.java
index 129ff7d206..dd52a1b998 100644
--- a/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFResponse.java
+++ b/source/java/org/alfresco/web/scripts/jsf/WebScriptJSFResponse.java
@@ -105,11 +105,12 @@ public class WebScriptJSFResponse implements WebScriptResponse
return buf.toString();
}
- /* (non-Javadoc)
+ /**
* @see org.alfresco.web.scripts.WebScriptResponse#reset()
*/
public void reset()
{
+ // nothing to do
}
/**
@@ -128,11 +129,12 @@ public class WebScriptJSFResponse implements WebScriptResponse
return fc.getResponseWriter();
}
- /* (non-Javadoc)
+ /**
* @see org.alfresco.web.scripts.WebScriptResponse#setStatus(int)
*/
public void setStatus(int status)
{
+ // makes no sense in the JSF env
}
/**
@@ -142,5 +144,32 @@ public class WebScriptJSFResponse implements WebScriptResponse
{
// Alfresco JSF framework only supports the default of text-html
}
-
+
+ /* (non-Javadoc)
+ * @see org.alfresco.web.scripts.WebScriptResponse#getEncodeScriptUrlFunction(java.lang.String)
+ */
+ public String getEncodeScriptUrlFunction(String name)
+ {
+ UIForm form = Utils.getParentForm(fc, component);
+ if (form == null)
+ {
+ throw new IllegalStateException("Must nest components inside UIForm to generate form submit!");
+ }
+ String fieldId = component.getClientId(fc);
+ String formClientId = form.getClientId(fc);
+ HtmlFormRendererBase.addHiddenCommandParameter(fc, form, fieldId);
+
+ String func = ENCODE_FUNCTION.replace("$name$", name);
+ func = func.replace("$formClientId$", formClientId);
+ func = func.replace("$fieldId$", fieldId);
+ return Utils.encodeJavascript(func);
+ }
+
+ private static final String ENCODE_FUNCTION =
+ "{ $name$: function(url) {" +
+ " var out = '';" +
+ " out += \"#\\\" onclick=\\\"document.forms['$formClientId$']['$fieldId$'].value='\";" +
+ " out += escape(url);" +
+ " out += \"';document.forms['$formClientId$'].submit();return false;\";" +
+ " return out; } }";
}
diff --git a/source/java/org/alfresco/web/scripts/portlet/WebScriptPortletResponse.java b/source/java/org/alfresco/web/scripts/portlet/WebScriptPortletResponse.java
index b01a88c173..da00f1d147 100644
--- a/source/java/org/alfresco/web/scripts/portlet/WebScriptPortletResponse.java
+++ b/source/java/org/alfresco/web/scripts/portlet/WebScriptPortletResponse.java
@@ -33,6 +33,7 @@ import javax.portlet.RenderResponse;
import org.alfresco.web.scripts.WebScriptRequest;
import org.alfresco.web.scripts.WebScriptResponse;
+import org.alfresco.web.ui.common.Utils;
/**
@@ -127,4 +128,34 @@ public class WebScriptPortletResponse implements WebScriptResponse
return portletUrl.toString();
}
+ /* (non-Javadoc)
+ * @see org.alfresco.web.scripts.WebScriptResponse#getEncodeScriptUrlFunction(java.lang.String)
+ */
+ public String getEncodeScriptUrlFunction(String name)
+ {
+ PortletURL portletUrl = res.createActionURL();
+
+ String func = ENCODE_FUNCTION.replace("$name$", name);
+ func = func.replace("$actionUrl$", portletUrl.toString());
+ return Utils.encodeJavascript(func);
+ }
+
+ private static final String ENCODE_FUNCTION =
+ "{ $name$: function(url) {" +
+ " var out = \"$actionUrl$\";" +
+ " var argsIndex = url.indexOf(\"?\");" +
+ " if (argsIndex == -1)" +
+ " {" +
+ " out += \"&scriptUrl=\" + escape(url);" +
+ " }" +
+ " else" +
+ " {" +
+ " out += \"&scriptUrl=\" + escape(url.substring(0, argsIndex));" +
+ " var args = url.substring(argsIndex + 1).split(\"&\");" +
+ " for (var i=0; i
scriptUrl
- /alfresco/service/mytasks
+ /alfresco/wcservice/mytasks
@@ -50,7 +50,7 @@
scriptUrl
- /alfresco/service/doclist
+ /alfresco/wcservice/doclist
@@ -71,7 +71,7 @@
scriptUrl
- /alfresco/service/myspaces
+ /alfresco/wcservice/myspaces
@@ -92,7 +92,7 @@
scriptUrl
- /alfresco/service/mywebforms
+ /alfresco/wcservice/mywebforms
diff --git a/source/web/scripts/ajax/myspaces.js b/source/web/scripts/ajax/myspaces.js
index 710a566deb..cc702c1246 100644
--- a/source/web/scripts/ajax/myspaces.js
+++ b/source/web/scripts/ajax/myspaces.js
@@ -11,6 +11,7 @@ var MySpaces = {
Home: null,
ServiceContext: null,
popupPanel: null,
+ ScriptUrlEncoder: null,
start: function()
{
@@ -26,14 +27,32 @@ var MySpaces = {
{
// push the response into the space panel div
$('spacePanel').setHTML(response.responseText);
+
+ // Construct the links to the outer webscript - we use the client script url encoder
+ // method provided by the outer webscript runtime to generate urls to call it from the
+ // inner webscript we called via a servlet - this means we can gen urls to call JSF or
+ // portlet webscript from the inner.
+ var navLinks = $$('#spacePanel .spaceNavLinkUrl');
+ var navImgs = $$('#spacePanel .spaceNavLinkImg');
+ navLinks.each(function(navLink, i)
+ {
+ navLink.setHTML('' + navImgs[i].innerHTML + '');
+ navImgs[i].innerHTML = ""; // remove the html so the class is not selected during init()
+ });
// extract the count value from a hidden div and display it
$('spaceCount').setHTML($('spaceCountValue').innerHTML);
+
// wire up all the events and animations
MySpaces.init();
},
failure: function(response)
{
+ // display the error
$('spacePanel').setHTML("Sorry, data currently unavailable.");
+
+ // hide the ajax wait panel and show the main spaces panel
+ $('spacePanelOverlay').setStyle('visibility', 'hidden');
+ $('spacePanel').setStyle('visibility', 'visible');
}
}
);
@@ -43,6 +62,7 @@ var MySpaces = {
init: function()
{
MySpaces.parseSpacePanels();
+
// hide the ajax wait panel and show the main spaces panel
$('spacePanelOverlay').setStyle('visibility', 'hidden');
$('spacePanel').setStyle('visibility', 'visible');
diff --git a/source/web/scripts/ajax/mytasks.js b/source/web/scripts/ajax/mytasks.js
index d6eec82aa8..b8f1f1a78e 100644
--- a/source/web/scripts/ajax/mytasks.js
+++ b/source/web/scripts/ajax/mytasks.js
@@ -25,7 +25,12 @@ var MyTasks = {
},
failure: function(response)
{
+ // display the error
$('taskPanel').setHTML("Sorry, data currently unavailable.");
+
+ // hide the ajax wait panel and show the main task panel
+ $('taskPanelOverlay').setStyle('visibility', 'hidden');
+ $('taskPanel').setStyle('visibility', 'visible');
}
}
);
@@ -35,6 +40,7 @@ var MyTasks = {
init: function()
{
MyTasks.parseTaskPanels();
+
// hide the ajax wait panel and show the main task panel
$('taskPanelOverlay').setStyle('visibility', 'hidden');
$('taskPanel').setStyle('visibility', 'visible');