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.sample.app.main;
35
36 import static java.util.stream.Collectors.toList;
37
38 import info.magnolia.context.MgnlContext;
39 import info.magnolia.i18nsystem.SimpleTranslator;
40 import info.magnolia.jcr.util.NodeUtil;
41 import info.magnolia.sample.app.main.chooser.BirdAttributeChooser;
42 import info.magnolia.ui.api.app.registry.AppDescriptorRegistry;
43 import info.magnolia.ui.api.context.UiContext;
44 import info.magnolia.ui.contentapp.configuration.column.ConfiguredColumnDefinition;
45 import info.magnolia.ui.datasource.jcr.JcrDatasourceDefinition;
46 import info.magnolia.ui.chooser.definition.AppAwareWorkbenchChooserDefinition;
47 import info.magnolia.ui.chooser.definition.ChooserDefinition;
48 import info.magnolia.ui.chooser.definition.SingleItemWorkbenchChooserDefinition;
49 import info.magnolia.ui.framework.overlay.ChooserController;
50 import info.magnolia.ui.vaadin.overlay.MessageStyleTypeEnum;
51
52 import java.util.Collections;
53
54 import javax.inject.Inject;
55 import javax.jcr.Node;
56 import javax.jcr.RepositoryException;
57
58 import com.vaadin.data.ValueProvider;
59 import com.vaadin.ui.Button;
60 import com.vaadin.ui.Component;
61 import com.vaadin.v7.ui.Label;
62 import com.vaadin.v7.ui.VerticalLayout;
63
64
65
66
67 public class NavigationViewImpl implements NavigationView {
68
69 private Listener listener;
70
71 private VerticalLayout layout;
72
73 private final SimpleTranslator i18n;
74
75 private final UiContext context;
76 private final ChooserController chooserController;
77 private final AppDescriptorRegistry appDescriptorRegistry;
78
79 @Inject
80 public NavigationViewImpl(SimpleTranslator i18n, UiContext context, ChooserController chooserController, AppDescriptorRegistry appDescriptorRegistry) {
81 this.i18n = i18n;
82 this.context = context;
83 this.chooserController = chooserController;
84 this.appDescriptorRegistry = appDescriptorRegistry;
85 }
86
87 @Override
88 public void setListener(Listener listener) {
89 this.listener = listener;
90 }
91
92 @Override
93 public Component asVaadinComponent() {
94 if (layout == null) {
95 layout = new VerticalLayout();
96 layout.setMargin(true);
97 layout.setSpacing(true);
98 layout.addComponent(new Label(i18n.translate("sample.app.navigation.label")));
99
100 layout.addComponent(createButton("Alpha"));
101 layout.addComponent(createButton("Bravo"));
102 layout.addComponent(createButton("Charlie"));
103 layout.addComponent(createButton("Delta"));
104 layout.addComponent(createButton("Echo"));
105
106 layout.addComponent(new Button("Choose bird", e -> {
107 ChooserDefinition<String, BirdAttributeChooser> chooserDefinition = new ChooserDefinition<>();
108 chooserDefinition.setImplementationClass(BirdAttributeChooser.class);
109
110 chooserController.openChooser(chooserDefinition).whenCompleteAsync((result, err) -> {
111 if (err != null) {
112 throw new RuntimeException(err);
113 }
114
115 context.openNotification(MessageStyleTypeEnum.INFO, true, "Your bird: " + result.getChoice().orElse("(nada)"));
116 });
117 }));
118
119 layout.addComponent(new Button("Definition-based workbench chooser", e -> {
120 AppAwareWorkbenchChooserDefinition<Node> chooserDefinition = new AppAwareWorkbenchChooserDefinition<>();
121 chooserDefinition.setTitle("Choose a thing™ ❤");
122 chooserDefinition.setAppName("content-app");
123
124 ConfiguredColumnDefinition<Node> columnDefinition = new ConfiguredColumnDefinition<>();
125 columnDefinition.setName("name");
126 columnDefinition.setLabel("Name");
127 columnDefinition.setValueProvider(NameValueProvider.class);
128 chooserDefinition.setColumns(Collections.singletonList(columnDefinition));
129
130 chooserController.openChooser(chooserDefinition, Collections.emptySet())
131 .whenComplete((result, err) -> {
132 if (err != null) {
133 throw new RuntimeException(err);
134 }
135
136 context.openNotification(MessageStyleTypeEnum.INFO, true,
137 "Your selection: " + (result.isChosen() ?
138 result.getChoice()
139 .map(x -> String.join(", ", x.stream().map(NodeUtil::getPathIfPossible).collect(toList())))
140 .orElse("(nothing)") :
141 "(cancelled)"));
142 });
143 }));
144
145 layout.addComponent(new Button("Definition-based single-item workbench chooser", e -> {
146 JcrDatasourceDefinition datasourceDef = new JcrDatasourceDefinition();
147 datasourceDef.setWorkspace("config");
148 datasourceDef.getAllowedNodeTypes().add("nt:base");
149
150 final ConfiguredColumnDefinition<Node> nameColDef = new ConfiguredColumnDefinition<>();
151 nameColDef.setLabel("Name");
152 nameColDef.setName("name");
153 nameColDef.setValueProvider(NameValueProvider.class);
154
155 final AppAwareWorkbenchChooserDefinition<Node> workbenchChooserDefinition = new AppAwareWorkbenchChooserDefinition<>();
156 workbenchChooserDefinition.setTitle("Choose only one thing");
157 workbenchChooserDefinition.setDatasource(datasourceDef);
158 workbenchChooserDefinition.setColumns(Collections.singletonList(nameColDef));
159
160 SingleItemWorkbenchChooserDefinition<Node> chooserDefinition = new SingleItemWorkbenchChooserDefinition<>();
161 chooserDefinition.setWorkbenchChooser(workbenchChooserDefinition);
162
163 try {
164 chooserController.openChooser(chooserDefinition, MgnlContext.getJCRSession("config").getNode("/modules/core"))
165 .whenComplete((result, err) -> {
166 if (err != null) {
167 throw new RuntimeException(err);
168 }
169
170 context.openNotification(MessageStyleTypeEnum.INFO, true,
171 "Your selection: " + (result.isChosen() && result.getChoice().isPresent() ?
172 NodeUtil.getPathIfPossible(result.getChoice().get()) :
173 "(none)"));
174 });
175 } catch (RepositoryException repex) {
176 throw new RuntimeException(repex);
177 }
178 }));
179 }
180 return layout;
181 }
182
183 private Button createButton(final String name) {
184 return new Button(i18n.translate("sample.app.navigation.button.select") + " " + name, new Button.ClickListener() {
185
186 @Override
187 public void buttonClick(Button.ClickEvent event) {
188 listener.onItemSelected(name);
189 }
190 });
191 }
192
193 private static class NameValueProvider implements ValueProvider<Node, String> {
194
195 @Inject
196 public NameValueProvider() {
197 }
198
199 @Override
200 public String apply(Node node) {
201 return NodeUtil.getName(node);
202 }
203 }
204 }