diff --git a/pages/suche_baende.go b/pages/suche_baende.go index abd300a..5da56c6 100644 --- a/pages/suche_baende.go +++ b/pages/suche_baende.go @@ -7,6 +7,30 @@ import ( "github.com/pocketbase/pocketbase/core" ) +const ( + DEFAULT_PAGESIZE_BAENDE = 40 +) + +type BaendeFilterParameters struct { + Agent string + Year string + Place string + State string +} + +func NewBaendeFilterParameters(ev *core.RequestEvent) BaendeFilterParameters { + agent := ev.Request.URL.Query().Get("agent") + year := ev.Request.URL.Query().Get("year") + place := ev.Request.URL.Query().Get("place") + state := ev.Request.URL.Query().Get("state") + return BaendeFilterParameters{ + Agent: agent, + Year: year, + Place: place, + State: state, + } +} + type SearchResultBaende struct { Queries []dbmodels.FTS5QueryRequest @@ -21,6 +45,8 @@ type SearchResultBaende struct { EntriesSeries map[string][]*dbmodels.REntriesSeries // <- Key: Entry ID SeriesEntries map[string][]*dbmodels.REntriesSeries // <- Key: Series ID EntriesAgents map[string][]*dbmodels.REntriesAgents // <- Key: Entry ID + + Pages []int } func EmptyResultBaende() *SearchResultBaende { @@ -133,16 +159,29 @@ func NewSearchBaende(app core.App, params SearchParameters) (*SearchResultBaende } hits := []string{} + pages := []int{} if params.Sort == "series" { dbmodels.Sort_Series_Title(series) for _, s := range series { hits = append(hits, s.Id) } + pages = PagesMap(hits, invrelationsmap, DEFAULT_PAGESIZE_BAENDE) } else { dbmodels.Sort_Entries_Year_Title(entries) for _, e := range entries { hits = append(hits, e.Id) } + pages = PagesArray(hits, DEFAULT_PAGESIZE_BAENDE) + } + + if params.Page < 1 || params.Page > len(pages) { + params.Page = 1 + } + + if params.Page == len(pages) { + hits = hits[pages[params.Page-1]:] + } else { + hits = hits[pages[params.Page-1]:pages[params.Page]] } return &SearchResultBaende{ @@ -154,10 +193,15 @@ func NewSearchBaende(app core.App, params SearchParameters) (*SearchResultBaende EntriesSeries: relationsmap, SeriesEntries: invrelationsmap, EntriesAgents: relationsagentsmap, + Pages: pages, }, nil } +func (r SearchResultBaende) PagesCount() int { + return len(r.Pages) - 1 +} + func (r SearchResultBaende) Count() int { return len(r.Entries) } diff --git a/pages/suche_beitraege.go b/pages/suche_beitraege.go index fab2688..e851598 100644 --- a/pages/suche_beitraege.go +++ b/pages/suche_beitraege.go @@ -255,7 +255,7 @@ func NewSearchBeitraege(app core.App, params SearchParameters, filters Beitraege hits = append(hits, e.Id) } - pages := PagesEntries(hits, contentsmap, DEFAULT_PAGESIZE) + pages := PagesMap(hits, contentsmap, DEFAULT_PAGESIZE) if params.Page < 1 || params.Page > len(pages) { params.Page = 1 } @@ -304,7 +304,7 @@ func (p *SearchResultBeitraege) PagesCount() int { return len(p.Pages) - 1 } -func PagesEntries[T any](hits []string, hitmap map[string][]*T, pagesize int) []int { +func PagesMap[T any](hits []string, hitmap map[string][]*T, pagesize int) []int { ret := []int{0} m := 0 for i, hit := range hits { @@ -321,3 +321,21 @@ func PagesEntries[T any](hits []string, hitmap map[string][]*T, pagesize int) [] return ret } + +func PagesArray[T any](hits []T, pagesize int) []int { + ret := []int{0} + m := 0 + for i := range hits { + m++ + if m >= pagesize { + ret = append(ret, i) + m = 0 + } + } + + if m > 0 { + ret = append(ret, len(hits)) + } + + return ret +} diff --git a/pages/suche_parameters.go b/pages/suche_parameters.go index 0d8fbe3..9946e0c 100644 --- a/pages/suche_parameters.go +++ b/pages/suche_parameters.go @@ -172,6 +172,10 @@ func (p SearchParameters) includedParams(q string) []string { return res } +func (p SearchParameters) SortToQueryParams() string { + return fmt.Sprintf("&sort=%s", p.Sort) +} + func (p SearchParameters) ToQueryParamsBeitraege() string { q := "?" diff --git a/views/routes/suche/baende/body.gohtml b/views/routes/suche/baende/body.gohtml index 3e2e211..33a9e71 100644 --- a/views/routes/suche/baende/body.gohtml +++ b/views/routes/suche/baende/body.gohtml @@ -212,29 +212,36 @@ {{- if $model.parameters.IsBaendeSearch -}}
-
+
·
- {{ if $model.parameters.Query -}} - Suche nach »{{ $model.parameters.Query }}« · - {{- end -}} - {{- if $isAlm -}} - Almanach-Nummer »{{ $model.parameters.AlmString }}« · - {{- end -}} - - {{ if eq $model.result.Count 1 -}} - Ein Band - {{ else -}} - {{ $model.result.Count }} Bände - {{- end }} - in - {{ if eq ($model.result.Series | len) 1 -}} - einer Reihe - {{ else -}} - {{ $model.result.Series | len }} Reihen +
+ {{ if $model.parameters.Query -}} + Suche nach »{{ $model.parameters.Query }}« · + {{- end -}} + {{- if $isAlm -}} + Almanach-Nummer »{{ $model.parameters.AlmString }}« · + {{- end -}} + + {{ if eq $model.result.Count 1 -}} + Ein Band + {{ else -}} + {{ $model.result.Count }} Bände + {{- end }} + in + {{ if eq ($model.result.Series | len) 1 -}} + einer Reihe + {{ else -}} + {{ $model.result.Series | len }} Reihen + {{- end -}} +
+ + {{- if gt (len $model.result.Pages) 1 }} +
 · 
{{- end -}} + {{ template "_pagination" Arr $model "baende" }}
{{- if not $isAlm -}} @@ -295,6 +302,13 @@ {{- end -}} {{- end -}} {{- end -}} + {{- if $model.result.Hits -}} +
+ {{- template "_pagination" Arr $model "baende" -}} +
+ {{- else -}} +
Keine Bände gefunden.
+ {{- end -}}
- - {{- if not $model.result.Hits -}} -
Keine Bände gefunden.
- {{- end -}} {{- end -}} diff --git a/views/routes/suche/beitraege/body.gohtml b/views/routes/suche/beitraege/body.gohtml index 8e4869f..75d144b 100644 --- a/views/routes/suche/beitraege/body.gohtml +++ b/views/routes/suche/beitraege/body.gohtml @@ -229,7 +229,7 @@ {{- if $model.result.Hits -}}
- {{- template "pagination" $model -}} + {{- template "_pagination" Arr $model "beitraege" -}}
{{- else -}}
Kein Beitrag gefunden.
diff --git a/views/routes/suche/beitraege/pagination.gohtml b/views/routes/suche/beitraege/pagination.gohtml deleted file mode 100644 index 714b337..0000000 --- a/views/routes/suche/beitraege/pagination.gohtml +++ /dev/null @@ -1,23 +0,0 @@ -{{ $model := . }} -{{- if gt (len $model.result.Pages) 1 }} -
- {{ if gt $model.parameters.Page 1 -}} - - - - {{- end -}} - Seite - {{ $model.parameters.Page }} / {{ $model.result.PagesCount }} - {{ if lt $model.parameters.Page ($model.result.PagesCount) -}} - - - - {{- end -}} -
-{{- end -}} diff --git a/views/routes/suche/beitraege/tablehead.gohtml b/views/routes/suche/beitraege/tablehead.gohtml index 70b6b21..bd8b5bf 100644 --- a/views/routes/suche/beitraege/tablehead.gohtml +++ b/views/routes/suche/beitraege/tablehead.gohtml @@ -49,7 +49,7 @@ {{- if gt (len $model.result.Pages) 1 }}
·
{{- end -}} - {{ template "pagination" $model }} + {{ template "_pagination" Arr $model "beitraege" }}
{{- if not $isAlm -}} diff --git a/views/routes/suche/components/_pagination.gohtml b/views/routes/suche/components/_pagination.gohtml new file mode 100644 index 0000000..99ab884 --- /dev/null +++ b/views/routes/suche/components/_pagination.gohtml @@ -0,0 +1,37 @@ +{{ $model := index . 0 }} +{{ $type := index . 1 }} + +{{ $queryParams := "./" }} +{{ if eq $type "baende" }} + {{ $queryParams = $model.parameters.ToQueryParamsBaende }} +{{ else }} + {{ $queryParams = $model.parameters.ToQueryParamsBeitraege }} +{{ end }} + +{{ $filterParams := "" }} +{{ if $model.filters }} + {{ $filterParams = $model.filters.ToQueryParams }} +{{ end }} + +{{- if gt (len $model.result.Pages) 1 }} +
+ {{ if gt $model.parameters.Page 1 -}} + + + + {{- end -}} + Seite + {{ $model.parameters.Page }} / {{ $model.result.PagesCount }} + {{ if lt $model.parameters.Page ($model.result.PagesCount) -}} + + + + {{- end -}} +
+{{- end -}}