Revision 90e5b45a
Added by Andreas Kohlbecker over 5 years ago
src/main/java/eu/etaxonomy/cdm/vaadin/event/InstitutionEditorAction.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.event; |
|
10 |
|
|
11 |
import java.util.UUID; |
|
12 |
|
|
13 |
import com.vaadin.ui.Button; |
|
14 |
import com.vaadin.ui.Field; |
|
15 |
|
|
16 |
import eu.etaxonomy.cdm.model.agent.Institution; |
|
17 |
import eu.etaxonomy.vaadin.event.EditorActionType; |
|
18 |
import eu.etaxonomy.vaadin.mvp.AbstractView; |
|
19 |
|
|
20 |
/** |
|
21 |
* @author a.kohlbecker |
|
22 |
* @since Mar 22, 2017 |
|
23 |
*/ |
|
24 |
public class InstitutionEditorAction extends AbstractEditorAction<Institution> { |
|
25 |
|
|
26 |
/** |
|
27 |
* @param eventType |
|
28 |
*/ |
|
29 |
public InstitutionEditorAction(EditorActionType type) { |
|
30 |
super(type); |
|
31 |
} |
|
32 |
|
|
33 |
/** |
|
34 |
* @param action |
|
35 |
* @param source |
|
36 |
*/ |
|
37 |
public InstitutionEditorAction(EditorActionType action, Button source, Field<Institution> target, AbstractView sourceView) { |
|
38 |
super(action, source, target, sourceView); |
|
39 |
} |
|
40 |
|
|
41 |
/** |
|
42 |
* @param action |
|
43 |
* @param entityId |
|
44 |
* @param source |
|
45 |
* @param sourceView |
|
46 |
*/ |
|
47 |
public InstitutionEditorAction(EditorActionType action, UUID entityUuid, Button source, Field<Institution> target, AbstractView sourceView) { |
|
48 |
super(action, entityUuid, source, target, sourceView); |
|
49 |
} |
|
50 |
|
|
51 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/model/common/AgentBaseDTO.java | ||
---|---|---|
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.model.common; |
|
10 |
|
|
11 |
import eu.etaxonomy.cdm.model.agent.AgentBase; |
|
12 |
import eu.etaxonomy.cdm.vaadin.model.CdmEntityAdapterDTO; |
|
13 |
|
|
14 |
/** |
|
15 |
* @author a.kohlbecker |
|
16 |
* @since Jul 25, 2018 |
|
17 |
* |
|
18 |
*/ |
|
19 |
public class AgentBaseDTO extends CdmEntityAdapterDTO<AgentBase<?>> { |
|
20 |
|
|
21 |
private static final long serialVersionUID = 8457280951445449327L; |
|
22 |
|
|
23 |
/** |
|
24 |
* @param entity |
|
25 |
*/ |
|
26 |
public AgentBaseDTO(AgentBase<?> entity) { |
|
27 |
super(entity); |
|
28 |
// TODO Auto-generated constructor stub |
|
29 |
} |
|
30 |
|
|
31 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/model/common/InstitutionDTO.java | ||
---|---|---|
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.model.common; |
|
10 |
|
|
11 |
import eu.etaxonomy.cdm.model.agent.Institution; |
|
12 |
import eu.etaxonomy.cdm.vaadin.model.CdmEntityAdapterDTO; |
|
13 |
|
|
14 |
/** |
|
15 |
* @author a.kohlbecker |
|
16 |
* @since Jul 25, 2018 |
|
17 |
* |
|
18 |
*/ |
|
19 |
public class InstitutionDTO extends CdmEntityAdapterDTO<Institution> { |
|
20 |
|
|
21 |
private static final long serialVersionUID = 8457280951445449327L; |
|
22 |
|
|
23 |
/** |
|
24 |
* @param entity |
|
25 |
*/ |
|
26 |
public InstitutionDTO(Institution entity) { |
|
27 |
super(entity); |
|
28 |
} |
|
29 |
|
|
30 |
public void setCode(String code){ |
|
31 |
entity.setCode(code); |
|
32 |
} |
|
33 |
|
|
34 |
public String getCode(){ |
|
35 |
return entity.getCode(); |
|
36 |
} |
|
37 |
|
|
38 |
/** |
|
39 |
* Returns the full name, as distinct from a code, an acronym or initials, |
|
40 |
* by which this institution is generally known. |
|
41 |
*/ |
|
42 |
public String getName(){ |
|
43 |
return entity.getName(); |
|
44 |
} |
|
45 |
/** |
|
46 |
* @see #getName() |
|
47 |
*/ |
|
48 |
public void setName(String name){ |
|
49 |
entity.setName(name); |
|
50 |
} |
|
51 |
|
|
52 |
/** |
|
53 |
* Returns the parent institution of this institution. |
|
54 |
* This is for instance the case when this institution is a herbarium |
|
55 |
* belonging to a parent institution such as a museum. |
|
56 |
*/ |
|
57 |
public Institution getIsPartOf(){ |
|
58 |
return entity.getIsPartOf(); |
|
59 |
} |
|
60 |
|
|
61 |
/** |
|
62 |
* Assigns a parent institution to which this institution belongs. |
|
63 |
* |
|
64 |
* @param isPartOf the parent institution |
|
65 |
* @see #getIsPartOf() |
|
66 |
*/ |
|
67 |
public void setIsPartOf(Institution parentInstitution){ |
|
68 |
entity.setIsPartOf(parentInstitution); |
|
69 |
} |
|
70 |
|
|
71 |
|
|
72 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionEditorPresenter.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.common; |
|
10 |
|
|
11 |
import java.util.Arrays; |
|
12 |
import java.util.List; |
|
13 |
import java.util.UUID; |
|
14 |
|
|
15 |
import org.springframework.context.annotation.Scope; |
|
16 |
import org.vaadin.spring.events.annotation.EventBusListenerMethod; |
|
17 |
|
|
18 |
import com.vaadin.spring.annotation.SpringComponent; |
|
19 |
|
|
20 |
import eu.etaxonomy.cdm.api.service.IService; |
|
21 |
import eu.etaxonomy.cdm.model.agent.AgentBase; |
|
22 |
import eu.etaxonomy.cdm.model.agent.Institution; |
|
23 |
import eu.etaxonomy.cdm.model.occurrence.Collection; |
|
24 |
import eu.etaxonomy.cdm.service.CdmFilterablePagingProvider; |
|
25 |
import eu.etaxonomy.cdm.service.UserHelperAccess; |
|
26 |
import eu.etaxonomy.cdm.vaadin.event.EditorActionTypeFilter; |
|
27 |
import eu.etaxonomy.cdm.vaadin.event.EntityChangeEvent; |
|
28 |
import eu.etaxonomy.cdm.vaadin.event.InstitutionEditorAction; |
|
29 |
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityReloader; |
|
30 |
import eu.etaxonomy.cdm.vaadin.model.common.InstitutionDTO; |
|
31 |
import eu.etaxonomy.vaadin.mvp.AbstractCdmDTOEditorPresenter; |
|
32 |
import eu.etaxonomy.vaadin.mvp.BoundField; |
|
33 |
import eu.etaxonomy.vaadin.ui.view.PopupView; |
|
34 |
|
|
35 |
/** |
|
36 |
* @author a.kohlbecker |
|
37 |
* @since Dec 21, 2017 |
|
38 |
* |
|
39 |
*/ |
|
40 |
@SpringComponent |
|
41 |
@Scope("prototype") |
|
42 |
public class InstitutionEditorPresenter extends AbstractCdmDTOEditorPresenter<InstitutionDTO, Institution, InstitutionPopupEditorView> { |
|
43 |
|
|
44 |
private static final long serialVersionUID = -1996365248431425021L; |
|
45 |
|
|
46 |
|
|
47 |
/** |
|
48 |
* {@inheritDoc} |
|
49 |
*/ |
|
50 |
@Override |
|
51 |
protected Institution loadCdmEntity(UUID identifier) { |
|
52 |
|
|
53 |
List<String> initStrategy = Arrays.asList(new String []{ |
|
54 |
|
|
55 |
"$", |
|
56 |
"contact.$", |
|
57 |
"isPartOf.$", |
|
58 |
} |
|
59 |
); |
|
60 |
|
|
61 |
Institution bean; |
|
62 |
if(identifier != null){ |
|
63 |
bean = (Institution) getRepo().getAgentService().load(identifier, initStrategy); |
|
64 |
} else { |
|
65 |
bean = Institution.NewInstance(); |
|
66 |
} |
|
67 |
return bean; |
|
68 |
} |
|
69 |
|
|
70 |
/** |
|
71 |
* {@inheritDoc} |
|
72 |
*/ |
|
73 |
@Override |
|
74 |
protected void guaranteePerEntityCRUDPermissions(UUID identifier) { |
|
75 |
if(crud != null){ |
|
76 |
newAuthorityCreated = UserHelperAccess.userHelper().createAuthorityForCurrentUser(Collection.class, identifier, crud, null); |
|
77 |
} |
|
78 |
|
|
79 |
} |
|
80 |
|
|
81 |
/** |
|
82 |
* {@inheritDoc} |
|
83 |
*/ |
|
84 |
@Override |
|
85 |
protected void guaranteePerEntityCRUDPermissions(Institution bean) { |
|
86 |
if(crud != null){ |
|
87 |
newAuthorityCreated = UserHelperAccess.userHelper().createAuthorityForCurrentUser(bean, crud, null); |
|
88 |
} |
|
89 |
|
|
90 |
} |
|
91 |
|
|
92 |
/** |
|
93 |
* {@inheritDoc} |
|
94 |
*/ |
|
95 |
@Override |
|
96 |
protected IService<Institution> getService() { |
|
97 |
// TODO Auto-generated method stub |
|
98 |
return null; |
|
99 |
} |
|
100 |
|
|
101 |
/** |
|
102 |
* {@inheritDoc} |
|
103 |
*/ |
|
104 |
@Override |
|
105 |
public void handleViewEntered() { |
|
106 |
super.handleViewEntered(); |
|
107 |
|
|
108 |
CdmFilterablePagingProvider<AgentBase, Institution> collectionPagingProvider = new CdmFilterablePagingProvider<AgentBase, Institution>(getRepo().getAgentService(), Institution.class); |
|
109 |
getView().getPartOfCombobox().getSelect().loadFrom(collectionPagingProvider, collectionPagingProvider, collectionPagingProvider.getPageSize()); |
|
110 |
getView().getPartOfCombobox().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<Institution>(getView().getPartOfCombobox(), this)); |
|
111 |
|
|
112 |
} |
|
113 |
|
|
114 |
@EventBusListenerMethod(filter = EditorActionTypeFilter.Add.class) |
|
115 |
public void onInstitutionEditorActionAdd(InstitutionEditorAction event) { |
|
116 |
|
|
117 |
if(!checkFromOwnView(event)){ |
|
118 |
return; |
|
119 |
} |
|
120 |
|
|
121 |
InstitutionPopupEditor intitutionPopuEditor = openPopupEditor(InstitutionPopupEditor.class, event); |
|
122 |
|
|
123 |
intitutionPopuEditor.grantToCurrentUser(this.crud); |
|
124 |
intitutionPopuEditor.withDeleteButton(true); |
|
125 |
intitutionPopuEditor.loadInEditor(null); |
|
126 |
} |
|
127 |
|
|
128 |
@EventBusListenerMethod(filter = EditorActionTypeFilter.Edit.class) |
|
129 |
public void onCollectionEditorActionEdit(InstitutionEditorAction event) { |
|
130 |
|
|
131 |
if(!checkFromOwnView(event)){ |
|
132 |
return; |
|
133 |
} |
|
134 |
|
|
135 |
InstitutionPopupEditor intitutionPopuEditor = openPopupEditor(InstitutionPopupEditor.class, event); |
|
136 |
|
|
137 |
intitutionPopuEditor.grantToCurrentUser(this.crud); |
|
138 |
intitutionPopuEditor.withDeleteButton(true); |
|
139 |
intitutionPopuEditor.loadInEditor(event.getEntityUuid()); |
|
140 |
} |
|
141 |
|
|
142 |
@EventBusListenerMethod() |
|
143 |
public void onEntityChangeEvent(EntityChangeEvent<?> event){ |
|
144 |
|
|
145 |
BoundField boundTargetField = boundTargetField((PopupView) event.getSourceView()); |
|
146 |
|
|
147 |
if(boundTargetField != null){ |
|
148 |
if(boundTargetField.matchesPropertyIdPath("isPartOf")){ |
|
149 |
if(event.isCreateOrModifiedType()){ |
|
150 |
|
|
151 |
Institution newInstitution = (Institution) event.getEntity(); |
|
152 |
getCache().load(newInstitution); |
|
153 |
if(event.isCreatedType()){ |
|
154 |
getView().getPartOfCombobox().setValue(newInstitution); |
|
155 |
} else { |
|
156 |
getView().getPartOfCombobox().reload(); |
|
157 |
} |
|
158 |
} |
|
159 |
|
|
160 |
} |
|
161 |
} |
|
162 |
} |
|
163 |
|
|
164 |
/** |
|
165 |
* {@inheritDoc} |
|
166 |
*/ |
|
167 |
@Override |
|
168 |
protected InstitutionDTO createDTODecorator(Institution cdmEntitiy) { |
|
169 |
return new InstitutionDTO(cdmEntitiy); |
|
170 |
} |
|
171 |
|
|
172 |
|
|
173 |
|
|
174 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionPopupEditor.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.common; |
|
10 |
|
|
11 |
import org.springframework.context.annotation.Scope; |
|
12 |
import org.springframework.security.core.GrantedAuthority; |
|
13 |
|
|
14 |
import com.vaadin.spring.annotation.SpringComponent; |
|
15 |
import com.vaadin.ui.GridLayout; |
|
16 |
import com.vaadin.ui.TextField; |
|
17 |
|
|
18 |
import eu.etaxonomy.cdm.model.agent.Institution; |
|
19 |
import eu.etaxonomy.cdm.vaadin.event.InstitutionEditorAction; |
|
20 |
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater; |
|
21 |
import eu.etaxonomy.cdm.vaadin.model.common.InstitutionDTO; |
|
22 |
import eu.etaxonomy.cdm.vaadin.permission.AccessRestrictedView; |
|
23 |
import eu.etaxonomy.cdm.vaadin.util.CdmTitleCacheCaptionGenerator; |
|
24 |
import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox; |
|
25 |
import eu.etaxonomy.vaadin.event.EditorActionType; |
|
26 |
import eu.etaxonomy.vaadin.mvp.AbstractCdmDTOPopupEditor; |
|
27 |
|
|
28 |
/** |
|
29 |
* @author a.kohlbecker |
|
30 |
* @since Dec 21, 2017 |
|
31 |
* |
|
32 |
*/ |
|
33 |
@SpringComponent |
|
34 |
@Scope("prototype") |
|
35 |
public class InstitutionPopupEditor extends AbstractCdmDTOPopupEditor<InstitutionDTO, Institution, InstitutionEditorPresenter> implements InstitutionPopupEditorView, AccessRestrictedView { |
|
36 |
|
|
37 |
private static final long serialVersionUID = 2019724189877425882L; |
|
38 |
|
|
39 |
private static final int GRID_COLS = 3; |
|
40 |
|
|
41 |
private static final int GRID_ROWS = 3; |
|
42 |
|
|
43 |
TextField codeField; |
|
44 |
TextField codeStandardField; |
|
45 |
TextField townOrLocationField; |
|
46 |
ToOneRelatedEntityCombobox<Institution> partOfCombobox; |
|
47 |
|
|
48 |
|
|
49 |
/** |
|
50 |
* @param layout |
|
51 |
* @param dtoType |
|
52 |
*/ |
|
53 |
public InstitutionPopupEditor() { |
|
54 |
super(new GridLayout(GRID_COLS, GRID_ROWS), InstitutionDTO.class); |
|
55 |
} |
|
56 |
|
|
57 |
/** |
|
58 |
* {@inheritDoc} |
|
59 |
*/ |
|
60 |
@Override |
|
61 |
public String getWindowCaption() { |
|
62 |
return "Institution editor"; |
|
63 |
} |
|
64 |
|
|
65 |
/** |
|
66 |
* {@inheritDoc} |
|
67 |
*/ |
|
68 |
@Override |
|
69 |
public int getWindowWidth() { |
|
70 |
return 500; |
|
71 |
} |
|
72 |
|
|
73 |
/** |
|
74 |
* {@inheritDoc} |
|
75 |
*/ |
|
76 |
@Override |
|
77 |
public void focusFirst() { |
|
78 |
codeField.focus(); |
|
79 |
} |
|
80 |
|
|
81 |
/** |
|
82 |
* {@inheritDoc} |
|
83 |
*/ |
|
84 |
@Override |
|
85 |
public boolean allowAnonymousAccess() { |
|
86 |
return false; |
|
87 |
} |
|
88 |
|
|
89 |
/** |
|
90 |
* {@inheritDoc} |
|
91 |
*/ |
|
92 |
@Override |
|
93 |
public java.util.Collection<java.util.Collection<GrantedAuthority>> allowedGrantedAuthorities() { |
|
94 |
return null; |
|
95 |
} |
|
96 |
|
|
97 |
/** |
|
98 |
* {@inheritDoc} |
|
99 |
*/ |
|
100 |
@Override |
|
101 |
protected String getDefaultComponentStyles() { |
|
102 |
return "tiny"; |
|
103 |
} |
|
104 |
|
|
105 |
/** |
|
106 |
* {@inheritDoc} |
|
107 |
*/ |
|
108 |
@Override |
|
109 |
protected void initContent() { |
|
110 |
|
|
111 |
GridLayout grid = (GridLayout)getFieldLayout(); |
|
112 |
grid.setSizeFull(); |
|
113 |
grid.setSpacing(true); |
|
114 |
|
|
115 |
int row = 0; |
|
116 |
codeField = addTextField("Code", "code", 0, row, 0, row); |
|
117 |
codeField.setWidth(100, Unit.PIXELS); |
|
118 |
|
|
119 |
townOrLocationField = addTextField("Name", "name", 1, row, 2, row); |
|
120 |
townOrLocationField.setWidth(200, Unit.PIXELS); |
|
121 |
|
|
122 |
row++; |
|
123 |
|
|
124 |
partOfCombobox = new ToOneRelatedEntityCombobox<Institution>("Part of", Institution.class); |
|
125 |
|
|
126 |
|
|
127 |
partOfCombobox.setWidth(300, Unit.PIXELS); |
|
128 |
addField(partOfCombobox, "isPartOf", 0, row, 1, row); |
|
129 |
|
|
130 |
partOfCombobox.getSelect().setCaptionGenerator( |
|
131 |
new CdmTitleCacheCaptionGenerator<Institution>() |
|
132 |
); |
|
133 |
partOfCombobox.getSelect().addValueChangeListener( |
|
134 |
new ToOneRelatedEntityButtonUpdater<Institution>(partOfCombobox) |
|
135 |
); |
|
136 |
|
|
137 |
|
|
138 |
partOfCombobox.addClickListenerAddEntity( e -> getViewEventBus().publish(this, |
|
139 |
new InstitutionEditorAction( |
|
140 |
EditorActionType.ADD, |
|
141 |
null, |
|
142 |
partOfCombobox, |
|
143 |
this) |
|
144 |
)); |
|
145 |
partOfCombobox.addClickListenerEditEntity(e -> { |
|
146 |
if(partOfCombobox.getValue() != null){ |
|
147 |
getViewEventBus().publish(this, |
|
148 |
new InstitutionEditorAction( |
|
149 |
EditorActionType.EDIT, |
|
150 |
partOfCombobox.getValue().getUuid(), |
|
151 |
e.getButton(), |
|
152 |
partOfCombobox, |
|
153 |
this |
|
154 |
) |
|
155 |
); |
|
156 |
} |
|
157 |
}); |
|
158 |
|
|
159 |
} |
|
160 |
|
|
161 |
/* ------------------ View Interface methods -------------------- */ |
|
162 |
|
|
163 |
@Override |
|
164 |
public ToOneRelatedEntityCombobox<Institution> getPartOfCombobox(){ |
|
165 |
return partOfCombobox; |
|
166 |
} |
|
167 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/view/common/InstitutionPopupEditorView.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.common; |
|
10 |
|
|
11 |
import eu.etaxonomy.cdm.model.agent.Institution; |
|
12 |
import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox; |
|
13 |
import eu.etaxonomy.vaadin.mvp.ApplicationView; |
|
14 |
|
|
15 |
/** |
|
16 |
* @author a.kohlbecker |
|
17 |
* @since Dec 21, 2017 |
|
18 |
* |
|
19 |
*/ |
|
20 |
public interface InstitutionPopupEditorView extends ApplicationView<InstitutionEditorPresenter> { |
|
21 |
|
|
22 |
ToOneRelatedEntityCombobox<Institution> getPartOfCombobox(); |
|
23 |
|
|
24 |
} |
Also available in: Unified diff
fix #7570 implementing intitution editor with basic set of fields