Project

General

Profile

Download (12.5 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
    public NameTypeDesignationPopupEditor() {
87
        super(new GridLayout(GRID_COLS, GRID_ROWS), NameTypeDesignation.class);
88
    }
89

    
90
    @Override
91
    public String getWindowCaption() {
92
        return "Name type designation editor";
93
    }
94

    
95
    @Override
96
    public void focusFirst() {
97
        // none
98
    }
99

    
100
    @Override
101
    protected String getDefaultComponentStyles() {
102
        return "tiny";
103
    }
104

    
105
    @Override
106
    protected void initContent() {
107
        /*
108
            conservedType : boolean
109
            rejectedType : boolean
110
            typeName : TaxonName
111

    
112
            typifiedNames
113
            notDesignated : boolean
114
            registrations : Set<Registration>
115
            typeStatus : T
116

    
117
            citation : Reference
118
            citationMicroReference : String
119
            originalNameString : String
120
         */
121

    
122
        GridLayout grid = (GridLayout)getFieldLayout();
123
        // grid.setSizeFull();
124
        grid.setSpacing(true);
125
        grid.setColumnExpandRatio(0, 0.25f);
126
        grid.setColumnExpandRatio(1, 0.25f);
127
        grid.setColumnExpandRatio(2, 0.25f);
128
        grid.setColumnExpandRatio(3, 0.25f);
129

    
130
        int row = 0;
131

    
132
        if(showTypeFlags){
133
            conservedTypeField = addCheckBox("Conserved type", "conservedType", 0, row);
134
            conservedTypeField.addValueChangeListener(e -> updateDesignationReferenceFields());
135
            conservedTypeField.addValueChangeListener(e -> handleTypeStatusFlagChange(conservedTypeField));
136
            rejectedTypeField = addCheckBox("Rejected type", "rejectedType", 1, row);
137
            rejectedTypeField.addValueChangeListener(e -> updateDesignationReferenceFields());
138
            rejectedTypeField.addValueChangeListener(e -> handleTypeStatusFlagChange(rejectedTypeField));
139
            notDesignatedField = addCheckBox("Not designated", "notDesignated", 2, row);
140
            notDesignatedField.addValueChangeListener(e -> updateDesignationReferenceFields());
141
            notDesignatedField.addValueChangeListener(e -> handleTypeStatusFlagChange(notDesignatedField));
142
            notDesignatedField.addValueChangeListener(e -> updateTypeNameField());
143
            typeStatusFlagFields = Arrays.asList(conservedTypeField, rejectedTypeField, notDesignatedField);
144
            row++;
145
        }
146

    
147
        typeStatusSelect = new NativeSelect("Type status");
148
        typeStatusSelect.setNullSelectionAllowed(false);
149
        typeStatusSelect.setWidth(100, Unit.PERCENTAGE);
150
        typeStatusSelect.setRequired(true);
151
        typeStatusSelect.setRequiredError(TYPE_STATUS_OR_FLAG_MUST_BE_SET);
152
        addField(typeStatusSelect, "typeStatus", 0, row, 1, row);
153
        grid.setComponentAlignment(typeStatusSelect, Alignment.TOP_RIGHT);
154
        typeStatusSelect.addValueChangeListener(e -> {
155
            updateDesignationReferenceFields();
156
        });
157

    
158
        row++;
159
        typeNameField = new ToOneRelatedEntityCombobox<TaxonName>("Type name", TaxonName.class);
160
        addField(typeNameField, "typeName", 0, row, 3, row);
161
        typeNameField.addClickListenerAddEntity(e -> getViewEventBus().publish(this,
162
                new TaxonNameEditorAction(
163
                        EditorActionType.ADD,
164
                        e.getButton(),
165
                        typeNameField,
166
                        this))
167
        );
168
        typeNameField.addClickListenerEditEntity(e -> {
169
            if(typeNameField.getValue() != null){
170
                getViewEventBus().publish(this,
171
                    new TaxonNameEditorAction(
172
                            EditorActionType.EDIT,
173
                            typeNameField.getValue().getUuid(),
174
                            e.getButton(),
175
                            typeNameField,
176
                            this)
177
                );
178
            }
179
        });
180

    
181
        row++;
182
        typifiedNamesComboboxSelect = new ToManyRelatedEntitiesComboboxSelect<TaxonName>(TaxonName.class, "Typified names");
183
        typifiedNamesComboboxSelect.setConverter(new SetToListConverter<TaxonName>());
184
        typifiedNamesComboboxSelect.setEditPermissionTester(new CdmEditDeletePermissionTester());
185
        addField(typifiedNamesComboboxSelect, "typifiedNames", 0, row, 3, row);
186
        typifiedNamesComboboxSelect.setReadOnly(false); // FIXME this does not help, see #7389
187

    
188
        row++;
189
        designationReferenceCombobox = new ToOneRelatedEntityCombobox<Reference>("Designation reference", Reference.class);
190
        addField(designationReferenceCombobox, "citation", 0, row, 2, row);
191
        designationReferenceCombobox.setWidth(400, Unit.PIXELS);
192
        designationReferenceDetailField = addTextField("Reference detail", "citationMicroReference", 3, row);
193
        designationReferenceCombobox.addClickListenerAddEntity(e -> getViewEventBus().publish(
194
                this,
195
                new ReferenceEditorAction(EditorActionType.ADD, null, designationReferenceCombobox, this)
196
                ));
197
        designationReferenceCombobox.addClickListenerEditEntity(e -> {
198
            if(designationReferenceCombobox.getValue() != null){
199
                getViewEventBus().publish(this,
200
                    new ReferenceEditorAction(
201
                            EditorActionType.EDIT,
202
                            designationReferenceCombobox.getValue().getUuid(),
203
                            e.getButton(),
204
                            designationReferenceCombobox,
205
                            this)
206
                );
207
            }
208
            });
209

    
210
        row++;
211
        annotationsListField = new FilterableAnnotationsField("Editorial notes");
212
        annotationsListField.setWidth(100, Unit.PERCENTAGE);
213
        boolean isCurator = UserHelperAccess.userHelper().userIs(new RoleProberImpl(RolesAndPermissions.ROLE_CURATION));
214
        boolean isAdmin = UserHelperAccess.userHelper().userIsAdmin();
215
        if(isCurator || isAdmin){
216
            annotationsListField.withNewButton(true);
217
        } else {
218
            annotationsListField.setAnnotationTypesVisible(editableAnotationTypes);
219
        }
220
        addField(annotationsListField, "annotations", 0, row, 3, row);
221
    }
222

    
223
    @Override
224
    protected void afterItemDataSourceSet() {
225
        super.afterItemDataSourceSet();
226
        updateDesignationReferenceFields();
227
    }
228

    
229
    protected void updateDesignationReferenceFields() {
230
        boolean hasDesignationSource = typeStatusSelect.getValue() != null && ((NameTypeDesignationStatus)typeStatusSelect.getValue()).hasDesignationSource();
231
        designationReferenceDetailField.setVisible(hasDesignationSource);
232
        designationReferenceCombobox.setVisible(hasDesignationSource);
233
        designationReferenceCombobox.setRequired(hasDesignationSource);
234
        // NOTE: For better usability we only hide these fields here,
235
        // NameTypeDesignationPresenter.preSaveBean(NameTypeDesignation bean) will empty them in needed
236

    
237
        boolean isInTypedesignationOnlyAct = !isInTypedesignationOnlyAct().isPresent() || isInTypedesignationOnlyAct().get();
238
        boolean typeStatusRequired = !(typeStatusFlagFields.stream().anyMatch(cb -> cb.getValue().booleanValue()));
239
        // need to check for isInTypedesignationOnlyAct also, otherwise the reference field will not show up
240
        // and the type designation might not be associated with the registration
241
        // TODO discuss with Henning
242
        typeStatusSelect.setRequired(typeStatusRequired || checkInTypeDesignationOnlyAct());
243
        if(typeStatusRequired && checkInTypeDesignationOnlyAct()) {
244
            designationReferenceCombobox.setRequiredError(TYPE_STATUS_MUST_BE_SET);
245
        } else {
246
            designationReferenceCombobox.setRequiredError(TYPE_STATUS_OR_FLAG_MUST_BE_SET);
247
        }
248
    }
249

    
250
    protected void updateTypeNameField() {
251
        typeNameField.setVisible(!notDesignatedField.getValue().booleanValue());
252
    }
253

    
254
    protected void handleTypeStatusFlagChange(CheckBox typeStatusFlagField) {
255
        if(typeStatusFlagField.getValue().booleanValue()) {
256
            typeStatusFlagFields.stream().filter(cb -> !cb.equals(typeStatusFlagField)).forEach(cb -> cb.setValue(false));
257
        }
258
    }
259

    
260
    @Override
261
    public ToOneRelatedEntityCombobox<TaxonName> getTypeNameField() {
262
        return typeNameField;
263
    }
264

    
265
    @Override
266
    public ToManyRelatedEntitiesComboboxSelect<TaxonName> getTypifiedNamesComboboxSelect() {
267
        return typifiedNamesComboboxSelect;
268
    }
269

    
270
    @Override
271
    public NativeSelect getTypeStatusSelect() {
272
        return typeStatusSelect;
273
    }
274

    
275
    @Override
276
    public ToOneRelatedEntityCombobox<Reference> getDesignationReferenceCombobox() {
277
        return designationReferenceCombobox;
278
    }
279

    
280
    @Override
281
    public boolean isShowTypeFlags() {
282
        return showTypeFlags;
283
    }
284

    
285
    @Override
286
    public void setShowTypeFlags(boolean showTypeFlags) {
287
        this.showTypeFlags = showTypeFlags;
288
    }
289

    
290
    @Override
291
    public AnnotationType[] getEditableAnotationTypes() {
292
        return editableAnotationTypes;
293
    }
294

    
295

    
296
    @Override
297
    public void setEditableAnotationTypes(AnnotationType... editableAnotationTypes) {
298
        this.editableAnotationTypes = editableAnotationTypes;
299
    }
300

    
301

    
302
    @Override
303
    public FilterableAnnotationsField getAnnotationsField() {
304
        return annotationsListField;
305
    }
306

    
307
    @Override
308
    public void setInTypedesignationOnlyAct(Optional<Boolean> isInTypedesignationOnlyAct) {
309
        this.inTypedesignationOnlyAct = isInTypedesignationOnlyAct;
310
    }
311

    
312
    @Override
313
    public Optional<Boolean> isInTypedesignationOnlyAct() {
314
        return inTypedesignationOnlyAct;
315
    }
316
}
(3-3/18)