Skip to content

Commit f0953bd

Browse files
committed
fix: track additional items
Additional items were not returned by findItemByLabel Close #35
1 parent 47189f3 commit f0953bd

File tree

1 file changed

+16
-5
lines changed

1 file changed

+16
-5
lines changed

src/main/java/com/flowingcode/vaadin/addons/chipfield/ChipField.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ public class ChipField<T> extends AbstractField<ChipField<T>, List<T>>
6868
public static final String CHIP_LABEL = "event.detail.chipLabel";
6969

7070
private DataProvider<T, ?> availableItems = DataProvider.ofCollection(new ArrayList<T>());
71+
private List<T> additionalItems = new ArrayList<>();
7172
private ItemLabelGenerator<T> itemLabelGenerator;
7273
private SerializableFunction<String, T> newItemHandler;
7374

@@ -178,7 +179,9 @@ protected void setPresentationValue(List<T> newPresentationValue) {
178179
}
179180

180181
private Optional<T> findItemByLabel(String label) {
181-
return availableItems.fetch(new Query<>()).filter(item -> itemLabelGenerator.apply(item).equals(label)).findFirst();
182+
return Stream.concat(availableItems.fetch(new Query<>()), additionalItems.stream())
183+
.filter(item -> itemLabelGenerator.apply(item).equals(label))
184+
.findFirst();
182185
}
183186

184187
private void setClientChipWithoutEvent(String[] labels) {
@@ -310,16 +313,23 @@ public void setDataProvider(DataProvider<T, ?> dataProvider) {
310313
}
311314

312315
public void addSelectedItem(T newItem) {
316+
addSelectedItem(newItem, false);
317+
}
318+
319+
private void addSelectedItem(T newItem, boolean fromClient) {
313320
String label = itemLabelGenerator.apply(newItem);
314321
if (isAllowAdditionalItems()) {
315-
addSelectedItem(findItemByLabel(label).orElse(newItem), false);
322+
addSelectedItemInternal(findItemByLabel(label).orElseGet(() -> {
323+
additionalItems.add(newItem);
324+
return newItem;
325+
}), fromClient);
316326
} else {
317-
addSelectedItem(findItemByLabel(label).orElseThrow(() -> new UnsupportedOperationException(
318-
"Cannot select item '" + newItem + "', because is not present in DataProvider, and adding new items is not permitted.")), false);
327+
addSelectedItemInternal(findItemByLabel(label).orElseThrow(() -> new UnsupportedOperationException(
328+
"Cannot select item '" + newItem + "', because is not present in DataProvider, and adding new items is not permitted.")), fromClient);
319329
}
320330
}
321331

322-
private void addSelectedItem(T newItem, boolean fromClient) {
332+
private void addSelectedItemInternal(T newItem, boolean fromClient) {
323333
List<T> value = getValue();
324334
if (!value.contains(newItem)) {
325335
value = new ArrayList<>(value);
@@ -340,6 +350,7 @@ private void removeSelectedItem(T itemToRemove, boolean fromClient) {
340350
List<T> value = new ArrayList<>(getValue());
341351
if (value.remove(itemToRemove)) {
342352
setModelValue(value, fromClient);
353+
additionalItems.retainAll(value);
343354
if (!fromClient) {
344355
setPresentationValue(value);
345356
fireEvent(new ChipRemovedEvent<>(this, fromClient, itemLabelGenerator.apply(itemToRemove)));

0 commit comments

Comments
 (0)