BUGFIX: Paginierung Bände

This commit is contained in:
Simon Martens
2025-03-07 16:39:19 +01:00
parent 8409b4fcfb
commit 88bba693df
8 changed files with 139 additions and 49 deletions

View File

@@ -7,6 +7,30 @@ import (
"github.com/pocketbase/pocketbase/core" "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 { type SearchResultBaende struct {
Queries []dbmodels.FTS5QueryRequest Queries []dbmodels.FTS5QueryRequest
@@ -21,6 +45,8 @@ type SearchResultBaende struct {
EntriesSeries map[string][]*dbmodels.REntriesSeries // <- Key: Entry ID EntriesSeries map[string][]*dbmodels.REntriesSeries // <- Key: Entry ID
SeriesEntries map[string][]*dbmodels.REntriesSeries // <- Key: Series ID SeriesEntries map[string][]*dbmodels.REntriesSeries // <- Key: Series ID
EntriesAgents map[string][]*dbmodels.REntriesAgents // <- Key: Entry ID EntriesAgents map[string][]*dbmodels.REntriesAgents // <- Key: Entry ID
Pages []int
} }
func EmptyResultBaende() *SearchResultBaende { func EmptyResultBaende() *SearchResultBaende {
@@ -133,16 +159,29 @@ func NewSearchBaende(app core.App, params SearchParameters) (*SearchResultBaende
} }
hits := []string{} hits := []string{}
pages := []int{}
if params.Sort == "series" { if params.Sort == "series" {
dbmodels.Sort_Series_Title(series) dbmodels.Sort_Series_Title(series)
for _, s := range series { for _, s := range series {
hits = append(hits, s.Id) hits = append(hits, s.Id)
} }
pages = PagesMap(hits, invrelationsmap, DEFAULT_PAGESIZE_BAENDE)
} else { } else {
dbmodels.Sort_Entries_Year_Title(entries) dbmodels.Sort_Entries_Year_Title(entries)
for _, e := range entries { for _, e := range entries {
hits = append(hits, e.Id) 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{ return &SearchResultBaende{
@@ -154,10 +193,15 @@ func NewSearchBaende(app core.App, params SearchParameters) (*SearchResultBaende
EntriesSeries: relationsmap, EntriesSeries: relationsmap,
SeriesEntries: invrelationsmap, SeriesEntries: invrelationsmap,
EntriesAgents: relationsagentsmap, EntriesAgents: relationsagentsmap,
Pages: pages,
}, nil }, nil
} }
func (r SearchResultBaende) PagesCount() int {
return len(r.Pages) - 1
}
func (r SearchResultBaende) Count() int { func (r SearchResultBaende) Count() int {
return len(r.Entries) return len(r.Entries)
} }

View File

@@ -255,7 +255,7 @@ func NewSearchBeitraege(app core.App, params SearchParameters, filters Beitraege
hits = append(hits, e.Id) 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) { if params.Page < 1 || params.Page > len(pages) {
params.Page = 1 params.Page = 1
} }
@@ -304,7 +304,7 @@ func (p *SearchResultBeitraege) PagesCount() int {
return len(p.Pages) - 1 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} ret := []int{0}
m := 0 m := 0
for i, hit := range hits { for i, hit := range hits {
@@ -321,3 +321,21 @@ func PagesEntries[T any](hits []string, hitmap map[string][]*T, pagesize int) []
return ret 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
}

View File

@@ -172,6 +172,10 @@ func (p SearchParameters) includedParams(q string) []string {
return res return res
} }
func (p SearchParameters) SortToQueryParams() string {
return fmt.Sprintf("&sort=%s", p.Sort)
}
func (p SearchParameters) ToQueryParamsBeitraege() string { func (p SearchParameters) ToQueryParamsBeitraege() string {
q := "?" q := "?"

View File

@@ -212,11 +212,12 @@
{{- if $model.parameters.IsBaendeSearch -}} {{- if $model.parameters.IsBaendeSearch -}}
<div class="container-normal" id="searchresults"> <div class="container-normal" id="searchresults">
<div class="border-b border-zinc-300 flex flex-row justify-between"> <div class="border-b border-zinc-300 flex flex-row justify-between">
<div> <div class="flex flex-row">
<div class="inline-block"> <div class="inline-block">
<i class="ri-hourglass-2-fill request-indicator spinning"></i> <i class="ri-hourglass-2-fill request-indicator spinning"></i>
</div> </div>
<div class="request-indicator">&middot;</div> <div class="request-indicator">&middot;</div>
<div>
{{ if $model.parameters.Query -}} {{ if $model.parameters.Query -}}
Suche nach <b>»{{ $model.parameters.Query }}«</b> &middot; Suche nach <b>»{{ $model.parameters.Query }}«</b> &middot;
{{- end -}} {{- end -}}
@@ -237,6 +238,12 @@
{{- end -}} {{- end -}}
</div> </div>
{{- if gt (len $model.result.Pages) 1 }}
<div>&nbsp;&middot;&nbsp;</div>
{{- end -}}
{{ template "_pagination" Arr $model "baende" }}
</div>
{{- if not $isAlm -}} {{- if not $isAlm -}}
<div> <div>
<label <label
@@ -295,6 +302,13 @@
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
{{- end -}} {{- end -}}
{{- if $model.result.Hits -}}
<div class="flex flex-row justify-end items-start border-t border-zinc-300 pt-4">
{{- template "_pagination" Arr $model "baende" -}}
</div>
{{- else -}}
<div class="container-normal">Keine Bände gefunden.</div>
{{- end -}}
<script type="module"> <script type="module">
let elements = document.querySelectorAll('.search-text'); let elements = document.querySelectorAll('.search-text');
@@ -307,8 +321,4 @@
}, 200); }, 200);
</script> </script>
</div> </div>
{{- if not $model.result.Hits -}}
<div class="container-normal">Keine Bände gefunden.</div>
{{- end -}}
{{- end -}} {{- end -}}

View File

@@ -229,7 +229,7 @@
{{- if $model.result.Hits -}} {{- if $model.result.Hits -}}
<div class="flex flex-row justify-end items-start border-t border-zinc-300 pt-4"> <div class="flex flex-row justify-end items-start border-t border-zinc-300 pt-4">
{{- template "pagination" $model -}} {{- template "_pagination" Arr $model "beitraege" -}}
</div> </div>
{{- else -}} {{- else -}}
<div class="mt-4">Kein Beitrag gefunden.</div> <div class="mt-4">Kein Beitrag gefunden.</div>

View File

@@ -1,23 +0,0 @@
{{ $model := . }}
{{- if gt (len $model.result.Pages) 1 }}
<div class="[&>_a]:no-underline">
{{ if gt $model.parameters.Page 1 -}}
<a
href="{{- $model.parameters.ToQueryParamsBeitraege -}}&page={{ $model.parameters.Prev }}"
hx-indicator="body"
class="mr-1.5 text-stone-500 hover:text-slate-900">
<i class="ri-arrow-left-long-line"></i>
</a>
{{- end -}}
Seite
<b>{{ $model.parameters.Page }}&thinsp;/&thinsp;{{ $model.result.PagesCount }}</b>
{{ if lt $model.parameters.Page ($model.result.PagesCount) -}}
<a
href="{{- $model.parameters.ToQueryParamsBeitraege -}}&page={{ $model.parameters.Next }}"
hx-indicator="body"
class="ml-1.5 text-stone-500 hover:text-slate-900">
<i class="ri-arrow-right-long-line"></i>
</a>
{{- end -}}
</div>
{{- end -}}

View File

@@ -49,7 +49,7 @@
{{- if gt (len $model.result.Pages) 1 }} {{- if gt (len $model.result.Pages) 1 }}
<div>&middot;</div> <div>&middot;</div>
{{- end -}} {{- end -}}
{{ template "pagination" $model }} {{ template "_pagination" Arr $model "beitraege" }}
</div> </div>
{{- if not $isAlm -}} {{- if not $isAlm -}}

View File

@@ -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 }}
<div class="[&>_a]:no-underline">
{{ if gt $model.parameters.Page 1 -}}
<a
href="{{- $queryParams -}}{{- $filterParams -}}{{- $model.parameters.SortToQueryParams -}}&page={{ $model.parameters.Prev }}"
hx-indicator="body"
class="mr-1.5 text-stone-500 hover:text-slate-900">
<i class="ri-arrow-left-long-line"></i>
</a>
{{- end -}}
Seite
<b>{{ $model.parameters.Page }}&thinsp;/&thinsp;{{ $model.result.PagesCount }}</b>
{{ if lt $model.parameters.Page ($model.result.PagesCount) -}}
<a
href="{{- $queryParams -}}{{- $filterParams -}}{{- $model.parameters.SortToQueryParams -}}&page={{ $model.parameters.Next }}"
hx-indicator="body"
class="ml-1.5 text-stone-500 hover:text-slate-900">
<i class="ri-arrow-right-long-line"></i>
</a>
{{- end -}}
</div>
{{- end -}}