Enhancements to Create From feature UI in Create Web Project wizard.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@7020 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2007-10-17 11:01:06 +00:00
parent 6b565772fd
commit 0ba846d5e7
9 changed files with 186 additions and 33 deletions

View File

@@ -985,6 +985,10 @@ create_website_step2_desc=Optionally select an existing project to be used as th
website_create_empty=Create a new empty Web Project website_create_empty=Create a new empty Web Project
website_create_existing=Create a Web Project based on an existing one. The Staging Sandbox structure, Web Forms, Workflow and Users will be copied from the selected Web Project website_create_existing=Create a Web Project based on an existing one. The Staging Sandbox structure, Web Forms, Workflow and Users will be copied from the selected Web Project
website_sourcewebsite=Created from Web Project website_sourcewebsite=Created from Web Project
website_sourcetemplate=Use as a template?
website_sourcenote=Note: Only those Web Projects marked for use as a template will be displayed by default.
website_sourceshowall=Show All Web Projects
website_sourceshowtemplates=Show Template Web Projects
website_selected_forms=Selected Web Content Forms website_selected_forms=Selected Web Content Forms
website_web_content_forms=Web Content Forms website_web_content_forms=Web Content Forms
website_save_location=Save Location website_save_location=Save Location
@@ -1145,7 +1149,7 @@ snapshot_success=Snapshot ''{0}'' created for sandbox: {1}
snapshot_failure=Snapshot not created - the sandbox has not been modified since the last snapshot. snapshot_failure=Snapshot not created - the sandbox has not been modified since the last snapshot.
snapshot_submitted_by=Submitted By snapshot_submitted_by=Submitted By
title_website_details=Web Project Details title_website_details=Web Project Details
websitedetails_description=View the details of the web project. webproject_details_of=Web Project Details of
delete_sandbox=Delete Sandbox delete_sandbox=Delete Sandbox
delete_sandbox_info=To remove this sandbox and the user from the Web Project, click OK. delete_sandbox_info=To remove this sandbox and the user from the Web Project, click OK.
delete_sandbox_confirm=Are you sure you want to remove the user sandbox \"{0}\" from the Web Project? delete_sandbox_confirm=Are you sure you want to remove the user sandbox \"{0}\" from the Web Project?
@@ -1193,7 +1197,7 @@ deploy_status_failed=FAILED
deploy_status_partial=PARTIAL FAILURE deploy_status_partial=PARTIAL FAILURE
reason=Reason reason=Reason
snapshot=Snapshot snapshot=Snapshot
deploy_to_help=<p>A comma separated list of servers to deploy the website to. Each entry either represents the location of a Deployment Receiver or an Alfresco Repository.</p><p>A file server entry must be prefixed with '\\\\'. Each server can be represented by a host name or an IP address and may also contain an RMI port number. If an RMI port number is not specified for a Deployment Receiver the default of {0} will be used. If an RMI port number is not specified for an Alfresco Repository the default of {1} will be used.</p><p>Example: \\\\liveserver1, \\\\liveserver2:44200, liverserver3, liverserver4:50900</p> deploy_to_help=A comma separated list of servers to deploy the website to. Each entry either represents the location of a Deployment Receiver or an Alfresco Repository.<br><br>A file server entry must be prefixed with '\\\\'. Each server can be represented by a host name or an IP address and may also contain an RMI port number. If an RMI port number is not specified for a Deployment Receiver the default of {0} will be used. If an RMI port number is not specified for an Alfresco Repository the default of {1} will be used.<br><br>Example: \\\\liveserver1, \\\\liveserver2:44200, liverserver3, liverserver4:50900
content_launch=Content Launch content_launch=Content Launch
launch_date=Launch Date launch_date=Launch Date
expiration_date_header=Content Expiration expiration_date_header=Content Expiration

View File

@@ -91,6 +91,7 @@ public class CreateWebsiteWizard extends BaseWizardBean
private static final String COMPONENT_WORKFLOWLIST = "workflow-list"; private static final String COMPONENT_WORKFLOWLIST = "workflow-list";
// wizard step names (that are referenced) // wizard step names (that are referenced)
private static final String STEP_DETAILS = "details";
private static final String STEP_FORMS = "forms"; private static final String STEP_FORMS = "forms";
private static final String MATCH_DEFAULT = ".*"; private static final String MATCH_DEFAULT = ".*";
@@ -114,6 +115,8 @@ public class CreateWebsiteWizard extends BaseWizardBean
protected String createFrom = null; protected String createFrom = null;
protected String[] sourceWebProject = null; protected String[] sourceWebProject = null;
protected ExpiringValueCache<List<UIListItem>> webProjectsList; protected ExpiringValueCache<List<UIListItem>> webProjectsList;
protected boolean isSource;
protected boolean showAllSourceProjects;
protected AVMService avmService; protected AVMService avmService;
protected WorkflowService workflowService; protected WorkflowService workflowService;
@@ -168,12 +171,14 @@ public class CreateWebsiteWizard extends BaseWizardBean
this.title = null; this.title = null;
this.description = null; this.description = null;
this.deployTo = null; this.deployTo = null;
this.isSource = false;
clearFormsWorkflowsAndUsers(); clearFormsWorkflowsAndUsers();
this.createFrom = CREATE_EMPTY; this.createFrom = CREATE_EMPTY;
// requry existing web projects list every 10 seconds // requry existing web projects list every 10 seconds
this.webProjectsList = new ExpiringValueCache<List<UIListItem>>(1000L*10L); this.webProjectsList = new ExpiringValueCache<List<UIListItem>>(1000L*10L);
this.sourceWebProject = null; this.sourceWebProject = null;
this.createFromValueChanged = false; this.createFromValueChanged = false;
this.showAllSourceProjects = false;
} }
private void clearFormsWorkflowsAndUsers() private void clearFormsWorkflowsAndUsers()
@@ -194,6 +199,9 @@ public class CreateWebsiteWizard extends BaseWizardBean
@Override @Override
protected String finishImpl(FacesContext context, String outcome) throws Exception protected String finishImpl(FacesContext context, String outcome) throws Exception
{ {
// the Finish button can be pressed early in the steps - ensure the model is up-to-date
updateModelOnCreateFromChange();
// create the website space in the correct parent folder // create the website space in the correct parent folder
final NodeRef websiteParent = WebProject.getWebsitesFolder(); final NodeRef websiteParent = WebProject.getWebsitesFolder();
@@ -216,6 +224,9 @@ public class CreateWebsiteWizard extends BaseWizardBean
uiFacetsProps.put(ContentModel.PROP_DESCRIPTION, this.description); uiFacetsProps.put(ContentModel.PROP_DESCRIPTION, this.description);
this.nodeService.addAspect(nodeRef, ApplicationModel.ASPECT_UIFACETS, uiFacetsProps); this.nodeService.addAspect(nodeRef, ApplicationModel.ASPECT_UIFACETS, uiFacetsProps);
// use as template source flag
this.nodeService.setProperty(nodeRef, WCMAppModel.PROP_ISSOURCE, this.isSource);
// set the default webapp name for the project // set the default webapp name for the project
String webapp = (this.webapp != null && this.webapp.length() != 0) ? this.webapp : WEBAPP_DEFAULT; String webapp = (this.webapp != null && this.webapp.length() != 0) ? this.webapp : WEBAPP_DEFAULT;
this.nodeService.setProperty(nodeRef, WCMAppModel.PROP_DEFAULTWEBAPP, webapp); this.nodeService.setProperty(nodeRef, WCMAppModel.PROP_DEFAULTWEBAPP, webapp);
@@ -249,8 +260,8 @@ public class CreateWebsiteWizard extends BaseWizardBean
// create the default webapp folder under the hidden system folders // create the default webapp folder under the hidden system folders
if (branchStoreId == null) if (branchStoreId == null)
{ {
final String stagingStore = AVMUtil.buildStagingStoreName(avmStore); String stagingStore = AVMUtil.buildStagingStoreName(avmStore);
final String stagingStoreRoot = AVMUtil.buildSandboxRootPath(stagingStore); String stagingStoreRoot = AVMUtil.buildSandboxRootPath(stagingStore);
this.avmService.createDirectory(stagingStoreRoot, webapp); this.avmService.createDirectory(stagingStoreRoot, webapp);
this.avmService.addAspect(AVMNodeConverter.ExtendAVMPath(stagingStoreRoot, webapp), this.avmService.addAspect(AVMNodeConverter.ExtendAVMPath(stagingStoreRoot, webapp),
WCMAppModel.ASPECT_WEBAPP); WCMAppModel.ASPECT_WEBAPP);
@@ -295,6 +306,14 @@ public class CreateWebsiteWizard extends BaseWizardBean
return outcome; return outcome;
} }
@Override
public boolean getFinishButtonDisabled()
{
// allow finish from any step other than the initial details page
String stepName = Application.getWizardManager().getCurrentStepName();
return (STEP_DETAILS.equals(stepName));
}
/** /**
* Persist the forms, templates, workflows and workflow defaults to the model for this web project * Persist the forms, templates, workflows and workflow defaults to the model for this web project
* *
@@ -417,6 +436,11 @@ public class CreateWebsiteWizard extends BaseWizardBean
this.dnsName = (String)props.get(WCMAppModel.PROP_AVMSTORE); this.dnsName = (String)props.get(WCMAppModel.PROP_AVMSTORE);
this.webapp = (String)props.get(WCMAppModel.PROP_DEFAULTWEBAPP); this.webapp = (String)props.get(WCMAppModel.PROP_DEFAULTWEBAPP);
this.deployTo = (List<String>)props.get(WCMAppModel.PROP_DEPLOYTO); this.deployTo = (List<String>)props.get(WCMAppModel.PROP_DEPLOYTO);
Boolean isSource = (Boolean)props.get(WCMAppModel.PROP_ISSOURCE);
if (isSource != null)
{
this.isSource = isSource.booleanValue();
}
} }
if (loadUsers) if (loadUsers)
@@ -749,6 +773,22 @@ public class CreateWebsiteWizard extends BaseWizardBean
return name; return name;
} }
/**
* @return true if this website is set to be a template source website for future web projects
*/
public boolean isSource()
{
return this.isSource;
}
/**
* @param isSource true if this website is set to be a template source website for future web projects
*/
public void setSource(boolean isSource)
{
this.isSource = isSource;
}
/** /**
* @return the existingWebProjects * @return the existingWebProjects
*/ */
@@ -759,16 +799,23 @@ public class CreateWebsiteWizard extends BaseWizardBean
{ {
FacesContext fc = FacesContext.getCurrentInstance(); FacesContext fc = FacesContext.getCurrentInstance();
// construct the query to retrieve all web projects // construct the query to retrieve the web projects
String path = Application.getRootPath(fc) + "/" + Application.getWebsitesFolderName(fc) + "/*"; String path = Application.getRootPath(fc) + "/" + Application.getWebsitesFolderName(fc) + "/*";
String query = "PATH:\"/" + path + "\" +TYPE:\"{" + NamespaceService.WCMAPP_MODEL_1_0_URI + "}webfolder\""; StringBuilder query = new StringBuilder(200);
query.append("PATH:\"/").append(path).append("\"");
query.append(" +TYPE:\"{").append(NamespaceService.WCMAPP_MODEL_1_0_URI).append("}webfolder\"");
if (this.showAllSourceProjects == false)
{
// only query for web project templates by default
query.append(" +@").append(Repository.escapeQName(WCMAppModel.PROP_ISSOURCE)).append(":true");
}
ResultSet results = null; ResultSet results = null;
try try
{ {
// execute the query // execute the query
results = searchService.query(Repository.getStoreRef(), results = searchService.query(Repository.getStoreRef(),
SearchService.LANGUAGE_LUCENE, query); SearchService.LANGUAGE_LUCENE, query.toString());
webProjects = new ArrayList<UIListItem>(results.length()); webProjects = new ArrayList<UIListItem>(results.length());
for (ResultSetRow row : results) for (ResultSetRow row : results)
{ {
@@ -796,6 +843,25 @@ public class CreateWebsiteWizard extends BaseWizardBean
return webProjects; return webProjects;
} }
/**
* Action handler called when toggle Show All/Show Template Web Projects link is clicked
*/
public void toggleWebProjectsList(ActionEvent event)
{
this.showAllSourceProjects = !this.showAllSourceProjects;
this.webProjectsList.clear();
this.createFromValueChanged = true;
}
/**
* @return true to show all Web Projects in the Create From list,
* false to only show those marked as templates
*/
public boolean getShowAllSourceProjects()
{
return this.showAllSourceProjects;
}
/** /**
* @return the deploy to help text that gets displayed if the user * @return the deploy to help text that gets displayed if the user
* clicks the Help icon * clicks the Help icon
@@ -820,27 +886,35 @@ public class CreateWebsiteWizard extends BaseWizardBean
{ {
// if we have just entered the Forms page and the Create From page data has changed // if we have just entered the Forms page and the Create From page data has changed
// then we need to pre-populate the Forms etc. from the template web project // then we need to pre-populate the Forms etc. from the template web project
if (this.createFromValueChanged) updateModelOnCreateFromChange();
{
if (CREATE_EXISTING.equals(this.createFrom))
{
if (this.sourceWebProject != null && this.sourceWebProject.length != 0)
{
clearFormsWorkflowsAndUsers();
loadWebProjectModel(new NodeRef(this.sourceWebProject[0]), false, true);
}
}
else
{
clearFormsWorkflowsAndUsers();
}
this.createFromValueChanged = false;
}
} }
return super.next(); return super.next();
} }
/**
* Update the wizard model when the value in the Create From page changes
*/
private void updateModelOnCreateFromChange()
{
if (this.createFromValueChanged)
{
if (CREATE_EXISTING.equals(this.createFrom))
{
if (this.sourceWebProject != null && this.sourceWebProject.length != 0)
{
clearFormsWorkflowsAndUsers();
loadWebProjectModel(new NodeRef(this.sourceWebProject[0]), false, true);
}
}
else
{
clearFormsWorkflowsAndUsers();
}
this.createFromValueChanged = false;
}
}
/** /**
* @return summary text for the wizard * @return summary text for the wizard
*/ */

View File

@@ -66,6 +66,13 @@ public class EditWebsiteWizard extends CreateWebsiteWizard
loadWebProjectModel(websiteRef, true, false); loadWebProjectModel(websiteRef, true, false);
} }
@Override
public boolean getFinishButtonDisabled()
{
// always allow Finish as we are editing existing settings
return false;
}
/** /**
* @see org.alfresco.web.bean.dialog.BaseDialogBean#finishImpl(javax.faces.context.FacesContext, java.lang.String) * @see org.alfresco.web.bean.dialog.BaseDialogBean#finishImpl(javax.faces.context.FacesContext, java.lang.String)
*/ */
@@ -79,6 +86,7 @@ public class EditWebsiteWizard extends CreateWebsiteWizard
this.nodeService.setProperty(nodeRef, ContentModel.PROP_TITLE, this.title); this.nodeService.setProperty(nodeRef, ContentModel.PROP_TITLE, this.title);
this.nodeService.setProperty(nodeRef, ContentModel.PROP_DESCRIPTION, this.description); this.nodeService.setProperty(nodeRef, ContentModel.PROP_DESCRIPTION, this.description);
this.nodeService.setProperty(nodeRef, WCMAppModel.PROP_DEPLOYTO, (Serializable)this.deployTo); this.nodeService.setProperty(nodeRef, WCMAppModel.PROP_DEPLOYTO, (Serializable)this.deployTo);
this.nodeService.setProperty(nodeRef, WCMAppModel.PROP_ISSOURCE, this.isSource);
// clear the existing settings for forms, template and workflows - then the existing methods // clear the existing settings for forms, template and workflows - then the existing methods
// can be used to apply the modified and previous settings from scratch // can be used to apply the modified and previous settings from scratch

View File

@@ -35,6 +35,7 @@ import javax.faces.el.ValueBinding;
public class UIListItems extends SelfRenderingComponent public class UIListItems extends SelfRenderingComponent
{ {
private Object value; private Object value;
private boolean cacheValue;
/** /**
* @see javax.faces.component.UIComponent#getFamily() * @see javax.faces.component.UIComponent#getFamily()
@@ -49,7 +50,7 @@ public class UIListItems extends SelfRenderingComponent
*/ */
public Object getValue() public Object getValue()
{ {
if (this.value == null) if (getCacheValue() == false || this.value == null)
{ {
ValueBinding vb = getValueBinding("value"); ValueBinding vb = getValueBinding("value");
if (vb != null) if (vb != null)
@@ -68,6 +69,27 @@ public class UIListItems extends SelfRenderingComponent
this.value = value; this.value = value;
} }
/**
* @return the cacheValue
*/
public boolean getCacheValue()
{
ValueBinding vb = getValueBinding("cacheValue");
if (vb != null)
{
this.cacheValue = (Boolean)vb.getValue(getFacesContext());;
}
return this.cacheValue;
}
/**
* @param cacheValue the cacheValue to set
*/
public void setCacheValue(boolean cacheValue)
{
this.cacheValue = cacheValue;
}
/** /**
* @see javax.faces.component.StateHolder#restoreState(javax.faces.context.FacesContext, java.lang.Object) * @see javax.faces.component.StateHolder#restoreState(javax.faces.context.FacesContext, java.lang.Object)
*/ */
@@ -77,6 +99,7 @@ public class UIListItems extends SelfRenderingComponent
// standard component attributes are restored by the super class // standard component attributes are restored by the super class
super.restoreState(context, values[0]); super.restoreState(context, values[0]);
this.value = values[1]; this.value = values[1];
this.cacheValue = (Boolean)values[2];
} }
/** /**
@@ -85,7 +108,11 @@ public class UIListItems extends SelfRenderingComponent
public Object saveState(FacesContext context) public Object saveState(FacesContext context)
{ {
// standard component attributes are saved by the super class // standard component attributes are saved by the super class
return new Object[] { super.saveState(context), this.value }; return new Object[] {
super.saveState(context),
this.value,
this.cacheValue
};
} }
} }

View File

@@ -60,6 +60,7 @@ public class ListItemsTag extends BaseComponentTag
super.setProperties(component); super.setProperties(component);
setStringBindingProperty(component, "value", this.value); setStringBindingProperty(component, "value", this.value);
setBooleanProperty(component, "cacheValue", this.cacheValue);
} }
/** /**
@@ -78,5 +79,20 @@ public class ListItemsTag extends BaseComponentTag
super.release(); super.release();
this.value = null; this.value = null;
this.cacheValue = null;
} }
/**
* Set the cacheValue
*
* @param cacheValue the cacheValue
*/
public void setCacheValue(String cacheValue)
{
this.cacheValue = cacheValue;
}
/** the cacheValue */
private String cacheValue;
} }

View File

@@ -1143,6 +1143,12 @@
<required>true</required> <required>true</required>
<rtexprvalue>true</rtexprvalue> <rtexprvalue>true</rtexprvalue>
</attribute> </attribute>
<attribute>
<name>cacheValue</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag> </tag>
<tag> <tag>

View File

@@ -36,8 +36,14 @@
<h:panelGroup id="grp-1"> <h:panelGroup id="grp-1">
<f:verbatim><div style="height:180px;*height:184px;margin-left:28px;width:90%;overflow:auto" class='selectListTable'></f:verbatim> <f:verbatim><div style="height:180px;*height:184px;margin-left:28px;width:90%;overflow:auto" class='selectListTable'></f:verbatim>
<a:selectList id="website-list" value="#{WizardManager.bean.sourceWebProject}" style="width:100%" itemStyleClass="selectListItem"> <a:selectList id="website-list" value="#{WizardManager.bean.sourceWebProject}" style="width:100%" itemStyleClass="selectListItem">
<a:listItems id="website-items" value="#{WizardManager.bean.webProjectsList}" /> <a:listItems id="website-items" value="#{WizardManager.bean.webProjectsList}" cacheValue="false" />
</a:selectList> </a:selectList>
<f:verbatim></div></f:verbatim> <f:verbatim></div></f:verbatim>
<f:verbatim><div style="margin-left:28px;margin-top:4px"></f:verbatim>
<h:outputText id="txt-note" value="#{msg.website_sourcenote}" />
<f:verbatim><br></f:verbatim>
<a:actionLink id="lnk-showall" value="#{msg.website_sourceshowall}" actionListener="#{WizardManager.bean.toggleWebProjectsList}" rendered="#{!WizardManager.bean.showAllSourceProjects}" />
<a:actionLink id="lnk-showtemplates" value="#{msg.website_sourceshowtemplates}" actionListener="#{WizardManager.bean.toggleWebProjectsList}" rendered="#{WizardManager.bean.showAllSourceProjects}" />
<f:verbatim></div></f:verbatim>
</h:panelGroup> </h:panelGroup>
</h:panelGrid> </h:panelGrid>

View File

@@ -106,7 +106,7 @@
<h:outputText value="#{msg.name}:"/> <h:outputText value="#{msg.name}:"/>
<f:verbatim> <f:verbatim>
</td> </td>
<td width="85%"> <td width="75%">
</f:verbatim> </f:verbatim>
<h:inputText id="name" value="#{WizardManager.bean.name}" size="45" maxlength="1024" <h:inputText id="name" value="#{WizardManager.bean.name}" size="45" maxlength="1024"
onkeyup="javascript:checkButtonState();" /> onkeyup="javascript:checkButtonState();" />
@@ -124,7 +124,7 @@
<h:outputText value="#{msg.website_dnsname}:"/> <h:outputText value="#{msg.website_dnsname}:"/>
<f:verbatim> <f:verbatim>
</td> </td>
<td width="85%"> <td>
</f:verbatim> </f:verbatim>
<h:inputText id="dnsname" value="#{WizardManager.bean.dnsName}" size="45" maxlength="64" <h:inputText id="dnsname" value="#{WizardManager.bean.dnsName}" size="45" maxlength="64"
onkeyup="javascript:checkButtonState();" disabled="#{WizardManager.bean.editMode}" /> onkeyup="javascript:checkButtonState();" disabled="#{WizardManager.bean.editMode}" />
@@ -138,7 +138,7 @@
<h:outputText value="#{msg.website_webapp}:"/> <h:outputText value="#{msg.website_webapp}:"/>
<f:verbatim> <f:verbatim>
</td> </td>
<td width="85%"> <td>
</f:verbatim> </f:verbatim>
<h:inputText id="webapp" value="#{WizardManager.bean.webapp}" size="45" maxlength="256" disabled="true" /> <h:inputText id="webapp" value="#{WizardManager.bean.webapp}" size="45" maxlength="256" disabled="true" />
<f:verbatim> <f:verbatim>
@@ -151,7 +151,7 @@
<h:outputText value="#{msg.website_deployto}:"/> <h:outputText value="#{msg.website_deployto}:"/>
<f:verbatim> <f:verbatim>
</td> </td>
<td width="85%"> <td>
</f:verbatim> </f:verbatim>
<h:inputText id="server" value="#{WizardManager.bean.deployTo}" size="45" maxlength="256"> <h:inputText id="server" value="#{WizardManager.bean.deployTo}" size="45" maxlength="256">
<a:convertMultiValue /> <a:convertMultiValue />
@@ -193,5 +193,18 @@
<f:verbatim> <f:verbatim>
</td> </td>
</tr> </tr>
<tr>
<td></td>
<td valign="top">
</f:verbatim>
<h:outputText value="#{msg.website_sourcetemplate}"/>
<f:verbatim>
</td>
<td>
</f:verbatim>
<h:selectBooleanCheckbox id="template" value="#{WizardManager.bean.source}" />
<f:verbatim>
</td>
</tr>
</table> </table>
</f:verbatim> </f:verbatim>

View File

@@ -77,9 +77,8 @@
<img src="<%=request.getContextPath()%>/images/icons/details_large.gif" width=32 height=32> <img src="<%=request.getContextPath()%>/images/icons/details_large.gif" width=32 height=32>
</td> </td>
<td> <td>
<div class="mainTitle"><h:outputText value="#{msg.details_of}" /> '<h:outputText value="#{SpaceDetailsBean.name}" />'</div> <div class="mainTitle"><h:outputText value="#{msg.webproject_details_of}" /> '<h:outputText value="#{SpaceDetailsBean.name}" />'</div>
<div class="mainSubText"><h:outputText value="#{msg.location}" />: <r:nodePath value="#{SpaceDetailsBean.space.nodeRef}" breadcrumb="true" actionListener="#{BrowseBean.clickSpacePath}" /></div> <div class="mainSubText"><h:outputText value="#{msg.location}" />: <r:nodePath value="#{SpaceDetailsBean.space.nodeRef}" breadcrumb="true" actionListener="#{BrowseBean.clickSpacePath}" /></div>
<div class="mainSubText"><h:outputText value="#{msg.websitedetails_description}" /></div>
</td> </td>
<%-- Navigation --%> <%-- Navigation --%>