Skip to content

Commit

Permalink
Add/remove extension dom elements correctly when text field attached/…
Browse files Browse the repository at this point in the history
…detached (#14)
  • Loading branch information
wbadam committed Apr 12, 2017
1 parent a73f118 commit defd047
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 11 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>org.vaadin.addons</groupId>
<artifactId>autocomplete</artifactId>
<version>0.2.0-SNAPSHOT</version>
<version>0.2.1-SNAPSHOT</version>
<packaging>bundle</packaging>
<name>Autocomplete Extension</name>
<organization>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,15 @@ protected void extend(ServerConnector serverConnector) {

suggestionList.setMaxSize(getState().suggestionListSize);

if (textField.isAttached()) {
addExtensionElements();
}

attachHandler = textField.addAttachHandler(event -> {
Element textElement = textField.getElement();
if (event.isAttached()) {
textElement.getParentElement()
.insertBefore(wrapper, textElement);
wrapper.appendChild(textElement);
wrapper.appendChild(suggestionList.getElement());
addExtensionElements();
} else {
wrapper.removeFromParent();
removeExtensionElements();
}
});

Expand Down Expand Up @@ -157,10 +157,10 @@ protected void extend(ServerConnector serverConnector) {
public void onUnregister() {
super.onUnregister();

// Remove autocomplete wrapper
wrapper.getParentElement()
.insertBefore(textField.getElement(), wrapper);
wrapper.removeFromParent();
// Remove autocomplete elements
if (textField.isAttached()) {
removeExtensionElements();
}

// Remove input event listener
Optional.ofNullable(inputHandler)
Expand All @@ -171,6 +171,19 @@ public void onUnregister() {
.ifPresent(HandlerRegistration::removeHandler);
}

private void addExtensionElements() {
Element textElement = textField.getElement();
textElement.getParentElement().insertBefore(wrapper, textElement);
wrapper.appendChild(textElement);
wrapper.appendChild(suggestionList.getElement());
}

private void removeExtensionElements() {
Element textElement = textField.getElement();
wrapper.getParentElement().insertBefore(textElement, wrapper);
wrapper.removeFromParent();
}

private void onSuggestionSelected() {
final SuggestionList.SuggestionItem selectedItem = suggestionList
.getSelectedItem();
Expand Down
66 changes: 66 additions & 0 deletions src/test/java/org/vaadin/addons/autocomplete/AddRemoveUsageUI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package org.vaadin.addons.autocomplete;

import java.util.List;
import java.util.stream.Collectors;

import org.vaadin.addonhelpers.AbstractTest;

import com.vaadin.ui.Button;
import com.vaadin.ui.Component;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Notification;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;

public class AddRemoveUsageUI extends AbstractTest {

private TextField textField;
private AutocompleteExtension<String> extension;

@Override
public Component getTestComponent() {

VerticalLayout layout = new VerticalLayout();

textField = createField();
extension = createExtension(textField);

Button removeExtension = new Button("Remove extension",
e -> extension.remove());

Button addExtension = new Button("Add extension",
e -> extension = createExtension(textField));

Button removeField = new Button("Remove field",
e -> layout.removeComponent(textField));

Button addField = new Button("Add field",
e -> layout.addComponentAsFirst(textField));

layout.addComponents(textField,
new HorizontalLayout(removeExtension, addExtension),
new HorizontalLayout(removeField, addField));

return layout;
}

private TextField createField() {
return new TextField();
}

private AutocompleteExtension<String> createExtension(TextField field) {
AutocompleteExtension<String> extension = new AutocompleteExtension<>(
field);
extension.setSuggestionGenerator(this::suggestPlanet);
extension.addSuggestionSelectListener(event -> {
event.getSelectedItem().ifPresent(Notification::show);
});
return extension;
}

private List<String> suggestPlanet(String query, int cap) {
return DataSource.getPlanets().stream()
.filter(p -> p.toLowerCase().contains(query.toLowerCase()))
.limit(cap).collect(Collectors.toList());
}
}

0 comments on commit defd047

Please sign in to comment.