Revision ad6c211a
Added by Andreas Kohlbecker over 2 years ago
src/main/java/eu/etaxonomy/cdm/service/CdmBeanItemContainerFactory.java | ||
---|---|---|
68 | 68 |
return termItemContainer; |
69 | 69 |
} |
70 | 70 |
|
71 |
@Transactional(readOnly=true) |
|
72 |
public <T extends DefinedTermBase> BeanItemContainer<T> buildTermItemContainer(Class<T> type, TermType termType) { |
|
73 |
|
|
74 |
clearSession(); |
|
75 |
// TODO use TermCacher? |
|
76 |
List<T> terms = repo.getTermService().listByTermType(termType, null, null, orderHints, INIT_STRATEGY); |
|
77 |
BeanItemContainer<T> termItemContainer = new BeanItemContainer<>(DefinedTermBase.class); |
|
78 |
termItemContainer.addAll(terms); |
|
79 |
return termItemContainer; |
|
80 |
} |
|
81 |
|
|
82 |
|
|
71 | 83 |
@Transactional(readOnly=true) |
72 | 84 |
public BeanItemContainer<DefinedTermBase> buildVocabularyTermsItemContainer(UUID vocabularyUuid) { |
73 | 85 |
|
src/main/java/eu/etaxonomy/cdm/vaadin/ui/RegistrationUIDefaults.java | ||
---|---|---|
12 | 12 |
import java.text.NumberFormat; |
13 | 13 |
import java.util.Arrays; |
14 | 14 |
import java.util.EnumSet; |
15 |
import java.util.HashSet; |
|
15 | 16 |
import java.util.List; |
17 |
import java.util.Set; |
|
16 | 18 |
|
17 | 19 |
import eu.etaxonomy.cdm.model.common.AnnotationType; |
18 | 20 |
import eu.etaxonomy.cdm.model.name.NomenclaturalCode; |
21 |
import eu.etaxonomy.cdm.model.name.Rank; |
|
19 | 22 |
import eu.etaxonomy.cdm.model.reference.ReferenceType; |
20 | 23 |
import eu.etaxonomy.cdm.persistence.permission.Role; |
21 | 24 |
import eu.etaxonomy.cdm.vaadin.permission.RolesAndPermissions; |
... | ... | |
64 | 67 |
ReferenceType.Report |
65 | 68 |
); |
66 | 69 |
|
70 |
public static final Set<Rank> RANK_SET_COMPACT = new HashSet<>(Arrays.asList( |
|
71 |
// see https://dev.e-taxonomy.eu/redmine/issues/6732 |
|
72 |
Rank.GENUS(), |
|
73 |
Rank.SPECIES(), |
|
74 |
Rank.SUBSPECIES(), |
|
75 |
Rank.VARIETY(), |
|
76 |
Rank.FORM() |
|
77 |
)); |
|
78 |
|
|
67 | 79 |
/** |
68 | 80 |
* TODO make configurable as preset and in TaxonNameEditor |
69 | 81 |
*/ |
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNameEditorPresenter.java | ||
---|---|---|
25 | 25 |
import org.vaadin.spring.events.annotation.EventBusListenerMethod; |
26 | 26 |
import org.vaadin.viritin.fields.AbstractElementCollection; |
27 | 27 |
|
28 |
import com.vaadin.data.Container.Filter; |
|
29 |
import com.vaadin.data.Item; |
|
28 | 30 |
import com.vaadin.data.Property; |
29 | 31 |
import com.vaadin.data.util.BeanItemContainer; |
30 | 32 |
import com.vaadin.spring.annotation.SpringComponent; |
... | ... | |
130 | 132 |
|
131 | 133 |
private Integer taxonNameId; |
132 | 134 |
|
135 |
private BeanItemContainer<DefinedTermBase> rankTermItemContainer; |
|
136 |
|
|
137 |
private Filter rankListFilter; |
|
138 |
|
|
139 |
/** |
|
140 |
* the taxon names rank as loaded from the persistence layer |
|
141 |
*/ |
|
142 |
private Rank initialRank; |
|
143 |
|
|
144 |
|
|
133 | 145 |
@SuppressWarnings("serial") |
134 | 146 |
@Override |
135 | 147 |
public void handleViewEntered() { |
... | ... | |
142 | 154 |
.buildEnumTermItemContainer(NomenclaturalCodeEdition.class, |
143 | 155 |
nomCodes.toArray(new NomenclaturalCodeEdition[nomCodes.size()])); |
144 | 156 |
|
157 |
rankTermItemContainer = cdmBeanItemContainerFactory.buildTermItemContainer(TermType.Rank); |
|
158 |
rankListFilter = new Filter() { |
|
159 |
@Override |
|
160 |
public boolean passesFilter(Object itemId, Item item) throws UnsupportedOperationException { |
|
161 |
return getView().isRanksFullList() || RegistrationUIDefaults.RANK_SET_COMPACT.contains(itemId) || itemId.equals(initialRank); |
|
162 |
} |
|
163 |
@Override |
|
164 |
public boolean appliesToProperty(Object propertyId) { |
|
165 |
return false; |
|
166 |
}}; |
|
167 |
rankTermItemContainer.addContainerFilter(rankListFilter); |
|
145 | 168 |
getView().getRankSelect() |
146 |
.setContainerDataSource(cdmBeanItemContainerFactory.buildTermItemContainer(TermType.Rank));
|
|
169 |
.setContainerDataSource(rankTermItemContainer);
|
|
147 | 170 |
getView().getRankSelect().setItemCaptionPropertyId("label"); |
171 |
getView().getRankSelectFullListToggle().addClickListener(e -> { |
|
172 |
updateRankTermItemContainer(); |
|
173 |
}); |
|
148 | 174 |
|
149 | 175 |
CdmFilterablePagingProvider<AgentBase, TeamOrPersonBase> termOrPersonPagingProvider = pagingProviderFactory |
150 | 176 |
.teamOrPersonPagingProvider(); |
... | ... | |
280 | 306 |
.buildVocabularyTermsItemContainer(AnnotationType.EDITORIAL().getVocabulary().getUuid())); |
281 | 307 |
} |
282 | 308 |
|
309 |
public void updateRankTermItemContainer() { |
|
310 |
// add and remove the filter to update the list of rank terms |
|
311 |
// the filter itself will behave accordingly to the isRanksFullList in the view |
|
312 |
rankTermItemContainer.removeContainerFilter(rankListFilter); |
|
313 |
rankTermItemContainer.addContainerFilter(rankListFilter); |
|
314 |
} |
|
315 |
|
|
283 | 316 |
@Deprecated |
284 | 317 |
private void addNomenclaturalStatus(NomenclaturalStatusDTO element) { |
285 | 318 |
// Nothing to do |
... | ... | |
288 | 321 |
@Override |
289 | 322 |
protected void adaptDataProviders() { |
290 | 323 |
updateOrthographicCorrectionRestriction(); |
324 |
updateRankTermItemContainer(); |
|
291 | 325 |
} |
292 | 326 |
|
293 | 327 |
private void updateOrthographicCorrectionRestriction() { |
... | ... | |
411 | 445 |
} |
412 | 446 |
|
413 | 447 |
taxonNameId = Integer.valueOf(taxonName.getId()); |
448 |
initialRank = taxonName.getRank(); |
|
414 | 449 |
relatedNamePagingProvider.addRestriction(new Restriction<>("id", Operator.AND_NOT, null, taxonNameId)); |
415 | 450 |
|
416 | 451 |
return taxonName; |
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditor.java | ||
---|---|---|
23 | 23 |
import com.vaadin.data.Property; |
24 | 24 |
import com.vaadin.data.Property.ValueChangeListener; |
25 | 25 |
import com.vaadin.data.Validator.InvalidValueException; |
26 |
import com.vaadin.server.FontAwesome; |
|
26 | 27 |
import com.vaadin.shared.ui.MarginInfo; |
27 | 28 |
import com.vaadin.spring.annotation.SpringComponent; |
28 | 29 |
import com.vaadin.ui.AbstractField; |
29 | 30 |
import com.vaadin.ui.Alignment; |
31 |
import com.vaadin.ui.Button; |
|
30 | 32 |
import com.vaadin.ui.CheckBox; |
31 | 33 |
import com.vaadin.ui.Component; |
34 |
import com.vaadin.ui.CssLayout; |
|
32 | 35 |
import com.vaadin.ui.GridLayout; |
33 | 36 |
import com.vaadin.ui.NativeSelect; |
34 | 37 |
import com.vaadin.ui.Panel; |
35 | 38 |
import com.vaadin.ui.TextField; |
39 |
import com.vaadin.ui.themes.ValoTheme; |
|
36 | 40 |
|
37 | 41 |
import eu.etaxonomy.cdm.api.util.RoleProberImpl; |
38 | 42 |
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase; |
... | ... | |
129 | 133 |
|
130 | 134 |
private NativeSelect rankSelect; |
131 | 135 |
|
136 |
private Button rankSelectFullListToggle; |
|
137 |
|
|
132 | 138 |
private TeamOrPersonField combinationAuthorshipField; |
133 | 139 |
|
134 | 140 |
private TeamOrPersonField exCombinationAuthorshipField; |
... | ... | |
157 | 163 |
|
158 | 164 |
private OrthographicCorrectionReferenceValidator orthographicCorrectionValidator; |
159 | 165 |
|
166 |
private boolean isRanksFullList = false; |
|
167 |
|
|
160 | 168 |
/** |
161 | 169 |
* By default AnnotationType.EDITORIAL() is enabled. |
162 | 170 |
* |
... | ... | |
277 | 285 |
rankSelect = new NativeSelect("Rank"); |
278 | 286 |
rankSelect.setNullSelectionAllowed(false); |
279 | 287 |
rankSelect.setWidth(100, Unit.PERCENTAGE); |
280 |
addField(rankSelect, "rank", 0, row, 1, row); |
|
281 |
grid.setComponentAlignment(rankSelect, Alignment.TOP_RIGHT); |
|
288 |
rankSelectFullListToggle = new Button(); |
|
289 |
updateRankSelectFullListToggleButton(); |
|
290 |
rankSelectFullListToggle.addClickListener(e -> { |
|
291 |
isRanksFullList = !isRanksFullList; |
|
292 |
updateRankSelectFullListToggleButton(); |
|
293 |
}); |
|
294 |
CssLayout rankSelectGroup = new CssLayout(); |
|
295 |
rankSelectGroup.setWidth(100, Unit.PERCENTAGE); |
|
296 |
rankSelectGroup.addComponents(rankSelect, rankSelectFullListToggle); |
|
297 |
bindField(rankSelect, "rank"); |
|
298 |
applyDefaultComponentStyles(rankSelect); |
|
299 |
applyDefaultComponentStyles(rankSelectFullListToggle); |
|
300 |
applyDefaultComponentStyle(rankSelectGroup); |
|
301 |
addComponent(rankSelectGroup, 0, row, 1, row); |
|
302 |
rankSelectGroup.setStyleName(ValoTheme.LAYOUT_COMPONENT_GROUP); |
|
303 |
grid.setComponentAlignment(rankSelectGroup, Alignment.TOP_RIGHT); |
|
282 | 304 |
|
283 | 305 |
row++; |
284 | 306 |
basionymToggle = new CheckBox("With basionym"); |
... | ... | |
581 | 603 |
|
582 | 604 |
} |
583 | 605 |
|
606 |
private void updateRankSelectFullListToggleButton() { |
|
607 |
if(isRanksFullList) { |
|
608 |
rankSelectFullListToggle.setIcon(FontAwesome.COMPRESS); |
|
609 |
rankSelectFullListToggle.setDescription("Show short list of ranks"); |
|
610 |
} else { |
|
611 |
rankSelectFullListToggle.setIcon(FontAwesome.EXPAND); |
|
612 |
rankSelectFullListToggle.setDescription("Show full list of ranks"); |
|
613 |
} |
|
614 |
} |
|
615 |
|
|
584 | 616 |
protected TeamOrPersonBase inferBasiomynAuthors() { |
585 | 617 |
List<TaxonName> basionyms = basionymsComboboxSelect.getValue(); |
586 | 618 |
if(!basionyms.isEmpty() && basionyms.get(0) != null){ |
... | ... | |
807 | 839 |
// TODO use getField() instead and remove field references |
808 | 840 |
Rank rank = (Rank) rankSelect.getValue(); |
809 | 841 |
|
842 |
@SuppressWarnings("deprecation") |
|
810 | 843 |
boolean isSpeciesOrBelow = !rank.isHigher(Rank.SPECIES()) && !rank.getRankClass().equals(RankClass.Unknown); |
811 | 844 |
Boolean withBasionymSection = BooleanUtils.isTrue(basionymToggle.getValue()); |
812 | 845 |
Boolean withValidationSection = BooleanUtils.isTrue(validationToggle.getValue()); |
... | ... | |
971 | 1004 |
return rankSelect; |
972 | 1005 |
} |
973 | 1006 |
|
1007 |
@Override |
|
1008 |
public Button getRankSelectFullListToggle() { |
|
1009 |
return rankSelectFullListToggle; |
|
1010 |
} |
|
1011 |
|
|
974 | 1012 |
@Override |
975 | 1013 |
public AbstractField<String> getGenusOrUninomialField(){ |
976 | 1014 |
return genusOrUninomialField; |
... | ... | |
1017 | 1055 |
return modesActive.contains(mode); |
1018 | 1056 |
} |
1019 | 1057 |
|
1058 |
@Override |
|
1059 |
public boolean isRanksFullList() { |
|
1060 |
return isRanksFullList; |
|
1061 |
} |
|
1062 |
|
|
1020 | 1063 |
@Override |
1021 | 1064 |
public void disableMode(TaxonNamePopupEditorMode mode){ |
1022 | 1065 |
modesActive.remove(mode); |
src/main/java/eu/etaxonomy/cdm/vaadin/view/name/TaxonNamePopupEditorView.java | ||
---|---|---|
13 | 13 |
import org.vaadin.viritin.fields.ElementCollectionField; |
14 | 14 |
|
15 | 15 |
import com.vaadin.ui.AbstractField; |
16 |
import com.vaadin.ui.Button; |
|
16 | 17 |
import com.vaadin.ui.CheckBox; |
17 | 18 |
import com.vaadin.ui.Component; |
18 | 19 |
import com.vaadin.ui.NativeSelect; |
... | ... | |
36 | 37 |
*/ |
37 | 38 |
public interface TaxonNamePopupEditorView extends ApplicationView<TaxonNameEditorPresenter>, AnnotationsEditor { |
38 | 39 |
|
39 |
/** |
|
40 |
* @return |
|
41 |
*/ |
|
42 | 40 |
public ToOneRelatedEntityCombobox<Reference> getNomReferenceCombobox(); |
43 | 41 |
|
44 |
/** |
|
45 |
* @return |
|
46 |
*/ |
|
47 | 42 |
public ToManyRelatedEntitiesComboboxSelect<TaxonName> getBasionymComboboxSelect(); |
48 | 43 |
|
49 | 44 |
public NativeSelect getRankSelect(); |
50 | 45 |
|
51 |
/** |
|
52 |
* @return the exBasionymAuthorshipField |
|
53 |
*/ |
|
46 |
public Button getRankSelectFullListToggle(); |
|
47 |
|
|
54 | 48 |
public TeamOrPersonField getExBasionymAuthorshipField(); |
55 | 49 |
|
56 |
/** |
|
57 |
* @return the basionymAuthorshipField |
|
58 |
*/ |
|
59 | 50 |
public TeamOrPersonField getBasionymAuthorshipField(); |
60 | 51 |
|
61 |
/** |
|
62 |
* @return the combinationAuthorshipField |
|
63 |
*/ |
|
64 | 52 |
public TeamOrPersonField getCombinationAuthorshipField(); |
65 | 53 |
|
66 |
/** |
|
67 |
* @return the exCombinationAuthorshipField |
|
68 |
*/ |
|
69 | 54 |
public TeamOrPersonField getExCombinationAuthorshipField(); |
70 | 55 |
|
71 | 56 |
void disableMode(TaxonNamePopupEditorMode mode); |
... | ... | |
77 | 62 |
*/ |
78 | 63 |
void enableMode(TaxonNamePopupEditorMode mode); |
79 | 64 |
|
80 |
/** |
|
81 |
* @param mode |
|
82 |
* @return |
|
83 |
*/ |
|
84 | 65 |
boolean isModeEnabled(TaxonNamePopupEditorMode mode); |
85 | 66 |
|
86 | 67 |
public EnumSet<TaxonNamePopupEditorMode> getModesActive(); |
87 | 68 |
|
88 |
/** |
|
89 |
* @return |
|
90 |
*/ |
|
91 | 69 |
CheckBox getBasionymToggle(); |
92 | 70 |
|
93 | 71 |
void updateAuthorshipFields(); |
94 | 72 |
|
95 |
/** |
|
96 |
* @return |
|
97 |
*/ |
|
98 | 73 |
ToManyRelatedEntitiesComboboxSelect<TaxonName> getReplacedSynonymsComboboxSelect(); |
99 | 74 |
|
100 |
/** |
|
101 |
* @return |
|
102 |
*/ |
|
103 | 75 |
NameRelationField getValidationField(); |
104 | 76 |
|
105 |
/** |
|
106 |
* @return |
|
107 |
*/ |
|
108 | 77 |
AbstractField<String> getGenusOrUninomialField(); |
109 | 78 |
|
110 |
/** |
|
111 |
* @return the infraGenericEpithetField |
|
112 |
*/ |
|
113 | 79 |
public AbstractField<String> getInfraGenericEpithetField(); |
114 | 80 |
|
115 |
/** |
|
116 |
* @return the specificEpithetField |
|
117 |
*/ |
|
118 | 81 |
public AbstractField<String> getSpecificEpithetField(); |
119 | 82 |
|
120 |
/** |
|
121 |
* @return the infraSpecificEpithetField |
|
122 |
*/ |
|
123 | 83 |
public AbstractField<String> getInfraSpecificEpithetField(); |
124 | 84 |
|
125 | 85 |
public NameRelationField getOrthographicVariantField(); |
126 | 86 |
|
127 | 87 |
CheckBox getOrthographicVariantToggle(); |
128 | 88 |
|
129 |
/** |
|
130 |
* @return |
|
131 |
*/ |
|
132 | 89 |
TextField getNomenclaturalReferenceDetail(); |
133 | 90 |
|
134 | 91 |
ElementCollectionField<NomenclaturalStatusDTO> getNomStatusCollectionField(); |
135 | 92 |
|
136 |
/** |
|
137 |
* @param components |
|
138 |
*/ |
|
139 | 93 |
void applyDefaultComponentStyle(Component[] components); |
140 | 94 |
|
95 |
/** |
|
96 |
* @return a flag indicating if the rank select should offer the full list of ranks or a compact list |
|
97 |
*/ |
|
98 |
public boolean isRanksFullList(); |
|
141 | 99 |
|
142 | 100 |
} |
Also available in: Unified diff
ref #6732 rank selector offering compact and full list of ranks