Revision 904cd1c0
Added by Andreas Kohlbecker almost 6 years ago
src/main/java/eu/etaxonomy/cdm/vaadin/model/name/NameRelationshipDTO.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.name; |
|
10 |
|
|
11 |
import java.io.Serializable; |
|
12 |
|
|
13 |
import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction; |
|
14 |
import eu.etaxonomy.cdm.model.name.NameRelationship; |
|
15 |
import eu.etaxonomy.cdm.model.name.NameRelationshipType; |
|
16 |
import eu.etaxonomy.cdm.model.name.TaxonName; |
|
17 |
import eu.etaxonomy.cdm.model.reference.Reference; |
|
18 |
|
|
19 |
/** |
|
20 |
* @author a.kohlbecker |
|
21 |
* @since May 3, 2018 |
|
22 |
* |
|
23 |
*/ |
|
24 |
public class NameRelationshipDTO implements Serializable { |
|
25 |
|
|
26 |
private static final long serialVersionUID = 966322755160849163L; |
|
27 |
|
|
28 |
NameRelationship nameRel; |
|
29 |
|
|
30 |
TaxonName otherName; |
|
31 |
NameRelationshipType type; |
|
32 |
Direction direction; |
|
33 |
Reference citation; |
|
34 |
String citationMicroReference; |
|
35 |
String ruleConsidered; |
|
36 |
|
|
37 |
/** |
|
38 |
* @param entity |
|
39 |
*/ |
|
40 |
public NameRelationshipDTO(Direction direction, NameRelationshipType type) { |
|
41 |
this.direction = direction; |
|
42 |
this.type = type; |
|
43 |
} |
|
44 |
|
|
45 |
public NameRelationshipDTO(Direction direction, NameRelationship nameRel) { |
|
46 |
this.direction = direction; |
|
47 |
otherName = otherNameFrom(nameRel); |
|
48 |
type = nameRel.getType(); |
|
49 |
citation = nameRel.getCitation(); |
|
50 |
citationMicroReference = nameRel.getCitationMicroReference(); |
|
51 |
ruleConsidered = nameRel.getRuleConsidered(); |
|
52 |
} |
|
53 |
|
|
54 |
/** |
|
55 |
* @return |
|
56 |
*/ |
|
57 |
protected TaxonName otherNameFrom(NameRelationship nameRel) { |
|
58 |
return this.direction.equals(Direction.relatedTo) ? nameRel.getFromName() : nameRel.getToName(); |
|
59 |
} |
|
60 |
|
|
61 |
protected TaxonName thisNameFrom(NameRelationship nameRel) { |
|
62 |
return this.direction.equals(Direction.relatedTo) ? nameRel.getToName() : nameRel.getFromName(); |
|
63 |
} |
|
64 |
|
|
65 |
/** |
|
66 |
* @return the otherName |
|
67 |
*/ |
|
68 |
public TaxonName getOtherName() { |
|
69 |
return otherName; |
|
70 |
} |
|
71 |
|
|
72 |
/** |
|
73 |
* @param otherName the otherName to set |
|
74 |
*/ |
|
75 |
public void setOtherName(TaxonName otherName) { |
|
76 |
this.otherName = otherName; |
|
77 |
} |
|
78 |
|
|
79 |
/** |
|
80 |
* @return the type |
|
81 |
*/ |
|
82 |
public NameRelationshipType getType() { |
|
83 |
return type; |
|
84 |
} |
|
85 |
|
|
86 |
/** |
|
87 |
* @param type the type to set |
|
88 |
*/ |
|
89 |
public void setType(NameRelationshipType type) { |
|
90 |
this.type = type; |
|
91 |
} |
|
92 |
|
|
93 |
/** |
|
94 |
* @return the direction |
|
95 |
*/ |
|
96 |
public Direction getDirection() { |
|
97 |
return direction; |
|
98 |
} |
|
99 |
|
|
100 |
/** |
|
101 |
* @param direction the direction to set |
|
102 |
*/ |
|
103 |
public void setDirection(Direction direction) { |
|
104 |
this.direction = direction; |
|
105 |
} |
|
106 |
|
|
107 |
/** |
|
108 |
* @return the citation |
|
109 |
*/ |
|
110 |
public Reference getCitation() { |
|
111 |
return citation; |
|
112 |
} |
|
113 |
|
|
114 |
/** |
|
115 |
* @param citation the citation to set |
|
116 |
*/ |
|
117 |
public void setCitation(Reference citation) { |
|
118 |
this.citation = citation; |
|
119 |
} |
|
120 |
|
|
121 |
/** |
|
122 |
* @return the citationMicroReference |
|
123 |
*/ |
|
124 |
public String getCitationMicroReference() { |
|
125 |
return citationMicroReference; |
|
126 |
} |
|
127 |
|
|
128 |
/** |
|
129 |
* @param citationMicroReference the citationMicroReference to set |
|
130 |
*/ |
|
131 |
public void setCitationMicroReference(String citationMicroReference) { |
|
132 |
this.citationMicroReference = citationMicroReference; |
|
133 |
} |
|
134 |
|
|
135 |
/** |
|
136 |
* @return the ruleConsidered |
|
137 |
*/ |
|
138 |
public String getRuleConsidered() { |
|
139 |
return ruleConsidered; |
|
140 |
} |
|
141 |
|
|
142 |
/** |
|
143 |
* @param ruleConsidered the ruleConsidered to set |
|
144 |
*/ |
|
145 |
public void setRuleConsidered(String ruleConsidered) { |
|
146 |
this.ruleConsidered = ruleConsidered; |
|
147 |
} |
|
148 |
|
|
149 |
|
|
150 |
|
|
151 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/model/name/TaxonNameDTO.java | ||
---|---|---|
11 | 11 |
import java.util.HashSet; |
12 | 12 |
import java.util.List; |
13 | 13 |
import java.util.Set; |
14 |
import java.util.stream.Collectors; |
|
14 | 15 |
|
15 | 16 |
import org.joda.time.DateTime; |
16 | 17 |
|
... | ... | |
22 | 23 |
import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction; |
23 | 24 |
import eu.etaxonomy.cdm.model.common.User; |
24 | 25 |
import eu.etaxonomy.cdm.model.name.HomotypicalGroup; |
26 |
import eu.etaxonomy.cdm.model.name.NameRelationship; |
|
25 | 27 |
import eu.etaxonomy.cdm.model.name.NameRelationshipType; |
26 | 28 |
import eu.etaxonomy.cdm.model.name.NomenclaturalCode; |
27 | 29 |
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus; |
... | ... | |
37 | 39 |
*/ |
38 | 40 |
public class TaxonNameDTO extends CdmEntityDecoraterDTO<TaxonName> { |
39 | 41 |
|
40 |
class TN extends TaxonName { |
|
41 |
|
|
42 |
} |
|
43 |
|
|
44 | 42 |
private static final long serialVersionUID = -8018109905949198530L; |
45 | 43 |
|
46 | 44 |
private TaxonName name; |
... | ... | |
49 | 47 |
|
50 | 48 |
private Set<TaxonName> persistedReplacedSynonyms; |
51 | 49 |
|
50 |
private TaxonName persistedValidatedName; |
|
51 |
|
|
52 | 52 |
/** |
53 | 53 |
* @param entity |
54 | 54 |
*/ |
... | ... | |
96 | 96 |
return replacedSynonyms; |
97 | 97 |
} |
98 | 98 |
|
99 |
public NameRelationshipDTO getValidationFor() { |
|
100 |
NameRelationshipDTO nameRelDto = null; |
|
101 |
NameRelationship validatingRelationship = validatingRelationship(); |
|
102 |
if(validatingRelationship != null){ |
|
103 |
nameRelDto = new NameRelationshipDTO(Direction.relatedTo, validatingRelationship); |
|
104 |
if(persistedValidatedName == null){ |
|
105 |
persistedValidatedName = nameRelDto.getOtherName(); |
|
106 |
} |
|
107 |
} |
|
108 |
return nameRelDto; |
|
109 |
} |
|
110 |
|
|
111 |
/** |
|
112 |
* @return |
|
113 |
*/ |
|
114 |
protected NameRelationship validatingRelationship() { |
|
115 |
Set<NameRelationship> toRelations = name.getRelationsToThisName(); |
|
116 |
Set<NameRelationship> validatedNameRelations = toRelations.stream().filter( |
|
117 |
nr -> nr.getType().equals(NameRelationshipType.VALIDATED_BY_NAME()) |
|
118 |
).collect(Collectors.toSet()); |
|
119 |
if(validatedNameRelations.size() > 1){ |
|
120 |
// TODO use non RuntimeException |
|
121 |
throw new RuntimeException("More than one validated name found."); |
|
122 |
} else if(validatedNameRelations.size() == 0) { |
|
123 |
return null; |
|
124 |
} |
|
125 |
return validatedNameRelations.iterator().next(); |
|
126 |
} |
|
127 |
|
|
128 |
public void setValidationFor(NameRelationshipDTO nameRelDto) { |
|
129 |
|
|
130 |
if(nameRelDto != null && nameRelDto.getOtherName() == null){ |
|
131 |
// treat as if there is no validation |
|
132 |
nameRelDto = null; |
|
133 |
} |
|
134 |
|
|
135 |
NameRelationship validatingRelationship = validatingRelationship(); |
|
136 |
|
|
137 |
if(nameRelDto != null){ |
|
138 |
// add or update ... |
|
139 |
if(validatingRelationship != null && persistedValidatedName != null && validatingRelationship.getFromName().equals(persistedValidatedName)){ |
|
140 |
// validated name has not changed, so we can update the relation |
|
141 |
validatingRelationship.setCitation(nameRelDto.getCitation()); |
|
142 |
validatingRelationship.setCitationMicroReference(nameRelDto.getCitationMicroReference()); |
|
143 |
validatingRelationship.setRuleConsidered(nameRelDto.getRuleConsidered()); |
|
144 |
} else { |
|
145 |
// need to remove the old relationship and to create a new one. |
|
146 |
// the actual removal will take place .... |
|
147 |
name.addRelationshipFromName(nameRelDto.getOtherName(), NameRelationshipType.VALIDATED_BY_NAME(), |
|
148 |
nameRelDto.getCitation(), nameRelDto.getCitationMicroReference(), nameRelDto.getRuleConsidered()); |
|
149 |
if(persistedValidatedName != null){ |
|
150 |
name.removeRelationWithTaxonName(persistedValidatedName, Direction.relatedTo, NameRelationshipType.VALIDATED_BY_NAME()); |
|
151 |
} |
|
152 |
} |
|
153 |
} else { |
|
154 |
// remove ... |
|
155 |
if(persistedValidatedName != null && validatingRelationship != null){ |
|
156 |
name.removeRelationWithTaxonName(persistedValidatedName, Direction.relatedTo, NameRelationshipType.VALIDATED_BY_NAME()); |
|
157 |
} |
|
158 |
} |
|
159 |
} |
|
160 |
|
|
99 | 161 |
public void setBasionyms(Set<TaxonName> basionyms) { |
100 | 162 |
setRelatedNames(Direction.relatedTo, NameRelationshipType.BASIONYM(), basionyms); |
101 | 163 |
} |
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNameEditorPresenter.java | ||
---|---|---|
130 | 130 |
getView().getReplacedSynonymsComboboxSelect().setCaptionGenerator( new CdmTitleCacheCaptionGenerator<TaxonName>()); |
131 | 131 |
// reusing the basionymPagingProvider for the replaced synonyms to benefit from caching |
132 | 132 |
getView().getReplacedSynonymsComboboxSelect().setPagingProviders(basionymPagingProvider, basionymPagingProvider, basionymPagingProvider.getPageSize(), this); |
133 |
|
|
134 |
getView().getValidationField().getValidatedNameComboBox().getSelect().setCaptionGenerator(new CdmTitleCacheCaptionGenerator<TaxonName>()); |
|
135 |
// reusing the basionymPagingProvider for the replaced synonyms to benefit from caching |
|
136 |
getView().getValidationField().getValidatedNameComboBox().loadFrom(basionymPagingProvider, basionymPagingProvider, basionymPagingProvider.getPageSize()); |
|
137 |
getView().getValidationField().getValidatedNameComboBox().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<>(getView().getValidationField().getValidatedNameComboBox(), this)); |
|
138 |
|
|
139 |
|
|
140 |
getView().getValidationField().getCitatonComboBox().getSelect().setCaptionGenerator(new CdmTitleCacheCaptionGenerator<Reference>()); |
|
141 |
getView().getValidationField().getCitatonComboBox().loadFrom(referencePagingProvider, referencePagingProvider, referencePagingProvider.getPageSize()); |
|
142 |
getView().getValidationField().getCitatonComboBox().getSelect().addValueChangeListener(new ToOneRelatedEntityReloader<>(getView().getValidationField().getCitatonComboBox(), this)); |
|
143 |
|
|
133 | 144 |
} |
134 | 145 |
|
135 | 146 |
/** |
... | ... | |
331 | 342 |
if(getView() == null || event.getSourceView() != getView() ){ |
332 | 343 |
return; |
333 | 344 |
} |
345 |
ReloadableLazyComboBox<TaxonName> sourceField = (ReloadableLazyComboBox<TaxonName>)event.getSourceComponent(); |
|
334 | 346 |
|
335 |
basionymSourceField = (ReloadableLazyComboBox<TaxonName>)event.getSourceComponent(); |
|
347 |
if(sourceField == getView().getValidationField().getValidatedNameComboBox().getSelect()){ |
|
348 |
// validatedNameSourceField .. this is awkward, better use a map to correlate fields to popup editors!!!! |
|
336 | 349 |
|
337 |
basionymNamePopup = getNavigationManager().showInPopup(TaxonNamePopupEditor.class, getView()); |
|
338 |
basionymNamePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE)); |
|
339 |
basionymNamePopup.withDeleteButton(true); |
|
340 |
getView().getModesActive().stream() |
|
341 |
.filter( |
|
342 |
m -> !TaxonNamePopupEditorMode.NOMENCLATURALREFERENCE_SECTION_EDITING_ONLY.equals(m)) |
|
343 |
.forEach(m -> basionymNamePopup.enableMode(m)); |
|
344 |
basionymNamePopup.loadInEditor(event.getEntityUuid()); |
|
345 |
basionymNamePopup.getBasionymToggle().setVisible(false); |
|
350 |
} else { |
|
351 |
basionymSourceField = sourceField; |
|
352 |
|
|
353 |
basionymNamePopup = getNavigationManager().showInPopup(TaxonNamePopupEditor.class, getView()); |
|
354 |
basionymNamePopup.grantToCurrentUser(EnumSet.of(CRUD.UPDATE, CRUD.DELETE)); |
|
355 |
basionymNamePopup.withDeleteButton(true); |
|
356 |
getView().getModesActive().stream() |
|
357 |
.filter( |
|
358 |
m -> !TaxonNamePopupEditorMode.NOMENCLATURALREFERENCE_SECTION_EDITING_ONLY.equals(m)) |
|
359 |
.forEach(m -> basionymNamePopup.enableMode(m)); |
|
360 |
basionymNamePopup.loadInEditor(event.getEntityUuid()); |
|
361 |
basionymNamePopup.getBasionymToggle().setVisible(false); |
|
362 |
} |
|
346 | 363 |
|
347 | 364 |
} |
348 | 365 |
|
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditor.java | ||
---|---|---|
34 | 34 |
|
35 | 35 |
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase; |
36 | 36 |
import eu.etaxonomy.cdm.model.common.CdmBase; |
37 |
import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction; |
|
38 |
import eu.etaxonomy.cdm.model.name.NameRelationshipType; |
|
37 | 39 |
import eu.etaxonomy.cdm.model.name.Rank; |
38 | 40 |
import eu.etaxonomy.cdm.model.name.TaxonName; |
39 | 41 |
import eu.etaxonomy.cdm.model.reference.Reference; |
40 | 42 |
import eu.etaxonomy.cdm.vaadin.component.common.TeamOrPersonField; |
41 | 43 |
import eu.etaxonomy.cdm.vaadin.event.ReferenceEditorAction; |
42 | 44 |
import eu.etaxonomy.cdm.vaadin.event.TaxonNameEditorAction; |
45 |
import eu.etaxonomy.cdm.vaadin.model.name.NameRelationshipDTO; |
|
43 | 46 |
import eu.etaxonomy.cdm.vaadin.model.name.TaxonNameDTO; |
44 | 47 |
import eu.etaxonomy.cdm.vaadin.permission.AccessRestrictedView; |
45 | 48 |
import eu.etaxonomy.cdm.vaadin.permission.CdmEditDeletePermissionTester; |
46 | 49 |
import eu.etaxonomy.cdm.vaadin.util.TeamOrPersonBaseCaptionGenerator; |
47 | 50 |
import eu.etaxonomy.cdm.vaadin.util.converter.SetToListConverter; |
51 |
import eu.etaxonomy.vaadin.component.NameRelationField; |
|
48 | 52 |
import eu.etaxonomy.vaadin.component.ReloadableLazyComboBox; |
49 | 53 |
import eu.etaxonomy.vaadin.component.SwitchableTextField; |
50 | 54 |
import eu.etaxonomy.vaadin.component.ToManyRelatedEntitiesComboboxSelect; |
... | ... | |
65 | 69 |
|
66 | 70 |
private final static int GRID_COLS = 4; |
67 | 71 |
|
68 |
private final static int GRID_ROWS = 15;
|
|
72 |
private final static int GRID_ROWS = 16;
|
|
69 | 73 |
|
70 | 74 |
private static final boolean HAS_BASIONYM_DEFAULT = false; |
71 | 75 |
|
... | ... | |
93 | 97 |
|
94 | 98 |
private ToManyRelatedEntitiesComboboxSelect<TaxonName> replacedSynonymsComboboxSelect; |
95 | 99 |
|
100 |
private NameRelationField validationField; |
|
101 |
|
|
96 | 102 |
private CheckBox basionymToggle; |
97 | 103 |
|
98 | 104 |
private CheckBox replacedSynonymsToggle; |
... | ... | |
115 | 121 |
|
116 | 122 |
private Map<AbstractField, Property.ValueChangeListener> authorshipUpdateListeners = new HashMap<>(); |
117 | 123 |
|
124 |
private Boolean isInferredExCombinationAuthorship; |
|
125 |
|
|
118 | 126 |
/** |
119 | 127 |
* @param layout |
120 | 128 |
* @param dtoType |
... | ... | |
236 | 244 |
|
237 | 245 |
basionymToggle = new CheckBox("With basionym"); |
238 | 246 |
basionymToggle.setValue(HAS_BASIONYM_DEFAULT); |
247 |
basionymToggle.addValueChangeListener(e -> { |
|
248 |
updateAuthorshipFields(); |
|
249 |
}); |
|
239 | 250 |
|
240 | 251 |
basionymToggle.setStyleName(getDefaultComponentStyles()); |
241 | 252 |
grid.addComponent(basionymToggle, 2, row, 3, row); |
... | ... | |
253 | 264 |
row++; |
254 | 265 |
validationToggle = new CheckBox("Validation"); |
255 | 266 |
validationToggle.addValueChangeListener(e -> { |
256 |
boolean enable = e.getProperty().getValue() != null && (Boolean)e.getProperty().getValue(); |
|
257 |
exCombinationAuthorshipField.setVisible(enable); |
|
267 |
updateAuthorshipFields(); |
|
258 | 268 |
}); |
259 | 269 |
grid.addComponent(validationToggle, 2, row, 3, row); |
260 | 270 |
grid.setComponentAlignment(validationToggle, Alignment.BOTTOM_LEFT); |
... | ... | |
310 | 320 |
nomenclaturalReferenceDetail = addTextField("Reference detail", "nomenclaturalMicroReference", 3, row, 3, row); |
311 | 321 |
nomenclaturalReferenceDetail.setWidth(100, Unit.PIXELS); |
312 | 322 |
|
313 |
row++; |
|
314 |
exCombinationAuthorshipField = new TeamOrPersonField("Ex-combination author(s)", TeamOrPersonBaseCaptionGenerator.CacheType.NOMENCLATURAL_TITLE); |
|
315 |
exCombinationAuthorshipField.setWidth(100, Unit.PERCENTAGE); |
|
316 |
addField(exCombinationAuthorshipField, "exCombinationAuthorship", 0, row, GRID_COLS-1, row); |
|
317 |
|
|
318 |
// Basionym |
|
323 |
// --------------- Basionyms |
|
319 | 324 |
row++; |
320 | 325 |
basionymsComboboxSelect = new ToManyRelatedEntitiesComboboxSelect<TaxonName>(TaxonName.class, "Basionym"); |
321 | 326 |
basionymsComboboxSelect.setConverter(new SetToListConverter<TaxonName>()); |
... | ... | |
345 | 350 |
exBasionymAuthorshipField.setWidth(100, Unit.PERCENTAGE); |
346 | 351 |
addField(exBasionymAuthorshipField, "exBasionymAuthorship", 0, row, GRID_COLS-1, row); |
347 | 352 |
|
348 |
// ReplacedSynonyms |
|
353 |
// --------------- ReplacedSynonyms
|
|
349 | 354 |
row++; |
350 | 355 |
replacedSynonymsComboboxSelect = new ToManyRelatedEntitiesComboboxSelect<TaxonName>(TaxonName.class, "Replaced synonyms"); |
351 | 356 |
replacedSynonymsComboboxSelect.setConverter(new SetToListConverter<TaxonName>()); |
... | ... | |
366 | 371 |
}); |
367 | 372 |
grid.setComponentAlignment(replacedSynonymsComboboxSelect, Alignment.TOP_RIGHT); |
368 | 373 |
|
374 |
// --------------- Validation |
|
375 |
row++; |
|
376 |
validationField = new NameRelationField("Validation", Direction.relatedTo, NameRelationshipType.VALIDATED_BY_NAME()); |
|
377 |
validationField.setWidth(100, Unit.PERCENTAGE); |
|
378 |
ToOneRelatedEntityCombobox<TaxonName> validatedNameComboBox = validationField.getValidatedNameComboBox(); |
|
379 |
validatedNameComboBox.addClickListenerAddEntity(e -> getViewEventBus().publish( |
|
380 |
this, |
|
381 |
new TaxonNameEditorAction(EditorActionType.ADD, null, validatedNameComboBox, this) |
|
382 |
)); |
|
383 |
validatedNameComboBox.addClickListenerAddEntity(e -> { |
|
384 |
if(validatedNameComboBox.getValue() != null){ |
|
385 |
getViewEventBus().publish(this, |
|
386 |
new TaxonNameEditorAction( |
|
387 |
EditorActionType.EDIT, |
|
388 |
validatedNameComboBox.getValue().getUuid(), |
|
389 |
validatedNameComboBox, |
|
390 |
this) |
|
391 |
); |
|
392 |
} |
|
393 |
}); |
|
394 |
ToOneRelatedEntityCombobox<Reference> validationCitatonComboBox = validationField.getCitatonComboBox(); |
|
395 |
validationCitatonComboBox.addClickListenerAddEntity(e -> getViewEventBus().publish( |
|
396 |
this, |
|
397 |
new ReferenceEditorAction(EditorActionType.ADD, null, validationCitatonComboBox, this) |
|
398 |
)); |
|
399 |
validationCitatonComboBox.addClickListenerAddEntity(e -> { |
|
400 |
if(validationCitatonComboBox.getValue() != null){ |
|
401 |
getViewEventBus().publish(this, |
|
402 |
new ReferenceEditorAction( |
|
403 |
EditorActionType.EDIT, |
|
404 |
validationCitatonComboBox.getValue().getUuid(), |
|
405 |
validationCitatonComboBox, |
|
406 |
this) |
|
407 |
); |
|
408 |
} |
|
409 |
}); |
|
410 |
addField(validationField, "validationFor", 0, row, 3, row); |
|
411 |
grid.setComponentAlignment(validationField, Alignment.TOP_RIGHT); |
|
412 |
|
|
413 |
row++; |
|
414 |
exCombinationAuthorshipField = new TeamOrPersonField("Ex-combination author(s)", TeamOrPersonBaseCaptionGenerator.CacheType.NOMENCLATURAL_TITLE); |
|
415 |
exCombinationAuthorshipField.setWidth(100, Unit.PERCENTAGE); |
|
416 |
addField(exCombinationAuthorshipField, "exCombinationAuthorship", 0, row, GRID_COLS-1, row); |
|
417 |
|
|
418 |
// ----------------------------------------------------------------------------- |
|
419 |
|
|
369 | 420 |
setAdvancedModeEnabled(true); |
370 | 421 |
registerAdvancedModeComponents(fullTitleCacheFiled, protectedNameCacheField); |
371 | 422 |
|
372 | 423 |
registerAdvancedModeComponents(combinationAuthorshipField); |
373 | 424 |
registerAdvancedModeComponents(basionymAuthorshipField); |
374 | 425 |
registerAdvancedModeComponents(exBasionymAuthorshipField); |
426 |
registerAdvancedModeComponents(exCombinationAuthorshipField); |
|
375 | 427 |
|
376 | 428 |
registerAdvancedModeComponents(combinationAuthorshipField.getCachFields()); |
377 | 429 |
registerAdvancedModeComponents(exCombinationAuthorshipField.getCachFields()); |
... | ... | |
412 | 464 |
return null; |
413 | 465 |
} |
414 | 466 |
|
467 |
protected TeamOrPersonBase inferExCombinationAuthors() { |
|
468 |
NameRelationshipDTO nameRelationDTO = validationField.getValue(); |
|
469 |
if(nameRelationDTO != null && nameRelationDTO.getOtherName() != null){ |
|
470 |
TaxonName validatedName = nameRelationDTO.getOtherName(); |
|
471 |
if(validatedName.getCombinationAuthorship() != null) { |
|
472 |
return validatedName.getCombinationAuthorship(); |
|
473 |
} else if(validatedName.getNomenclaturalReference() != null){ |
|
474 |
return validatedName.getNomenclaturalReference().getAuthorship(); |
|
475 |
} |
|
476 |
} |
|
477 |
return null; |
|
478 |
} |
|
479 |
|
|
415 | 480 |
@Override |
416 | 481 |
protected void afterItemDataSourceSet() { |
417 | 482 |
TaxonNameDTO taxonNameDTO = getBean(); |
... | ... | |
420 | 485 |
|| taxonNameDTO.getExBasionymAuthorship() != null; |
421 | 486 |
basionymToggle.setValue(showBasionymSection); |
422 | 487 |
basionymToggle.setReadOnly(showBasionymSection); |
423 |
basionymToggle.addValueChangeListener(e -> { |
|
424 |
updateAuthorshipFields(); |
|
425 |
updateFieldVisibility(); |
|
426 |
}); |
|
427 | 488 |
|
428 | 489 |
boolean showReplacedSynonyms = taxonNameDTO.getReplacedSynonyms().size() > 0; |
429 | 490 |
replacedSynonymsToggle.setValue(showReplacedSynonyms); |
430 | 491 |
replacedSynonymsToggle.setReadOnly(showReplacedSynonyms); |
431 | 492 |
replacedSynonymsComboboxSelect.setVisible(showReplacedSynonyms); |
432 | 493 |
|
433 |
boolean showExAuthors = taxonNameDTO.getExCombinationAuthorship() != null; |
|
434 |
validationToggle.setValue(showExAuthors); |
|
435 |
validationToggle.setReadOnly(showExAuthors); |
|
436 |
exCombinationAuthorshipField.setVisible(showExAuthors); |
|
494 |
boolean showValidationSection = taxonNameDTO.getValidationFor() != null || taxonNameDTO.getExCombinationAuthorship() != null; |
|
495 |
|
|
496 |
validationToggle.setValue(showValidationSection); |
|
497 |
validationToggle.setReadOnly(showValidationSection); |
|
498 |
// validationField.setVisible(showValidation); |
|
499 |
// exCombinationAuthorshipField.setVisible(showExAuthors); |
|
437 | 500 |
|
438 | 501 |
if(isModeEnabled(TaxonNamePopupEditorMode.AUTOFILL_AUTHORSHIP_DATA)){ |
439 | 502 |
updateAuthorshipFields(); |
... | ... | |
456 | 519 |
} |
457 | 520 |
|
458 | 521 |
/** |
522 |
* Updates all authorship fields if the an authorship field is empty this method attempts to infer the |
|
523 |
* authors from the related nomenclatural reference or taxon name. |
|
524 |
* <p> |
|
525 |
* Finally the {@link #updateFieldVisibility()} is invoked. |
|
526 |
* |
|
459 | 527 |
* @param taxonName |
460 | 528 |
*/ |
461 | 529 |
@Override |
... | ... | |
493 | 561 |
|
494 | 562 |
} |
495 | 563 |
|
564 |
// ------------- Validation and ExCombinationAuthors |
|
565 |
isInferredExCombinationAuthorship = updateAuthorshipFieldData( |
|
566 |
taxonName.getExCombinationAuthorship(), |
|
567 |
inferExCombinationAuthors(), |
|
568 |
exCombinationAuthorshipField, |
|
569 |
validationField.getValidatedNameComboBox(), |
|
570 |
isInferredExCombinationAuthorship |
|
571 |
); |
|
572 |
|
|
496 | 573 |
updateFieldVisibility(); |
497 | 574 |
|
498 | 575 |
} |
... | ... | |
568 | 645 |
Rank rank = (Rank) rankSelect.getValue(); |
569 | 646 |
|
570 | 647 |
boolean isSpeciesOrBelow = !rank.isHigher(Rank.SPECIES()); |
571 |
Boolean withBasionym = BooleanUtils.isTrue(basionymToggle.getValue()); |
|
572 |
Boolean withValidation = BooleanUtils.isTrue(validationToggle.getValue());
|
|
648 |
Boolean withBasionymSection = BooleanUtils.isTrue(basionymToggle.getValue());
|
|
649 |
Boolean withValidationSection = isSpeciesOrBelow && BooleanUtils.isTrue(validationToggle.getValue());
|
|
573 | 650 |
|
574 | 651 |
specificEpithetField.setVisible(isSpeciesOrBelow); |
575 | 652 |
infraSpecificEpithetField.setVisible(rank.isInfraSpecific()); |
576 | 653 |
infraGenericEpithetField.setVisible(rank.isInfraGeneric()); |
577 | 654 |
|
578 |
|
|
579 |
basionymAuthorshipField.setVisible(withBasionym != null && withBasionym); |
|
580 |
exBasionymAuthorshipField.setVisible(withBasionym); |
|
581 |
basionymsComboboxSelect.setVisible(withBasionym); |
|
655 |
basionymsComboboxSelect.setVisible(withBasionymSection); |
|
582 | 656 |
|
583 | 657 |
combinationAuthorshipField.setVisible(isInferredCombinationAuthorship != null && !isInferredCombinationAuthorship); |
584 |
if(BooleanUtils.isTrue(basionymToggle.getValue())){ |
|
585 |
basionymAuthorshipField.setVisible(isInferredBasionymAuthorship != null && !isInferredBasionymAuthorship); |
|
586 |
exBasionymAuthorshipField.setVisible(isInferredExBasionymAuthorship != null && !isInferredExBasionymAuthorship); |
|
587 |
} |
|
658 |
basionymAuthorshipField.setVisible(withBasionymSection && isInferredBasionymAuthorship != null && !isInferredBasionymAuthorship); |
|
659 |
exBasionymAuthorshipField.setVisible(withBasionymSection && isInferredExBasionymAuthorship != null && !isInferredExBasionymAuthorship); |
|
660 |
|
|
661 |
validationField.setVisible(withValidationSection); |
|
662 |
exCombinationAuthorshipField.setVisible(withValidationSection && isInferredExCombinationAuthorship != null && !isInferredExCombinationAuthorship); |
|
663 |
|
|
588 | 664 |
|
589 | 665 |
// if(taxonName != null){ |
590 | 666 |
// if(modesActive.contains(TaxonNamePopupEditorMode.AUTOFILL_AUTHORSHIP_DATA)){ |
... | ... | |
595 | 671 |
specificEpithetField.setVisible(isSpeciesOrBelow); |
596 | 672 |
infraGenericEpithetField.setVisible(rank.isInfraGenericButNotSpeciesGroup()); |
597 | 673 |
genusOrUninomialField.setCaption(isSpeciesOrBelow ? "Genus" : "Uninomial"); |
598 |
exCombinationAuthorshipField.setVisible(isSpeciesOrBelow && withValidation); |
|
599 | 674 |
} |
600 | 675 |
|
601 | 676 |
@Override |
... | ... | |
684 | 759 |
return exCombinationAuthorshipField; |
685 | 760 |
} |
686 | 761 |
|
762 |
@Override |
|
763 |
public NameRelationField getValidationField(){ |
|
764 |
return validationField; |
|
765 |
} |
|
766 |
|
|
687 | 767 |
@Override |
688 | 768 |
public void enableMode(TaxonNamePopupEditorMode mode){ |
689 | 769 |
modesActive.add(mode); |
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditorView.java | ||
---|---|---|
16 | 16 |
import eu.etaxonomy.cdm.model.name.TaxonName; |
17 | 17 |
import eu.etaxonomy.cdm.model.reference.Reference; |
18 | 18 |
import eu.etaxonomy.cdm.vaadin.component.common.TeamOrPersonField; |
19 |
import eu.etaxonomy.vaadin.component.NameRelationField; |
|
19 | 20 |
import eu.etaxonomy.vaadin.component.ToManyRelatedEntitiesComboboxSelect; |
20 | 21 |
import eu.etaxonomy.vaadin.component.ToOneRelatedEntityCombobox; |
21 | 22 |
import eu.etaxonomy.vaadin.mvp.ApplicationView; |
... | ... | |
88 | 89 |
*/ |
89 | 90 |
ToManyRelatedEntitiesComboboxSelect<TaxonName> getReplacedSynonymsComboboxSelect(); |
90 | 91 |
|
92 |
/** |
|
93 |
* @return |
|
94 |
*/ |
|
95 |
NameRelationField getValidationField(); |
|
96 |
|
|
91 | 97 |
} |
src/main/java/eu/etaxonomy/vaadin/component/NameRelationField.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.vaadin.component; |
|
10 |
|
|
11 |
import com.vaadin.data.fieldgroup.BeanFieldGroup; |
|
12 |
import com.vaadin.data.fieldgroup.FieldGroup; |
|
13 |
import com.vaadin.server.FontAwesome; |
|
14 |
import com.vaadin.ui.Button; |
|
15 |
import com.vaadin.ui.Component; |
|
16 |
import com.vaadin.ui.CssLayout; |
|
17 |
import com.vaadin.ui.GridLayout; |
|
18 |
import com.vaadin.ui.themes.ValoTheme; |
|
19 |
|
|
20 |
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper; |
|
21 |
import eu.etaxonomy.cdm.model.common.RelationshipBase.Direction; |
|
22 |
import eu.etaxonomy.cdm.model.name.NameRelationshipType; |
|
23 |
import eu.etaxonomy.cdm.model.name.TaxonName; |
|
24 |
import eu.etaxonomy.cdm.model.reference.Reference; |
|
25 |
import eu.etaxonomy.cdm.vaadin.component.TextFieldNFix; |
|
26 |
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityButtonUpdater; |
|
27 |
import eu.etaxonomy.cdm.vaadin.model.name.NameRelationshipDTO; |
|
28 |
|
|
29 |
|
|
30 |
/** |
|
31 |
* @author a.kohlbecker |
|
32 |
* @since May 3, 2018 |
|
33 |
* |
|
34 |
*/ |
|
35 |
public class NameRelationField extends CompositeCustomField<NameRelationshipDTO> { |
|
36 |
|
|
37 |
/** |
|
38 |
* |
|
39 |
*/ |
|
40 |
public static final String PRIMARY_STYLE = "v-name-relation-field"; |
|
41 |
|
|
42 |
private static final long serialVersionUID = -7080885013120044655L; |
|
43 |
|
|
44 |
private CssLayout compositeWrapper = new CssLayout(); |
|
45 |
|
|
46 |
private CssLayout toolBar= new CssLayout(); |
|
47 |
|
|
48 |
private Button removeButton = new Button(FontAwesome.REMOVE); |
|
49 |
|
|
50 |
private Button newButton = new Button(FontAwesome.PLUS); |
|
51 |
|
|
52 |
private BeanFieldGroup<NameRelationshipDTO> fieldGroup = new BeanFieldGroup<>(NameRelationshipDTO.class); |
|
53 |
|
|
54 |
ToOneRelatedEntityCombobox<TaxonName> validatedNameComboBox; |
|
55 |
|
|
56 |
ToOneRelatedEntityCombobox<Reference> citatonComboBox; |
|
57 |
|
|
58 |
TextFieldNFix citationMicroReferenceField = new TextFieldNFix(); |
|
59 |
|
|
60 |
TextFieldNFix ruleConsideredField = new TextFieldNFix(); |
|
61 |
|
|
62 |
private Direction direction; |
|
63 |
|
|
64 |
private NameRelationshipType type; |
|
65 |
|
|
66 |
private GridLayout grid; |
|
67 |
|
|
68 |
|
|
69 |
/** |
|
70 |
* @param string |
|
71 |
*/ |
|
72 |
public NameRelationField(String caption, Direction direction, NameRelationshipType type) { |
|
73 |
this.direction = direction; |
|
74 |
this.type = type; |
|
75 |
|
|
76 |
setCaption(caption); |
|
77 |
setPrimaryStyleName(PRIMARY_STYLE); |
|
78 |
|
|
79 |
validatedNameComboBox = new ToOneRelatedEntityCombobox<TaxonName>("Validated name", TaxonName.class); |
|
80 |
citatonComboBox = new ToOneRelatedEntityCombobox<Reference>("Reference", Reference.class); |
|
81 |
} |
|
82 |
|
|
83 |
/** |
|
84 |
* {@inheritDoc} |
|
85 |
*/ |
|
86 |
@Override |
|
87 |
protected void addDefaultStyles() { |
|
88 |
// TODO Auto-generated method stub |
|
89 |
|
|
90 |
} |
|
91 |
|
|
92 |
/** |
|
93 |
* {@inheritDoc} |
|
94 |
*/ |
|
95 |
@Override |
|
96 |
public FieldGroup getFieldGroup() { |
|
97 |
return fieldGroup; |
|
98 |
} |
|
99 |
|
|
100 |
/** |
|
101 |
* {@inheritDoc} |
|
102 |
*/ |
|
103 |
@Override |
|
104 |
protected Component initContent() { |
|
105 |
|
|
106 |
newButton.addClickListener(e -> { |
|
107 |
setValue(new NameRelationshipDTO(direction, type)); |
|
108 |
updateToolBarButtonStates(); |
|
109 |
}); |
|
110 |
removeButton.addClickListener(e -> { |
|
111 |
setValue(null); |
|
112 |
updateToolBarButtonStates(); |
|
113 |
}); |
|
114 |
validatedNameComboBox.getSelect().addValueChangeListener(new ToOneRelatedEntityButtonUpdater<TaxonName>(validatedNameComboBox)); |
|
115 |
citatonComboBox.getSelect().addValueChangeListener(new ToOneRelatedEntityButtonUpdater<Reference>(citatonComboBox)); |
|
116 |
|
|
117 |
grid = new GridLayout(2, 3); |
|
118 |
|
|
119 |
grid.addComponent(validatedNameComboBox, 0, 0, 1, 0); |
|
120 |
|
|
121 |
validatedNameComboBox.setCaption("Validated name"); |
|
122 |
citatonComboBox.setCaption("Reference"); |
|
123 |
citationMicroReferenceField.setCaption("Reference detail"); |
|
124 |
ruleConsideredField.setCaption("Rule considered"); |
|
125 |
|
|
126 |
grid.addComponent(citatonComboBox, 0, 1, 0, 1); |
|
127 |
grid.addComponent(citationMicroReferenceField, 1, 1, 1, 1); |
|
128 |
grid.addComponent(ruleConsideredField, 0, 2, 1, 2); |
|
129 |
|
|
130 |
validatedNameComboBox.setWidth(100, Unit.PERCENTAGE); |
|
131 |
ruleConsideredField.setWidth(100, Unit.PERCENTAGE); |
|
132 |
citatonComboBox.setWidth(100, Unit.PERCENTAGE); |
|
133 |
|
|
134 |
|
|
135 |
grid.setColumnExpandRatio(0, 7); |
|
136 |
grid.setWidth(100, Unit.PERCENTAGE); |
|
137 |
|
|
138 |
toolBar.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP + " toolbar"); |
|
139 |
toolBar.addComponents(newButton, removeButton); |
|
140 |
|
|
141 |
compositeWrapper.setStyleName("margin-wrapper"); |
|
142 |
compositeWrapper.addComponents(toolBar); |
|
143 |
|
|
144 |
addSizedComponents(compositeWrapper); |
|
145 |
addStyledComponents(validatedNameComboBox, citationMicroReferenceField, citatonComboBox, ruleConsideredField, newButton, removeButton); |
|
146 |
|
|
147 |
return compositeWrapper; |
|
148 |
} |
|
149 |
|
|
150 |
/** |
|
151 |
* {@inheritDoc} |
|
152 |
*/ |
|
153 |
@Override |
|
154 |
public Class<NameRelationshipDTO> getType() { |
|
155 |
return NameRelationshipDTO.class; |
|
156 |
} |
|
157 |
|
|
158 |
/** |
|
159 |
* {@inheritDoc} |
|
160 |
*/ |
|
161 |
@Override |
|
162 |
protected void setInternalValue(NameRelationshipDTO newValue) { |
|
163 |
|
|
164 |
NameRelationshipDTO oldValue = getValue(); |
|
165 |
|
|
166 |
super.setInternalValue(newValue); |
|
167 |
|
|
168 |
|
|
169 |
newValue = HibernateProxyHelper.deproxy(newValue); |
|
170 |
if(newValue != null) { |
|
171 |
compositeWrapper.addComponent(grid); |
|
172 |
getFieldGroup().bind(validatedNameComboBox, "otherName"); |
|
173 |
getFieldGroup().bind(citationMicroReferenceField, "citationMicroReference"); |
|
174 |
getFieldGroup().bind(citatonComboBox, "citation"); |
|
175 |
getFieldGroup().bind(ruleConsideredField, "ruleConsidered"); |
|
176 |
|
|
177 |
fieldGroup.setItemDataSource(newValue); |
|
178 |
} else { |
|
179 |
if(oldValue != null){ |
|
180 |
compositeWrapper.removeComponent(grid); |
|
181 |
getFieldGroup().unbind(validatedNameComboBox); |
|
182 |
getFieldGroup().unbind(citationMicroReferenceField); |
|
183 |
getFieldGroup().unbind(citatonComboBox); |
|
184 |
getFieldGroup().unbind(ruleConsideredField); |
|
185 |
|
|
186 |
fieldGroup.setItemDataSource(newValue); |
|
187 |
} |
|
188 |
} |
|
189 |
|
|
190 |
updateToolBarButtonStates(); |
|
191 |
|
|
192 |
} |
|
193 |
|
|
194 |
|
|
195 |
private void updateToolBarButtonStates(){ |
|
196 |
boolean hasValue = getValue() != null; |
|
197 |
removeButton.setEnabled(hasValue); |
|
198 |
newButton.setEnabled(!hasValue); |
|
199 |
} |
|
200 |
|
|
201 |
/** |
|
202 |
* @return the validatedNameComboBox |
|
203 |
*/ |
|
204 |
public ToOneRelatedEntityCombobox<TaxonName> getValidatedNameComboBox() { |
|
205 |
return validatedNameComboBox; |
|
206 |
} |
|
207 |
|
|
208 |
/** |
|
209 |
* @return the citatonComboBox |
|
210 |
*/ |
|
211 |
public ToOneRelatedEntityCombobox<Reference> getCitatonComboBox() { |
|
212 |
return citatonComboBox; |
|
213 |
} |
|
214 |
|
|
215 |
} |
src/main/java/eu/etaxonomy/vaadin/component/NameRelationsListEditor.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.vaadin.component; |
|
10 |
|
|
11 |
import org.vaadin.viritin.fields.CaptionGenerator; |
|
12 |
import org.vaadin.viritin.fields.LazyComboBox.FilterableCountProvider; |
|
13 |
import org.vaadin.viritin.fields.LazyComboBox.FilterablePagingProvider; |
|
14 |
|
|
15 |
import eu.etaxonomy.cdm.model.name.TaxonName; |
|
16 |
import eu.etaxonomy.cdm.model.reference.Reference; |
|
17 |
import eu.etaxonomy.cdm.vaadin.model.name.NameRelationshipDTO; |
|
18 |
import eu.etaxonomy.cdm.vaadin.view.name.CachingPresenter; |
|
19 |
|
|
20 |
/** |
|
21 |
* @author a.kohlbecker |
|
22 |
* @since May 3, 2018 |
|
23 |
* |
|
24 |
*/ |
|
25 |
public class NameRelationsListEditor extends ToManyRelatedEntitiesListSelect<NameRelationshipDTO, NameRelationField> { |
|
26 |
|
|
27 |
private static final long serialVersionUID = 6295557881702890211L; |
|
28 |
|
|
29 |
private ReloadableLazyComboBoxInstantiator<TaxonName> nameSelectInstantiator; |
|
30 |
|
|
31 |
private ReloadableLazyComboBoxInstantiator<Reference> referenceSelectInstantiator; |
|
32 |
|
|
33 |
/** |
|
34 |
* @param itemType |
|
35 |
* @param caption |
|
36 |
*/ |
|
37 |
public NameRelationsListEditor(String caption) { |
|
38 |
super(NameRelationshipDTO.class, null, caption); |
|
39 |
this.fieldType = NameRelationField.class; |
|
40 |
// addEmptyRowOnInitContent is false in this class since adding row is only possible after setting the PagingProviders |
|
41 |
addEmptyRowOnInitContent = false; |
|
42 |
nameSelectInstantiator = new ReloadableLazyComboBoxInstantiator<TaxonName>(TaxonName.class); |
|
43 |
referenceSelectInstantiator = new ReloadableLazyComboBoxInstantiator<Reference>(Reference.class); |
|
44 |
} |
|
45 |
|
|
46 |
/** |
|
47 |
* {@inheritDoc} |
|
48 |
*/ |
|
49 |
// @Override |
|
50 |
// protected NameRelationField newFieldInstance(NameRelationshipDTO val) throws InstantiationException, IllegalAccessException { |
|
51 |
// |
|
52 |
// NameRelationField field = new NameRelationField(nameSelectInstantiator, referenceSelectInstantiator, val); |
|
53 |
// field.setWidth(100, Unit.PERCENTAGE); |
|
54 |
// return field; |
|
55 |
// } |
|
56 |
|
|
57 |
public void setTaxonNamePagingProviders(FilterablePagingProvider<TaxonName> filterablePagingProvider, FilterableCountProvider filterableCountProvider, int pageLength, |
|
58 |
CachingPresenter cachingPresenter){ |
|
59 |
nameSelectInstantiator.setPagingProviders(filterablePagingProvider, filterableCountProvider, pageLength, cachingPresenter); |
|
60 |
setInternalValue(null); |
|
61 |
} |
|
62 |
|
|
63 |
/** |
|
64 |
* @param cdmTitleCacheCaptionGenerator |
|
65 |
*/ |
|
66 |
public void setTaxonNameCaptionGenerator(CaptionGenerator<TaxonName> captionGenerator) { |
|
67 |
nameSelectInstantiator.setCaptionGenerator(captionGenerator); |
|
68 |
} |
|
69 |
|
|
70 |
public void setReferencePagingProviders(FilterablePagingProvider<Reference> filterablePagingProvider, FilterableCountProvider filterableCountProvider, int pageLength, |
|
71 |
CachingPresenter cachingPresenter){ |
|
72 |
referenceSelectInstantiator.setPagingProviders(filterablePagingProvider, filterableCountProvider, pageLength, cachingPresenter); |
|
73 |
setInternalValue(null); |
|
74 |
} |
|
75 |
|
|
76 |
/** |
|
77 |
* @param cdmTitleCacheCaptionGenerator |
|
78 |
*/ |
|
79 |
public void setReferenceCaptionGenerator(CaptionGenerator<Reference> captionGenerator) { |
|
80 |
referenceSelectInstantiator.setCaptionGenerator(captionGenerator); |
|
81 |
} |
|
82 |
|
|
83 |
|
|
84 |
} |
src/main/java/eu/etaxonomy/vaadin/component/ReloadableLazyComboBoxInstantiator.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.vaadin.component; |
|
10 |
|
|
11 |
import org.vaadin.viritin.fields.CaptionGenerator; |
|
12 |
import org.vaadin.viritin.fields.LazyComboBox.FilterableCountProvider; |
|
13 |
import org.vaadin.viritin.fields.LazyComboBox.FilterablePagingProvider; |
|
14 |
|
|
15 |
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityReloader; |
|
16 |
import eu.etaxonomy.cdm.vaadin.view.name.CachingPresenter; |
|
17 |
|
|
18 |
/** |
|
19 |
* @author a.kohlbecker |
|
20 |
* @since May 3, 2018 |
|
21 |
* |
|
22 |
*/ |
|
23 |
public class ReloadableLazyComboBoxInstantiator<V extends Object> { |
|
24 |
|
|
25 |
private FilterablePagingProvider<V> filterablePagingProvider = null; |
|
26 |
private FilterableCountProvider filterableCountProvider = null; |
|
27 |
private Integer pageLength = null; |
|
28 |
|
|
29 |
private CaptionGenerator<V> captionGenerator; |
|
30 |
|
|
31 |
private CachingPresenter cachingPresenter; |
|
32 |
private Class<V> itemType; |
|
33 |
|
|
34 |
public ReloadableLazyComboBoxInstantiator(Class<V> itemType){ |
|
35 |
this.itemType = itemType; |
|
36 |
} |
|
37 |
|
|
38 |
/** |
|
39 |
* {@inheritDoc} |
|
40 |
*/ |
|
41 |
protected ReloadableLazyComboBox<V> newInstance(V val) throws InstantiationException, IllegalAccessException { |
|
42 |
|
|
43 |
|
|
44 |
ReloadableLazyComboBox<V> field = new ReloadableLazyComboBox<V>(itemType); |
|
45 |
// FIXME using the ToOneRelatedEntityReloader created a dependency to the cdm packages, this should be relaxed!!! |
|
46 |
field.addValueChangeListener(new ToOneRelatedEntityReloader(field, cachingPresenter)); |
|
47 |
|
|
48 |
if(filterablePagingProvider == null || filterableCountProvider == null || pageLength == null) { |
|
49 |
throw new RuntimeException("The filterablePagingProvider, filterableCountProvider and pageLength must be set, use setPagingProviders()."); |
|
50 |
} |
|
51 |
field.loadFrom(filterablePagingProvider, filterableCountProvider, pageLength); |
|
52 |
if(captionGenerator != null){ |
|
53 |
field.setCaptionGenerator(captionGenerator); |
|
54 |
} |
|
55 |
field.setValue(val); |
|
56 |
return field; |
|
57 |
} |
|
58 |
|
|
59 |
public void setPagingProviders(FilterablePagingProvider<V> filterablePagingProvider, FilterableCountProvider filterableCountProvider, int pageLength, |
|
60 |
CachingPresenter cachingPresenter){ |
|
61 |
this.filterablePagingProvider = filterablePagingProvider; |
|
62 |
this.filterableCountProvider = filterableCountProvider; |
|
63 |
this.pageLength = pageLength; |
|
64 |
this.cachingPresenter = cachingPresenter; |
|
65 |
} |
|
66 |
|
|
67 |
/** |
|
68 |
* @param cdmTitleCacheCaptionGenerator |
|
69 |
*/ |
|
70 |
public void setCaptionGenerator(CaptionGenerator<V> captionGenerator) { |
|
71 |
this.captionGenerator = captionGenerator; |
|
72 |
} |
|
73 |
|
|
74 |
|
|
75 |
|
|
76 |
} |
src/main/java/eu/etaxonomy/vaadin/component/ToManyRelatedEntitiesComboboxSelect.java | ||
---|---|---|
13 | 13 |
import org.vaadin.viritin.fields.LazyComboBox.FilterableCountProvider; |
14 | 14 |
import org.vaadin.viritin.fields.LazyComboBox.FilterablePagingProvider; |
15 | 15 |
|
16 |
import eu.etaxonomy.cdm.vaadin.event.ToOneRelatedEntityReloader; |
|
17 | 16 |
import eu.etaxonomy.cdm.vaadin.view.name.CachingPresenter; |
18 | 17 |
|
19 | 18 |
/** |
... | ... | |
27 | 26 |
|
28 | 27 |
private static final long serialVersionUID = -4496067980953939548L; |
29 | 28 |
|
30 |
private FilterablePagingProvider<V> filterablePagingProvider = null; |
|
31 |
private FilterableCountProvider filterableCountProvider = null; |
|
32 |
private Integer pageLength = null; |
|
33 |
|
|
34 |
private CaptionGenerator<V> captionGenerator; |
|
35 |
|
|
36 |
private CachingPresenter cachingPresenter; |
|
29 |
private ReloadableLazyComboBoxInstantiator<V> fieldInstantiator; |
|
37 | 30 |
|
38 | 31 |
/** |
39 | 32 |
* @param itemType |
... | ... | |
47 | 40 |
this.fieldType = (Class<ReloadableLazyComboBox<V>>) field.getClass(); |
48 | 41 |
// addEmptyRowOnInitContent is false in this class since adding row is only possible after setting the PagingProviders |
49 | 42 |
addEmptyRowOnInitContent = false; |
43 |
fieldInstantiator = new ReloadableLazyComboBoxInstantiator<V>(itemType); |
|
50 | 44 |
} |
51 | 45 |
|
52 | 46 |
/** |
... | ... | |
56 | 50 |
protected ReloadableLazyComboBox<V> newFieldInstance(V val) throws InstantiationException, IllegalAccessException { |
57 | 51 |
|
58 | 52 |
// TODO use the setEntityFieldInstantiator(EntityFieldInstantiator) instead to inject as instantiator? |
59 |
ReloadableLazyComboBox<V> field = new ReloadableLazyComboBox<V>(itemType); |
|
60 |
// FIXME using the ToOneRelatedEntityReloader created a dependency to the cdm packages, this should be relaxed!!! |
|
61 |
field.addValueChangeListener(new ToOneRelatedEntityReloader(field, cachingPresenter)); |
|
62 |
|
|
63 |
if(filterablePagingProvider == null || filterableCountProvider == null || pageLength == null) { |
|
64 |
throw new RuntimeException("The filterablePagingProvider, filterableCountProvider and pageLength must be set, use setPagingProviders()."); |
|
65 |
} |
|
66 |
field.loadFrom(filterablePagingProvider, filterableCountProvider, pageLength); |
|
67 |
if(captionGenerator != null){ |
|
68 |
field.setCaptionGenerator(captionGenerator); |
|
69 |
} |
|
70 |
field.setValue(val); |
|
53 |
ReloadableLazyComboBox<V> field = fieldInstantiator.newInstance(val); |
|
71 | 54 |
field.setWidth(100, Unit.PERCENTAGE); |
72 | 55 |
return field; |
73 | 56 |
} |
74 | 57 |
|
75 | 58 |
public void setPagingProviders(FilterablePagingProvider<V> filterablePagingProvider, FilterableCountProvider filterableCountProvider, int pageLength, |
76 | 59 |
CachingPresenter cachingPresenter){ |
77 |
this.filterablePagingProvider = filterablePagingProvider; |
|
78 |
this.filterableCountProvider = filterableCountProvider; |
|
79 |
this.pageLength = pageLength; |
|
80 |
this.cachingPresenter = cachingPresenter; |
|
60 |
fieldInstantiator.setPagingProviders(filterablePagingProvider, filterableCountProvider, pageLength, cachingPresenter); |
|
81 | 61 |
setInternalValue(null); |
82 | 62 |
} |
83 | 63 |
|
... | ... | |
85 | 65 |
* @param cdmTitleCacheCaptionGenerator |
86 | 66 |
*/ |
87 | 67 |
public void setCaptionGenerator(CaptionGenerator<V> captionGenerator) { |
88 |
this.captionGenerator = captionGenerator;
|
|
68 |
fieldInstantiator.setCaptionGenerator(captionGenerator);
|
|
89 | 69 |
} |
90 | 70 |
|
91 | 71 |
} |
src/main/webapp/VAADIN/themes/edit-valo/custom-fields.scss | ||
---|---|---|
95 | 95 |
} |
96 | 96 |
} |
97 | 97 |
|
98 |
// ------------ NameRelationField ------------ // |
|
99 |
.v-name-relation-field { |
|
100 |
.toolbar { |
|
101 |
float: right; |
|
102 |
height: $v-unit-size; |
|
103 |
} |
|
104 |
.margin-wrapper { |
|
105 |
@include composite-field-wrapper; |
|
106 |
} |
|
107 |
} |
|
108 |
|
|
98 | 109 |
// ------------ v-person-field ------------ // |
99 | 110 |
.v-person-field { |
100 | 111 |
position: relative; |
Also available in: Unified diff
ref #7364 validation section implemented in TaxonNameEditor