Merged V1.3 to HEAD (3027:3044)

svn merge svn://www.alfresco.org:3691/alfresco/BRANCHES/V1.3@3027 svn://www.alfresco.org:3691/alfresco/BRANCHES/V1.3@3044 .


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@3339 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Derek Hulley
2006-07-18 15:17:28 +00:00
parent c235f3463f
commit b56cc82043
13 changed files with 169 additions and 62 deletions

View File

@@ -16,6 +16,35 @@
<param name="id">#{actionContext.id}</param> <param name="id">#{actionContext.id}</param>
</params> </params>
</action> </action>
<!-- Override the cut action to check for discussions, don't allow them to be cut -->
<!-- Cut a document or space to the clipboard, from browse or doc details screens -->
<action id="cut_node">
<evaluator>org.alfresco.web.action.evaluator.DiscussionCutCopyEvaluator</evaluator>
<permissions>
<permission allow="true">Delete</permission>
</permissions>
<label-id>cut</label-id>
<image>/images/icons/cut.gif</image>
<action-listener>#{ClipboardBean.cutNode}</action-listener>
<params>
<param name="id">#{actionContext.id}</param>
<!--<param name="parent">#{NavigationBean.currentNodeId}</param>-->
</params>
</action>
<!-- Override the copy action to check for discussions, don't allow them to be copied -->
<!-- Copy a document or space to the clipboard, from browse or doc details screens -->
<action id="copy_node">
<evaluator>org.alfresco.web.action.evaluator.DiscussionCutCopyEvaluator</evaluator>
<label-id>copy</label-id>
<image>/images/icons/copy.gif</image>
<action-listener>#{ClipboardBean.copyNode}</action-listener>
<params>
<param name="id">#{actionContext.id}</param>
<!--<param name="parent">#{NavigationBean.currentNodeId}</param>-->
</params>
</action>
<!-- Discuss document or space e.g. jump to Forums view for this node --> <!-- Discuss document or space e.g. jump to Forums view for this node -->
<action id="discuss_node"> <action id="discuss_node">

View File

@@ -35,32 +35,6 @@
ignore-if-missing="false" /> ignore-if-missing="false" />
</property-sheet> </property-sheet>
</config> </config>
<config evaluator="node-type" condition="fm:forums">
<property-sheet>
<show-property name="name"/>
<show-property name="description"/>
<show-property name="app:icon" show-in-view-mode="false" display-label-id="icon"
component-generator="SpaceIconPickerGenerator" />
</property-sheet>
</config>
<config evaluator="node-type" condition="fm:forum">
<property-sheet>
<show-property name="name"/>
<show-property name="description"/>
<show-property name="app:icon" show-in-view-mode="false" display-label-id="icon"
component-generator="SpaceIconPickerGenerator" />
</property-sheet>
</config>
<config evaluator="node-type" condition="fm:topic">
<property-sheet>
<show-property name="name" display-label-id="subject" />
<show-property name="app:icon" show-in-view-mode="false" display-label-id="icon"
component-generator="SpaceIconPickerGenerator" />
</property-sheet>
</config>
<config evaluator="node-type" condition="dictionaryModel"> <config evaluator="node-type" condition="dictionaryModel">
<property-sheet> <property-sheet>
@@ -97,7 +71,7 @@
<property-sheet> <property-sheet>
<!-- The 'name' property isn't part of the titled aspect --> <!-- The 'name' property isn't part of the titled aspect -->
<!-- but it's presence here will force it to the top of the --> <!-- but it's presence here will force it to the top of the -->
<!-- list when custom types are defined in --> <!-- list when custom content types are defined in -->
<!-- web-client-config-custom.xml --> <!-- web-client-config-custom.xml -->
<show-property name="name" /> <show-property name="name" />
<show-property name="title" /> <show-property name="title" />
@@ -105,6 +79,20 @@
</property-sheet> </property-sheet>
</config> </config>
<config evaluator="aspect-name" condition="app:uifacets">
<property-sheet>
<!-- The 'name' property isn't part of the uifacets aspect -->
<!-- but it's presence here will force it to the top of the -->
<!-- list when custom folder types are defined in -->
<!-- web-client-config-custom.xml -->
<show-property name="name" />
<show-property name="title" />
<show-property name="description" />
<show-property name="app:icon" show-in-view-mode="false" display-label-id="icon"
component-generator="SpaceIconPickerGenerator" />
</property-sheet>
</config>
<config evaluator="aspect-name" condition="author"> <config evaluator="aspect-name" condition="author">
<property-sheet> <property-sheet>
<show-property name="author" /> <show-property name="author" />
@@ -184,4 +172,39 @@
</property-sheet> </property-sheet>
</config> </config>
<!-- Configuration for discussion types -->
<config evaluator="node-type" condition="fm:forums">
<property-sheet>
<show-property name="name"/>
<show-property name="description"/>
<show-property name="app:icon" show-in-view-mode="false" display-label-id="icon"
component-generator="SpaceIconPickerGenerator" />
<!-- hide the title property -->
<show-property name="title" show-in-view-mode="false" show-in-edit-mode="false" />
</property-sheet>
</config>
<config evaluator="node-type" condition="fm:forum">
<property-sheet>
<show-property name="name"/>
<show-property name="description"/>
<show-property name="app:icon" show-in-view-mode="false" display-label-id="icon"
component-generator="SpaceIconPickerGenerator" />
<!-- hide the title property -->
<show-property name="title" show-in-view-mode="false" show-in-edit-mode="false" />
</property-sheet>
</config>
<config evaluator="node-type" condition="fm:topic">
<property-sheet>
<show-property name="name" display-label-id="subject" />
<show-property name="app:icon" show-in-view-mode="false" display-label-id="icon"
component-generator="SpaceIconPickerGenerator" />
<!-- hide the description and title properties -->
<show-property name="description" show-in-view-mode="false" show-in-edit-mode="false" />
<show-property name="title" show-in-view-mode="false" show-in-edit-mode="false" />
</property-sheet>
</config>
</alfresco-config> </alfresco-config>

View File

@@ -17,7 +17,6 @@
package org.alfresco.web.action.evaluator; package org.alfresco.web.action.evaluator;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.web.action.ActionEvaluator; import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node; import org.alfresco.web.bean.repository.Node;

View File

@@ -16,7 +16,6 @@
*/ */
package org.alfresco.web.action.evaluator; package org.alfresco.web.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.model.ForumModel; import org.alfresco.model.ForumModel;
import org.alfresco.web.action.ActionEvaluator; import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node; import org.alfresco.web.bean.repository.Node;

View File

@@ -16,7 +16,6 @@
*/ */
package org.alfresco.web.action.evaluator; package org.alfresco.web.action.evaluator;
import org.alfresco.model.ContentModel;
import org.alfresco.model.ForumModel; import org.alfresco.model.ForumModel;
import org.alfresco.web.action.ActionEvaluator; import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node; import org.alfresco.web.bean.repository.Node;

View File

@@ -0,0 +1,45 @@
package org.alfresco.web.action.evaluator;
import javax.faces.context.FacesContext;
import org.alfresco.model.ForumModel;
import org.alfresco.service.cmr.repository.ChildAssociationRef;
import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.namespace.QName;
import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository;
/**
* Evaluates whether the cut or copy action should be visible.
*
* If the node is a discussion don't allow the action.
*
* @author gavinc
*/
public class DiscussionCutCopyEvaluator implements ActionEvaluator
{
/**
* @see org.alfresco.web.action.ActionEvaluator#evaluate(org.alfresco.web.bean.repository.Node)
*/
public boolean evaluate(Node node)
{
boolean result = true;
// if the node in question is a forum...
if (node.getType().equals(ForumModel.TYPE_FORUM))
{
// get the association type
FacesContext context = FacesContext.getCurrentInstance();
NodeService nodeService = Repository.getServiceRegistry(context).getNodeService();
ChildAssociationRef parentAssoc = nodeService.getPrimaryParent(node.getNodeRef());
QName assocType = parentAssoc.getTypeQName();
// only allow the action if the association type is not the discussion assoc
result = (assocType.equals(ForumModel.ASSOC_DISCUSSION) == false);
}
return result;
}
}

View File

@@ -17,7 +17,6 @@
package org.alfresco.web.action.evaluator; package org.alfresco.web.action.evaluator;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.web.action.ActionEvaluator; import org.alfresco.web.action.ActionEvaluator;
import org.alfresco.web.bean.repository.Node; import org.alfresco.web.bean.repository.Node;

View File

@@ -261,13 +261,13 @@ public class TemplateContentServlet extends BaseServlet
private Object getModel(ServiceRegistry services, HttpServletRequest req, NodeRef templateRef, NodeRef nodeRef) private Object getModel(ServiceRegistry services, HttpServletRequest req, NodeRef templateRef, NodeRef nodeRef)
{ {
// build FreeMarker default model and merge // build FreeMarker default model and merge
Map root = DefaultModelHelper.buildDefaultModel(services, Application.getCurrentUser(req.getSession())); Map root = DefaultModelHelper.buildDefaultModel(
services, Application.getCurrentUser(req.getSession()), templateRef);
// put the current NodeRef in as "space" and "document" // put the current NodeRef in as "space" and "document"
TemplateNode node = new TemplateNode(nodeRef, services, this.imageResolver); TemplateNode node = new TemplateNode(nodeRef, services, this.imageResolver);
root.put("space", node); root.put("space", node);
root.put("document", node); root.put("document", node);
root.put("template", new TemplateNode(templateRef, services, this.imageResolver));
// add URL arguments as a map called 'args' to the root of the model // add URL arguments as a map called 'args' to the root of the model
Map<String, String> args = new HashMap<String, String>(8, 1.0f); Map<String, String> args = new HashMap<String, String>(8, 1.0f);

View File

@@ -40,6 +40,7 @@ import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.NodeService; import org.alfresco.service.cmr.repository.NodeService;
import org.alfresco.service.cmr.security.AuthorityService; import org.alfresco.service.cmr.security.AuthorityService;
import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.AuthorityType;
import org.alfresco.service.cmr.security.PermissionService;
import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.security.PersonService;
import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.NamespaceService;
import org.alfresco.web.app.Application; import org.alfresco.web.app.Application;
@@ -568,16 +569,21 @@ public class GroupsBean implements IContextListener
services.getNamespaceService(), services.getNamespaceService(),
false); false);
items = new SelectItem[nodes.size()]; ArrayList<SelectItem> itemList = new ArrayList<SelectItem>(nodes.size());
for (int index=0; index<nodes.size(); index++) for (NodeRef personRef : nodes)
{ {
NodeRef personRef = nodes.get(index);
String firstName = (String)this.nodeService.getProperty(personRef, ContentModel.PROP_FIRSTNAME);
String lastName = (String)this.nodeService.getProperty(personRef, ContentModel.PROP_LASTNAME);
String username = (String)this.nodeService.getProperty(personRef, ContentModel.PROP_USERNAME); String username = (String)this.nodeService.getProperty(personRef, ContentModel.PROP_USERNAME);
SelectItem item = new SortableSelectItem(username, firstName + " " + lastName, lastName); if (PermissionService.GUEST_AUTHORITY.equals(username) == false)
items[index] = item; {
String firstName = (String)this.nodeService.getProperty(personRef, ContentModel.PROP_FIRSTNAME);
String lastName = (String)this.nodeService.getProperty(personRef, ContentModel.PROP_LASTNAME);
SelectItem item = new SortableSelectItem(username, firstName + " " + lastName, lastName);
itemList.add(item);
}
} }
items = new SelectItem[itemList.size()];
itemList.toArray(items);
// commit the transaction // commit the transaction
tx.commit(); tx.commit();

View File

@@ -297,7 +297,7 @@ public abstract class InviteUsersWizard extends AbstractWizardBean
NodeRef templateRef = new NodeRef(Repository.getStoreRef(), this.usingTemplate); NodeRef templateRef = new NodeRef(Repository.getStoreRef(), this.usingTemplate);
ServiceRegistry services = Repository.getServiceRegistry(fc); ServiceRegistry services = Repository.getServiceRegistry(fc);
Map<String, Object> model = DefaultModelHelper.buildDefaultModel( Map<String, Object> model = DefaultModelHelper.buildDefaultModel(
services, Application.getCurrentUser(fc)); services, Application.getCurrentUser(fc), templateRef);
model.put("role", roleText); model.put("role", roleText);
model.put("space", new TemplateNode(node, Repository.getServiceRegistry(fc), null)); model.put("space", new TemplateNode(node, Repository.getServiceRegistry(fc), null));

View File

@@ -16,10 +16,9 @@
*/ */
package org.alfresco.web.config; package org.alfresco.web.config;
import javax.faces.context.FacesContext; import java.util.Set;
import org.alfresco.config.evaluator.Evaluator; import org.alfresco.config.evaluator.Evaluator;
import org.alfresco.service.cmr.dictionary.DictionaryService;
import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.QName;
import org.alfresco.web.bean.repository.Node; import org.alfresco.web.bean.repository.Node;
import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.bean.repository.Repository;
@@ -38,19 +37,18 @@ public final class AspectEvaluator implements Evaluator
*/ */
public boolean applies(Object obj, String condition) public boolean applies(Object obj, String condition)
{ {
boolean result = false;
if (obj instanceof Node) if (obj instanceof Node)
{ {
DictionaryService dd = Repository.getServiceRegistry(FacesContext.getCurrentInstance()).getDictionaryService(); Set aspects = ((Node)obj).getAspects();
QName aspectQName = Repository.resolveToQName(condition); if (aspects != null)
for (QName aspect : ((Node)obj).getAspects())
{ {
if (dd.isSubClass(aspect, aspectQName) == true) QName spaceQName = Repository.resolveToQName(condition);
{ result = aspects.contains(spaceQName);
return true;
}
} }
} }
return false; return result;
} }
} }

View File

@@ -58,7 +58,7 @@ public class DefaultModelHelper
* *
* @return Map containing the default model. * @return Map containing the default model.
*/ */
public static Map<String, Object> buildDefaultModel(ServiceRegistry services, User user) public static Map<String, Object> buildDefaultModel(ServiceRegistry services, User user, NodeRef template)
{ {
if (services == null) if (services == null)
{ {
@@ -85,6 +85,12 @@ public class DefaultModelHelper
// supply the current user Node as "person" // supply the current user Node as "person"
root.put("person", new TemplateNode(user.getPerson(), services, imageResolver)); root.put("person", new TemplateNode(user.getPerson(), services, imageResolver));
// add the template itself as "template" if it comes from content on a node
if (template != null)
{
root.put("template", new TemplateNode(template, services, imageResolver));
}
// current date/time is useful to have and isn't supplied by FreeMarker by default // current date/time is useful to have and isn't supplied by FreeMarker by default
root.put("date", new Date()); root.put("date", new Date());

View File

@@ -17,21 +17,16 @@
package org.alfresco.web.ui.repo.component.template; package org.alfresco.web.ui.repo.component.template;
import java.io.IOException; import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import javax.faces.el.ValueBinding; import javax.faces.el.ValueBinding;
import org.alfresco.repo.template.DateCompareMethod;
import org.alfresco.repo.template.HasAspectMethod;
import org.alfresco.repo.template.I18NMessageMethod;
import org.alfresco.service.ServiceRegistry; import org.alfresco.service.ServiceRegistry;
import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.service.cmr.repository.StoreRef;
import org.alfresco.service.cmr.repository.TemplateException; import org.alfresco.service.cmr.repository.TemplateException;
import org.alfresco.service.cmr.repository.TemplateImageResolver; import org.alfresco.service.cmr.repository.TemplateImageResolver;
import org.alfresco.service.cmr.repository.TemplateNode;
import org.alfresco.service.cmr.repository.TemplateService; import org.alfresco.service.cmr.repository.TemplateService;
import org.alfresco.web.app.Application; import org.alfresco.web.app.Application;
import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.bean.repository.Repository;
@@ -108,9 +103,6 @@ public class UITemplate extends SelfRenderingComponent
return; return;
} }
// get the data model to use - building default if required
Object model = getModel();
// get the template to process // get the template to process
String template = getTemplate(); String template = getTemplate();
if (template != null && template.length() != 0) if (template != null && template.length() != 0)
@@ -125,6 +117,9 @@ public class UITemplate extends SelfRenderingComponent
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
} }
// get the data model to use - building default if required
Object model = getModel();
// process the template against the model // process the template against the model
try try
{ {
@@ -195,7 +190,16 @@ public class UITemplate extends SelfRenderingComponent
FacesContext fc = FacesContext.getCurrentInstance(); FacesContext fc = FacesContext.getCurrentInstance();
ServiceRegistry services = Repository.getServiceRegistry(fc); ServiceRegistry services = Repository.getServiceRegistry(fc);
User user = Application.getCurrentUser(fc); User user = Application.getCurrentUser(fc);
Map root = DefaultModelHelper.buildDefaultModel(services, user);
// add the template itself to the model
NodeRef templateRef = null;
if (getTemplate().indexOf(StoreRef.URI_FILLER) != -1)
{
// found a noderef template
templateRef = new NodeRef(getTemplate());
}
Map root = DefaultModelHelper.buildDefaultModel(services, user, templateRef);
// merge models // merge models
if (model instanceof Map) if (model instanceof Map)