diff --git a/config/alfresco/messages/webclient.properties b/config/alfresco/messages/webclient.properties index 61e80b2bf6..e1a6e570b9 100644 --- a/config/alfresco/messages/webclient.properties +++ b/config/alfresco/messages/webclient.properties @@ -807,7 +807,7 @@ space_type_note=Note: If you can only see one type of space then other space typ template_space=Template Space select_template=Select the template you want to use. -# Create Website Wizard messages +# Create and Edit Website Wizard messages create_website=Create Web Project create_website_title=Create Web Project Wizard create_website_desc=This wizard helps you create a new web project space. @@ -852,6 +852,10 @@ create_website_step5_title=Step Five - Notify Users create_website_step5_desc=Notify the invited users. create_website_finish_instruction=To close this wizard and create your web project space click Finish. To review or change your selections click Back. create_website_summary_users=Users and Roles +edit_website_title=Edit Web Project Wizard +edit_website_desc=This wizard helps you modify the settings for a web project space. +edit_website_finish_instruction=To close this wizard and save the modified settings for your web project space click Finish. To review or change your selections click Back. +edit_website=Edit Web Project Settings # Invite web users wizard messages invite_website_users=Invite Web Project Users diff --git a/config/alfresco/web-client-config-dialogs.xml b/config/alfresco/web-client-config-dialogs.xml index d72309b06d..ca7717e5b1 100644 --- a/config/alfresco/web-client-config-dialogs.xml +++ b/config/alfresco/web-client-config-dialogs.xml @@ -165,6 +165,18 @@ + + + + + + diff --git a/config/alfresco/web-client-config-wcm-actions.xml b/config/alfresco/web-client-config-wcm-actions.xml index 905e9074d1..9ccb8a7f89 100644 --- a/config/alfresco/web-client-config-wcm-actions.xml +++ b/config/alfresco/web-client-config-wcm-actions.xml @@ -202,6 +202,20 @@ + + + + Write + + edit_website + /images/icons/edit_website.gif + wizard:editWebsite + #{BrowseBean.setupSpaceAction} + + #{actionContext.id} + + + @@ -284,6 +298,7 @@ + diff --git a/config/alfresco/web-client-config-wizards.xml b/config/alfresco/web-client-config-wizards.xml index ef59a73aa1..abff3b489f 100644 --- a/config/alfresco/web-client-config-wizards.xml +++ b/config/alfresco/web-client-config-wizards.xml @@ -5,7 +5,7 @@ - + @@ -47,6 +47,36 @@ + + + + + + + + + + + + + + + + formsList = null; + protected List formsList = null; /** list of form wrapper objects */ - private List forms = null; + protected List forms = null; /** Current form for dialog context */ - private FormWrapper actionForm = null; + protected FormWrapper actionForm = null; /** datamodel for table of selected workflows */ - private DataModel workflowsDataModel = null; + protected DataModel workflowsDataModel = null; /** transient list of workflow UIListItem objects */ - private List workflowsList = null; + protected List workflowsList = null; /** list of workflow wrapper objects */ - private List workflows = null; + protected List workflows = null; /** Current workflow for dialog context */ - private WorkflowWrapper actionWorkflow = null; + protected WorkflowWrapper actionWorkflow = null; // ------------------------------------------------------------------------------ @@ -146,6 +147,7 @@ public class CreateWebsiteWizard extends BaseWizardBean /** * @see org.alfresco.web.bean.dialog.BaseDialogBean#finishImpl(javax.faces.context.FacesContext, java.lang.String) */ + @Override protected String finishImpl(FacesContext context, String outcome) throws Exception { // create the website space in the correct parent folder @@ -209,7 +211,7 @@ public class CreateWebsiteWizard extends BaseWizardBean * * @param nodeRef NodeRef to the web project */ - private void saveWebProjectModel(NodeRef nodeRef) + protected void saveWebProjectModel(NodeRef nodeRef) { Map props = new HashMap(4, 1.0f); @@ -282,7 +284,7 @@ public class CreateWebsiteWizard extends BaseWizardBean for (WorkflowWrapper workflow : this.workflows) { props.clear(); - props.put(ContentModel.PROP_NAME, workflow.getName()); + props.put(WCMAppModel.PROP_WORKFLOW_NAME, workflow.getName()); NodeRef workflowRef = this.nodeService.createNode(nodeRef, WCMAppModel.ASSOC_WEBWORKFLOWDEFAULTS, WCMAppModel.ASSOC_WEBWORKFLOWDEFAULTS, @@ -355,6 +357,22 @@ public class CreateWebsiteWizard extends BaseWizardBean // ------------------------------------------------------------------------------ // Bean getters and setters + /** + * @return Returns the wizard Edit Mode. + */ + public boolean getEditMode() + { + return this.editMode; + } + + /** + * @param editMode The wizard Edit Mode to set. + */ + public void setEditMode(boolean editMode) + { + this.editMode = editMode; + } + /** * @return Returns the name. */ @@ -845,6 +863,18 @@ public class CreateWebsiteWizard extends BaseWizardBean } return this.templates; } + + /** + * @param template to add to the list of PresentationTemplate + */ + public void addTemplate(PresentationTemplate template) + { + if (this.templates == null) + { + this.templates = new ArrayList(4); + } + this.templates.add(template); + } /** * @param templates The presentation templates to set. diff --git a/source/java/org/alfresco/web/bean/wcm/EditWebsiteWizard.java b/source/java/org/alfresco/web/bean/wcm/EditWebsiteWizard.java new file mode 100644 index 0000000000..808ac81cb5 --- /dev/null +++ b/source/java/org/alfresco/web/bean/wcm/EditWebsiteWizard.java @@ -0,0 +1,249 @@ +/* + * 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.IOException; +import java.io.ObjectInputStream; +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +import javax.faces.context.FacesContext; + +import org.alfresco.error.AlfrescoRuntimeException; +import org.alfresco.model.ContentModel; +import org.alfresco.model.WCMAppModel; +import org.alfresco.service.cmr.repository.ChildAssociationRef; +import org.alfresco.service.cmr.repository.ContentReader; +import org.alfresco.service.cmr.repository.ContentService; +import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.workflow.WorkflowDefinition; +import org.alfresco.service.namespace.QName; +import org.alfresco.service.namespace.RegexQNamePattern; +import org.alfresco.web.app.AlfrescoNavigationHandler; +import org.alfresco.web.bean.repository.Repository; +import org.alfresco.web.forms.Form; +import org.alfresco.web.forms.FormsService; +import org.alfresco.web.forms.RenderingEngineTemplate; + +/** + * Backing bean for the Edit Web Project wizard. + * + * @author Kevin Roast + */ +public class EditWebsiteWizard extends CreateWebsiteWizard +{ + // ------------------------------------------------------------------------------ + // Wizard implementation + + /** + * Initialises the wizard + */ + public void init(Map parameters) + { + super.init(parameters); + + // the editMode flag is used to disabled some wizard fields + this.editMode = true; + + NodeRef websiteRef = this.browseBean.getActionSpace().getNodeRef(); + if (websiteRef == null) + { + throw new IllegalArgumentException("Edit Web Project wizard requires action node context."); + } + loadWebProjectModel(websiteRef); + } + + /** + * Restore the forms, templates and workflows from the model for this web project + * + * @param nodeRef NodeRef to the web project + */ + private void loadWebProjectModel(NodeRef nodeRef) + { + // simple properties + this.name = (String)this.nodeService.getProperty(nodeRef, ContentModel.PROP_NAME); + this.title = (String)this.nodeService.getProperty(nodeRef, ContentModel.PROP_TITLE); + this.description = (String)this.nodeService.getProperty(nodeRef, ContentModel.PROP_DESCRIPTION); + this.dnsName = (String)this.nodeService.getProperty(nodeRef, WCMAppModel.PROP_AVMSTORE); + this.webapp = (String)this.nodeService.getProperty(nodeRef, WCMAppModel.PROP_DEFAULTWEBAPP); + + // load the form templates + List webFormRefs = this.nodeService.getChildAssocs( + nodeRef, WCMAppModel.ASSOC_WEBFORM, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef ref : webFormRefs) + { + NodeRef formRef = ref.getChildRef(); + + String name = (String)this.nodeService.getProperty(formRef, WCMAppModel.PROP_FORMNAME); + Form formImpl = FormsService.getInstance().getForm(name); + if (formImpl != null) + { + FormWrapper form = new FormWrapper(formImpl); + form.setTitle((String)this.nodeService.getProperty(formRef, ContentModel.PROP_TITLE)); + form.setDescription((String)this.nodeService.getProperty(formRef, ContentModel.PROP_DESCRIPTION)); + form.setFilenamePattern((String)this.nodeService.getProperty(formRef, WCMAppModel.PROP_FILENAMEPATTERN)); + + // the single workflow attached to the form + List workflowRefs = this.nodeService.getChildAssocs( + formRef, WCMAppModel.ASSOC_WORKFLOWDEFAULTS, RegexQNamePattern.MATCH_ALL); + if (workflowRefs.size() == 1) + { + NodeRef wfRef = workflowRefs.get(0).getChildRef(); + String wfName = (String)this.nodeService.getProperty(wfRef, WCMAppModel.PROP_WORKFLOW_NAME); + WorkflowDefinition wfDef = this.workflowService.getDefinitionByName("jbpm$" + wfName); + if (wfDef != null) + { + WorkflowWrapper wfWrapper = new WorkflowWrapper(wfName, wfDef.getTitle()); + wfWrapper.setParams((Map)deserializeWorkflowParams(wfRef)); + if (wfDef.startTaskDefinition != null) + { + wfWrapper.setType(wfDef.startTaskDefinition.metadata.getName()); + } + form.setWorkflow(wfWrapper); + } + } + + // the templates attached to the form + List engineTemplates = formImpl.getRenderingEngineTemplates(); + List templateRefs = this.nodeService.getChildAssocs( + formRef, WCMAppModel.ASSOC_WEBFORMTEMPLATE, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef tChildRef : templateRefs) + { + NodeRef templateRef = tChildRef.getChildRef(); + NodeRef engineRef = (NodeRef)this.nodeService.getProperty(templateRef, WCMAppModel.PROP_ENGINE); + for (RenderingEngineTemplate ret : engineTemplates) + { + if (engineRef.equals(ret.getNodeRef())) + { + String filenamePattern = (String)this.nodeService.getProperty(templateRef, + WCMAppModel.PROP_FILENAMEPATTERN); + PresentationTemplate template = new PresentationTemplate(ret, filenamePattern); + form.addTemplate(template); + break; + } + } + } + + this.forms.add(form); + } + } + + // load the workflows associated with the website + List workflowRefs = this.nodeService.getChildAssocs( + nodeRef, WCMAppModel.ASSOC_WEBWORKFLOWDEFAULTS, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef wChildRef : workflowRefs) + { + NodeRef wfRef = wChildRef.getChildRef(); + String wfName = (String)this.nodeService.getProperty(wfRef, WCMAppModel.PROP_WORKFLOW_NAME); + WorkflowDefinition wfDef = this.workflowService.getDefinitionByName("jbpm$" + wfName); + if (wfDef != null) + { + WorkflowWrapper wfWrapper = new WorkflowWrapper(wfName, wfDef.getTitle()); + wfWrapper.setParams((Map)deserializeWorkflowParams(wfRef)); + wfWrapper.setFilenamePattern((String)this.nodeService.getProperty( + wfRef, WCMAppModel.PROP_FILENAMEPATTERN)); + if (wfDef.startTaskDefinition != null) + { + wfWrapper.setType(wfDef.startTaskDefinition.metadata.getName()); + } + this.workflows.add(wfWrapper); + } + } + } + + /** + * @see org.alfresco.web.bean.dialog.BaseDialogBean#finishImpl(javax.faces.context.FacesContext, java.lang.String) + */ + @Override + protected String finishImpl(FacesContext context, String outcome) throws Exception + { + NodeRef nodeRef = this.browseBean.getActionSpace().getNodeRef(); + + // apply the name, title and description props + this.nodeService.setProperty(nodeRef, ContentModel.PROP_NAME, this.name); + this.nodeService.setProperty(nodeRef, ContentModel.PROP_TITLE, this.title); + this.nodeService.setProperty(nodeRef, ContentModel.PROP_DESCRIPTION, this.description); + + // 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 + clearWebProjectModel(nodeRef); + + // TODO: add the ability to change/rename the root webapp and DNS name for the website + + // persist the forms, templates, workflows and workflow defaults to the model for this web project + saveWebProjectModel(nodeRef); + + return AlfrescoNavigationHandler.CLOSE_WIZARD_OUTCOME; + } + + /** + * Cascade delete the existing Form and Workflow defs attached to the specified Web Project node + * + * @param nodeRef Web project node + */ + private void clearWebProjectModel(NodeRef nodeRef) + { + List webFormRefs = nodeService.getChildAssocs( + nodeRef, WCMAppModel.ASSOC_WEBFORM, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef ref : webFormRefs) + { + // cascade delete will take case of child-child relationships + this.nodeService.removeChild(nodeRef, ref.getChildRef()); + } + + List wfRefs = nodeService.getChildAssocs( + nodeRef, WCMAppModel.ASSOC_WEBWORKFLOWDEFAULTS, RegexQNamePattern.MATCH_ALL); + for (ChildAssociationRef ref : wfRefs) + { + this.nodeService.removeChild(nodeRef, ref.getChildRef()); + } + } + + /** + * Deserialize the workflow params from a content stream + * + * @param workflowRef The noderef to write the property too + * + * @return Serializable workflow params + */ + private Serializable deserializeWorkflowParams(NodeRef workflowRef) + { + try + { + // restore the serialized Map from a binary content stream - like database blob! + Serializable params = null; + ContentService cs = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getContentService(); + ContentReader reader = cs.getReader(workflowRef, WCMAppModel.PROP_WORKFLOWDEFAULTS); + if (reader != null) + { + ObjectInputStream ois = new ObjectInputStream(reader.getContentInputStream()); + params = (Serializable)ois.readObject(); + ois.close(); + } + return params; + } + catch (IOException ioErr) + { + throw new AlfrescoRuntimeException("Unable to deserialize workflow default parameters: " + ioErr.getMessage()); + } + catch (ClassNotFoundException classErr) + { + throw new AlfrescoRuntimeException("Unable to deserialize workflow default parameters: " + classErr.getMessage()); + } + } +} diff --git a/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java b/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java index 840a96ee08..df89cc604c 100644 --- a/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java +++ b/source/java/org/alfresco/web/ui/wcm/component/UISandboxSnapshots.java @@ -234,12 +234,13 @@ public class UISandboxSnapshots extends SelfRenderingComponent requestMap.put(REQUEST_SNAPVERSION, Integer.toString(item.getVersionID())); Utils.encodeRecursive(context, action); requestMap.remove(REQUEST_SNAPVERSION); - out.write(" "); + //out.write(" "); - Utils.encodeRecursive(context, aquireAction( + // TODO: restore once preview of a store by version is implemented in vserver + /*Utils.encodeRecursive(context, aquireAction( context, sandbox, ACT_SNAPSHOT_PREVIEW, null, null, null)); - out.write(" "); + out.write(" ");*/ out.write(""); } diff --git a/source/web/WEB-INF/faces-config-beans.xml b/source/web/WEB-INF/faces-config-beans.xml index e26e48bdfe..a42d32fa47 100644 --- a/source/web/WEB-INF/faces-config-beans.xml +++ b/source/web/WEB-INF/faces-config-beans.xml @@ -2162,6 +2162,43 @@ + + + The bean that backs up the Edit Website Wizard + + EditWebsiteWizard + org.alfresco.web.bean.wcm.EditWebsiteWizard + session + + browseBean + #{BrowseBean} + + + nodeService + #{NodeService} + + + fileFolderService + #{FileFolderService} + + + navigator + #{NavigationBean} + + + searchService + #{SearchService} + + + avmService + #{AVMService} + + + workflowService + #{WorkflowService} + + + The bean that backs up the Import Website Dialog @@ -2634,6 +2671,61 @@ + + + The bean that backs up the Edit Form Template Details dialog + + EditFormDetailsDialog + org.alfresco.web.bean.wcm.FormDetailsDialog + session + + avmService + #{AVMService} + + + createWebsiteWizard + #{EditWebsiteWizard} + + + workflowService + #{WorkflowService} + + + + + + The bean that backs up the Edit Form Template Templates dialog + + EditFormTemplatesDialog + org.alfresco.web.bean.wcm.FormTemplatesDialog + session + + avmService + #{AVMService} + + + createWebsiteWizard + #{EditWebsiteWizard} + + + + + + The bean that backs up the Edit Form Template Workflow dialog + + EditFormWorkflowDialog + org.alfresco.web.bean.wcm.FormWorkflowDialog + session + + createWebsiteWizard + #{EditWebsiteWizard} + + + workflowService + #{WorkflowService} + + + diff --git a/source/web/images/icons/edit_website.gif b/source/web/images/icons/edit_website.gif new file mode 100644 index 0000000000..ebc366641f Binary files /dev/null and b/source/web/images/icons/edit_website.gif differ diff --git a/source/web/images/icons/edit_website_large.gif b/source/web/images/icons/edit_website_large.gif new file mode 100644 index 0000000000..ee8cbcae6e Binary files /dev/null and b/source/web/images/icons/edit_website_large.gif differ diff --git a/source/web/jsp/wcm/create-website-wizard/details.jsp b/source/web/jsp/wcm/create-website-wizard/details.jsp index 18d85e7629..6359313c66 100644 --- a/source/web/jsp/wcm/create-website-wizard/details.jsp +++ b/source/web/jsp/wcm/create-website-wizard/details.jsp @@ -34,7 +34,6 @@ document.getElementById("wizard:wizard-body:name").focus(); document.getElementById("wizard").onsubmit = validate; document.getElementById("wizard:next-button").onclick = function() {finishButtonPressed = true; clear_wizard();} - document.getElementById("wizard:finish-button").onclick = function() {finishButtonPressed = true; clear_wizard();} checkButtonState(); } @@ -44,12 +43,10 @@ document.getElementById("wizard:wizard-body:dnsname").value.length < 2) { document.getElementById("wizard:next-button").disabled = true; - document.getElementById("wizard:finish-button").disabled = true; } else { document.getElementById("wizard:next-button").disabled = false; - document.getElementById("wizard:finish-button").disabled = false; } } @@ -116,7 +113,7 @@ + onkeyup="javascript:checkButtonState();" disabled="#{WizardManager.bean.editMode}" /> @@ -129,7 +126,8 @@ - + diff --git a/source/web/jsp/wcm/create-website-wizard/forms.jsp b/source/web/jsp/wcm/create-website-wizard/forms.jsp index 36a6d9fbaa..dcc7da8b2a 100644 --- a/source/web/jsp/wcm/create-website-wizard/forms.jsp +++ b/source/web/jsp/wcm/create-website-wizard/forms.jsp @@ -58,9 +58,16 @@ - - - + + + + + + + + + + - + +