Skip to content

Commit

Permalink
changed search button to new component
Browse files Browse the repository at this point in the history
  • Loading branch information
Kateryna Honchar committed Jun 28, 2022
1 parent eb14496 commit 71082b0
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 91 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
~ and European Union Public License. See LICENSE file for details.
-->
<wicket:panel xmlns:wicket="http://wicket.apache.org">
<div class="input-group-append">
<div class="btn-group btn-group-sm">
<button wicket:id="searchButton" class="btn btn-primary">
<i class="fa fa-search mr-1"/>&nbsp;
<span wicket:id="searchButtonLabel"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,37 @@
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;

import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction;
import com.evolveum.midpoint.web.component.menu.cog.MenuLinkPanel;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxSubmitLink;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.List;

public abstract class SearchButtonWithDropdownMenu extends BasePanel<List<InlineMenuItem>> {
public abstract class SearchButtonWithDropdownMenu<E extends Enum> extends BasePanel<List<E>> {
private static final long serialVersionUID = 1L;

private static final String ID_SEARCH_BUTTON = "searchButton";
private static final String ID_SEARCH_BUTTON_LABEL = "searchButtonLabel";
private static final String ID_MENU_ITEMS = "menuItems";
private static final String ID_MENU_ITEM = "menuItem";

InlineMenuItem selectedItem;
IModel<String> buttonLabelModel;

public SearchButtonWithDropdownMenu(String id, @NotNull IModel<List<InlineMenuItem>> menuItemsModel) {
public SearchButtonWithDropdownMenu(String id, @NotNull IModel<List<E>> menuItemsModel, IModel<String> buttonLabelModel) {
super(id, menuItemsModel);
selectedItem = CollectionUtils.isNotEmpty(menuItemsModel.getObject()) ? menuItemsModel.getObject().get(0) : null;
this.buttonLabelModel = buttonLabelModel;
}

protected void onInitialize() {
Expand All @@ -48,17 +50,31 @@ protected void onInitialize() {
private void initLayout() {
final AjaxSubmitLink searchButton = new AjaxSubmitLink(ID_SEARCH_BUTTON) {

private static final long serialVersionUID = 1L;

@Override
protected void onError(AjaxRequestTarget target) {
Form form = SearchButtonWithDropdownMenu.this.findParent(Form.class);
if (form != null) {
target.add(form);
} else {
target.add(SearchButtonWithDropdownMenu.this.getPageBase());
}
}

@Override
protected void onSubmit(AjaxRequestTarget target) {
searchPerformed(target);
}
};
searchButton.setOutputMarkupId(true);
searchButton.add(getSearchButtonVisibleEnableBehavior());

searchButton.add(new Label(ID_SEARCH_BUTTON_LABEL, (IModel<Object>) () -> selectedItem.getLabel()));
Label buttonLabel = new Label(ID_SEARCH_BUTTON_LABEL, buttonLabelModel);
searchButton.add(buttonLabel);
add(searchButton);

ListView<InlineMenuItem> menuItems = new ListView<InlineMenuItem>(ID_MENU_ITEMS, getModel()) {
ListView<InlineMenuItem> menuItems = new ListView<InlineMenuItem>(ID_MENU_ITEMS, createMenuItemsModel()) {

private static final long serialVersionUID = 1L;

Expand All @@ -80,9 +96,49 @@ public boolean isVisible() {

}

public Component getSearchButton() {
return get(ID_SEARCH_BUTTON);
protected VisibleEnableBehaviour getSearchButtonVisibleEnableBehavior() {
return new VisibleEnableBehaviour();
}

private IModel<List<InlineMenuItem>> createMenuItemsModel() {
List<InlineMenuItem> menuItems = new ArrayList<>();
getModelObject().forEach(item -> {
InlineMenuItem searchItem = new InlineMenuItem(createStringResource(item)) {
private static final long serialVersionUID = 1L;

@Override
public InlineMenuItemAction initAction() {
return new InlineMenuItemAction() {

private static final long serialVersionUID = 1L;

@Override
public void onClick(AjaxRequestTarget target) {
target.add(getSearchButton());
menuItemSelected(target, item);
}
};
}

@Override
public IModel<Boolean> getVisible() {
return isMenuItemVisible(item);
}
};
menuItems.add(searchItem);
});
return Model.ofList(menuItems);
}

public AjaxSubmitLink getSearchButton() {
return (AjaxSubmitLink) get(ID_SEARCH_BUTTON);
}

public IModel<Boolean> isMenuItemVisible(E item) {
return Model.of(true);
}

protected abstract void searchPerformed(AjaxRequestTarget target);

protected abstract void menuItemSelected(AjaxRequestTarget target, E item);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,23 +9,7 @@
<form wicket:id="form" class="search-panel-form d-flex flex-wrap justify-content-end gap-1 align-items-start">
<div wicket:id="searchItemsPanel"/>

<div wicket:id="searchContainer">
<div class="btn-group btn-group-sm">
<button type="button" class="btn btn-primary" about="searchSimple" wicket:id="submitSearchButton">
<i class="fa fa-search flip-icon fa-lg"></i>
</button>
<button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false" wicket:id="searchTypesMenu">
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu pull-right" role="menu">
<li wicket:id="searchTypeItems">
<div wicket:id="searchType"/>
</li>
</ul>
</div>
</div>
<div wicket:id="searchButtonPanel" />
<div class="btn-group btn-group-sm" wicket:id="saveSearchContainer">
<button type="button" class="btn btn-default" wicket:id="saveSearchButton">
<i class="fa fa-save"></i>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import org.apache.wicket.markup.html.panel.Fragment;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.LoadableDetachableModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;

Expand Down Expand Up @@ -86,6 +87,7 @@ public abstract class SearchPanel<C extends Containerable> extends BasePanel<Sea
private static final String ID_FORM = "form";
private static final String ID_SEARCH_ITEMS_PANEL = "searchItemsPanel";
private static final String ID_SEARCH_CONTAINER = "searchContainer";
private static final String ID_SEARCH_BUTTON_PANEL = "searchButtonPanel";
private static final String ID_SUBMIT_SEARCH_BUTTON = "submitSearchButton";
private static final String ID_SEARCH_TYPES_MENU = "searchTypesMenu";
private static final String ID_SEARCH_TYPE_ITEMS = "searchTypeItems";
Expand Down Expand Up @@ -131,6 +133,7 @@ protected void onInitialize() {

private void initBasicSearchItemsModel() {
basicSearchItemsModel = new LoadableModel<List<AbstractSearchItemWrapper>>(true) {
private static final long serialVersionUID = 1L;
@Override
protected List<AbstractSearchItemWrapper> load() {
return getModelObject().getItems().stream().filter(item
Expand Down Expand Up @@ -166,84 +169,54 @@ private <S extends AbstractSearchItemWrapper, T extends Serializable> void initL
form.add(searchItemsRepeatingView);
initSearchItemsPanel(searchItemsRepeatingView);

WebMarkupContainer searchContainer = new WebMarkupContainer(ID_SEARCH_CONTAINER);
searchContainer.setOutputMarkupId(true);
form.add(searchContainer);

AjaxCompositedIconSubmitButton submitSearchButton = new AjaxCompositedIconSubmitButton(ID_SUBMIT_SEARCH_BUTTON, getSubmitSearchButtonBuilder(),
getPageBase().createStringResource("SearchPanel.search")) {

private static final long serialVersionUID = 1L;

LoadableDetachableModel<String> labelModel = new LoadableDetachableModel<String>() {
@Override
protected void onError(AjaxRequestTarget target) {
target.add(form);
protected String load() {
return createStringResource(SearchPanel.this.getModelObject().getSearchMode()).getString();
}

};
SearchButtonWithDropdownMenu<SearchBoxModeType> searchButtonPanel = new SearchButtonWithDropdownMenu<SearchBoxModeType>(ID_SEARCH_BUTTON_PANEL,
Model.ofList(getSearchConfigurationWrapper().getAllowedModeList()), labelModel) {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target) {
protected void searchPerformed(AjaxRequestTarget target) {
searchPerformed(target);
}
};

IModel<String> buttonRightPaddingModel = () -> {
boolean isLongButton = SearchBoxModeType.BASIC.equals(getSearchConfigurationWrapper().getDefaultSearchBoxMode())
|| SearchBoxModeType.AXIOM_QUERY.equals(getSearchConfigurationWrapper().getDefaultSearchBoxMode());
String style = "padding-right: " + (isLongButton ? "23" : "16") + "px;";
if (getSearchConfigurationWrapper().getAllowedModeList().size() == 1) {
style = style + "border-top-right-radius: 3px; border-bottom-right-radius: 3px;";
@Override
protected void menuItemSelected(AjaxRequestTarget target, SearchBoxModeType searchBoxModeType) {
searchBoxTypeUpdated(target, searchBoxModeType);
}
return style;
};
submitSearchButton.add(AttributeAppender.append("style", buttonRightPaddingModel));

submitSearchButton.add(new VisibleEnableBehaviour() {

private static final long serialVersionUID = 1L;

@Override
public boolean isEnabled() {
Search search = getModelObject();
if (SearchBoxModeType.ADVANCED.equals(getModelObject().getSearchMode())
|| SearchBoxModeType.AXIOM_QUERY.equals(getModelObject().getSearchMode())) {
PrismContext ctx = getPageBase().getPrismContext();
return search.isAdvancedQueryValid(ctx);
}
if (SearchBoxModeType.FULLTEXT.equals(getModelObject().getSearchMode())) {
return search.isFullTextSearchEnabled();
}
if (SearchBoxModeType.BASIC.equals(getModelObject().getSearchMode())) {
return CollectionUtils.isNotEmpty(getModelObject().getItems());
public IModel<Boolean> isMenuItemVisible(SearchBoxModeType searchBoxModeType) {
if (SearchBoxModeType.AXIOM_QUERY.equals(searchBoxModeType)) {
return Model.of(WebModelServiceUtils.isEnableExperimentalFeature(getPageBase())
&& getSearchConfigurationWrapper().getAllowedModeList().contains(searchBoxModeType));
}
return true;
return Model.of(getSearchConfigurationWrapper().getAllowedModeList().contains(searchBoxModeType));
}
});
submitSearchButton.setOutputMarkupId(true);
searchContainer.add(submitSearchButton);
form.setDefaultButton(submitSearchButton);

WebMarkupContainer dropdownButton = new WebMarkupContainer(ID_SEARCH_TYPES_MENU);
dropdownButton.add(new VisibleBehaviour(() -> getSearchConfigurationWrapper().getAllowedModeList().size() != 1));
searchContainer.add(dropdownButton);

ListView<InlineMenuItem> li = new ListView<InlineMenuItem>(ID_SEARCH_TYPE_ITEMS, getSearchBoxTypesList()) {

private static final long serialVersionUID = 1L;

@Override
protected void populateItem(ListItem<InlineMenuItem> item) {
WebMarkupContainer menuItemBody = new MenuLinkPanel(ID_SEARCH_TYPE, item.getModel());
menuItemBody.setRenderBodyOnly(true);
item.add(menuItemBody);
menuItemBody.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return Boolean.TRUE.equals(item.getModelObject().getVisible().getObject());
}
});
protected VisibleEnableBehaviour getSearchButtonVisibleEnableBehavior() {
return SearchPanel.this.getSearchButtonVisibleEnableBehavior();
}
};
searchContainer.add(li);

searchButtonPanel.setOutputMarkupId(true);
form.add(searchButtonPanel);
form.setDefaultButton(searchButtonPanel.getSearchButton());

// IModel<String> buttonRightPaddingModel = () -> {
// boolean isLongButton = SearchBoxModeType.BASIC.equals(getSearchConfigurationWrapper().getDefaultSearchBoxMode())
// || SearchBoxModeType.AXIOM_QUERY.equals(getSearchConfigurationWrapper().getDefaultSearchBoxMode());
// String style = "padding-right: " + (isLongButton ? "23" : "16") + "px;";
// if (getSearchConfigurationWrapper().getAllowedModeList().size() == 1) {
// style = style + "border-top-right-radius: 3px; border-bottom-right-radius: 3px;";
// }
// return style;
// };
// submitSearchButton.add(AttributeAppender.append("style", buttonRightPaddingModel));

WebMarkupContainer saveSearchContainer = new WebMarkupContainer(ID_SAVE_SEARCH_CONTAINER);
saveSearchContainer.add(new VisibleBehaviour(() -> !isPopupWindow() && isCollectionInstancePage()));
Expand Down Expand Up @@ -327,6 +300,30 @@ public void onClick(AjaxRequestTarget target) {
saveSearchContainer.add(savedSearchMenu);
}

private VisibleEnableBehaviour getSearchButtonVisibleEnableBehavior() {
return new VisibleEnableBehaviour() {

private static final long serialVersionUID = 1L;

@Override
public boolean isEnabled() {
Search search = getModelObject();
if (SearchBoxModeType.ADVANCED.equals(getModelObject().getSearchMode())
|| SearchBoxModeType.AXIOM_QUERY.equals(getModelObject().getSearchMode())) {
PrismContext ctx = getPageBase().getPrismContext();
return search.isAdvancedQueryValid(ctx);
}
if (SearchBoxModeType.FULLTEXT.equals(getModelObject().getSearchMode())) {
return search.isFullTextSearchEnabled();
}
if (SearchBoxModeType.BASIC.equals(getModelObject().getSearchMode())) {
return CollectionUtils.isNotEmpty(getModelObject().getItems());
}
return true;
}
};
}

private void selectSavedFilterPerformed(List<AvailableFilterType> filterList, AjaxRequestTarget target) {
if (CollectionUtils.isEmpty(filterList)) {
return;
Expand Down

0 comments on commit 71082b0

Please sign in to comment.