Annotation based access control
[cdm-vaadin.git] / src / main / java / eu / etaxonomy / cdm / vaadin / view / registration / ListViewBean.java
1 /**
2 * Copyright (C) 2017 EDIT
3 * European Distributed Institute of Taxonomy
4 * http://www.e-taxonomy.eu
5 *
6 * The contents of this file are subject to the Mozilla Public License Version 1.1
7 * See LICENSE.TXT at the top of this package for the full license terms.
8 */
9 package eu.etaxonomy.cdm.vaadin.view.registration;
10
11 import java.util.ArrayList;
12 import java.util.Collection;
13 import java.util.List;
14
15 import org.springframework.beans.factory.annotation.Autowired;
16
17 import com.vaadin.data.Item;
18 import com.vaadin.data.util.BeanContainer;
19 import com.vaadin.data.util.GeneratedPropertyContainer;
20 import com.vaadin.data.util.PropertyValueGenerator;
21 import com.vaadin.navigator.View;
22 import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
23 import com.vaadin.server.Page;
24 import com.vaadin.shared.ui.grid.HeightMode;
25 import com.vaadin.spring.annotation.SpringView;
26 import com.vaadin.ui.Button;
27 import com.vaadin.ui.Button.ClickEvent;
28 import com.vaadin.ui.Component;
29 import com.vaadin.ui.CssLayout;
30 import com.vaadin.ui.Grid;
31 import com.vaadin.ui.Grid.Column;
32 import com.vaadin.ui.Grid.SelectionMode;
33 import com.vaadin.ui.Notification;
34 import com.vaadin.ui.renderers.ButtonRenderer;
35 import com.vaadin.ui.renderers.DateRenderer;
36 import com.vaadin.ui.renderers.HtmlRenderer;
37
38 import eu.etaxonomy.cdm.vaadin.component.registration.RegistrationItem;
39 import eu.etaxonomy.cdm.vaadin.security.annotation.RequireAuthentication;
40 import eu.etaxonomy.cdm.vaadin.util.converter.JodaDateTimeConverter;
41 import eu.etaxonomy.cdm.vaadin.util.converter.UrlStringConverter;
42 import eu.etaxonomy.cdm.vaadin.view.AbstractPageView;
43 import eu.etaxonomy.vaadin.ui.navigation.NavigationEvent;
44
45 /**
46 * @author a.kohlbecker
47 * @since Mar 2, 2017
48 *
49 */
50 @SpringView(name=ListViewBean.NAME)
51 @RequireAuthentication
52 public class ListViewBean extends AbstractPageView<ListPresenter> implements ListView, View {
53
54 private static final long serialVersionUID = 3543300933072824713L;
55
56 public static final String NAME = "list";
57
58 private CssLayout listContainer;
59
60 private Grid grid;
61
62 private CssLayout toolBar;
63
64 public ListViewBean() {
65
66 super();
67
68 toolBar = new CssLayout();
69 toolBar.setWidth(100, Unit.PERCENTAGE);
70 toolBar.addComponent(new Button("As grid", e -> toggleListType(e)));
71 getLayout().addComponent(toolBar);
72
73 buildList();
74 buildGrid();
75
76 showList();
77 }
78
79 @Override
80 protected String getHeaderText() {
81 return "Registrations";
82 }
83
84 @Override
85 protected String getSubHeaderText() {
86 return "This is the list of all your registrations in progress.";
87 }
88
89 private void buildList() {
90 listContainer = new CssLayout();
91 listContainer.setId("registration-list");
92 listContainer.setWidth(100, Unit.PERCENTAGE);
93 }
94
95 private void buildGrid() {
96 grid = new Grid();
97 grid.setSizeFull();
98 grid.setEditorEnabled(false);
99 grid.setId("registration-list");
100 grid.setCellStyleGenerator(cellRef -> cellRef.getPropertyId().toString());
101 grid.setSelectionMode(SelectionMode.NONE);
102 grid.setHeightMode(HeightMode.CSS);
103 // add status as class attribute to the rows to allow styling with css
104 grid.setRowStyleGenerator(rowRef -> {return "status-" + rowRef.getItem().getItemProperty("status").getValue().toString();});
105 }
106
107 /**
108 * @param e
109 * @return
110 */
111 private Object toggleListType(ClickEvent e) {
112 Button button = e.getButton();
113 if(button.getCaption().equals("As grid")){
114 button.setCaption("As list");
115 showGrid();
116 } else {
117 button.setCaption("As grid");
118 showList();
119 }
120 return null;
121 }
122
123 private void showList() {
124 if(grid != null){
125 getLayout().removeComponent(grid);
126 }
127 getLayout().addComponent(listContainer);
128 }
129
130 private void showGrid() {
131 if(listContainer != null){
132 getLayout().removeComponent(listContainer);
133 }
134 getLayout().addComponent(grid);
135 }
136
137
138 /**
139 * {@inheritDoc}
140 */
141 @Override
142 public void enter(ViewChangeEvent event) {
143 getPresenter().onViewEnter();
144 }
145
146 /**
147 * {@inheritDoc}
148 */
149 @Override
150 @Autowired
151 protected void injectPresenter(ListPresenter presenter) {
152 setPresenter(presenter);
153 }
154
155 @Override
156 public void populate(Collection<RegistrationDTO> registrations) {
157
158 registrations = new ArrayList<RegistrationDTO>(registrations).subList(0, 10);
159
160 populateGrid(registrations);
161 populateList(registrations);
162 }
163
164
165 public void populateGrid(Collection<RegistrationDTO> registrations) {
166
167 BeanContainer<String, RegistrationDTO> registrationItems = new BeanContainer<String, RegistrationDTO>(RegistrationDTO.class);
168 registrationItems.setBeanIdProperty("specificIdentifier");
169 registrationItems.addAll(registrations);
170
171 grid.setContainerDataSource(buildGeneratedProperties(registrationItems));
172
173 grid.removeAllColumns();
174
175 Column typeColumn = grid.addColumn("registrationType");
176 typeColumn.setRenderer(new HtmlRenderer(), new RegistrationTypeConverter());
177 typeColumn.setHeaderCaption("");
178
179 Column statusColumn = grid.addColumn("status");
180
181 Column citationColumn = grid.addColumn("citation");
182 citationColumn.setHeaderCaption("Publication");
183
184
185 Column summaryColumn = grid.addColumn("summary");
186
187 Column regidColumn = grid.addColumn("identifier");
188 regidColumn.setHeaderCaption("Id");
189 regidColumn.setRenderer(new HtmlRenderer(), new UrlStringConverter("http://pyhcobank.org/"));
190
191 Column createdColumn = grid.addColumn("created");
192 createdColumn.setRenderer(new DateRenderer(), new JodaDateTimeConverter());
193 createdColumn.setHidable(true);
194 createdColumn.setHidden(true);
195
196 Column regDateColumn = grid.addColumn("registrationDate");
197 // regDateColumn.setHeaderCaption("Date");
198 regDateColumn.setRenderer(new DateRenderer(), new JodaDateTimeConverter());
199 regDateColumn.setHidable(true);
200 regDateColumn.setHidden(true);
201
202
203 Column buttonColumn = grid.addColumn("operation");
204 buttonColumn.setRenderer(new ButtonRenderer(e -> eventBus.publishEvent(new NavigationEvent(
205 RegistrationWorkflowViewBean.NAME,
206 RegistrationWorkflowViewBean.ACTION_EDIT,
207 e.getItemId().toString()
208 ))));
209 buttonColumn.setSortable(false);
210
211 grid.setFrozenColumnCount(1);
212
213 }
214
215
216 public void populateList(Collection<RegistrationDTO> registrations) {
217
218 for(RegistrationDTO regDto : registrations) {
219 Component item = new RegistrationItem(regDto, this);
220 item.setWidth(100, Unit.PERCENTAGE);
221 listContainer.addComponent(item);
222 }
223 }
224
225 @Override
226 public void openDetailsPopup(String caption, List<String> messages){
227 StringBuffer sb = new StringBuffer();
228 sb.append("<div class=\"details-popup-content\">");
229 messages.forEach(s -> sb.append(s).append("</br>"));
230 sb.append("</div>");
231 new Notification(caption, sb.toString(), Notification.Type.HUMANIZED_MESSAGE, true).show(Page.getCurrent());
232 }
233
234 /**
235 * @param registrationItems
236 * @return
237 */
238 private GeneratedPropertyContainer buildGeneratedProperties(
239 BeanContainer<String, RegistrationDTO> registrationItems) {
240 GeneratedPropertyContainer gpContainer = new GeneratedPropertyContainer(registrationItems);
241
242 gpContainer.addGeneratedProperty("operation", new PropertyValueGenerator<String>() {
243
244 @Override
245 public String getValue(Item item, Object itemId, Object propertyId) {
246 return "Open";
247 }
248
249 @Override
250 public Class<String> getType() {
251 return String.class;
252 }
253 });
254
255 return gpContainer;
256 }
257
258
259
260 }