diff --git a/.air.toml b/.air.toml index 077a703..7432c04 100644 --- a/.air.toml +++ b/.air.toml @@ -5,7 +5,7 @@ tmp_dir = "tmp" [build] args_bin = [] full_bin = "./tmp/musenalm --dir ./pb_data serve" -cmd = "go build -tags=dev,fts5 -o ./tmp/musenalm ." +cmd = "go build -tags=dev,fts5,sqlite_icu -o ./tmp/musenalm ." delay = 400 exclude_dir = [ "views/assets", diff --git a/dbmodels/entries.go b/dbmodels/entries.go index 6b539b8..53993bc 100644 --- a/dbmodels/entries.go +++ b/dbmodels/entries.go @@ -1,12 +1,26 @@ package dbmodels import ( + "strconv" + "github.com/pocketbase/dbx" "github.com/pocketbase/pocketbase/core" ) type EntriesAgents map[string][]*REntriesAgents +func EntriesForID(app core.App, query int) ([]*Entry, error) { + entries := []*Entry{} + err := app.RecordQuery(ENTRIES_TABLE). + Where(dbx.HashExp{MUSENALMID_FIELD: strconv.Itoa(query)}). + All(&entries) + if err != nil { + return nil, err + } + + return entries, nil +} + func YearsForEntries(app core.App) ([]int, error) { rec := []core.Record{} err := app.RecordQuery(ENTRIES_TABLE). diff --git a/dbmodels/seriesses.go b/dbmodels/seriesses.go index 9ab55a2..bff2687 100644 --- a/dbmodels/seriesses.go +++ b/dbmodels/seriesses.go @@ -10,7 +10,6 @@ import ( "golang.org/x/text/cases" "golang.org/x/text/collate" "golang.org/x/text/language" - "golang.org/x/text/unicode/norm" ) type SeriesEntries map[string][]*REntriesSeries @@ -22,13 +21,25 @@ func SortSeriessesByTitle(series []*Series) { }) } +func MusenalmIDSearchSeries(app core.App, query string) ([]*Series, error) { + series := []*Series{} + err := app.RecordQuery(SERIES_TABLE). + Where(dbx.Like(MUSENALMID_FIELD, query).Match(true, false)). + All(&series) + if err != nil { + return nil, err + } + + return series, nil +} + func BasicSearchSeries(app core.App, query string) ([]*Series, []*Series, error) { query = strings.TrimSpace(query) query = datatypes.DeleteTags(query) query = datatypes.NormalizeString(query) query = datatypes.RemovePunctuation(query) query = cases.Lower(language.German).String(query) - query = norm.NFKD.String(query) + // TODO: how to normalize, which unicode normalization to use? if query == "" { return []*Series{}, []*Series{}, nil diff --git a/migrations/seed/common.go b/migrations/seed/common.go index a9f0f5f..615b1d6 100644 --- a/migrations/seed/common.go +++ b/migrations/seed/common.go @@ -1,15 +1,14 @@ package seed import ( - "strings" - + "github.com/Theodor-Springmann-Stiftung/musenalm/helpers/datatypes" "github.com/pocketbase/pocketbase/core" + "golang.org/x/text/unicode/norm" ) func NormalizeString(s string) string { - s = strings.TrimSpace(s) - s = strings.ReplaceAll(s, "
", "") - s = strings.ReplaceAll(s, "
", "") + s = datatypes.NormalizeString(s) + s = norm.NFC.String(s) return s } diff --git a/pages/reihen.go b/pages/reihen.go index bf39d50..b668da5 100644 --- a/pages/reihen.go +++ b/pages/reihen.go @@ -150,15 +150,17 @@ func (p *ReihenPage) PlaceRequest(app core.App, engine *templating.Engine, e *co return p.Get(e, engine, data) } -// BUG: Umlaute werden nicht korrekt gesucht // BUG: alternative treffer haben keine relations // TODO: Suche nach Musenalm-ID // TODO: Suchverhalten bei gefilterten Personen, Orten und Jahren +// TODO: FTS-Suche für alt. Ergebnisse func (p *ReihenPage) SearchRequest(app core.App, engine *templating.Engine, e *core.RequestEvent) error { search := e.Request.URL.Query().Get(PARAM_SEARCH) data := map[string]interface{}{} data[PARAM_SEARCH] = search + // INFO: normalization happens in the db query series, altseries, err := dbmodels.BasicSearchSeries(app, search) + if err != nil { return Error404(e, engine, err, data) } @@ -171,6 +173,50 @@ func (p *ReihenPage) SearchRequest(app core.App, engine *templating.Engine, e *c if err != nil { return Error404(e, engine, err, data) } + + rmap2, bmap2, err := dbmodels.EntriesForSeriesses(app, altseries) + if err != nil { + return Error404(e, engine, err, data) + } + + for k, v := range rmap2 { + rmap[k] = v + } + for k, v := range bmap2 { + bmap[k] = v + } + + // Searching for MUSENALM-ID + if searchint, err := strconv.Atoi(search); err == nil { + identries, err := dbmodels.EntriesForID(app, searchint) + if err != nil { + return Error404(e, engine, err, data) + } + + if len(identries) != 0 { + + idseries, rmap3, bmap3, err := dbmodels.SeriesForEntries(app, identries) + if err != nil { + return Error404(e, engine, err, data) + } + + dbmodels.SortSeriessesByTitle(idseries) + data["idseries"] = idseries + + if err != nil { + return Error404(e, engine, err, data) + } + + for k, v := range rmap3 { + rmap[k] = v + } + + for k, v := range bmap3 { + bmap[k] = v + } + } + } + data["entries"] = bmap data["relations"] = rmap diff --git a/views/routes/components/_reihe.gohtml b/views/routes/components/_reihe.gohtml index 6858e00..6126915 100644 --- a/views/routes/components/_reihe.gohtml +++ b/views/routes/components/_reihe.gohtml @@ -1,5 +1,6 @@ {{ $model := index . 0 }} {{ $r := index . 1 }} +{{ $showidseries := index . 2 }} {{ $bds := index $model.relations $r.Id }} @@ -9,13 +10,15 @@ {{ if $r.References }}
{{ $r.References }}
{{ end }} - {{ if $model.musenalmid }} + {{ if $showidseries }} {{ range $_, $rel := $bds }}
Almanach-Nr. - {{ (index $model.entries - $rel.Entry).MusenalmID - }} + + {{ (index $model.entries + $rel.Entry).MusenalmID + }} +
{{ end }} {{ end }} diff --git a/views/routes/components/_reihenfilter.gohtml b/views/routes/components/_reihenfilter.gohtml index 0cbbaa9..5c31eb3 100644 --- a/views/routes/components/_reihenfilter.gohtml +++ b/views/routes/components/_reihenfilter.gohtml @@ -4,7 +4,7 @@ [&>*]:px-12 [&>*]:pt-8 -mr-36 [&>*]:bg-slate-100"> {{ if .agents }}
-

Personen, Verlage & Druckereien

+

Herausgeber:innen, Verlage & Druckereien

{{ end }} - {{ if or .series .altseries }} -
+ +
+ {{ if and .search .idseries }}
- {{ range $id, $r := .series }} - {{ template "_reihe" (Arr $model $r) }} + {{ range $id, $r := .idseries }} + {{ template "_reihe" (Arr $model $r true) }} {{ end }}
+ {{ end }} - {{ if and .search .altseries }} - {{ if .series }} -
- Treffer in Reihentiteln ↑ -
+ {{ if .series }} +
+ {{ range $id, $r := .series }} + {{ template "_reihe" (Arr $model $r false) }} {{ end }} -
- Treffer in Anmerkungen, Verweisen etc. ↓ -
-
- {{ range $id, $r := .altseries }} - {{ template "_reihe" (Arr $model $r) }} - {{ end }} +
+ {{ end }} + + {{ if and .search .altseries }} + {{ if .idseries }} +
+ Treffer in Almanach-Nummer ↑
{{ end }} -
- {{ else }} + + {{ if .series }} +
+ Treffer in Reihentiteln ↑ +
+ {{ end }} +
+ Treffer in Anmerkungen, Verweisen etc. ↓ +
+
+ {{ range $id, $r := .altseries }} + {{ template "_reihe" (Arr $model $r false) }} + {{ end }} +
+ {{ end }} +
+ {{ if not (or .series .altseries .idseries) }}
Keine Reihen {{ if .search }}für {{ .search }}{{ end }}