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