diff --git a/handlers/search/filters.go b/handlers/search/filters.go index 4775be26..f7fe96a1 100644 --- a/handlers/search/filters.go +++ b/handlers/search/filters.go @@ -1,112 +1,66 @@ package search import ( - "fmt" - - "blackfyre.ninja/wga/models" "github.com/labstack/echo/v5" "github.com/pocketbase/dbx" "github.com/pocketbase/pocketbase" ) type filters struct { - Q string - School string - ArtForm string - ArtType string + Title string + SchoolString string + ArtFormString string + ArtTypeString string + ArtistString string } func (f *filters) AnyFilterActive() bool { - return f.Q != "" || f.School != "" || f.ArtForm != "" || f.ArtType != "" + return f.Title != "" || f.SchoolString != "" || f.ArtFormString != "" || f.ArtTypeString != "" || f.ArtistString != "" } func (f *filters) FingerPrint() string { - return f.Q + ":" + f.School + ":" + f.ArtForm + ":" + f.ArtType + return f.Title + ":" + f.SchoolString + ":" + f.ArtFormString + ":" + f.ArtTypeString + ":" + f.ArtistString } func (f *filters) BuildFilter() (string, dbx.Params) { filterString := "published = true" params := dbx.Params{} - if f.Q != "" { - filterString = filterString + " && name ~ {:q}" - params["q"] = f.Q + if f.Title != "" { + filterString = filterString + " && title ~ {:title}" + params["title"] = f.Title } - if f.School != "" { - filterString = filterString + " && school = {:art_school}" - params["art_school"] = f.School + if f.SchoolString != "" { + filterString = filterString + " && school.slug = {:art_school}" + params["art_school"] = f.SchoolString } - if f.ArtForm != "" { - filterString = filterString + " && form = {:art_form}" - params["art_form"] = f.ArtForm + if f.ArtFormString != "" { + filterString = filterString + " && form.slug = {:art_form}" + params["art_form"] = f.ArtFormString } - if f.ArtType != "" { - filterString = filterString + " && type = {:art_type}" - params["art_type"] = f.ArtType + if f.ArtTypeString != "" { + filterString = filterString + " && type.slug = {:art_type}" + params["art_type"] = f.ArtTypeString } - fmt.Println(filterString, params) + if f.ArtistString != "" { + filterString = filterString + " && author.name ~ {:artist}" + params["artist"] = f.ArtistString + } return filterString, params } func buildFilters(app *pocketbase.PocketBase, c echo.Context) *filters { f := &filters{ - Q: c.QueryParamDefault("q", ""), - School: c.QueryParamDefault("art_school", ""), - ArtForm: c.QueryParamDefault("art_form", ""), - ArtType: c.QueryParamDefault("art_type", ""), - } - - if f.School == "na" { - f.School = "" - } else { - if app.Cache().Has("search:schools:" + f.School) { - f.School = app.Cache().Get("search:schools:" + f.School).(string) - } else { - r, err := models.GetSchoolBySlug(app.Dao(), f.School) - - if err != nil { - f.School = "" - } else { - f.School = r.GetId() - } - } - } - - if f.ArtForm == "na" { - f.ArtForm = "" - } else { - if app.Cache().Has("search:forms:" + f.ArtForm) { - f.ArtForm = app.Cache().Get("search:forms:" + f.ArtForm).(string) - } else { - r, err := models.GetArtFormBySlug(app.Dao(), f.ArtForm) - - if err != nil { - f.ArtForm = "" - } else { - f.ArtForm = r.GetId() - } - } - } - - if f.ArtType == "na" { - f.ArtType = "" - } else { - if app.Cache().Has("search:types:" + f.ArtType) { - f.ArtType = app.Cache().Get("search:types:" + f.ArtType).(string) - } else { - r, err := models.GetArtTypeBySlug(app.Dao(), f.ArtType) - - if err != nil { - f.ArtType = "" - } else { - f.ArtType = r.GetId() - } - } + Title: c.QueryParamDefault("title", ""), + SchoolString: c.QueryParamDefault("art_school", ""), + ArtFormString: c.QueryParamDefault("art_form", ""), + ArtTypeString: c.QueryParamDefault("art_type", ""), + ArtistString: c.QueryParamDefault("artist", ""), } return f diff --git a/handlers/search/getters.go b/handlers/search/getters.go index 326da0aa..7e24268c 100644 --- a/handlers/search/getters.go +++ b/handlers/search/getters.go @@ -8,7 +8,9 @@ import ( // getArtTypesOptions returns a map of art type slugs and their corresponding names. // It retrieves the art types from the database using the provided PocketBase app instance. func getArtTypesOptions(app *pocketbase.PocketBase) (map[string]string, error) { - options := map[string]string{} + options := map[string]string{ + "": "Any", + } c, err := models.GetArtTypes(app.Dao()) if err != nil { @@ -25,7 +27,9 @@ func getArtTypesOptions(app *pocketbase.PocketBase) (map[string]string, error) { // getArtFormOptions returns a map of art form slugs to their corresponding names. // It retrieves the art forms from the database using the provided PocketBase app instance. func getArtFormOptions(app *pocketbase.PocketBase) (map[string]string, error) { - options := map[string]string{} + options := map[string]string{ + "": "Any", + } c, err := models.GetArtForms(app.Dao()) if err != nil { @@ -41,7 +45,9 @@ func getArtFormOptions(app *pocketbase.PocketBase) (map[string]string, error) { // getArtSchoolOptions returns a map of art school options where the key is the slug and the value is the name. func getArtSchoolOptions(app *pocketbase.PocketBase) (map[string]string, error) { - options := map[string]string{} + options := map[string]string{ + "": "Any", + } c, err := models.GetSchools(app.Dao()) if err != nil { @@ -54,3 +60,24 @@ func getArtSchoolOptions(app *pocketbase.PocketBase) (map[string]string, error) return options, nil } + +func getArtistNameList(app *pocketbase.PocketBase) ([]string, error) { + names := []string{} + c, err := app.Dao().FindRecordsByFilter( + "artists", + "published = true", + "+name", + 0, + 0, + ) + + if err != nil { + return names, err + } + + for _, v := range c { + names = append(names, v.GetString("name")) + } + + return names, nil +} diff --git a/handlers/search/main.go b/handlers/search/main.go index 6cea62a6..bb311d04 100644 --- a/handlers/search/main.go +++ b/handlers/search/main.go @@ -23,9 +23,6 @@ func search(app *pocketbase.PocketBase, e *core.ServeEvent, c echo.Context) erro limit := 30 page := 1 - //set push url - c.Response().Header().Set("HX-Push-Url", currentUrl) - //build filters filters := buildFilters(app, c) @@ -134,14 +131,22 @@ func search(app *pocketbase.PocketBase, e *core.ServeEvent, c echo.Context) erro td["ArtFormOptions"], _ = getArtFormOptions(app) td["ArtTypeOptions"], _ = getArtTypesOptions(app) td["ArtSchoolOptions"], _ = getArtSchoolOptions(app) + td["ArtistNameList"], _ = getArtistNameList(app) + td["ActiveFilterValues"] = filters pagination := utils.NewPagination(recordsCount, limit, page, "/artists?q=") td["Pagination"] = pagination.Render() + blockToRender := "search:content" + + if filters.AnyFilterActive() { + blockToRender = "search:search-results" + } + html, err := assets.Render(assets.Renderable{ IsHtmx: htmx, - Block: "search:content", + Block: blockToRender, Data: td, }) @@ -149,7 +154,7 @@ func search(app *pocketbase.PocketBase, e *core.ServeEvent, c echo.Context) erro return apis.NewNotFoundError("", err) } - c.Response().Header().Set("HX-Push-Url", "/search") + c.Response().Header().Set("HX-Push-Url", currentUrl) return c.HTML(http.StatusOK, html) }