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.api.i18n.I18NAuthoringSupport;
38 import info.magnolia.ui.contentapp.browser.preview.PreviewProvider;
39 import info.magnolia.ui.framework.component.ItemPreviewComponent;
40 import info.magnolia.ui.field.LinkFieldDefinition;
41 import info.magnolia.ui.field.LinkField;
42 import info.magnolia.ui.framework.datasource.DatasourceSupport;
43 import info.magnolia.ui.framework.datasource.components.ItemResolver;
44 import info.magnolia.ui.framework.datasource.components.PropertySetFactory;
45 import info.magnolia.ui.framework.overlay.ChooserController;
46 import info.magnolia.ui.framework.overlay.ChooserController.ChooseResult;
47
48 import java.util.Locale;
49 import java.util.Optional;
50
51 import javax.inject.Inject;
52
53
54
55
56
57
58
59
60 public class LinkFieldFactory<T, DEF, D extends LinkFieldDefinition<T, DEF>> extends AbstractFieldFactory<D, T, LinkField<T>> {
61
62 private final DatasourceSupport datasourceSupport;
63 private final ChooserController chooserController;
64
65 @Inject
66 public LinkFieldFactory(D definition, ComponentProvider componentProvider, Locale locale, I18NAuthoringSupport i18nAuthoringSupport, DatasourceSupport datasourceSupport, ChooserController chooserController) {
67 super(definition, componentProvider, locale, i18nAuthoringSupport);
68
69 Optional.ofNullable(definition.getChooser())
70 .orElseThrow(() -> new IllegalArgumentException("Could not find a chooser dialog definition at LinkField definition " + definition.getName()));
71
72 this.datasourceSupport = datasourceSupport;
73 this.chooserController = chooserController;
74 }
75
76 @Override
77 protected LinkField<T> createFieldComponent() {
78 final DEF datasource = getDefinition().getDatasource();
79
80 final ItemResolver<T> itemResolver = datasourceSupport.getDatasourceBundle(datasource).lookup(ItemResolver.class, datasource)
81 .orElseThrow(() -> new IllegalArgumentException("Could not resolve item resolver from definition " + getDefinition().getName()));
82
83 final LinkField<T> linkField = new LinkField<>(itemResolver);
84
85 Optional.ofNullable(getDefinition().getPlaceholder()).filter(p -> !isMessageKey(p))
86 .ifPresent(placeholder -> linkField.setPlaceholder(placeholder));
87
88 linkField.setButtonCaptionNew(isMessageKey(getDefinition().getButtonSelectNewLabel()) ?
89 getDefinition().getButtonSelectNewDefaultLabel() : getDefinition().getButtonSelectNewLabel());
90
91 linkField.setButtonCaptionOther(isMessageKey(getDefinition().getButtonSelectOtherLabel()) ?
92 getDefinition().getButtonSelectOtherDefaultLabel() : getDefinition().getButtonSelectOtherLabel());
93
94 linkField.setEditable(getDefinition().isEditable());
95 linkField.setDisableOnClick(true);
96
97 linkField.addClickListener(event ->
98 chooserController.openChooser(getDefinition().getChooser(), linkField.getValue()).whenComplete((ChooseResult<T> result, Throwable err) -> {
99
100 linkField.setEnabled(true);
101
102 if (err != null) {
103 throw new RuntimeException(err);
104 }
105
106 result.getChoice().ifPresent(linkField::setValue);
107 }));
108
109 newItemPreviewComponent().ifPresent(itemPreviewComponent -> {
110 linkField.addValueChangeListener(event -> {
111 itemPreviewComponent.onValueChange((event.getValue()));
112 itemPreviewComponent.setVisible(event.getValue() != null);
113 });
114 linkField.setContentPreview(itemPreviewComponent);
115 });
116
117 return linkField;
118 }
119
120 protected Optional<? extends ItemPreviewComponent<T>> newItemPreviewComponent() {
121 Class<? extends ItemPreviewComponent<T>> previewComponentClass = Optional.ofNullable(getDefinition().getPreview())
122 .map(def -> def.getImplementationClass()).orElse(null);
123
124 return Optional.ofNullable(previewComponentClass).map(clazz -> {
125 final DEF datasource = getDefinition().getDatasource();
126
127 final PreviewProvider<T> previewProvider = datasourceSupport.getDatasourceBundle(datasource).lookup(PreviewProvider.class, datasource)
128 .orElse(null);
129
130 final PropertySetFactory<T> propertySetFactory = datasourceSupport.getDatasourceBundle(datasource).lookup(PropertySetFactory.class, datasource)
131 .orElseThrow(() -> new IllegalArgumentException("Could not resolve PropertySetFactory for datasource " + datasource));
132
133 return getComponentProvider().newInstance(clazz, propertySetFactory, previewProvider);
134 });
135 }
136 }