View Javadoc
1   /**
2    * This file Copyright (c) 2018 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
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   * TaskDetailSubApp.
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 }