diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AutoCompleteTextFieldComponent.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AutoCompleteTextFieldComponent.java index e3d766391..24f69d2fc 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AutoCompleteTextFieldComponent.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/AutoCompleteTextFieldComponent.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.concurrent.Executor; import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; import org.eclipse.hawkbit.repository.rsql.RsqlValidationOracle; import org.eclipse.hawkbit.ui.common.builder.TextFieldBuilder; @@ -24,8 +25,9 @@ import org.eclipse.hawkbit.ui.utils.SPUIStyleDefinitions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.vaadin.spring.events.EventBus; +import org.vaadin.spring.events.EventScope; +import org.vaadin.spring.events.annotation.EventBusListenerMethod; -import com.vaadin.event.ShortcutListener; import com.vaadin.server.FontAwesome; import com.vaadin.shared.ui.label.ContentMode; import com.vaadin.spring.annotation.SpringComponent; @@ -85,9 +87,27 @@ public class AutoCompleteTextFieldComponent extends HorizontalLayout { */ @PostConstruct public void postConstruct() { + eventBus.subscribe(this); new TextFieldSuggestionBox(rsqlValidationOracle, this).extend(queryTextField); } + @PreDestroy + void destroy() { + eventBus.unsubscribe(this); + } + + @EventBusListenerMethod(scope = EventScope.SESSION) + void onEvent(final CustomFilterUIEvent custFUIEvent) { + if (custFUIEvent == CustomFilterUIEvent.UPDATE_TARGET_FILTER_SEARCH_ICON) { + validationIcon.setValue(FontAwesome.CHECK_CIRCLE.getHtml()); + if (!isValidationError()) { + validationIcon.setStyleName(SPUIStyleDefinitions.SUCCESS_ICON); + } else { + validationIcon.setStyleName(SPUIStyleDefinitions.ERROR_ICON); + } + } + } + /** * Clears the textfield and resets the validation icon. */ @@ -181,7 +201,6 @@ public class AutoCompleteTextFieldComponent extends HorizontalLayout { textField.setTextChangeEventMode(TextChangeEventMode.EAGER); textField.setImmediate(true); textField.setTextChangeTimeout(100); - textField.addShortcutListener(new EnterShortCutListener()); return textField; } @@ -214,27 +233,17 @@ public class AutoCompleteTextFieldComponent extends HorizontalLayout { } } - private final class EnterShortCutListener extends ShortcutListener { + /** + * Sets the spinner as progress indicator. + */ + public void showValidationInProgress() { + validationIcon.setValue(null); + validationIcon.addStyleName("show-status-label"); + validationIcon.setStyleName(SPUIStyleDefinitions.TARGET_FILTER_SEARCH_PROGRESS_INDICATOR_STYLE); + } - private static final long serialVersionUID = 1L; - - public EnterShortCutListener() { - super("Enter", KeyCode.ENTER, new int[0]); - } - - @Override - public void handleAction(final Object sender, final Object target) { - if (!isValidationError()) { - showValidationInProgress(); - executor.execute(new StatusCircledAsync(UI.getCurrent())); - } - } - - private void showValidationInProgress() { - validationIcon.setValue(null); - validationIcon.addStyleName("show-status-label"); - validationIcon.setStyleName(SPUIStyleDefinitions.TARGET_FILTER_SEARCH_PROGRESS_INDICATOR_STYLE); - } + public Executor getExecutor() { + return executor; } /** diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TextFieldSuggestionBox.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TextFieldSuggestionBox.java index 3c3b63bee..51dae8561 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TextFieldSuggestionBox.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/TextFieldSuggestionBox.java @@ -20,6 +20,7 @@ import org.eclipse.hawkbit.ui.filtermanagement.client.TextFieldSuggestionBoxServ import com.vaadin.server.AbstractExtension; import com.vaadin.ui.TextField; +import com.vaadin.ui.UI; /** * Extension for the AutoCompleteTexfield. @@ -64,6 +65,15 @@ public class TextFieldSuggestionBox extends AbstractExtension implements TextFie getRpcProxy(TextFieldSuggestionBoxClientRpc.class).showSuggestions(mapToDto(suggest.getSuggestionContext())); } + @Override + public void executeQuery(final String text, final int cursor) { + if (!autoCompleteTextFieldComponent.isValidationError()) { + autoCompleteTextFieldComponent.showValidationInProgress(); + autoCompleteTextFieldComponent.getExecutor() + .execute(autoCompleteTextFieldComponent.new StatusCircledAsync(UI.getCurrent())); + } + } + private static SuggestionContextDto mapToDto(final SuggestionContext suggestionContext) { return new SuggestionContextDto(suggestionContext.getCursorPosition(), suggestionContext.getSuggestions().stream() diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/client/AutoCompleteTextFieldConnector.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/client/AutoCompleteTextFieldConnector.java index 949b2a39d..8b5812bf1 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/client/AutoCompleteTextFieldConnector.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/client/AutoCompleteTextFieldConnector.java @@ -82,6 +82,8 @@ public class AutoCompleteTextFieldConnector extends AbstractExtensionConnector { public void onKeyUp(final KeyUpEvent event) { if (panel.isAttached()) { handlePanelEventDelegation(event); + } else if (event.getNativeKeyCode() == KeyCodes.KEY_ENTER) { + rpc.executeQuery(textFieldWidget.getValue(), textFieldWidget.getCursorPos()); } else { doAskForSuggestion(); } diff --git a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/client/TextFieldSuggestionBoxServerRpc.java b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/client/TextFieldSuggestionBoxServerRpc.java index 51388a0a3..c1fc5ca8b 100644 --- a/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/client/TextFieldSuggestionBoxServerRpc.java +++ b/hawkbit-ui/src/main/java/org/eclipse/hawkbit/ui/filtermanagement/client/TextFieldSuggestionBoxServerRpc.java @@ -15,7 +15,6 @@ import com.vaadin.shared.communication.ServerRpc; * make client to server calls in Vaadin. Only void methods are allowed in * ServerRpc calls. */ -@FunctionalInterface public interface TextFieldSuggestionBoxServerRpc extends ServerRpc { /** @@ -31,4 +30,15 @@ public interface TextFieldSuggestionBoxServerRpc extends ServerRpc { * the current cursor position */ void suggest(final String text, final int cursor); + + /** + * Executes the query text to get the filtered data. + * + * @param text + * the current entered text e.g. in a text field to retrieve + * suggestion for + * @param cursor + * the current cursor position + */ + void executeQuery(final String text, final int cursor); }