1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.ui.contentapp.column.jcr;
35
36 import info.magnolia.icons.MagnoliaIcons;
37 import info.magnolia.jcr.util.NodeTypes;
38 import info.magnolia.jcr.util.NodeUtil;
39 import info.magnolia.jcr.util.PropertyUtil;
40 import info.magnolia.objectfactory.Components;
41 import info.magnolia.ui.contentapp.configuration.column.ColumnType;
42 import info.magnolia.ui.contentapp.configuration.column.icon.IconColumnDefinition;
43 import info.magnolia.ui.datasource.DatasourceDefinition;
44 import info.magnolia.ui.datasource.jcr.JcrDatasourceDefinition;
45 import info.magnolia.ui.field.ConfiguredFieldDefinition;
46 import info.magnolia.ui.field.TextFieldDefinition;
47
48 import java.util.HashMap;
49 import java.util.Map;
50 import java.util.Optional;
51
52 import javax.inject.Inject;
53 import javax.jcr.Item;
54 import javax.jcr.Node;
55
56 import com.machinezoo.noexception.Exceptions;
57 import com.vaadin.ui.renderers.HtmlRenderer;
58
59 import lombok.Getter;
60 import lombok.Setter;
61
62
63
64
65
66
67 @ColumnType("jcrTitleColumn")
68 public class JcrTitleColumnDefinition extends IconColumnDefinition {
69
70 private static final String JCR_NAME = "jcrName";
71
72 @Setter
73 @Getter
74 private Map<String, String> nodeTypeToIcon = new HashMap<>();
75
76 @Getter
77 @Setter
78 private String propertyIcon = "icon-node-data";
79
80 public JcrTitleColumnDefinition() {
81 setName(JCR_NAME);
82 setRenderer(HtmlRenderer.class);
83 setValueProvider(JcrTitleValueProvider.class);
84
85 ConfiguredFieldDefinition<?> filterComponent = new TextFieldDefinition();
86 filterComponent.setName("filterComponent");
87 setFilterComponent(filterComponent);
88 }
89
90
91
92
93 public static class JcrTitleValueProvider extends IconColumnDefinition.IconValueProvider<Item, JcrTitleColumnDefinition> {
94
95 private final JcrDatasourceDefinition jcrDatasourceDefinition;
96
97
98
99
100 public JcrTitleValueProvider(JcrTitleColumnDefinition definition) {
101 this(definition, (JcrDatasourceDefinition) Components.getComponent(DatasourceDefinition.class));
102 }
103
104 @Inject
105 JcrTitleValueProvider(JcrTitleColumnDefinition definition, JcrDatasourceDefinition jcrDatasourceDefinition) {
106 super(definition);
107 this.jcrDatasourceDefinition = jcrDatasourceDefinition;
108 }
109
110 @Override
111 public String apply(Item item) {
112 return super.apply(item) + Optional.ofNullable(jcrDatasourceDefinition.getNodeNameProperty())
113 .filter(any -> item.isNode())
114 .map(Exceptions.wrap().function(propertyName -> PropertyUtil.getString((Node) item, propertyName)))
115 .orElse(Exceptions.wrap().get(item::getName));
116 }
117
118 @Override
119 protected String getIcon(Item item) {
120 return Optional.of(item)
121 .filter(Item::isNode)
122 .map(Node.class::cast)
123 .map(Exceptions.wrap().function(node ->
124 NodeUtil.hasMixin(node, NodeTypes.Deleted.NAME) ?
125 MagnoliaIcons.TRASH.getCssClass() :
126 getDefinition().getNodeTypeToIcon().getOrDefault(node.getPrimaryNodeType().getName(), super.getIcon(item))))
127 .orElse(getPropertyIcon(item));
128 }
129
130 private String getPropertyIcon(Item item) {
131 if (!item.isNode()) {
132 return getDefinition().getPropertyIcon();
133 }
134
135 return super.getIcon(item);
136 }
137 }
138 }