diff --git a/src/main/java/com/mousetech/gourmetj/AdminMainBean.java b/src/main/java/com/mousetech/gourmetj/AdminMainBean.java index f828e1e..ec6be8a 100644 --- a/src/main/java/com/mousetech/gourmetj/AdminMainBean.java +++ b/src/main/java/com/mousetech/gourmetj/AdminMainBean.java @@ -6,6 +6,7 @@ import javax.annotation.PostConstruct; import javax.faces.event.AjaxBehaviorEvent; import javax.faces.model.DataModel; import javax.faces.model.ListDataModel; +import javax.faces.model.SelectItem; import javax.faces.view.ViewScoped; import javax.inject.Inject; import javax.inject.Named; @@ -13,6 +14,7 @@ import javax.inject.Named; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.List; import com.mousetech.gourmetj.UserSession; @@ -42,8 +44,8 @@ public class AdminMainBean implements Serializable { /* Logger */ - private static final Logger log = LoggerFactory.getLogger(AdminMainBean.class); - + private static final Logger log = + LoggerFactory.getLogger(AdminMainBean.class); /** * Persistency service for Recipes @@ -119,8 +121,8 @@ public class AdminMainBean implements Serializable { } /** - * Return to last search, if any - * No longer broken (required Maven include for annotation). + * Return to last search, if any No longer broken (required + * Maven include for annotation). */ @PostConstruct void init() { @@ -131,9 +133,9 @@ public class AdminMainBean implements Serializable { doFind(); } - /** * Search, driven by AJAX + * * @param event Notused */ public void ajaxUpdateList(AjaxBehaviorEvent event) { @@ -148,15 +150,31 @@ public class AdminMainBean implements Serializable { this.doFind(); } - /** * Finder * * @return Navigation string */ public String doFind() { - List recipes = - recipeService.findByTitle(searchText); + List recipes = null; + + switch (this.getSearchType()) { + case rst_BY_NAME: + recipes = recipeService.findByTitle(searchText); + break; + case rst_BY_CATEGORY: + recipes = recipeService.findByCategoryLike(searchText); + break; + case rst_BY_CUISINE: + recipes = recipeService.findByCuisineLike(searchText); + break; + case rst_BY_INGREDIENT: + recipes = recipeService.findByIngredientLike(searchText); + break; + default: + log.error("Invalid recipe search type: " + this.getSearchType()); + break; + } getSearchResults().setWrappedData(recipes); this.userSession.setLastSearch(this.getSearchText()); @@ -183,7 +201,8 @@ public class AdminMainBean implements Serializable { */ public String showRecipe() { long recipeId = getSearchResults().getRowData().getId(); - // Flash Scope is buggy under Mojarra plus now using session + // Flash Scope is buggy under Mojarra plus now using + // session // JSFUtils.flashScope().put("recipeID", // Long.valueOf(recipeId)); userSession.setLastEdit(recipeId); @@ -194,6 +213,7 @@ public class AdminMainBean implements Serializable { /** * Get printable preptime. Database version is in seconds. + * * @deprecated User {@link UserSession#formatTime(Long)} * * @return Formatted time. Called from EL on main page. @@ -214,4 +234,48 @@ public class AdminMainBean implements Serializable { return sb.toString(); } + // *** + + private RecipeSearchType searchType = + RecipeSearchType.rst_BY_NAME; + + /** + * @return the searchType + */ + public RecipeSearchType getSearchType() { + return searchType; + } + + /** + * @param searchType the searchType to set + */ + public void setSearchType(RecipeSearchType searchType) { + this.searchType = searchType; + } + + private List searchTypeList; + + /** + * @return the searchTypeList + */ + public List getSearchTypeList() { + if (searchTypeList == null) { + searchTypeList = loadSearchTypeList(); + } + return searchTypeList; + } + + private List loadSearchTypeList() { + List list = new ArrayList(5); + list.add(new SelectItem(RecipeSearchType.rst_BY_NAME, + "Title")); + list.add(new SelectItem(RecipeSearchType.rst_BY_CATEGORY, + "Category")); + list.add(new SelectItem(RecipeSearchType.rst_BY_CUISINE, + "Cuisine")); + list.add( + new SelectItem(RecipeSearchType.rst_BY_INGREDIENT, + "Ingredient")); + return list; + } } diff --git a/src/main/java/com/mousetech/gourmetj/RecipeSearchType.java b/src/main/java/com/mousetech/gourmetj/RecipeSearchType.java new file mode 100644 index 0000000..4fc0979 --- /dev/null +++ b/src/main/java/com/mousetech/gourmetj/RecipeSearchType.java @@ -0,0 +1,20 @@ +/** + * Copyright (C) 2022, Tim Holloway + * + * Date written: Jan 9, 2022 + * Author: Tim Holloway + */ +package com.mousetech.gourmetj; + +/** + * Types of recipe search for mainpage. + * + * @author timh + * @since Jan 9, 2022 + */ +public enum RecipeSearchType { + rst_BY_NAME, + rst_BY_CATEGORY, + rst_BY_CUISINE, + rst_BY_INGREDIENT +} diff --git a/src/main/java/com/mousetech/gourmetj/UserSession.java b/src/main/java/com/mousetech/gourmetj/UserSession.java index 4a0c100..f69260e 100644 --- a/src/main/java/com/mousetech/gourmetj/UserSession.java +++ b/src/main/java/com/mousetech/gourmetj/UserSession.java @@ -124,7 +124,9 @@ public class UserSession implements Serializable { return sb.toString(); } - //** Util, consider conversion to JSF Converter + /* + * @Deprecated Using TimeConverter. + */ public String formatTime(Long ltime) { return TimeFormatter.formatTime(ltime); } diff --git a/src/main/java/com/mousetech/gourmetj/persistence/dao/RecipeRepository.java b/src/main/java/com/mousetech/gourmetj/persistence/dao/RecipeRepository.java index 058382e..2b5bb67 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/dao/RecipeRepository.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/dao/RecipeRepository.java @@ -31,4 +31,11 @@ public interface RecipeRepository @Query(name = "Recipe.findCusines", nativeQuery = true) List FindCuisinesNative(); + + List findByCategories_CategoryContains(String searchText); + + List findByCuisineContains(String searchText); + + List findByIngredientHash_ItemContains(String searchText); + } diff --git a/src/main/java/com/mousetech/gourmetj/persistence/service/RecipeService.java b/src/main/java/com/mousetech/gourmetj/persistence/service/RecipeService.java index 483b536..7913ccc 100644 --- a/src/main/java/com/mousetech/gourmetj/persistence/service/RecipeService.java +++ b/src/main/java/com/mousetech/gourmetj/persistence/service/RecipeService.java @@ -113,4 +113,16 @@ public class RecipeService implements Serializable { public List findCategories() { return categoryRepository.findDistinctCategoryNative(); } + + public List findByCategoryLike(String searchText) { + return recipeRepository.findByCategories_CategoryContains(searchText); + } + + public List findByCuisineLike(String searchText) { + return recipeRepository.findByCuisineContains(searchText); + } + + public List findByIngredientLike(String searchText) { + return recipeRepository.findByIngredientHash_ItemContains(searchText); + } } diff --git a/src/main/resources/META-INF/resources/main.xhtml b/src/main/resources/META-INF/resources/main.xhtml index e4385b4..bc45c2f 100644 --- a/src/main/resources/META-INF/resources/main.xhtml +++ b/src/main/resources/META-INF/resources/main.xhtml @@ -7,6 +7,7 @@ > Gourmet Recipe Manager +
- + + + + + @@ -39,7 +48,8 @@
- -