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 }}