@@ -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