. Checkpoint of WCM UI

- More implementation of the User sandboxes UI
   - added actions placeholders for Preview, Create and Browse for sandbox
   - Modified files list component framework and placeholder
 - Import Website Content dialog component framework pieces

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3791 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2006-09-14 14:18:26 +00:00
parent 66803daad8
commit 64f50671da
10 changed files with 605 additions and 50 deletions

View File

@@ -797,6 +797,15 @@ title_browse_website=Browse Website Sandboxes
website_info=Use this view to browse the staging area and user sandboxes for a website.
staging_sandbox=Staging Sandbox
user_sandboxes=User Sandboxes
sandbox_preview=Preview Website
sandbox_create=Create New Content
sandbox_browse=Browse Website
import_website_content=Import Website Content
# Website actions and dialog messages
title_import_content=Import Content into Website
import_website_content_title=Import Content into Website
import_website_content_desc=Use this dialog to import an archive of content into the root of the website.
# New User Wizard messages
new_user_title=New User Wizard

View File

@@ -0,0 +1,188 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* 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.alfresco.web.bean.wcm;
import java.io.File;
import java.text.MessageFormat;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.transaction.UserTransaction;
import org.alfresco.web.app.AlfrescoNavigationHandler;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.FileUploadBean;
import org.alfresco.web.bean.repository.Repository;
import org.alfresco.web.ui.common.Utils;
/**
* @author Kevin Roast
*/
public class ImportWebsiteDialog
{
protected File file;
protected String fileName;
private boolean isFinished = false;
/**
* @return Returns the name of the file
*/
public String getFileName()
{
// try and retrieve the file and filename from the file upload bean
// representing the file we previously uploaded.
FacesContext ctx = FacesContext.getCurrentInstance();
FileUploadBean fileBean = (FileUploadBean)ctx.getExternalContext().getSessionMap().
get(FileUploadBean.FILE_UPLOAD_BEAN_NAME);
if (fileBean != null)
{
this.file = fileBean.getFile();
this.fileName = fileBean.getFileName();
}
return this.fileName;
}
/**
* @param fileName The name of the file
*/
public void setFileName(String fileName)
{
this.fileName = fileName;
// we also need to keep the file upload bean in sync
FacesContext ctx = FacesContext.getCurrentInstance();
FileUploadBean fileBean = (FileUploadBean)ctx.getExternalContext().getSessionMap().
get(FileUploadBean.FILE_UPLOAD_BEAN_NAME);
if (fileBean != null)
{
fileBean.setFileName(this.fileName);
}
}
public boolean getFinishButtonDisabled()
{
return (this.fileName == null || this.fileName.length() == 0);
}
// ------------------------------------------------------------------------------
// Action event handlers
/**
* Action listener called when the add content dialog is called
*/
public void start(ActionEvent event)
{
clearUpload();
this.fileName = null;
}
/**
* Action handler called when the Finish button is pressed
*/
public String finish()
{
String outcome = null;
// check the isFinished flag to stop the finish button
// being pressed multiple times
if (this.isFinished == false)
{
this.isFinished = true;
UserTransaction tx = null;
try
{
FacesContext context = FacesContext.getCurrentInstance();
tx = Repository.getUserTransaction(context);
tx.begin();
//
// TODO: import the content
//
tx.commit();
outcome = AlfrescoNavigationHandler.CLOSE_DIALOG_OUTCOME;
}
catch (Throwable e)
{
// rollback the transaction
try { if (tx != null) {tx.rollback();} } catch (Exception ex) {}
Utils.addErrorMessage(MessageFormat.format(
Application.getMessage(FacesContext.getCurrentInstance(), Repository.ERROR_GENERIC),
e.getMessage(), e));
}
finally
{
// reset the flag so we can re-attempt the operation
this.isFinished = false;
}
}
return outcome;
}
/**
* Action handler called when the user wishes to remove an uploaded file
*/
public String removeUploadedFile()
{
clearUpload();
// also clear the file name
this.fileName = null;
// refresh the current page
return null;
}
/**
* Action handler called when the dialog is cancelled
*/
public String cancel()
{
clearUpload();
return AlfrescoNavigationHandler.CLOSE_DIALOG_OUTCOME;
}
// ------------------------------------------------------------------------------
// Helper Methods
/**
* Deletes the uploaded file and removes the FileUploadBean from the session
*/
protected void clearUpload()
{
// delete the temporary file we uploaded earlier
if (this.file != null)
{
this.file.delete();
}
this.file = null;
// remove the file upload bean from the session
FacesContext ctx = FacesContext.getCurrentInstance();
ctx.getExternalContext().getSessionMap().remove(FileUploadBean.FILE_UPLOAD_BEAN_NAME);
}
}

View File

@@ -64,10 +64,11 @@ public class UIActions extends SelfRenderingComponent
private static final String ATTR_STYLECLASS = "styleClass";
private static final String ATTR_STYLE = "style";
private static final String ACTION_CONTEXT = "actionContext";
private static final String RENDERER_ACTIONLINK = "org.alfresco.faces.ActionLinkRenderer";
private static final String COMPONENT_ACTIONLINK = "org.alfresco.faces.ActionLink";
private static final String COMPONENT_PERMISSIONEVAL = "org.alfresco.faces.PermissionEvaluator";
private static final String COMPONENT_ACTIONEVAL = "org.alfresco.faces.ActionInstanceEvaluator";
public static final String RENDERER_ACTIONLINK = "org.alfresco.faces.ActionLinkRenderer";
public static final String COMPONENT_ACTIONLINK = "org.alfresco.faces.ActionLink";
public static final String COMPONENT_PERMISSIONEVAL = "org.alfresco.faces.PermissionEvaluator";
public static final String COMPONENT_ACTIONEVAL = "org.alfresco.faces.ActionInstanceEvaluator";
private final static Class ACTION_CLASS_ARGS[] = {javax.faces.event.ActionEvent.class};

View File

@@ -19,8 +19,10 @@ package org.alfresco.web.ui.wcm.component;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;
import javax.faces.component.NamingContainer;
@@ -42,15 +44,23 @@ import org.alfresco.web.bean.wcm.AVMConstants;
import org.alfresco.web.ui.common.PanelGenerator;
import org.alfresco.web.ui.common.Utils;
import org.alfresco.web.ui.common.component.SelfRenderingComponent;
import org.alfresco.web.ui.common.component.UIActionLink;
import org.alfresco.web.ui.repo.component.UIActions;
import org.alfresco.web.ui.wcm.WebResources;
import org.springframework.web.jsf.FacesContextUtils;
import sun.swing.UIAction;
/**
* @author Kevin Roast
*/
public class UIUserSandboxes extends SelfRenderingComponent
{
private static final String MSG_USERNAME = "username";
private static final String MSG_NAME = "name";
private static final String MSG_DESCRIPTION = "description";
private static final String MSG_MODIFIED = "modified_date";
private static final String MSG_ACTIONS = "actions";
/** website to show sandboxes for */
private NodeRef value;
@@ -87,6 +97,22 @@ public class UIUserSandboxes extends SelfRenderingComponent
values[2] = this.expandedPanels;
return values;
}
/**
* @see javax.faces.component.UIComponentBase#getRendersChildren()
*/
public boolean getRendersChildren()
{
return true;
}
/**
* @see javax.faces.component.UIComponentBase#encodeChildren(javax.faces.context.FacesContext)
*/
public void encodeChildren(FacesContext context) throws IOException
{
// the child components are rendered explicitly during the encodeBegin()
}
/**
* @see javax.faces.component.UIComponentBase#decode(javax.faces.context.FacesContext)
@@ -127,11 +153,7 @@ public class UIUserSandboxes extends SelfRenderingComponent
ResponseWriter out = context.getResponseWriter();
if (getChildCount() == 0)
{
// create any sub-component for the first time
}
ResourceBundle bundle = Application.getBundle(context);
AVMService avmService = getAVMService(context);
NodeService nodeService = getNodeService(context);
UserTransaction tx = null;
@@ -153,45 +175,92 @@ public class UIUserSandboxes extends SelfRenderingComponent
{
String username = users.get(i);
// build the name of the main store for the user
String mainStore = storeRoot + '-' + username + AVMConstants.STORE_MAIN;
AVMStoreDescriptor store = avmService.getAVMStore(mainStore);
// for each user sandbox, generate an outer panel table
PanelGenerator.generatePanelStart(out,
context.getExternalContext().getRequestContextPath(),
"white",
"white");
// components for the current username, preview, browse and modified items inner list
out.write("<table cellspacing=2 cellpadding=2 border=0 width=100%><tr><td>");
out.write(Utils.buildImageTag(context, WebResources.IMAGE_SANDBOX_32, 32, 32, ""));
out.write("</td><td width=100%>");
out.write("<b>");
out.write(Application.getMessage(context, MSG_USERNAME));
out.write(":</b>&nbsp;");
out.write(username); // TODO: convert to full name
out.write("</td><td><nobr>");
// direct actions for a sandbox
// TODO: add actions for a sandbox
out.write("(Preview) (Create) (Browse)");
out.write("</nobr></td></tr>");
// modified items panel
out.write("<tr><td></td><td colspan=2>");
String panelImage = this.expandedPanels.contains(username) ? WebResources.IMAGE_EXPANDED : WebResources.IMAGE_COLLAPSED;
out.write(Utils.buildImageTag(context, panelImage, 11, 11, "",
Utils.generateFormSubmit(context, this, getClientId(context), username)));
out.write("&nbsp;<b>Modified Items (3)</b>");
out.write("</td></tr></table>");
// end the outer panel for this sandbox
PanelGenerator.generatePanelEnd(out,
context.getExternalContext().getRequestContextPath(),
"white");
// spacer row
if (i < users.size() - 1)
// check it exists before we render the view
if (avmService.getAVMStore(mainStore) != null)
{
out.write("<div style='padding:4px'></div>");
// for each user sandbox, generate an outer panel table
PanelGenerator.generatePanelStart(out,
context.getExternalContext().getRequestContextPath(),
"white",
"white");
// components for the current username, preview, browse and modified items inner list
out.write("<table cellspacing=2 cellpadding=2 border=0 width=100%><tr><td>");
out.write(Utils.buildImageTag(context, WebResources.IMAGE_SANDBOX_32, 32, 32, ""));
out.write("</td><td width=100%>");
out.write("<b>");
out.write(bundle.getString(MSG_USERNAME));
out.write(":</b>&nbsp;");
out.write(username); // TODO: convert to full name?
out.write("</td><td><nobr>");
// direct actions for a sandbox
Utils.encodeRecursive(context, aquireAction(
context, "sandbox_preview", "/images/icons/preview_website.gif"));
out.write("&nbsp;&nbsp;");
Utils.encodeRecursive(context, aquireAction(
context, "sandbox_create", "/images/icons/new_content.gif"));
out.write("&nbsp;&nbsp;");
Utils.encodeRecursive(context, aquireAction(
context, "sandbox_browse", "/images/icons/space_small.gif"));
out.write("</nobr></td></tr>");
// modified items panel
out.write("<tr><td></td><td colspan=2>");
String panelImage = WebResources.IMAGE_COLLAPSED;
if (this.expandedPanels.contains(username))
{
panelImage = WebResources.IMAGE_EXPANDED;
}
out.write(Utils.buildImageTag(context, panelImage, 11, 11, "",
Utils.generateFormSubmit(context, this, getClientId(context), username)));
out.write("&nbsp;<b>Modified Items (3)</b>");
if (this.expandedPanels.contains(username))
{
out.write("<div style='padding:2px'></div>");
out.write("<table cellspacing=2 cellpadding=2 border=0 width=100%>");
// header row
out.write("<tr align=left><th width=16></th><th>");
out.write(bundle.getString(MSG_NAME));
out.write("</th><th>");
out.write(bundle.getString(MSG_DESCRIPTION));
out.write("</th><th>");
out.write(bundle.getString(MSG_MODIFIED));
out.write("</th><th>");
out.write(bundle.getString(MSG_ACTIONS));
out.write("</th></tr>");
// row per modified doc item
// TODO: add modified items list for this sandbox user
out.write("<tr><td width=16>(O)</td><td>");
out.write("Some document.html");
out.write("</td><td>");
out.write("A description would go here");
out.write("</td><td>");
out.write("01-01-2006 11:58am");
out.write("</td><td>");
// TODO: add UI actions for this item
out.write("(P)&nbsp;(E)&nbsp;(T)&nbsp;(D)");
out.write("</td></tr>");
out.write("</table>");
}
out.write("</td></tr></table>");
// end the outer panel for this sandbox
PanelGenerator.generatePanelEnd(out,
context.getExternalContext().getRequestContextPath(),
"white");
// spacer row
if (i < users.size() - 1)
{
out.write("<div style='padding:4px'></div>");
}
}
}
@@ -204,6 +273,47 @@ public class UIUserSandboxes extends SelfRenderingComponent
}
}
private UIActionLink aquireAction(FacesContext fc, String name, String icon)
{
UIActionLink action = findAction(name);
if (action == null)
{
action = createAction(fc, name, icon);
}
return action;
}
private UIActionLink findAction(String name)
{
UIActionLink action = null;
String actionId = getId() + name;
for (UIComponent component : (List<UIComponent>)getChildren())
{
if (actionId.equals(component.getId()))
{
action = (UIActionLink)component;
break;
}
}
return action;
}
private UIActionLink createAction(FacesContext fc, String name, String icon)
{
javax.faces.application.Application facesApp = fc.getApplication();
UIActionLink control = (UIActionLink)facesApp.createComponent(UIActions.COMPONENT_ACTIONLINK);
control.setRendererType(UIActions.RENDERER_ACTIONLINK);
control.setId(getId() + name);
control.setValue(Application.getMessage(fc, name));
control.setShowLink(false);
control.setImage(icon);
this.getChildren().add(control);
return control;
}
private AVMService getAVMService(FacesContext fc)
{
return (AVMService)FacesContextUtils.getRequiredWebApplicationContext(fc).getBean("AVMService");

View File

@@ -563,6 +563,15 @@
</managed-property>
</managed-bean>
<managed-bean>
<description>
The bean that backs up the Create Website Wizard
</description>
<managed-bean-name>ImportWebsiteDialog</managed-bean-name>
<managed-bean-class>org.alfresco.web.bean.wcm.ImportWebsiteDialog</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<description>
The bean that backs up the Set Content Properties Dialog

View File

@@ -907,4 +907,12 @@
</navigation-case>
</navigation-rule>
<navigation-rule>
<from-view-id>/jsp/wcm/*</from-view-id>
<navigation-case>
<from-outcome>importContent</from-outcome>
<to-view-id>/jsp/wcm/import-content-dialog.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>

Binary file not shown.

After

Width:  |  Height:  |  Size: 621 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -74,6 +74,10 @@
<div class="mainSubText"><h:outputText value="#{msg.website_info}" id="msg3" /></div>
<div class="mainSubText"><h:outputText value="#{NavigationBean.nodeProperties.description}" id="msg4" /></div>
</td>
<td align=right>
<%-- Import website content action --%>
<a:actionLink value="#{msg.import_website_content}" image="/images/icons/import_website.gif" padding="2" action="dialog:importContent" actionListener="#{ImportWebsiteDialog.start}" />
</td>
</tr>
</table>
@@ -96,11 +100,21 @@
<%-- Staging Sandbox Info here --%>
<% PanelGenerator.generatePanelStart(out, request.getContextPath(), "blue", "#D3E6FE"); %>
---STAGING SANDBOX INFO HERE---<br>
-------------------------------<br>
Last Updated: 1234<br>
12 items currently being modified<br>
3 items pending approval
<table cellspacing=2 cellpadding=2 border=0 width=100%>
<tr>
<td align=left width=32><h:graphicImage url="/images/icons/website_large.gif" width="32" height="32" /></td>
<td align=left><h:outputText value="#{msg.staging_sandbox}" styleClass="mainSubTitle" /></td>
<td align=right>(P)&nbsp;(E)&nbsp;(T)&nbsp;(D)</td>
</tr>
<tr>
<td></td>
<td colspan=2>
Last Updated: 20th September 2006<P>
12 items currently being modified<P>
3 items pending approval
</td>
</tr>
</table>
<% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "blue"); %>
</a:panel>

View File

@@ -0,0 +1,216 @@
<%--
Copyright (C) 2005 Alfresco, Inc.
Licensed under the Mozilla Public License version 1.1
with a permitted attribution clause. You may obtain a
copy of the License at
http://www.alfresco.org/legal/license.txt
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.
--%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="/WEB-INF/alfresco.tld" prefix="a" %>
<%@ taglib uri="/WEB-INF/repo.tld" prefix="r" %>
<%@ page buffer="32kb" contentType="text/html;charset=UTF-8" %>
<%@ page isELIgnored="false" %>
<%@ page import="javax.faces.context.FacesContext" %>
<%@ page import="org.alfresco.web.app.Application" %>
<%@ page import="org.alfresco.web.bean.wcm.ImportWebsiteDialog" %>
<%@ page import="org.alfresco.web.app.servlet.FacesHelper" %>
<%@ page import="org.alfresco.web.ui.common.PanelGenerator" %>
<r:page titleId="title_import_content">
<f:view>
<%-- load a bundle of properties with I18N strings --%>
<f:loadBundle basename="alfresco.messages.webclient" var="msg"/>
<h:form acceptCharset="UTF-8" id="add-content-upload-start">
<%-- Main outer table --%>
<table cellspacing="0" cellpadding="2">
<%-- Title bar --%>
<tr>
<td colspan="2">
<%@ include file="../parts/titlebar.jsp" %>
</td>
</tr>
<%-- Main area --%>
<tr valign="top">
<%-- Shelf --%>
<td>
<%@ include file="../parts/shelf.jsp" %>
</td>
<%-- Work Area --%>
<td width="100%">
<table cellspacing="0" cellpadding="0" width="100%">
<%-- Breadcrumb --%>
<%@ include file="../parts/breadcrumb.jsp" %>
<%-- Status and Actions --%>
<tr>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/statuspanel_4.gif)" width="4"></td>
<td bgcolor="#EEEEEE">
<%-- Status and Actions inner contents table --%>
<%-- Generally this consists of an icon, textual summary and actions for the current object --%>
<table cellspacing="4" cellpadding="0" width="100%">
<tr>
<td width="32">
<h:graphicImage id="dialog-logo" url="/images/icons/add_content_large.gif" />
</td>
<td>
<div class="mainTitle"><h:outputText value="#{msg.import_website_content_title}" /></div>
<div class="mainSubText"><h:outputText value="#{msg.import_website_content_desc}" /></div>
</td>
</tr>
</table>
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/statuspanel_6.gif)" width="4"></td>
</tr>
<%-- separator row with gradient shadow --%>
<tr>
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_7.gif" width="4" height="9"></td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/statuspanel_8.gif)"></td>
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width="4" height="9"></td>
</tr>
</h:form>
<%-- Details --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width="4"></td>
<td>
<table cellspacing="0" cellpadding="3" border="0" width="100%">
<tr>
<td width="100%" valign="top">
<a:errors message="#{msg.error_dialog}" styleClass="errorMessage" />
<% PanelGenerator.generatePanelStart(out, request.getContextPath(), "white", "white"); %>
<table cellpadding="2" cellspacing="2" border="0" width="100%">
<%
ImportWebsiteDialog bean = (ImportWebsiteDialog)FacesHelper.getManagedBean(FacesContext.getCurrentInstance(), "ImportWebsiteDialog");
boolean foundFile = (bean != null && bean.getFileName() != null);
if (foundFile == false) {
%>
<tr>
<td colspan="3" class="wizardSectionHeading"><h:outputText value="#{msg.upload_content}"/></td>
</tr>
<tr><td class="paddingRow"></td></tr>
<tr>
<td class="mainSubText" colspan="3">
<h:outputText id="text1" value="1. #{msg.locate_content}"/>
</td>
</tr>
<tr><td class="paddingRow"></td></tr>
<r:uploadForm>
<tr>
<td colspan="3">
<input style="margin-left:12px;" type="file" size="75" name="alfFileInput"/>
</td>
</tr>
<tr><td class="paddingRow"></td></tr>
<tr>
<td class="mainSubText" colspan="3">
2. <%=Application.getMessage(FacesContext.getCurrentInstance(), "click_upload")%>
</td>
</tr>
<tr>
<td colspan="3">
<input style="margin-left:12px;" type="submit" value="<%=Application.getMessage(FacesContext.getCurrentInstance(), "upload")%>" />
</td>
</tr>
</r:uploadForm>
<% } %>
<h:form acceptCharset="UTF-8" id="add-content-upload-end">
<% if (foundFile) { %>
<tr>
<td colspan="3">
<table border="0" cellspacing="2" cellpadding="2" class="selectedItems">
<tr>
<td colspan="2" class="selectedItemsHeader">
<h:outputText id="text2" value="#{msg.uploaded_content}" />
</th>
</tr>
<tr>
<td class="selectedItemsRow">
<h:outputText id="text3" value="#{ImportWebsiteDialog.fileName}" />
</td>
<td>
<a:actionLink image="/images/icons/delete.gif" value="#{msg.remove}"
action="#{ImportWebsiteDialog.removeUploadedFile}"
showLink="false" id="link1" />
</td>
</tr>
</table>
</td>
</tr>
<% } %>
</table>
<% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "white"); %>
</td>
<td valign="top">
<% PanelGenerator.generatePanelStart(out, request.getContextPath(), "blue", "#D3E6FE"); %>
<table cellpadding="1" cellspacing="1" border="0">
<tr>
<td align="center">
<h:commandButton id="finish-button" styleClass="wizardButton"
value="#{msg.ok}"
action="#{ImportWebsiteDialog.finish}"
disabled="#{ImportWebsiteDialog.finishButtonDisabled}" />
</td>
</tr>
<tr>
<td align="center">
<h:commandButton id="cancel-button" styleClass="wizardButton"
value="#{msg.cancel}"
action="#{ImportWebsiteDialog.cancel}" />
</td>
</tr>
</table>
<% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "blue"); %>
</td>
</tr>
</table>
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width="4"></td>
</tr>
<%-- separator row with bottom panel graphics --%>
<tr>
<td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width="4" height="4"></td>
<td width="100%" align="center" style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_8.gif)"></td>
<td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_9.gif" width="4" height="4"></td>
</tr>
</table>
</td>
</tr>
</table>
</h:form>
</f:view>
</r:page>