use new SearchField for Comics
This commit is contained in:
@@ -12,9 +12,28 @@ public interface ComicRepository extends JpaRepository<Comic, String> {
|
|||||||
"where lower(c.title) like lower(concat('%', :searchTerm, '%')) ")
|
"where lower(c.title) like lower(concat('%', :searchTerm, '%')) ")
|
||||||
List<Comic> search(@Param("searchTerm") String searchTerm);
|
List<Comic> search(@Param("searchTerm") String searchTerm);
|
||||||
|
|
||||||
|
@Query("select c from Comic c " +
|
||||||
|
"where lower(c.title) like lower(concat('%', :searchTerm, '%')) " +
|
||||||
|
"AND c.currentOrder=:currentOrder AND c.completed=:completed")
|
||||||
|
List<Comic> search(@Param("searchTerm") String searchTerm, Boolean currentOrder, Boolean completed);
|
||||||
|
|
||||||
Comic findByTitleAndPublisher(String title, Publisher publisher);
|
Comic findByTitleAndPublisher(String title, Publisher publisher);
|
||||||
|
|
||||||
List<Comic> findByTitle(String title);
|
List<Comic> findByTitle(String title);
|
||||||
|
|
||||||
List<Comic> findByTitleIgnoreCase(String title);
|
List<Comic> findByTitleIgnoreCase(String title);
|
||||||
|
|
||||||
|
List<Comic> findByCurrentOrderAndCompleted(Boolean currentOrder, Boolean completed);
|
||||||
|
|
||||||
|
List<Comic> findByCurrentOrder(Boolean currentOrder);
|
||||||
|
|
||||||
|
List<Comic> findByCompleted(Boolean completed);
|
||||||
|
|
||||||
|
@Query("select c from Comic c " +
|
||||||
|
"where lower(c.title) like lower(concat('%', :searchTerm, '%')) AND c.currentOrder=:currentOrder")
|
||||||
|
List<Comic> searchAndFilterByCurrentOrder(String searchTerm, Boolean currentOrder);
|
||||||
|
|
||||||
|
@Query("select c from Comic c " +
|
||||||
|
"where lower(c.title) like lower(concat('%', :searchTerm, '%')) AND c.completed=:completed")
|
||||||
|
List<Comic> searchAndFilterByCompleted(String searchTerm, Boolean completed);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import java.util.List;
|
|||||||
|
|
||||||
import de.thpeetz.kontor.comics.data.*;
|
import de.thpeetz.kontor.comics.data.*;
|
||||||
import de.thpeetz.kontor.comics.repository.*;
|
import de.thpeetz.kontor.comics.repository.*;
|
||||||
|
import de.thpeetz.kontor.common.views.FilterOption;
|
||||||
|
import de.thpeetz.kontor.common.views.SearchFilter;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -71,6 +73,38 @@ public class ComicService {
|
|||||||
return comicRepository.search(stringFilter);
|
return comicRepository.search(stringFilter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
public List<Comic> findAllComicsByFilter(SearchFilter searchFilter) {
|
||||||
|
if (searchFilter == null) return comicRepository.findAll();
|
||||||
|
if (searchFilter.getFilterOptions().isEmpty()) return comicRepository.search(searchFilter.getSearchTerm());
|
||||||
|
if (searchFilter.getFilterOptions().size() == 1) {
|
||||||
|
FilterOption option = searchFilter.getFilterOptions().getFirst();
|
||||||
|
if (searchFilter.getSearchTerm() != null && !searchFilter.getSearchTerm().isEmpty()) {
|
||||||
|
switch (option.getName()) {
|
||||||
|
case "Bestellung":
|
||||||
|
return comicRepository.searchAndFilterByCurrentOrder(searchFilter.getSearchTerm(), option.getValue());
|
||||||
|
case "Abgeschlossen":
|
||||||
|
return comicRepository.searchAndFilterByCompleted(searchFilter.getSearchTerm(), option.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
switch (option.getName()) {
|
||||||
|
case "Bestellung":
|
||||||
|
return comicRepository.findByCurrentOrder(option.getValue());
|
||||||
|
case "Abgeschlossen":
|
||||||
|
return comicRepository.findByCompleted(option.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (searchFilter.getFilterOptions().size() == 2) {
|
||||||
|
if (searchFilter.getSearchTerm() != null && !searchFilter.getSearchTerm().isEmpty()) {
|
||||||
|
return comicRepository.search(searchFilter.getSearchTerm(),
|
||||||
|
searchFilter.getFilter("Bestellung").getValue(),
|
||||||
|
searchFilter.getFilter("Abgeschlossen").getValue());
|
||||||
|
}
|
||||||
|
return comicRepository.findByCurrentOrderAndCompleted(searchFilter.getFilter("Bestellung").getValue(),
|
||||||
|
searchFilter.getFilter("Abgeschlossen").getValue());
|
||||||
|
}
|
||||||
|
return comicRepository.findAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public Comic findComicByTitle(String title) {
|
public Comic findComicByTitle(String title) {
|
||||||
List<Comic> comics = comicRepository.findByTitle(title);
|
List<Comic> comics = comicRepository.findByTitle(title);
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package de.thpeetz.kontor.comics.views;
|
package de.thpeetz.kontor.comics.views;
|
||||||
|
|
||||||
|
import de.thpeetz.kontor.common.views.ColumnToggleContextMenu;
|
||||||
|
import de.thpeetz.kontor.common.views.MainLayout;
|
||||||
|
import de.thpeetz.kontor.common.views.SearchFilterField;
|
||||||
|
import de.thpeetz.kontor.common.views.StatusIcon;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
|
|
||||||
import com.vaadin.flow.component.Component;
|
import com.vaadin.flow.component.Component;
|
||||||
import com.vaadin.flow.component.button.Button;
|
import com.vaadin.flow.component.button.Button;
|
||||||
import com.vaadin.flow.component.button.ButtonVariant;
|
import com.vaadin.flow.component.button.ButtonVariant;
|
||||||
import com.vaadin.flow.component.grid.Grid;
|
import com.vaadin.flow.component.grid.Grid;
|
||||||
import com.vaadin.flow.component.icon.Icon;
|
|
||||||
import com.vaadin.flow.component.icon.VaadinIcon;
|
|
||||||
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
|
||||||
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
|
||||||
import com.vaadin.flow.component.textfield.TextField;
|
|
||||||
import com.vaadin.flow.data.value.ValueChangeMode;
|
|
||||||
import com.vaadin.flow.router.PageTitle;
|
import com.vaadin.flow.router.PageTitle;
|
||||||
import com.vaadin.flow.router.Route;
|
import com.vaadin.flow.router.Route;
|
||||||
import com.vaadin.flow.spring.annotation.SpringComponent;
|
import com.vaadin.flow.spring.annotation.SpringComponent;
|
||||||
@@ -19,9 +19,6 @@ import com.vaadin.flow.spring.annotation.SpringComponent;
|
|||||||
import de.thpeetz.kontor.comics.ComicConstants;
|
import de.thpeetz.kontor.comics.ComicConstants;
|
||||||
import de.thpeetz.kontor.comics.data.Comic;
|
import de.thpeetz.kontor.comics.data.Comic;
|
||||||
import de.thpeetz.kontor.comics.services.ComicService;
|
import de.thpeetz.kontor.comics.services.ComicService;
|
||||||
import de.thpeetz.kontor.common.views.ColumnToggleContextMenu;
|
|
||||||
import de.thpeetz.kontor.common.views.MainLayout;
|
|
||||||
import de.thpeetz.kontor.common.views.StatusIcon;
|
|
||||||
import jakarta.annotation.security.PermitAll;
|
import jakarta.annotation.security.PermitAll;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -52,7 +49,7 @@ public class ComicView extends VerticalLayout {
|
|||||||
.setHeader("Abgeschlossen").setWidth("6rem").setSortable(true);
|
.setHeader("Abgeschlossen").setWidth("6rem").setSortable(true);
|
||||||
Grid.Column<Comic> weblinkColumn = grid.addColumn(Comic::getWeblink)
|
Grid.Column<Comic> weblinkColumn = grid.addColumn(Comic::getWeblink)
|
||||||
.setHeader("Link").setResizable(true).setSortable(true);
|
.setHeader("Link").setResizable(true).setSortable(true);
|
||||||
TextField filterText = new TextField();
|
SearchFilterField searchFilterField = new SearchFilterField();
|
||||||
@Getter
|
@Getter
|
||||||
ComicForm form;
|
ComicForm form;
|
||||||
ComicService service;
|
ComicService service;
|
||||||
@@ -106,11 +103,9 @@ public class ComicView extends VerticalLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private HorizontalLayout getToolbar() {
|
private HorizontalLayout getToolbar() {
|
||||||
filterText.setPlaceholder("Filter by name...");
|
searchFilterField.addFilter("Bestellung");
|
||||||
filterText.setClearButtonVisible(true);
|
searchFilterField.addFilter("Abgeschlossen");
|
||||||
filterText.setPrefixComponent(new Icon(VaadinIcon.SEARCH));
|
searchFilterField.addValueChangeListener(e -> updateList());
|
||||||
filterText.setValueChangeMode(ValueChangeMode.LAZY);
|
|
||||||
filterText.addValueChangeListener(e -> updateList());
|
|
||||||
|
|
||||||
Button addComicButton = new Button("Add comic");
|
Button addComicButton = new Button("Add comic");
|
||||||
addComicButton.addClickListener(click -> addComic());
|
addComicButton.addClickListener(click -> addComic());
|
||||||
@@ -126,7 +121,7 @@ public class ComicView extends VerticalLayout {
|
|||||||
columnToggleContextMenu.addColumnToggleItem(currentOrderColumn);
|
columnToggleContextMenu.addColumnToggleItem(currentOrderColumn);
|
||||||
columnToggleContextMenu.addColumnToggleItem(completedColumn);
|
columnToggleContextMenu.addColumnToggleItem(completedColumn);
|
||||||
columnToggleContextMenu.addColumnToggleItem(weblinkColumn);
|
columnToggleContextMenu.addColumnToggleItem(weblinkColumn);
|
||||||
HorizontalLayout toolbar = new HorizontalLayout(filterText, addComicButton, menuButton);
|
HorizontalLayout toolbar = new HorizontalLayout(searchFilterField, addComicButton, menuButton);
|
||||||
toolbar.addClassName("toolbar");
|
toolbar.addClassName("toolbar");
|
||||||
return toolbar;
|
return toolbar;
|
||||||
}
|
}
|
||||||
@@ -159,6 +154,6 @@ public class ComicView extends VerticalLayout {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void updateList() {
|
public void updateList() {
|
||||||
grid.setItems(service.findAllComics(filterText.getValue()));
|
grid.setItems(service.findAllComicsByFilter(searchFilterField.getValue()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,11 @@
|
|||||||
package de.thpeetz.kontor.common.views;
|
package de.thpeetz.kontor.common.views;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import com.vaadin.flow.component.HasValue;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
@@ -17,11 +20,18 @@ public class SearchFilter {
|
|||||||
@Getter
|
@Getter
|
||||||
private List<FilterOption> filterOptions = new LinkedList<>();
|
private List<FilterOption> filterOptions = new LinkedList<>();
|
||||||
|
|
||||||
|
private final Map<String, FilterOption> filterMap = new HashMap<>();
|
||||||
|
|
||||||
public SearchFilter() {
|
public SearchFilter() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addFilter(FilterOption option) {
|
public void addFilter(FilterOption option) {
|
||||||
filterOptions.add(option);
|
filterOptions.add(option);
|
||||||
|
filterMap.put(option.getName(), option);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FilterOption getFilter(String optionName) {
|
||||||
|
return filterMap.get(optionName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
package de.thpeetz.kontor.common.views;
|
package de.thpeetz.kontor.common.views;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import com.vaadin.flow.component.combobox.MultiSelectComboBox;
|
import com.vaadin.flow.component.combobox.MultiSelectComboBox;
|
||||||
@@ -50,7 +52,8 @@ public class SearchFilterField extends CustomField<SearchFilter> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void addFilter(String optionName) {
|
public void addFilter(String optionName) {
|
||||||
filterOptions.add(new FilterOption(optionName, true));
|
FilterOption filterOption = new FilterOption(optionName, true);
|
||||||
|
filterOptions.add(filterOption);
|
||||||
filterField.setItems(filterOptions);
|
filterField.setItems(filterOptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user