fix #7353 SpecimenTypedesignationsWorkingsetEditor: adapting to changes in DerivedUni...
[cdm-vaadin.git] / src / main / java / eu / etaxonomy / cdm / vaadin / view / name / SpecimenTypeDesignationWorkingsetPopupEditor.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.name;
10
11 import java.util.Collection;
12 import java.util.EnumSet;
13
14 import org.springframework.context.annotation.Scope;
15 import org.springframework.security.core.GrantedAuthority;
16 import org.vaadin.viritin.fields.ElementCollectionField;
17
18 import com.vaadin.data.validator.DoubleRangeValidator;
19 import com.vaadin.spring.annotation.SpringComponent;
20 import com.vaadin.ui.AbstractSelect.ItemCaptionMode;
21 import com.vaadin.ui.Component;
22 import com.vaadin.ui.GridLayout;
23 import com.vaadin.ui.ListSelect;
24 import com.vaadin.ui.Panel;
25 import com.vaadin.ui.TextArea;
26
27 import eu.etaxonomy.cdm.persistence.hibernate.permission.CRUD;
28 import eu.etaxonomy.cdm.vaadin.component.CollectionRowRepresentative;
29 import eu.etaxonomy.cdm.vaadin.component.PartialDateField;
30 import eu.etaxonomy.cdm.vaadin.component.common.GeoLocationField;
31 import eu.etaxonomy.cdm.vaadin.component.common.MinMaxTextField;
32 import eu.etaxonomy.cdm.vaadin.component.common.TeamOrPersonField;
33 import eu.etaxonomy.cdm.vaadin.model.registration.SpecimenTypeDesignationDTO;
34 import eu.etaxonomy.cdm.vaadin.model.registration.SpecimenTypeDesignationWorkingSetDTO;
35 import eu.etaxonomy.cdm.vaadin.security.AccessRestrictedView;
36 import eu.etaxonomy.cdm.vaadin.util.TeamOrPersonBaseCaptionGenerator;
37 import eu.etaxonomy.cdm.vaadin.util.converter.DoubleConverter;
38 import eu.etaxonomy.cdm.vaadin.util.converter.IntegerConverter;
39 import eu.etaxonomy.cdm.vaadin.view.PerEntityAuthorityGrantingEditor;
40 import eu.etaxonomy.vaadin.mvp.AbstractPopupEditor;
41
42 /**
43 * @author a.kohlbecker
44 * @since May 15, 2017
45 *
46 */
47 @SpringComponent
48 @Scope("prototype")
49 public class SpecimenTypeDesignationWorkingsetPopupEditor
50 extends AbstractPopupEditor<SpecimenTypeDesignationWorkingSetDTO, SpecimenTypeDesignationWorkingsetEditorPresenter>
51 implements SpecimenTypeDesignationWorkingsetPopupEditorView, AccessRestrictedView, PerEntityAuthorityGrantingEditor {
52 /**
53 * @param layout
54 * @param dtoType
55 */
56 public SpecimenTypeDesignationWorkingsetPopupEditor() {
57 super(new GridLayout(), SpecimenTypeDesignationWorkingSetDTO.class);
58 GridLayout grid = (GridLayout) getFieldLayout();
59 grid.setMargin(true);
60 grid.setSpacing(true);
61 }
62
63 private static final long serialVersionUID = 5418275817834009509L;
64
65 private ListSelect countrySelectField;
66
67 private ElementCollectionField<SpecimenTypeDesignationDTO> typeDesignationsCollectionField;
68
69 private EnumSet<CRUD> crud;
70
71 private TeamOrPersonField collectorField;
72
73 /**
74 * @return the countrySelectField
75 */
76 @Override
77 public ListSelect getCountrySelectField() {
78 return countrySelectField;
79 }
80
81 /**
82 * {@inheritDoc}
83 */
84 @Override
85 protected void initContent() {
86
87 GridLayout grid = (GridLayout)getFieldLayout();
88 grid.setSpacing(true);
89 grid.setMargin(true);
90 grid.setColumns(3);
91 grid.setRows(9);
92
93 //TODO typifyingAuthors
94
95 // FieldUnit + GatheringEvent
96
97 int row = 0;
98 countrySelectField = new ListSelect("Country");
99 addField(countrySelectField, "country", 1, row , 2, row);
100 countrySelectField.setWidth("100%");
101 countrySelectField.setItemCaptionMode(ItemCaptionMode.PROPERTY);
102 countrySelectField.setItemCaptionPropertyId("label");
103 countrySelectField.setRows(1);
104
105 row++;
106 TextArea localityField = new TextArea("Locality");
107 addField(localityField, "locality", 0, row , 2, row);
108 localityField.setWidth("100%");
109 // NOTE: setRows and SetCold breaks he width setting,
110 // see https://github.com/vaadin/framework/issues/3617
111
112 row++;
113 GeoLocationField exactLocation = new GeoLocationField("Geo location");
114 addField(exactLocation, "exactLocation", 0, row, 2, row);
115 exactLocation.setWidth("100%");
116
117 row++;
118 MinMaxTextField absElevationMinMax = new MinMaxTextField("Altitude", "m");
119 absElevationMinMax.setWidth("100%");
120 absElevationMinMax.addSubComponentsStyleName(getDefaultComponentStyles());
121 grid.addComponent(absElevationMinMax, 0, row, 2, row);
122
123 bindField(absElevationMinMax.getMinField(), "absoluteElevation");
124 bindField(absElevationMinMax.getMaxField(), "absoluteElevationMax");
125 bindField(absElevationMinMax.getTextField(), "absoluteElevationText");
126
127 absElevationMinMax.getMaxField().setConverter(new IntegerConverter());
128 absElevationMinMax.getMinField().setConverter(new IntegerConverter());
129
130 row++;
131 MinMaxTextField distanceToWaterSurfaceMinMax = new MinMaxTextField("Distance to water surface", "m");
132 distanceToWaterSurfaceMinMax.setWidth("100%");
133 distanceToWaterSurfaceMinMax.addSubComponentsStyleName(getDefaultComponentStyles());
134 grid.addComponent(distanceToWaterSurfaceMinMax, 0, row, 2, row);
135
136 bindField(distanceToWaterSurfaceMinMax.getMinField(), "distanceToWaterSurface");
137 bindField(distanceToWaterSurfaceMinMax.getMaxField(), "distanceToWaterSurfaceMax");
138 bindField(distanceToWaterSurfaceMinMax.getTextField(), "distanceToWaterSurfaceText");
139 distanceToWaterSurfaceMinMax.getMaxField().setConverter(new DoubleConverter());
140 distanceToWaterSurfaceMinMax.getMinField().setConverter(new DoubleConverter());
141 distanceToWaterSurfaceMinMax.getMaxField().addValidator(new DoubleRangeValidator("Negative values are not allowed here.", 0.0, Double.MAX_VALUE));
142 distanceToWaterSurfaceMinMax.getMinField().addValidator(new DoubleRangeValidator("Negative values are not allowed here.", 0.0, Double.MAX_VALUE));
143
144 row++;
145 MinMaxTextField distanceToGroundMinMax = new MinMaxTextField("Distance to substrate", "m");
146 distanceToGroundMinMax.setWidth("100%");
147 distanceToGroundMinMax.addSubComponentsStyleName(getDefaultComponentStyles());
148 grid.addComponent(distanceToGroundMinMax, 0, row, 2, row);
149
150 bindField(distanceToGroundMinMax.getMinField(), "distanceToGround");
151 bindField(distanceToGroundMinMax.getMaxField(), "distanceToGroundMax");
152 bindField(distanceToGroundMinMax.getTextField(), "distanceToGroundText");
153 distanceToGroundMinMax.getMaxField().setConverter(new DoubleConverter());
154 distanceToGroundMinMax.getMinField().setConverter(new DoubleConverter());
155
156 row++;
157 collectorField = new TeamOrPersonField("Collector", TeamOrPersonBaseCaptionGenerator.CacheType.NOMENCLATURAL_TITLE);
158 addField(collectorField, "collector", 0, row, 2, row);
159
160 row++;
161 PartialDateField collectionDateField = new PartialDateField("Collection date");
162 collectionDateField.setInputPrompt("dd.mm.yyyy");
163 addField(collectionDateField, "gatheringDate", 0, row, 1, row);
164 addTextField("Field number", "fieldNumber", 2, row);
165
166
167 row++;
168
169 // FIXME: can we use the Grid instead?
170 typeDesignationsCollectionField = new ElementCollectionField<>(
171 SpecimenTypeDesignationDTO.class,
172 SpecimenTypeDesignationDTORow.class
173 );
174 typeDesignationsCollectionField.withCaption("Types");
175 typeDesignationsCollectionField.getLayout().setSpacing(false);
176 typeDesignationsCollectionField.getLayout().setColumns(3);
177
178 typeDesignationsCollectionField.setVisibleProperties(SpecimenTypeDesignationDTORow.visibleFields());
179
180 typeDesignationsCollectionField.setPropertyHeader("accessionNumber", "Access. num.");
181 typeDesignationsCollectionField.setPropertyHeader("preferredStableUri", "Stable URI");
182 typeDesignationsCollectionField.setPropertyHeader("mediaSpecimenReference", "Image reference");
183 typeDesignationsCollectionField.setPropertyHeader("mediaSpecimenReferenceDetail", "Reference detail");
184
185 // typeDesignationsCollectionField.getLayout().setMargin(false);
186 // typeDesignationsCollectionField.addStyleName("composite-field-wrapper");
187 // addField(typeDesignationsCollectionField, "specimenTypeDesignationDTOs", 0, row, 2, row);
188
189 Panel scrollPanel = new Panel(typeDesignationsCollectionField.getLayout());
190 scrollPanel.setCaption("Types");
191 scrollPanel.setWidth(800, Unit.PIXELS);
192
193 bindField(typeDesignationsCollectionField, "specimenTypeDesignationDTOs");
194 addComponent(scrollPanel, 0, row, 2, row);
195
196 }
197
198
199 /**
200 * {@inheritDoc}
201 */
202 @Override
203 public String getWindowCaption() {
204 return "Specimen typedesignations editor";
205 }
206
207 /**
208 * {@inheritDoc}
209 */
210 @Override
211 public void focusFirst() {
212 // none
213 }
214
215 /**
216 * {@inheritDoc}
217 */
218 @Override
219 protected String getDefaultComponentStyles() {
220 return "tiny";
221 }
222
223 /**
224 * {@inheritDoc}
225 */
226 @Override
227 public boolean allowAnonymousAccess() {
228 return false;
229 }
230
231 /**
232 * {@inheritDoc}
233 */
234 @Override
235 public Collection<Collection<GrantedAuthority>> allowedGrantedAuthorities() {
236 return null;
237 }
238
239 /**
240 * {@inheritDoc}
241 */
242 @Override
243 public boolean isResizable() {
244 return true;
245 }
246
247
248 // ------- SpecimenTypeDesignationWorkingsetPopupEditorView methods ---- //
249 @Override
250 public ElementCollectionField<SpecimenTypeDesignationDTO> getTypeDesignationsCollectionField() {
251 return typeDesignationsCollectionField;
252 }
253
254 @Override
255 public void applyDefaultComponentStyle(Component ... components){
256 for(int i = 0; i <components.length; i++){
257 components[i].setStyleName(getDefaultComponentStyles());
258 }
259 }
260
261 /**
262 * {@inheritDoc}
263 */
264 @Override
265 public void grantToCurrentUser(EnumSet<CRUD> crud) {
266 getPresenter().setGrantsForCurrentUser(crud);
267
268 }
269
270 /**
271 * {@inheritDoc}
272 */
273 @Override
274 protected void afterItemDataSourceSet() {
275 super.afterItemDataSourceSet();
276 GridLayout gridLayout = this.typeDesignationsCollectionField.getLayout();
277 for(int rowIndex = 1; rowIndex < gridLayout.getRows(); rowIndex++){ // first row is header
278 Component item = gridLayout.getComponent(SpecimenTypeDesignationDTORow.rowListSelectColumn(), rowIndex);
279 ((CollectionRowRepresentative)item).updateRowItemsEnabledStates();
280 }
281 updateAllowDelete();
282 }
283
284 /**
285 * {@inheritDoc}
286 */
287 @Override
288 public void updateAllowDelete(){
289 // disable the delete button if there is only one typeDesignation
290 // if this typeDesignation is deleted the fieldUnit would become orphan in the
291 // TypeDesignationWorkingSet
292 GridLayout gridLayout = this.typeDesignationsCollectionField.getLayout();
293 if(gridLayout.getRows() == 3){ // first row is header, last row is next new item
294 gridLayout.getComponent(gridLayout.getColumns() - 1, 1).setEnabled(false);
295 }
296 }
297
298 /**
299 * {@inheritDoc}
300 */
301 @Override
302 public void setReadOnly(boolean readOnly) {
303 super.setReadOnly(readOnly);
304 getFieldLayout().iterator().forEachRemaining(c -> c.setReadOnly(readOnly));
305 typeDesignationsCollectionField.getLayout().iterator().forEachRemaining(c -> c.setReadOnly(readOnly));
306
307 }
308
309 /**
310 * @return the collectorField
311 */
312 @Override
313 public TeamOrPersonField getCollectorField() {
314 return collectorField;
315 }
316
317
318
319 }