Project

General

Profile

Download (11.8 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.Optional;
12

    
13
import org.springframework.context.annotation.Scope;
14

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

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

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

    
50
    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.";
51

    
52
    private static final String TYPE_STATUS_MUST_BE_SET = "\"Type status\" must be set.";
53

    
54
    private static final long serialVersionUID = 8233876984579344340L;
55

    
56
    private static final int GRID_COLS = 4;
57
    private static final int GRID_ROWS = 7;
58

    
59
    private CheckBox conservedTypeField;
60
    private CheckBox rejectedTypeField;
61
    private CheckBox notDesignatedField;
62

    
63
    private ToOneRelatedEntityCombobox<TaxonName> typeNameField;
64

    
65
    private ToManyRelatedEntitiesComboboxSelect<TaxonName> typifiedNamesComboboxSelect;
66

    
67
    private NativeSelect typeStatusSelect;
68

    
69
    private ToOneRelatedEntityCombobox<Reference> designationReferenceCombobox;
70

    
71
    private TextField designationReferenceDetailField;
72

    
73
    private boolean showTypeFlags = true;
74

    
75
    private Optional<Boolean> inTypedesignationOnlyAct = Optional.empty();
76

    
77
    private FilterableAnnotationsField annotationsListField;
78

    
79
    private AnnotationType[] editableAnotationTypes = RegistrationUIDefaults.EDITABLE_ANOTATION_TYPES;
80

    
81

    
82
    /**
83
     * @param layout
84
     * @param dtoType
85
     */
86
    public NameTypeDesignationPopupEditor() {
87
        super(new GridLayout(GRID_COLS, GRID_ROWS), NameTypeDesignation.class);
88
    }
89

    
90
    /**
91
     * {@inheritDoc}
92
     */
93
    @Override
94
    public String getWindowCaption() {
95
        return "Name type designation editor";
96
    }
97

    
98
    /**
99
     * {@inheritDoc}
100
     */
101
    @Override
102
    public void focusFirst() {
103
        // none
104
    }
105

    
106
    /**
107
     * {@inheritDoc}
108
     */
109
    @Override
110
    protected String getDefaultComponentStyles() {
111
        return "tiny";
112
    }
113

    
114
    /**
115
     * {@inheritDoc}
116
     */
117
    @Override
118
    protected void initContent() {
119
        /*
120
            conservedType : boolean
121
            rejectedType : boolean
122
            typeName : TaxonName
123

    
124
            typifiedNames
125
            notDesignated : boolean
126
            registrations : Set<Registration>
127
            typeStatus : T
128

    
129
            citation : Reference
130
            citationMicroReference : String
131
            originalNameString : String
132
         */
133

    
134
        GridLayout grid = (GridLayout)getFieldLayout();
135
        // grid.setSizeFull();
136
        grid.setSpacing(true);
137
        grid.setColumnExpandRatio(0, 0.25f);
138
        grid.setColumnExpandRatio(1, 0.25f);
139
        grid.setColumnExpandRatio(2, 0.25f);
140
        grid.setColumnExpandRatio(3, 0.25f);
141

    
142
        int row = 0;
143

    
144
        if(showTypeFlags){
145
            conservedTypeField = addCheckBox("Conserved type", "conservedType", 0, row);
146
            conservedTypeField.addValueChangeListener(e -> updateDesignationReferenceFields());
147
            rejectedTypeField = addCheckBox("Rejected type", "rejectedType", 1, row);
148
            rejectedTypeField.addValueChangeListener(e -> updateDesignationReferenceFields());
149
            notDesignatedField = addCheckBox("Not designated", "notDesignated", 2, row);
150
            notDesignatedField.addValueChangeListener(e -> updateDesignationReferenceFields());
151
            row++;
152
        }
153

    
154
        typeStatusSelect = new NativeSelect("Type status");
155
        typeStatusSelect.setNullSelectionAllowed(false);
156
        typeStatusSelect.setWidth(100, Unit.PERCENTAGE);
157
        typeStatusSelect.setRequired(true);
158
        typeStatusSelect.setRequiredError(TYPE_STATUS_OR_FLAG_MUST_BE_SET);
159
        addField(typeStatusSelect, "typeStatus", 0, row, 1, row);
160
        grid.setComponentAlignment(typeStatusSelect, Alignment.TOP_RIGHT);
161
        typeStatusSelect.addValueChangeListener(e -> {
162
            updateDesignationReferenceFields();
163
        });
164

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

    
188
        row++;
189
        typifiedNamesComboboxSelect = new ToManyRelatedEntitiesComboboxSelect<TaxonName>(TaxonName.class, "Typified names");
190
        typifiedNamesComboboxSelect.setConverter(new SetToListConverter<TaxonName>());
191
        typifiedNamesComboboxSelect.setEditPermissionTester(new CdmEditDeletePermissionTester());
192
        addField(typifiedNamesComboboxSelect, "typifiedNames", 0, row, 3, row);
193
        typifiedNamesComboboxSelect.setReadOnly(false); // FIXME this does not help, see #7389
194

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

    
217
        row++;
218
        annotationsListField = new FilterableAnnotationsField("Editorial notes");
219
        annotationsListField.setWidth(100, Unit.PERCENTAGE);
220
        boolean isCurator = UserHelperAccess.userHelper().userIs(new RoleProberImpl(RolesAndPermissions.ROLE_CURATION));
221
        boolean isAdmin = UserHelperAccess.userHelper().userIsAdmin();
222
        if(isCurator || isAdmin){
223
            annotationsListField.withNewButton(true);
224
        } else {
225
            annotationsListField.setAnnotationTypesVisible(editableAnotationTypes);
226
        }
227
        addField(annotationsListField, "annotations", 0, row, 3, row);
228
    }
229

    
230

    
231

    
232
    @Override
233
    protected void afterItemDataSourceSet() {
234
        super.afterItemDataSourceSet();
235
        updateDesignationReferenceFields();
236
    }
237

    
238
    protected void updateDesignationReferenceFields() {
239
        boolean hasDesignationSource = typeStatusSelect.getValue() != null && ((NameTypeDesignationStatus)typeStatusSelect.getValue()).hasDesignationSource();
240
        designationReferenceDetailField.setVisible(hasDesignationSource);
241
        designationReferenceCombobox.setVisible(hasDesignationSource);
242
        designationReferenceCombobox.setRequired(hasDesignationSource);
243
        // NOTE: For better usability we only hide these fields here,
244
        // NameTypeDesignationPresenter.preSaveBean(NameTypeDesignation bean) will empty them in needed
245

    
246
        boolean isInTypedesignationOnlyAct = !isInTypedesignationOnlyAct().isPresent() || isInTypedesignationOnlyAct().get();
247
        boolean typeStatusRequired = !(conservedTypeField.getValue().booleanValue()
248
                || rejectedTypeField.getValue().booleanValue()
249
                || notDesignatedField.getValue().booleanValue());
250
        // need to check for isInTypedesignationOnlyAct also, otherwise the reference field will not show up
251
        // and the type designation might not be associated with the registration
252
        // TODO discuss with Henning
253
        typeStatusSelect.setRequired(typeStatusRequired || checkInTypeDesignationOnlyAct());
254
        if(typeStatusRequired && checkInTypeDesignationOnlyAct()) {
255
            designationReferenceCombobox.setRequiredError(TYPE_STATUS_MUST_BE_SET);
256
        } else {
257
            designationReferenceCombobox.setRequiredError(TYPE_STATUS_OR_FLAG_MUST_BE_SET);
258
        }
259

    
260

    
261
    }
262

    
263
    @Override
264
    public ToOneRelatedEntityCombobox<TaxonName> getTypeNameField() {
265
        return typeNameField;
266
    }
267

    
268
    @Override
269
    public ToManyRelatedEntitiesComboboxSelect<TaxonName> getTypifiedNamesComboboxSelect() {
270
        return typifiedNamesComboboxSelect;
271
    }
272

    
273
    @Override
274
    public NativeSelect getTypeStatusSelect() {
275
        return typeStatusSelect;
276
    }
277

    
278
    @Override
279
    public ToOneRelatedEntityCombobox<Reference> getDesignationReferenceCombobox() {
280
        return designationReferenceCombobox;
281
    }
282

    
283
    @Override
284
    public boolean isShowTypeFlags() {
285
        return showTypeFlags;
286
    }
287

    
288
    @Override
289
    public void setShowTypeFlags(boolean showTypeFlags) {
290
        this.showTypeFlags = showTypeFlags;
291
    }
292

    
293
    @Override
294
    public AnnotationType[] getEditableAnotationTypes() {
295
        return editableAnotationTypes;
296
    }
297

    
298

    
299
    @Override
300
    public void setEditableAnotationTypes(AnnotationType... editableAnotationTypes) {
301
        this.editableAnotationTypes = editableAnotationTypes;
302
    }
303

    
304

    
305
    @Override
306
    public FilterableAnnotationsField getAnnotationsField() {
307
        return annotationsListField;
308
    }
309

    
310
    @Override
311
    public void setInTypedesignationOnlyAct(Optional<Boolean> isInTypedesignationOnlyAct) {
312
        this.inTypedesignationOnlyAct = isInTypedesignationOnlyAct;
313
    }
314

    
315
    @Override
316
    public Optional<Boolean> isInTypedesignationOnlyAct() {
317
        return inTypedesignationOnlyAct;
318
    }
319
}
(3-3/18)