internal/components/data.go (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | package components
import (
"net/url"
"slices"
"strconv"
"alin.ovh/searchix/frontend"
"alin.ovh/searchix/internal/config"
search "alin.ovh/searchix/internal/index"
"alin.ovh/searchix/internal/pagination"
)
type TemplateData struct {
Sources []*config.Source
Source *config.Source
Query string
ExtraHeadHTML string
Code int
Message string
Assets *frontend.AssetCollection
SearchNav SearchNav
}
type ResultData struct {
TemplateData
Query string
FacetQueries url.Values
Results *search.Result
}
type SearchNav struct {
URL url.URL
Prev string
Next string
All string
pagination *pagination.Pagination
}
func NewSearchNav(u url.URL) SearchNav {
return SearchNav{URL: u}
}
func (u SearchNav) WithPagination(page *pagination.Pagination) SearchNav {
u.pagination = page
q := u.URL.Query()
urlBase := u.URL.Path
if page.Next != 0 {
q.Set("page", strconv.Itoa(page.Next))
u.Next = urlBase + "?" + q.Encode()
}
if page.Prev != 0 {
if page.Prev == 1 {
q.Del("page")
} else {
q.Set("page", strconv.Itoa(page.Prev))
}
u.Prev = urlBase + "?" + q.Encode()
}
if page.CanShowAll {
q.Set("page", "0")
u.All = urlBase + "?" + q.Encode()
}
return u
}
func (u SearchNav) HasFacet(field string, term string) bool {
return slices.Contains(u.URL.Query()[field], term)
}
func (u SearchNav) AddFacet(field string, term string) string {
nu := u.URL
q := nu.Query()
q.Add(field, term)
nu.RawQuery = q.Encode()
return nu.String()
}
func (u SearchNav) RemoveFacet(field string, term string) string {
nu := u.URL
q := nu.Query()
q[field] = slices.DeleteFunc(q[field], func(v string) bool {
return v == term
})
nu.RawQuery = q.Encode()
return nu.String()
}
|