Clipboard Changes: When an item is added to the clipboard a status message is now displayed (which can be turned off in config). The Paste All action now also automatically clears the clipboard (again this behaviour can be turned off in config). This is to allow users to navigate around the app copying and pasting without having to ever see the clipboard.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5065 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Gavin Cornwell
2007-02-07 12:30:38 +00:00
parent cda0d4761f
commit bb1973354e
14 changed files with 257 additions and 61 deletions

View File

@@ -97,6 +97,7 @@ has_following_categories_space=This space has the following categories applied..
moved=moved moved=moved
copied=copied copied=copied
clipboard=Clipboard clipboard=Clipboard
node_added_clipboard=An item was added to the clipboard. There are now {0} item(s) in the clipboard. Click ''Paste All'' in the ''More Actions'' menu to add the items to your current location.
recent_spaces=Recent Spaces recent_spaces=Recent Spaces
shortcuts=Shortcuts shortcuts=Shortcuts
company_home=Company Home company_home=Company Home

View File

@@ -75,6 +75,11 @@
<!-- the from address to use when sending emails from the client --> <!-- the from address to use when sending emails from the client -->
<from-email-address>alfresco@alfresco.org</from-email-address> <from-email-address>alfresco@alfresco.org</from-email-address>
<!-- clipboard behaviour i.e. whether to show a status message when an item is added -->
<!-- to the clipboard and whether the paste all action also clears the clipboard -->
<clipboard-status-visible>true</clipboard-status-visible>
<paste-all-and-clear>true</paste-all-and-clear>
</client> </client>
</config> </config>

View File

@@ -16,10 +16,12 @@
*/ */
package org.alfresco.web.bean.clipboard; package org.alfresco.web.bean.clipboard;
import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent; import javax.faces.event.ActionEvent;
@@ -135,6 +137,8 @@ public class ClipboardBean
*/ */
private void performPasteItems(int index, int action) private void performPasteItems(int index, int action)
{ {
FacesContext context = FacesContext.getCurrentInstance();
try try
{ {
if (index == -1) if (index == -1)
@@ -152,7 +156,12 @@ public class ClipboardBean
} }
} }
} }
// TODO: after a paste all - remove items from the clipboard...? or not. ask linton
// if configured to do so clear the clipboard after a paste all
if (Application.getClientConfig(context).isPasteAllAndClearEnabled())
{
this.items.clear();
}
} }
else else
{ {
@@ -169,12 +178,12 @@ public class ClipboardBean
} }
// refresh UI on success // refresh UI on success
UIContextService.getInstance(FacesContext.getCurrentInstance()).notifyBeans(); UIContextService.getInstance(context).notifyBeans();
} }
catch (Throwable err) catch (Throwable err)
{ {
Utils.addErrorMessage(Application.getMessage( Utils.addErrorMessage(Application.getMessage(context,
FacesContext.getCurrentInstance(), MSG_ERROR_PASTE) + err.getMessage(), err); MSG_ERROR_PASTE) + err.getMessage(), err);
} }
} }
@@ -268,6 +277,16 @@ public class ClipboardBean
{ {
items.add(item); items.add(item);
} }
// add a message to inform the user of the clipboard state now if configured
FacesContext context = FacesContext.getCurrentInstance();
if (Application.getClientConfig(context).isClipboardStatusVisible())
{
String pattern = Application.getMessage(context, "node_added_clipboard");
String msg = MessageFormat.format(pattern, items.size());
FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
context.addMessage(null, facesMsg);
}
} }
} }
} }

View File

@@ -56,9 +56,11 @@ public class ClientConfigElement extends ConfigElementAdapter
private String homeSpacePermission = null; private String homeSpacePermission = null;
private boolean ajaxEnabled = false; private boolean ajaxEnabled = false;
private String initialLocation = "myalfresco"; private String initialLocation = "myalfresco";
private ExpiringValueCache<String> wcmDomain = new ExpiringValueCache(1000*10L); private ExpiringValueCache<String> wcmDomain = new ExpiringValueCache<String>(1000*10L);
private ExpiringValueCache<String> wcmPort = new ExpiringValueCache(1000*10L); private ExpiringValueCache<String> wcmPort = new ExpiringValueCache<String>(1000*10L);
private String defaultHomeSpacePath = "/app:company_home"; private String defaultHomeSpacePath = "/app:company_home";
private boolean clipboardStatusVisible = true;
private boolean pasteAllAndClear = true;
private boolean allowGuestConfig = false; private boolean allowGuestConfig = false;
/** /**
@@ -164,6 +166,16 @@ public class ClientConfigElement extends ConfigElementAdapter
combinedElement.setShelfVisible(newElement.isShelfVisible()); combinedElement.setShelfVisible(newElement.isShelfVisible());
} }
if (newElement.isClipboardStatusVisible() != combinedElement.isClipboardStatusVisible())
{
combinedElement.setClipboardStatusVisible(newElement.isClipboardStatusVisible());
}
if (newElement.isPasteAllAndClearEnabled() != combinedElement.isPasteAllAndClearEnabled())
{
combinedElement.setPasteAllAndClearEnabled(newElement.isPasteAllAndClearEnabled());
}
if (newElement.getFromEmailAddress() != null && if (newElement.getFromEmailAddress() != null &&
(newElement.getFromEmailAddress().equals(combinedElement.getFromEmailAddress()) == false)) (newElement.getFromEmailAddress().equals(combinedElement.getFromEmailAddress()) == false))
{ {
@@ -220,6 +232,39 @@ public class ClientConfigElement extends ConfigElementAdapter
{ {
this.shelfVisible = shelfVisible; this.shelfVisible = shelfVisible;
} }
/**
* @return Returns if the clipboard status messages are visible by default.
*/
public boolean isClipboardStatusVisible()
{
return this.clipboardStatusVisible;
}
/**
* @param clipboardStatusVisible True if the clipboard status messages should be visible.
*/
/*package*/ void setClipboardStatusVisible(boolean clipboardStatusVisible)
{
this.clipboardStatusVisible = clipboardStatusVisible;
}
/**
* @return Returns if the clipboard paste all action should clear the clipboard.
*/
public boolean isPasteAllAndClearEnabled()
{
return this.pasteAllAndClear;
}
/**
* @param pasteAllAndClear Sets whether the paste all action should clear all items
* from the clipboard.
*/
/*package*/ void setPasteAllAndClearEnabled(boolean pasteAllAndClear)
{
this.pasteAllAndClear = pasteAllAndClear;
}
/** /**
* @return The error page the application should use * @return The error page the application should use

View File

@@ -43,6 +43,8 @@ public class ClientElementReader implements ConfigElementReader
public static final String ELEMENT_AJAX_ENABLED = "ajax-enabled"; public static final String ELEMENT_AJAX_ENABLED = "ajax-enabled";
public static final String ELEMENT_INITIALLOCATION = "initial-location"; public static final String ELEMENT_INITIALLOCATION = "initial-location";
public static final String ELEMENT_DEFAULTHOMESPACEPATH = "default-home-space-path"; public static final String ELEMENT_DEFAULTHOMESPACEPATH = "default-home-space-path";
public static final String ELEMENT_CLIPBOARDSTATUS = "clipboard-status-visible";
public static final String ELEMENT_PASTEALLANDCLEAR = "paste-all-and-clear";
public static final String ELEMENT_GUESTCONFIG = "allow-guest-config"; public static final String ELEMENT_GUESTCONFIG = "allow-guest-config";
/** /**
@@ -171,6 +173,22 @@ public class ClientElementReader implements ConfigElementReader
configElement.setDefaultHomeSpacePath(defaultHomeSpacePath.getTextTrim()); configElement.setDefaultHomeSpacePath(defaultHomeSpacePath.getTextTrim());
} }
// get the default visibility of the clipboard status messages
Element clipboardStatusVisible = element.element(ELEMENT_CLIPBOARDSTATUS);
if (clipboardStatusVisible != null)
{
configElement.setClipboardStatusVisible(Boolean.parseBoolean(
clipboardStatusVisible.getTextTrim()));
}
// get the default setting for the paste all action, should it clear the clipboard after?
Element pasteAllAndClear = element.element(ELEMENT_PASTEALLANDCLEAR);
if (pasteAllAndClear != null)
{
configElement.setPasteAllAndClearEnabled(Boolean.parseBoolean(
pasteAllAndClear.getTextTrim()));
}
// get allow Guest to configure start location preferences // get allow Guest to configure start location preferences
Element guestConfigElement = element.element(ELEMENT_GUESTCONFIG); Element guestConfigElement = element.element(ELEMENT_GUESTCONFIG);
if (guestConfigElement != null) if (guestConfigElement != null)

View File

@@ -55,6 +55,8 @@ public class ErrorsRenderer extends BaseRenderer
ResponseWriter out = context.getResponseWriter(); ResponseWriter out = context.getResponseWriter();
String contextPath = context.getExternalContext().getRequestContextPath(); String contextPath = context.getExternalContext().getRequestContextPath();
String styleClass = (String)component.getAttributes().get("styleClass"); String styleClass = (String)component.getAttributes().get("styleClass");
String errorClass = (String)component.getAttributes().get("errorClass");
String infoClass = (String)component.getAttributes().get("infoClass");
String message = (String)component.getAttributes().get("message"); String message = (String)component.getAttributes().get("message");
if (message == null) if (message == null)
@@ -75,27 +77,57 @@ public class ErrorsRenderer extends BaseRenderer
PanelGenerator.generatePanelStart(out, contextPath, "yellowInner", "#ffffcc"); PanelGenerator.generatePanelStart(out, contextPath, "yellowInner", "#ffffcc");
out.write("\n<div"); out.write("\n<div");
if (styleClass != null) if (styleClass != null)
{ {
outputAttribute(out, styleClass, "class"); outputAttribute(out, styleClass, "class");
} }
out.write(">"); out.write(">");
out.write("<img src='");
out.write(contextPath);
out.write("/images/icons/info_icon.gif' alt='Error' align='absmiddle'/>&nbsp;&nbsp;");
out.write(Utils.encode(message));
out.write("\n<ul style='margin:2px;'>");
while (messages.hasNext()) // if we have a message to display show it next to the info icon
if (message.length() > 0)
{ {
FacesMessage fm = (FacesMessage)messages.next(); out.write("<img src='");
out.write("<li>"); out.write(contextPath);
out.write(Utils.encode(fm.getSummary())); out.write("/images/icons/info_icon.gif' alt='Error' align='absmiddle'/>&nbsp;&nbsp;");
out.write("</li>\n"); out.write(Utils.encode(message));
out.write("\n<ul style='margin:2px;'>");
while (messages.hasNext())
{
FacesMessage fm = (FacesMessage)messages.next();
out.write("<li");
renderMessageAttrs(fm, out, errorClass, infoClass);
out.write(">");
out.write(Utils.encode(fm.getSummary()));
out.write("</li>\n");
}
out.write("</ul>");
}
else
{
// if there is no title message to display use a table to place
// the info icon on the left and the list of messages on the right
out.write("<table border='0' cellpadding='3' cellspacing='0'><tr><td valign='top'><img src='");
out.write(contextPath);
out.write("/images/icons/info_icon.gif' alt='Error' />");
out.write("</td><td>");
while (messages.hasNext())
{
FacesMessage fm = (FacesMessage)messages.next();
out.write("<div style='margin-bottom: 3px;'");
renderMessageAttrs(fm, out, errorClass, infoClass);
out.write(">");
out.write(Utils.encode(fm.getSummary()));
out.write("</div>\n");
}
out.write("</td></tr></table>");
} }
out.write("</ul></div>\n"); out.write("</div>\n");
PanelGenerator.generatePanelEnd(out, contextPath, "yellowInner"); PanelGenerator.generatePanelEnd(out, contextPath, "yellowInner");
@@ -111,4 +143,31 @@ public class ErrorsRenderer extends BaseRenderer
{ {
return false; return false;
} }
/**
* Renders the attributes for the given FacesMessage.
*/
private void renderMessageAttrs(FacesMessage fm, ResponseWriter out,
String errorClass, String infoClass) throws IOException
{
// use the error class if the message is error level
if (errorClass != null &&
fm.getSeverity() == FacesMessage.SEVERITY_ERROR ||
fm.getSeverity() == FacesMessage.SEVERITY_FATAL)
{
out.write(" class='");
out.write(errorClass);
out.write("'");
}
// use the info class if the message is info level
if (infoClass != null &&
fm.getSeverity() == FacesMessage.SEVERITY_INFO ||
fm.getSeverity() == FacesMessage.SEVERITY_WARN)
{
out.write(" class='");
out.write(infoClass);
out.write("'");
}
}
} }

View File

@@ -21,6 +21,8 @@ import javax.faces.component.UIComponent;
public class ErrorsTag extends HtmlComponentTag public class ErrorsTag extends HtmlComponentTag
{ {
private String message; private String message;
private String errorClass;
private String infoClass;
/** /**
* @see javax.faces.webapp.UIComponentTag#getComponentType() * @see javax.faces.webapp.UIComponentTag#getComponentType()
@@ -46,6 +48,8 @@ public class ErrorsTag extends HtmlComponentTag
super.setProperties(component); super.setProperties(component);
setStringProperty(component, "message", this.message); setStringProperty(component, "message", this.message);
setStringProperty(component, "errorClass", this.errorClass);
setStringProperty(component, "infoClass", this.infoClass);
} }
/** /**
@@ -55,4 +59,20 @@ public class ErrorsTag extends HtmlComponentTag
{ {
this.message = message; this.message = message;
} }
/**
* @param errorClass The CSS class to use for error messages
*/
public void setErrorClass(String errorClass)
{
this.errorClass = errorClass;
}
/**
* @param infoClass The CSS class to use for info messages
*/
public void setInfoClass(String infoClass)
{
this.infoClass = infoClass;
}
} }

View File

@@ -1470,6 +1470,18 @@
<rtexprvalue>true</rtexprvalue> <rtexprvalue>true</rtexprvalue>
</attribute> </attribute>
<attribute>
<name>infoClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>errorClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute> <attribute>
<name>style</name> <name>style</name>
<required>false</required> <required>false</required>

View File

@@ -202,6 +202,16 @@
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width=4 height=9></td> <td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width=4 height=9></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<a:errors message="" infoClass="statusWarningText" errorClass="statusErrorText" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- Custom Template View --%> <%-- Custom Template View --%>
<a:panel id="custom-wrapper-panel" rendered="#{NavigationBean.currentNodeHasTemplate}"> <a:panel id="custom-wrapper-panel" rendered="#{NavigationBean.currentNodeHasTemplate}">
<tr valign=top> <tr valign=top>
@@ -487,16 +497,6 @@
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td> <td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<h:messages globalOnly="true" styleClass="errorMessage" layout="table" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- separator row with bottom panel graphics --%> <%-- separator row with bottom panel graphics --%>
<tr> <tr>
<td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width=4 height=4></td> <td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width=4 height=4></td>

View File

@@ -117,6 +117,16 @@
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width="4" height="9"></td> <td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width="4" height="9"></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<a:errors message="" infoClass="statusWarningText" errorClass="statusErrorText" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- Details --%> <%-- Details --%>
<tr valign=top> <tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width="4"></td> <td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width="4"></td>
@@ -227,7 +237,6 @@
action="#{DocumentDetailsBean.applyInlineEditable}" action="#{DocumentDetailsBean.applyInlineEditable}"
rendered="#{DocumentDetailsBean.inlineEditable == false}" /> rendered="#{DocumentDetailsBean.inlineEditable == false}" />
</r:permissionEvaluator> </r:permissionEvaluator>
<h:messages id="error1" globalOnly="true" styleClass="errorMessage" layout="table" />
<h:message id="msg1" for="document-props" styleClass="statusMessage" /> <h:message id="msg1" for="document-props" styleClass="statusMessage" />
</td> </td>
</tr> </tr>
@@ -259,7 +268,6 @@
columns="1" mode="view" labelStyleClass="propertiesLabel" externalConfig="true" /> columns="1" mode="view" labelStyleClass="propertiesLabel" externalConfig="true" />
<h:outputText id="no-inline-msg2" value="<br/>#{msg.not_inline_editable}<br/>" <h:outputText id="no-inline-msg2" value="<br/>#{msg.not_inline_editable}<br/>"
rendered="#{DocumentDetailsBean.inlineEditable == false}" escape="false" /> rendered="#{DocumentDetailsBean.inlineEditable == false}" escape="false" />
<h:messages id="error2" globalOnly="true" styleClass="errorMessage" layout="table" />
<h:message id="msg2" for="document-props-locked" styleClass="statusMessage" /> <h:message id="msg2" for="document-props-locked" styleClass="statusMessage" />
</td> </td>
</tr> </tr>

View File

@@ -105,6 +105,16 @@
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width="4" height="9"></td> <td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width="4" height="9"></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<a:errors message="" infoClass="statusWarningText" errorClass="statusErrorText" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- Details --%> <%-- Details --%>
<tr valign=top> <tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width="4"></td> <td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width="4"></td>
@@ -205,7 +215,6 @@
<r:propertySheetGrid id="space-props" value="#{SpaceDetailsBean.space}" var="spaceProps" <r:propertySheetGrid id="space-props" value="#{SpaceDetailsBean.space}" var="spaceProps"
columns="1" mode="view" labelStyleClass="propertiesLabel" columns="1" mode="view" labelStyleClass="propertiesLabel"
externalConfig="true" /> externalConfig="true" />
<h:messages globalOnly="true" styleClass="errorMessage" layout="table" />
<h:message for="space-props" styleClass="statusMessage" /> <h:message for="space-props" styleClass="statusMessage" />
</td> </td>
</tr> </tr>

View File

@@ -113,6 +113,16 @@
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width=4 height=9></td> <td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width=4 height=9></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<a:errors message="" infoClass="statusWarningText" errorClass="statusErrorText" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- Details - Topics --%> <%-- Details - Topics --%>
<tr valign=top> <tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td> <td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
@@ -175,16 +185,6 @@
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td> <td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<h:messages globalOnly="true" styleClass="errorMessage" layout="table" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- separator row with bottom panel graphics --%> <%-- separator row with bottom panel graphics --%>
<tr> <tr>
<td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width=4 height=4></td> <td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width=4 height=4></td>

View File

@@ -116,6 +116,16 @@
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width=4 height=9></td> <td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width=4 height=9></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<a:errors message="" infoClass="statusWarningText" errorClass="statusErrorText" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- Details - Forums --%> <%-- Details - Forums --%>
<tr valign=top> <tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td> <td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
@@ -231,16 +241,6 @@
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td> <td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<h:messages globalOnly="true" styleClass="errorMessage" layout="table" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- separator row with bottom panel graphics --%> <%-- separator row with bottom panel graphics --%>
<tr> <tr>
<td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width=4 height=4></td> <td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width=4 height=4></td>

View File

@@ -114,6 +114,16 @@
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width=4 height=9></td> <td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width=4 height=9></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<a:errors message="" infoClass="statusWarningText" errorClass="statusErrorText" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- Details - Posts --%> <%-- Details - Posts --%>
<tr valign=top> <tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td> <td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
@@ -209,16 +219,6 @@
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td> <td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr> </tr>
<%-- Error Messages --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width=4></td>
<td>
<%-- messages tag to show messages not handled by other specific message tags --%>
<h:messages globalOnly="true" styleClass="errorMessage" layout="table" />
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width=4></td>
</tr>
<%-- separator row with bottom panel graphics --%> <%-- separator row with bottom panel graphics --%>
<tr> <tr>
<td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width=4 height=4></td> <td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width=4 height=4></td>