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.field.factory;
35
36 import info.magnolia.objectfactory.ComponentProvider;
37 import info.magnolia.ui.field.LinkField;
38 import info.magnolia.ui.field.LinkFieldDefinition;
39 import info.magnolia.ui.form.ItemPreviewDefinition;
40 import info.magnolia.ui.framework.component.ItemPreviewComponent;
41 import info.magnolia.ui.framework.datasource.components.ItemResolver;
42 import info.magnolia.ui.framework.overlay.ChooserController;
43 import info.magnolia.ui.framework.overlay.ChooserController.ChooseResult;
44
45 import java.util.Optional;
46
47 import javax.inject.Inject;
48
49 import com.vaadin.ui.Component;
50
51
52
53
54
55
56 public class LinkFieldFactory<T, D extends LinkFieldDefinition<T>> extends AbstractFieldFactory<String, D> {
57
58 private final ChooserController chooserController;
59 private final ItemResolver<T> itemResolver;
60
61 @Inject
62 public LinkFieldFactory(D definition, ComponentProvider componentProvider, ItemResolver<T> itemResolver, ChooserController chooserController) {
63 super(definition, componentProvider);
64 this.itemResolver = itemResolver;
65
66 if (definition.getChooser() == null) {
67 throw new IllegalArgumentException("Could not find a chooser dialog definition at LinkField definition " + definition.getName());
68 }
69
70 this.chooserController = chooserController;
71 }
72
73 @Override
74 protected Component createFieldComponent() {
75 LinkFieldd.html#LinkField">LinkField linkField = new LinkField();
76
77 Optional.ofNullable(getDefinition().getPlaceholder()).filter(p -> !isMessageKey(p)).ifPresent(linkField::setPlaceholder);
78
79 linkField.setButtonCaptionNew(getDefinition().getButtonSelectNewLabel());
80 linkField.setButtonCaptionOther(getDefinition().getButtonSelectOtherLabel());
81 linkField.setEditable(getDefinition().isEditable());
82 linkField.setDisableOnClick(true);
83 linkField.addClickListener(event -> chooserController.openChooser(getDefinition().getChooser(), null)
84 .whenComplete((ChooseResult<T> result, Throwable err) -> {
85
86 linkField.setEnabled(true);
87
88 if (err != null) {
89 throw new RuntimeException(err);
90 }
91
92 result.getChoice()
93 .map(itemResolver::getPath)
94 .ifPresent(linkField::setValue);
95 }));
96
97 newItemPreviewComponent().ifPresent(itemPreviewComponent -> {
98 linkField.addValueChangeListener(event ->
99 itemResolver.getItemByPath(event.getValue()).ifPresent(item -> {
100 itemPreviewComponent.onValueChange(item);
101 itemPreviewComponent.setVisible(event.getValue() != null);
102 }));
103 linkField.setContentPreview(itemPreviewComponent);
104 });
105
106 return linkField;
107 }
108
109 protected Optional<? extends ItemPreviewComponent<T>> newItemPreviewComponent() {
110 return Optional.ofNullable(getDefinition().getPreview())
111 .map(ItemPreviewDefinition::getImplementationClass)
112 .map(clazz -> componentProvider.newInstance(clazz));
113 }
114
115 }