Project

General

Profile

Download (6.8 KB) Statistics
| Branch: | Tag: | Revision:
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.component.common;
10

    
11
import com.vaadin.data.fieldgroup.BeanFieldGroup;
12
import com.vaadin.data.fieldgroup.FieldGroup;
13
import com.vaadin.data.util.BeanItem;
14
import com.vaadin.server.FontAwesome;
15
import com.vaadin.server.UserError;
16
import com.vaadin.ui.Button;
17
import com.vaadin.ui.Component;
18
import com.vaadin.ui.CssLayout;
19
import com.vaadin.ui.themes.ValoTheme;
20

    
21
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
22
import eu.etaxonomy.cdm.model.agent.Person;
23
import eu.etaxonomy.cdm.model.agent.Team;
24
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
25
import eu.etaxonomy.cdm.vaadin.security.UserHelper;
26
import eu.etaxonomy.cdm.vaadin.util.converter.CdmBaseDeproxyConverter;
27
import eu.etaxonomy.vaadin.component.CompositeCustomField;
28
import eu.etaxonomy.vaadin.component.SwitchableTextField;
29
import eu.etaxonomy.vaadin.component.ToManyRelatedEntitiesListSelect;
30

    
31
/**
32
 * @author a.kohlbecker
33
 * @since May 11, 2017
34
 *
35
 */
36
public class TeamOrPersonField extends CompositeCustomField<TeamOrPersonBase<?>> {
37

    
38
    private static final long serialVersionUID = 660806402243118112L;
39

    
40
    private static final String PRIMARY_STYLE = "v-team-or-person-field";
41

    
42
    private CssLayout root = new CssLayout();
43
    private CssLayout toolBar= new CssLayout();
44
    private CssLayout compositeWrapper = new CssLayout();
45

    
46
    private Button removeButton = new Button(FontAwesome.REMOVE);
47
    private Button personButton = new Button(FontAwesome.USER);
48
    private Button teamButton = new Button(FontAwesome.USERS);
49

    
50
    // Fields for case when value is a Person
51
    private PersonField personField = new PersonField();
52

    
53
    // Fields for case when value is a Team
54
    private SwitchableTextField titleField = new SwitchableTextField("Team (bibliographic)");
55
    private SwitchableTextField nomenclaturalTitleField = new SwitchableTextField("Team (nomenclatural)");
56
    private ToManyRelatedEntitiesListSelect<Person, PersonField> personsListEditor = new ToManyRelatedEntitiesListSelect<Person, PersonField>(Person.class, PersonField.class, "Teammembers");
57

    
58
    private BeanFieldGroup<Team> fieldGroup  = new BeanFieldGroup<>(Team.class);
59

    
60
    public TeamOrPersonField(String caption){
61

    
62
        setCaption(caption);
63

    
64
        addStyledComponent(personField);
65
        addStyledComponent(titleField);
66
        addStyledComponent(nomenclaturalTitleField);
67
        addStyledComponent(personsListEditor);
68
        addStyledComponents(removeButton, personButton, teamButton);
69

    
70

    
71
        addSizedComponent(root);
72
        addSizedComponent(compositeWrapper);
73
        addSizedComponent(personField);
74
        addSizedComponent(titleField);
75
        addSizedComponent(nomenclaturalTitleField);
76
        addSizedComponent(personsListEditor);
77

    
78
        setConverter(new CdmBaseDeproxyConverter<TeamOrPersonBase<?>>());
79

    
80
        updateToolBarButtonStates();
81
    }
82

    
83
    /**
84
     * {@inheritDoc}
85
     */
86
    @Override
87
    protected Component initContent() {
88

    
89
        removeButton.addClickListener(e -> {
90
            setValue(null);
91
            updateToolBarButtonStates();
92
        });
93
        removeButton.setDescription("Remove");
94

    
95
        personButton.addClickListener(e -> {
96
            setValue(Person.NewInstance()); // FIXME add SelectField or open select dialog, use ToOneSelect field!!
97
            updateToolBarButtonStates();
98
        });
99
        personButton.setDescription("Add person");
100
        teamButton.addClickListener(e -> {
101
            setValue(Team.NewInstance()); // FIXME add SelectField or open select dialog, use ToOneSelect field!!
102
            updateToolBarButtonStates();
103
        });
104
        teamButton.setDescription("Add team");
105

    
106
        toolBar.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP + " toolbar");
107
        toolBar.addComponents(removeButton, personButton, teamButton);
108

    
109
        compositeWrapper.setStyleName("margin-wrapper");
110
        compositeWrapper.addComponent(toolBar);
111

    
112
        root.setPrimaryStyleName(PRIMARY_STYLE);
113
        root.addComponent(compositeWrapper);
114
        return root;
115
    }
116

    
117
    /**
118
     * {@inheritDoc}
119
     */
120
    @Override
121
    public Class getType() {
122
        return TeamOrPersonBase.class;
123
    }
124

    
125
    private void updateToolBarButtonStates(){
126
        TeamOrPersonBase<?> val = getInternalValue();
127
        boolean userCanCreate = UserHelper.fromSession().userHasPermission(Person.class, "CREATE");
128
        removeButton.setEnabled(val != null);
129
        personButton.setEnabled(userCanCreate && val == null);
130
        teamButton.setEnabled(userCanCreate && val == null);
131
    }
132

    
133
    /**
134
     * {@inheritDoc}
135
     */
136
    @Override
137
    protected void setInternalValue(TeamOrPersonBase<?> newValue) {
138

    
139
        super.setInternalValue(newValue);
140

    
141
        newValue = HibernateProxyHelper.deproxy(newValue);
142

    
143
        compositeWrapper.removeAllComponents();
144
        compositeWrapper.addComponent(toolBar);
145

    
146
        if(newValue == null) {
147
            return;
148
        }
149

    
150
        if(Person.class.isAssignableFrom(newValue.getClass())){
151
            // value is a Person:
152
            compositeWrapper.addComponent(personField);
153

    
154
            personField.setValue((Person) newValue);
155
            personField.registerParentFieldGroup(fieldGroup);
156

    
157
        }
158
        else if(Team.class.isAssignableFrom(newValue.getClass())){
159
            // otherwise it a Team
160

    
161
            compositeWrapper.addComponents(titleField, nomenclaturalTitleField, personsListEditor);
162

    
163
            titleField.bindTo(fieldGroup, "titleCache", "protectedTitleCache");
164
            nomenclaturalTitleField.bindTo(fieldGroup, "nomenclaturalTitle", "protectedNomenclaturalTitleCache");
165
            fieldGroup.bind(personsListEditor, "teamMembers");
166

    
167
            fieldGroup.setItemDataSource(new BeanItem<Team>((Team)newValue));
168
            personsListEditor.registerParentFieldGroup(fieldGroup);
169

    
170

    
171
        } else {
172
            setComponentError(new UserError("TeamOrPersonField Error: Unsupported value type: " + newValue.getClass().getName()));
173
        }
174

    
175
        updateToolBarButtonStates();
176
        checkUserPermissions(newValue);
177
    }
178

    
179
    private void checkUserPermissions(TeamOrPersonBase<?> newValue) {
180
        boolean userCanEdit = UserHelper.fromSession().userHasPermission(newValue, "DELETE", "UPDATE");
181
        titleField.setEnabled(userCanEdit);
182
        nomenclaturalTitleField.setEnabled(userCanEdit);
183
    }
184

    
185
    /**
186
     * {@inheritDoc}
187
     */
188
    @Override
189
    protected void addDefaultStyles() {
190
        // no default styles here
191
    }
192

    
193
    /**
194
     * {@inheritDoc}
195
     */
196
    @Override
197
    public FieldGroup getFieldGroup() {
198
        return fieldGroup;
199
    }
200

    
201
    public Component[] getCachFields(){
202
        return new Component[]{titleField, nomenclaturalTitleField};
203
    }
204

    
205

    
206

    
207
}
(4-4/5)