package xapi.polymer.pickers; import static elemental.events.KeyboardEvent.KeyCode.ENTER; import static xapi.components.impl.JsSupport.addClassName; import static xapi.components.impl.JsSupport.is; import static xapi.polymer.core.PolymerElement.newFlexVertical; import static xapi.polymer.core.PolymerElement.newIconButtonFloatingMini; import static xapi.polymer.core.PolymerElement.newLayoutCenterHorizontal; import static xapi.polymer.pickers.StringPickerElement.NEW_STRING_PICKER; import xapi.components.api.WebComponent; import xapi.components.api.WebComponentFactory; import xapi.polymer.core.PolymerElement; import xapi.ui.html.api.Css; import xapi.ui.html.api.Style; import xapi.ui.html.api.Style.Display; import xapi.ui.html.api.Style.Rgb; import xapi.ui.html.api.Style.Unit; import xapi.ui.html.api.Style.UnitType; import com.google.gwt.core.client.js.JsProperty; import com.google.gwt.core.client.js.JsType; import com.google.gwt.core.shared.GWT; import com.google.gwt.event.dom.client.ClickEvent; import elemental.dom.Element; @JsType @WebComponent(tagName=StringListPickerElement.TAG_NAME) @Css(style={ @Style( names = "."+StringListPickerElement.CLASS_NAME+" > core-label > div > .polymer", display = Display.Block, width = @Unit(value=100, type=UnitType.Pct) ), @Style( names = ".polymer .add", backgroundColor = @Rgb(r=0, g=0xff, b=0) ) }) public interface StringListPickerElement extends ListItemElement { String TAG_NAME = "xapi-string-list-picker"; String CLASS_NAME = "xapi-list"; WebComponentFactory<StringListPickerElement> NEW_STRING_LIST_PICKER = GWT.create(StringListPickerElement.class); @JsProperty StringPickerElement getStringPicker(); @JsProperty void setStringPicker(StringPickerElement stringPicker); @Override default void onCreated(Element element) { setRemovable(true); addClassName(element, CLASS_NAME); StringPickerElement stringPicker = NEW_STRING_PICKER.newComponent(); setStringPicker(stringPicker); onAfterCreated(e->{ Element core = getCoreLabel(); Element box = newFlexVertical("five"); box.setClassName("polymer"); Element inputBox = newLayoutCenterHorizontal(); inputBox.appendChild(stringPicker.getPolymer().element()); PolymerElement addButton = newIconButtonFloatingMini("add"); addButton.element().setClassName("add"); inputBox.appendChild(addButton.element()); box.appendChild(inputBox); box.appendChild(getPolymer().element()); core.appendChild(box); addButton.onClick(this::addNewValue); }, true); stringPicker.getPolymer().onKeyUp(ev -> { if (ev.getKeyCode() == ENTER) { // Treat this as if the user clicked the add button addNewValue(null); } }); } default void addNewValue(ClickEvent e) { String value = getStringPicker().getValue(); if (is(value)) { addValue(value); getStringPicker().setValue(""); } } }