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.task.app.view.detail;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.i18nsystem.I18nizer;
38 import info.magnolia.icons.MagnoliaIcons;
39 import info.magnolia.registry.RegistrationException;
40 import info.magnolia.task.Task;
41 import info.magnolia.task.app.actions.ArchiveTasksAction;
42 import info.magnolia.task.definition.TaskDefinition;
43 import info.magnolia.task.definition.registry.TaskDefinitionRegistry;
44 import info.magnolia.ui.admincentral.shellapp.pulse.item.definition.ItemViewDefinition;
45 import info.magnolia.ui.admincentral.shellapp.pulse.item.registry.ItemViewDefinitionRegistry;
46 import info.magnolia.ui.api.app.SubAppContext;
47 import info.magnolia.ui.api.app.SubAppDescriptor;
48 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
49 import info.magnolia.ui.api.location.Location;
50 import info.magnolia.ui.contentapp.browser.actionbar.ActionbarView;
51 import info.magnolia.ui.contentapp.browser.context.ActionConfigurationContext;
52 import info.magnolia.ui.contentapp.browser.context.ValueContext;
53 import info.magnolia.ui.contentapp.detail.ContentDetailSubApp;
54 import info.magnolia.ui.form.definition.DefinitionConverter;
55 import info.magnolia.ui.framework.ViewProvider;
56 import info.magnolia.ui.framework.app.BaseSubApp;
57 import info.magnolia.ui.framework.databinding.ItemProviderStrategy;
58 import info.magnolia.ui.framework.databinding.view.FormView;
59 import info.magnolia.ui.framework.datasource.components.SelectedItems;
60
61 import java.text.MessageFormat;
62 import java.util.Locale;
63 import java.util.Optional;
64
65 import javax.inject.Inject;
66
67 import org.apache.commons.lang3.BooleanUtils;
68 import org.apache.commons.lang3.StringUtils;
69 import org.slf4j.Logger;
70 import org.slf4j.LoggerFactory;
71
72 import lombok.SneakyThrows;
73
74
75
76
77 public class TaskDetailSubApp extends BaseSubApp<TaskFormView> {
78
79 private static final Logger log = LoggerFactory.getLogger(ArchiveTasksAction.class);
80
81 private final TaskDetailDescriptor subAppDescriptor;
82 private final I18NAuthoringSupport i18NAuthoringSupport;
83 private final ItemViewDefinitionRegistry itemViewDefinitionRegistry;
84 private final I18nizer i18nizer;
85 private final TaskDefinitionRegistry taskDefinitionRegistry;
86 private ContentDetailSubApp.LocationContext locationContext;
87 private ItemProviderStrategy<Task> itemProviderStrategy;
88 private ValueContext<Task> valueContext;
89
90 @Inject
91 protected TaskDetailSubApp(SubAppContext subAppContext, ViewProvider viewProvider, I18NAuthoringSupport i18NAuthoringSupport, ItemViewDefinitionRegistry itemViewDefinitionRegistry, I18nizer i18nizer, TaskDefinitionRegistry taskDefinitionRegistry) {
92 super(subAppContext, viewProvider.create(subAppContext.getSubAppDescriptor().getLabel(), TaskFormView.class));
93 this.itemViewDefinitionRegistry = itemViewDefinitionRegistry;
94 this.i18nizer = i18nizer;
95 this.taskDefinitionRegistry = taskDefinitionRegistry;
96 this.subAppDescriptor = (TaskDetailDescriptor) getSubAppContext().getSubAppDescriptor();
97 this.i18NAuthoringSupport = i18NAuthoringSupport;
98 }
99
100 @Override
101 @SneakyThrows(RegistrationException.class)
102 public TaskFormView start(Location location) {
103 super.start(location);
104
105 final TaskFormView view = getView();
106 view.bindDatasourceDefinition(subAppDescriptor.getDatasource());
107 valueContext = view.bindContext(ValueContext.class);
108
109 final ContentDetailSubApp.LocaleContext localeContext = view.bindContext(ContentDetailSubApp.LocaleContext.class);
110 final Locale currentLocale = getSubAppContext().getAuthoringLocale() != null ?
111 getSubAppContext().getAuthoringLocale() :
112 i18NAuthoringSupport.getDefaultLocale();
113 localeContext.current().set(currentLocale);
114
115 this.locationContext = view.bindContext(ContentDetailSubApp.LocationContext.class);
116 this.locationContext.location().set(ContentDetailSubApp.DetailLocation.wrap(location));
117 this.itemProviderStrategy = view.create(subAppDescriptor.getItemProvider(), subAppDescriptor.getDatasource());
118
119 view.bindInstance(SubAppDescriptor.class, this.subAppDescriptor);
120 view.bindInstance(ItemProviderStrategy.class, itemProviderStrategy);
121
122 Optional<Task> itemProvider = itemProviderStrategy.read();
123 if (itemProvider.isPresent()) {
124 Task task = itemProvider.get();
125 TaskDefinition taskDefinition = taskDefinitionRegistry.get(task.getName());
126
127 String itemView = taskDefinition.getTaskView();
128 if (StringUtils.isEmpty(itemView)) {
129 String workspace = (String) task.getContent().get("repository");
130 String taskView = taskDefinition.getViewMapping().get(workspace);
131 itemView = StringUtils.isNotBlank(taskView) ? taskView : taskDefinition.getViewMapping().get("default");
132 }
133
134 ItemViewDefinition itemViewDefinition = itemViewDefinitionRegistry.get(itemView);
135 itemViewDefinition = i18nizer.decorate(itemViewDefinition);
136
137 view.bindContext(ActionConfigurationContext.class).actions().set(itemViewDefinition.getActions());
138
139 valueContext.current().set(SelectedItems.of(itemProvider.get()));
140
141 final FormView<Task> form = view.getViewProvider().create(DefinitionConverter.FORM.convert(itemViewDefinition.getForm()), subAppDescriptor.getDatasource());
142
143 updateViewAndSubAppDescriptorIcons(taskDefinition, task);
144 view.setSizeFull();
145 view.addStyleName("detail");
146 view.setMargin(false);
147 view.setSpacing(false);
148 subAppDescriptor.setActions(itemViewDefinition.getActions());
149 view.setActionBar(view.getViewProvider().create("actionbar", ActionbarView.class, itemViewDefinition.getActionbar()));
150 view.setContent(form.asVaadinComponent());
151
152 locationContext.location().observeNullable(l -> itemProviderStrategy.read().ifPresent(taskItem -> {
153 form.populate(taskItem);
154 valueContext.current().set(SelectedItems.of(taskItem));
155 try {
156 TaskDefinition taskDef = taskDefinitionRegistry.get(taskItem.getName());
157 updateViewAndSubAppDescriptorIcons(taskDef, taskItem);
158 } catch (RegistrationException e) {
159 log.debug("No task definition registered for name: {}", taskItem.getName());
160 }
161 }));
162 localeContext.current().observeNullable(locale -> view.setContent(form.getLayout(locale)));
163 }
164
165 return view;
166 }
167
168 @Override
169 public void locationChanged(Location location) {
170 super.locationChanged(location);
171 this.locationContext.location().set(ContentDetailSubApp.DetailLocation.wrap(location));
172 }
173
174 @Override
175 public void stop() {
176 getView().destroy();
177 }
178
179 private String taskTitle(TaskDefinition definition, Task task) {
180 String title = definition.getTitle();
181 if ("publish".equals(task.getName())) {
182 title = title + " {1} {2}";
183 } else {
184 return title;
185 }
186
187 String workspace = (String) task.getContent().get(Context.ATTRIBUTE_REPOSITORY);
188 String path = (String) task.getContent().get(Context.ATTRIBUTE_PATH);
189 boolean isDeletion = BooleanUtils.toBooleanDefaultIfNull((Boolean) task.getContent().get("isDeletion"), false);
190 title = MessageFormat.format(title, BooleanUtils.toInteger(isDeletion), workspace, path);
191
192 return title;
193 }
194
195 private MagnoliaIcons taskIcon(Task task) {
196 if ("publish".equals(task.getName())) {
197 if (BooleanUtils.toBooleanDefaultIfNull((Boolean) task.getContent().get("isDeletion"), false)) {
198 return MagnoliaIcons.UNPUBLISH;
199 }
200 return BooleanUtils.toBooleanDefaultIfNull((Boolean) task.getContent().get("recursive"), false) ? MagnoliaIcons.PUBLISH_INCL_SUB : MagnoliaIcons.PUBLISH;
201 }
202
203 return MagnoliaIcons.WORK_ITEM;
204 }
205
206 private void updateViewAndSubAppDescriptorIcons(TaskDefinition taskDefinition, Task taskItem) {
207 String title = taskTitle(taskDefinition, taskItem);
208 MagnoliaIcons newIcon = taskIcon(taskItem);
209 getView().setCaption(title);
210 getView().setIcon(newIcon);
211 subAppDescriptor.setLabel(title);
212 subAppDescriptor.setIcon(newIcon.getCssClass());
213 }
214 }