Project

General

Profile

Download (12.7 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2018 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.Arrays;
12
import java.util.List;
13
import java.util.Optional;
14

    
15
import org.springframework.context.annotation.Scope;
16

    
17
import com.vaadin.spring.annotation.SpringComponent;
18
import com.vaadin.ui.Alignment;
19
import com.vaadin.ui.CheckBox;
20
import com.vaadin.ui.GridLayout;
21
import com.vaadin.ui.NativeSelect;
22
import com.vaadin.ui.TextField;
23

    
24
import eu.etaxonomy.cdm.api.util.RoleProberImpl;
25
import eu.etaxonomy.cdm.model.common.AnnotationType;
26
import eu.etaxonomy.cdm.model.name.NameTypeDesignation;
27
import eu.etaxonomy.cdm.model.name.NameTypeDesignationStatus;
28
import eu.etaxonomy.cdm.model.name.TaxonName;
29
import eu.etaxonomy.cdm.model.reference.Reference;
30
import eu.etaxonomy.cdm.service.UserHelperAccess;
31
import eu.etaxonomy.cdm.vaadin.component.common.FilterableAnnotationsField;
32
import eu.etaxonomy.cdm.vaadin.event.ReferenceEditorAction;
33
import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction;
34
import eu.etaxonomy.cdm.vaadin.permission.CdmEditDeletePermissionTester;
35
import eu.etaxonomy.cdm.vaadin.permission.RolesAndPermissions;
36
import eu.etaxonomy.cdm.vaadin.ui.RegistrationUIDefaults;
37
import eu.etaxonomy.cdm.vaadin.util.converter.SetToListConverter;
38
import eu.etaxonomy.vaadin.component.ToManyRelatedEntitiesComboboxSelect;
39
import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox;
40
import eu.etaxonomy.vaadin.event.EditorActionType;
41
import eu.etaxonomy.vaadin.mvp.AbstractCdmPopupEditor;
42

    
43
/**
44
 * @author a.kohlbecker
45
 * @since Jan 26, 2018
46
 */
47
@SpringComponent
48
@Scope("prototype")
49
public class NameTypeDesignationPopupEditor extends AbstractCdmPopupEditor<NameTypeDesignation, NameTypeDesignationPresenter>
50
    implements NameTypeDesignationEditorView {
51

    
52
    private static final String TYPE_STATUS_OR_FLAG_MUST_BE_SET = "Either \"Type status\" must be set or any of the \"Conserved type\", \"Rejected type\" or \"Not designated\" flags must be set.";
53

    
54
    private static final String TYPE_STATUS_MUST_BE_SET = "\"Type status\" must be set.";
55

    
56
    private static final long serialVersionUID = 8233876984579344340L;
57

    
58
    private static final int GRID_COLS = 4;
59
    private static final int GRID_ROWS = 7;
60

    
61

    
62
    private CheckBox conservedTypeField;
63
    private CheckBox rejectedTypeField;
64
    private CheckBox notDesignatedField;
65
    List<CheckBox> typeStatusFlagFields;
66

    
67
    private ToOneRelatedEntityCombobox<TaxonName> typeNameField;
68

    
69
    private ToManyRelatedEntitiesComboboxSelect<TaxonName> typifiedNamesComboboxSelect;
70

    
71
    private NativeSelect typeStatusSelect;
72

    
73
    private ToOneRelatedEntityCombobox<Reference> designationReferenceCombobox;
74

    
75
    private TextField designationReferenceDetailField;
76

    
77
    private boolean showTypeFlags = true;
78

    
79
    private Optional<Boolean> inTypedesignationOnlyAct = Optional.empty();
80

    
81
    private FilterableAnnotationsField annotationsListField;
82

    
83
    private AnnotationType[] editableAnotationTypes = RegistrationUIDefaults.EDITABLE_ANOTATION_TYPES;
84

    
85

    
86
    /**
87
     * @param layout
88
     * @param dtoType
89
     */
90
    public NameTypeDesignationPopupEditor() {
91
        super(new GridLayout(GRID_COLS, GRID_ROWS), NameTypeDesignation.class);
92
    }
93

    
94
    /**
95
     * {@inheritDoc}
96
     */
97
    @Override
98
    public String getWindowCaption() {
99
        return "Name type designation editor";
100
    }
101

    
102
    /**
103
     * {@inheritDoc}
104
     */
105
    @Override
106
    public void focusFirst() {
107
        // none
108
    }
109

    
110
    /**
111
     * {@inheritDoc}
112
     */
113
    @Override
114
    protected String getDefaultComponentStyles() {
115
        return "tiny";
116
    }
117

    
118
    /**
119
     * {@inheritDoc}
120
     */
121
    @Override
122
    protected void initContent() {
123
        /*
124
            conservedType : boolean
125
            rejectedType : boolean
126
            typeName : TaxonName
127

    
128
            typifiedNames
129
            notDesignated : boolean
130
            registrations : Set<Registration>
131
            typeStatus : T
132

    
133
            citation : Reference
134
            citationMicroReference : String
135
            originalNameString : String
136
         */
137

    
138
        GridLayout grid = (GridLayout)getFieldLayout();
139
        // grid.setSizeFull();
140
        grid.setSpacing(true);
141
        grid.setColumnExpandRatio(0, 0.25f);
142
        grid.setColumnExpandRatio(1, 0.25f);
143
        grid.setColumnExpandRatio(2, 0.25f);
144
        grid.setColumnExpandRatio(3, 0.25f);
145

    
146
        int row = 0;
147

    
148
        if(showTypeFlags){
149
            conservedTypeField = addCheckBox("Conserved type", "conservedType", 0, row);
150
            conservedTypeField.addValueChangeListener(e -> updateDesignationReferenceFields());
151
            conservedTypeField.addValueChangeListener(e -> handleTypeStatusFlagChange(conservedTypeField));
152
            rejectedTypeField = addCheckBox("Rejected type", "rejectedType", 1, row);
153
            rejectedTypeField.addValueChangeListener(e -> updateDesignationReferenceFields());
154
            rejectedTypeField.addValueChangeListener(e -> handleTypeStatusFlagChange(rejectedTypeField));
155
            notDesignatedField = addCheckBox("Not designated", "notDesignated", 2, row);
156
            notDesignatedField.addValueChangeListener(e -> updateDesignationReferenceFields());
157
            notDesignatedField.addValueChangeListener(e -> handleTypeStatusFlagChange(notDesignatedField));
158
            notDesignatedField.addValueChangeListener(e -> updateTypeNameField());
159
            typeStatusFlagFields = Arrays.asList(conservedTypeField, rejectedTypeField, notDesignatedField);
160
            row++;
161
        }
162

    
163
        typeStatusSelect = new NativeSelect("Type status");
164
        typeStatusSelect.setNullSelectionAllowed(false);
165
        typeStatusSelect.setWidth(100, Unit.PERCENTAGE);
166
        typeStatusSelect.setRequired(true);
167
        typeStatusSelect.setRequiredError(TYPE_STATUS_OR_FLAG_MUST_BE_SET);
168
        addField(typeStatusSelect, "typeStatus", 0, row, 1, row);
169
        grid.setComponentAlignment(typeStatusSelect, Alignment.TOP_RIGHT);
170
        typeStatusSelect.addValueChangeListener(e -> {
171
            updateDesignationReferenceFields();
172
        });
173

    
174
        row++;
175
        typeNameField = new ToOneRelatedEntityCombobox<TaxonName>("Type name", TaxonName.class);
176
        addField(typeNameField, "typeName", 0, row, 3, row);
177
        typeNameField.addClickListenerAddEntity(e -> getViewEventBus().publish(this,
178
                new TaxonNameEditorAction(
179
                        EditorActionType.ADD,
180
                        e.getButton(),
181
                        typeNameField,
182
                        this))
183
        );
184
        typeNameField.addClickListenerEditEntity(e -> {
185
            if(typeNameField.getValue() != null){
186
                getViewEventBus().publish(this,
187
                    new TaxonNameEditorAction(
188
                            EditorActionType.EDIT,
189
                            typeNameField.getValue().getUuid(),
190
                            e.getButton(),
191
                            typeNameField,
192
                            this)
193
                );
194
            }
195
        });
196

    
197
        row++;
198
        typifiedNamesComboboxSelect = new ToManyRelatedEntitiesComboboxSelect<TaxonName>(TaxonName.class, "Typified names");
199
        typifiedNamesComboboxSelect.setConverter(new SetToListConverter<TaxonName>());
200
        typifiedNamesComboboxSelect.setEditPermissionTester(new CdmEditDeletePermissionTester());
201
        addField(typifiedNamesComboboxSelect, "typifiedNames", 0, row, 3, row);
202
        typifiedNamesComboboxSelect.setReadOnly(false); // FIXME this does not help, see #7389
203

    
204
        row++;
205
        designationReferenceCombobox = new ToOneRelatedEntityCombobox<Reference>("Designation reference", Reference.class);
206
        addField(designationReferenceCombobox, "citation", 0, row, 2, row);
207
        designationReferenceCombobox.setWidth(400, Unit.PIXELS);
208
        designationReferenceDetailField = addTextField("Reference detail", "citationMicroReference", 3, row);
209
        designationReferenceCombobox.addClickListenerAddEntity(e -> getViewEventBus().publish(
210
                this,
211
                new ReferenceEditorAction(EditorActionType.ADD, null, designationReferenceCombobox, this)
212
                ));
213
        designationReferenceCombobox.addClickListenerEditEntity(e -> {
214
            if(designationReferenceCombobox.getValue() != null){
215
                getViewEventBus().publish(this,
216
                    new ReferenceEditorAction(
217
                            EditorActionType.EDIT,
218
                            designationReferenceCombobox.getValue().getUuid(),
219
                            e.getButton(),
220
                            designationReferenceCombobox,
221
                            this)
222
                );
223
            }
224
            });
225

    
226
        row++;
227
        annotationsListField = new FilterableAnnotationsField("Editorial notes");
228
        annotationsListField.setWidth(100, Unit.PERCENTAGE);
229
        boolean isCurator = UserHelperAccess.userHelper().userIs(new RoleProberImpl(RolesAndPermissions.ROLE_CURATION));
230
        boolean isAdmin = UserHelperAccess.userHelper().userIsAdmin();
231
        if(isCurator || isAdmin){
232
            annotationsListField.withNewButton(true);
233
        } else {
234
            annotationsListField.setAnnotationTypesVisible(editableAnotationTypes);
235
        }
236
        addField(annotationsListField, "annotations", 0, row, 3, row);
237
    }
238

    
239

    
240

    
241
    @Override
242
    protected void afterItemDataSourceSet() {
243
        super.afterItemDataSourceSet();
244
        updateDesignationReferenceFields();
245
    }
246

    
247
    protected void updateDesignationReferenceFields() {
248
        boolean hasDesignationSource = typeStatusSelect.getValue() != null && ((NameTypeDesignationStatus)typeStatusSelect.getValue()).hasDesignationSource();
249
        designationReferenceDetailField.setVisible(hasDesignationSource);
250
        designationReferenceCombobox.setVisible(hasDesignationSource);
251
        designationReferenceCombobox.setRequired(hasDesignationSource);
252
        // NOTE: For better usability we only hide these fields here,
253
        // NameTypeDesignationPresenter.preSaveBean(NameTypeDesignation bean) will empty them in needed
254

    
255
        boolean isInTypedesignationOnlyAct = !isInTypedesignationOnlyAct().isPresent() || isInTypedesignationOnlyAct().get();
256
        boolean typeStatusRequired = !(typeStatusFlagFields.stream().anyMatch(cb -> cb.getValue().booleanValue()));
257
        // need to check for isInTypedesignationOnlyAct also, otherwise the reference field will not show up
258
        // and the type designation might not be associated with the registration
259
        // TODO discuss with Henning
260
        typeStatusSelect.setRequired(typeStatusRequired || checkInTypeDesignationOnlyAct());
261
        if(typeStatusRequired && checkInTypeDesignationOnlyAct()) {
262
            designationReferenceCombobox.setRequiredError(TYPE_STATUS_MUST_BE_SET);
263
        } else {
264
            designationReferenceCombobox.setRequiredError(TYPE_STATUS_OR_FLAG_MUST_BE_SET);
265
        }
266
    }
267

    
268
    protected void updateTypeNameField() {
269
        typeNameField.setVisible(!notDesignatedField.getValue().booleanValue());
270
    }
271

    
272
    protected void handleTypeStatusFlagChange(CheckBox typeStatusFlagField) {
273
        if(typeStatusFlagField.getValue().booleanValue()) {
274
            typeStatusFlagFields.stream().filter(cb -> !cb.equals(typeStatusFlagField)).forEach(cb -> cb.setValue(false));
275
        }
276
    }
277

    
278
    @Override
279
    public ToOneRelatedEntityCombobox<TaxonName> getTypeNameField() {
280
        return typeNameField;
281
    }
282

    
283
    @Override
284
    public ToManyRelatedEntitiesComboboxSelect<TaxonName> getTypifiedNamesComboboxSelect() {
285
        return typifiedNamesComboboxSelect;
286
    }
287

    
288
    @Override
289
    public NativeSelect getTypeStatusSelect() {
290
        return typeStatusSelect;
291
    }
292

    
293
    @Override
294
    public ToOneRelatedEntityCombobox<Reference> getDesignationReferenceCombobox() {
295
        return designationReferenceCombobox;
296
    }
297

    
298
    @Override
299
    public boolean isShowTypeFlags() {
300
        return showTypeFlags;
301
    }
302

    
303
    @Override
304
    public void setShowTypeFlags(boolean showTypeFlags) {
305
        this.showTypeFlags = showTypeFlags;
306
    }
307

    
308
    @Override
309
    public AnnotationType[] getEditableAnotationTypes() {
310
        return editableAnotationTypes;
311
    }
312

    
313

    
314
    @Override
315
    public void setEditableAnotationTypes(AnnotationType... editableAnotationTypes) {
316
        this.editableAnotationTypes = editableAnotationTypes;
317
    }
318

    
319

    
320
    @Override
321
    public FilterableAnnotationsField getAnnotationsField() {
322
        return annotationsListField;
323
    }
324

    
325
    @Override
326
    public void setInTypedesignationOnlyAct(Optional<Boolean> isInTypedesignationOnlyAct) {
327
        this.inTypedesignationOnlyAct = isInTypedesignationOnlyAct;
328
    }
329

    
330
    @Override
331
    public Optional<Boolean> isInTypedesignationOnlyAct() {
332
        return inTypedesignationOnlyAct;
333
    }
334
}
(3-3/18)