Skip to content

Commit

Permalink
Change the solution to use an enum to make the code clearer and make …
Browse files Browse the repository at this point in the history
…it easier to add more behaviours later
  • Loading branch information
Erik Strid authored and bitstorm committed Dec 2, 2024
1 parent d227133 commit fc290a0
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,8 @@ protected final String constructSettingsJS()
{
sb.append(",className: '").append(settings.getCssClassName()).append('\'');
}
sb.append(",focusInputOnTabSelection: ").append(settings.shouldFocusInputOnTabSelection());
sb.append(",tabBehavior: '").append(
settings.getTabBehavior().getValue()).append('\'');
sb.append('}');
return sb.toString();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public final class AutoCompleteSettings implements IClusterable

private int minInputLength = 1;

private boolean focusInputOnTabSelection = false;
private TabBehavior tabBehavior = TabBehavior.SELECT_FOCUS_NEXT_ELEMENT;

/**
* Indicates whether the first item in the list is automatically selected when the autocomplete
Expand Down Expand Up @@ -384,27 +384,52 @@ public AutoCompleteSettings setMinInputLength(int minInputLength)

/**
* Indicates how the Tab key should be handled when having an item in the autocomplete list
* selected.
* selected, {@link TabBehavior#SELECT_FOCUS_NEXT_ELEMENT} is the default behavior.
*
* @return <code>true</code> if the focus should return to the input field, <code>false</code>
* moves the focus to the next component.
* @return the behavior that should be used when the Tab key is pressed
*/
public boolean shouldFocusInputOnTabSelection()
public TabBehavior getTabBehavior()
{
return focusInputOnTabSelection;
return tabBehavior;
}

/**
* Set how the tab key should be handled when having an item in the autocomplete list selected.
* Set how the Tab key should be handled when having an item in the autocomplete list selected.
*
* @param focusInputOnTabSelection <code>true</code> if the focus should return to the input
* field when the Tab key pressed, <code>false</code> is the default which moves the focus to
* the next component.
* @param tabSelectBehavior the behavior that should be used when the Tab key is pressed,
* {@link TabBehavior#SELECT_FOCUS_NEXT_ELEMENT} is the default behavior
* @return this {@link AutoCompleteSettings}
*/
public AutoCompleteSettings setFocusInputOnTabSelection(boolean focusInputOnTabSelection)
public AutoCompleteSettings setTabBehavior(TabBehavior tabSelectBehavior)
{
this.focusInputOnTabSelection = focusInputOnTabSelection;
this.tabBehavior = tabSelectBehavior;
return this;
}

/**
* A behavior that can be used to control how the Tab key should be handled when having an item
* in the autocomplete list is marked.
*/
public enum TabBehavior {
/**
* Select the currently marked item and move the focus to the next focusable element.
*/
SELECT_FOCUS_NEXT_ELEMENT("selectFocusNextElement"),
/**
* Select the currently marked item and move the focus to the auto complete input field.
*/
SELECT_FOCUS_INPUT("selectFocusAutocompleteInput");

private final String value;

TabBehavior(String value)
{
this.value = value;
}

public String getValue()
{
return value;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -184,7 +184,7 @@

hideAutoComplete();

if (cfg.focusInputOnTabSelection && keyCode === KEY_TAB) {
if (cfg.tabBehavior === 'selectFocusAutocompleteInput' && keyCode === KEY_TAB) {
// prevent moving focus to the next component if an item in the dropdown is selected
// using the Tab key
jqEvent.preventDefault();
Expand Down

0 comments on commit fc290a0

Please sign in to comment.