diff --git a/app/pb.go b/app/pb.go index 1c5679d..d226489 100644 --- a/app/pb.go +++ b/app/pb.go @@ -57,6 +57,7 @@ type BaendeCache struct { EntriesAgents map[string][]*dbmodels.REntriesAgents Items map[string][]*dbmodels.Item Users map[string]*dbmodels.User + ContentsCount map[string]int CachedAt time.Time } @@ -93,6 +94,9 @@ func (bc *BaendeCache) GetUsers() interface{} { return bc.Users } +func (bc *BaendeCache) GetContentsCount() interface{} { + return bc.ContentsCount +} const ( TEST_SUPERUSER_MAIL = "demo@example.com" TEST_SUPERUSER_PASS = "password" @@ -671,6 +675,16 @@ func (app *App) EnsureBaendeCache() (*BaendeCache, error) { } } + // Load contents counts + contentsCount := map[string]int{} + if len(entryIDs) > 0 { + counts, err := dbmodels.CountContentsEntries(app.PB.App, entryIDs) + if err != nil { + return nil, err + } + contentsCount = counts + } + // Load users (editors) usersMap := map[string]*dbmodels.User{} editorIDs := map[string]struct{}{} @@ -704,6 +718,7 @@ func (app *App) EnsureBaendeCache() (*BaendeCache, error) { EntriesAgents: entryAgentsMap, Items: itemsMap, Users: usersMap, + ContentsCount: contentsCount, CachedAt: time.Now(), } diff --git a/controllers/baende.go b/controllers/baende.go index 0d82e43..7bd4e76 100644 --- a/controllers/baende.go +++ b/controllers/baende.go @@ -27,7 +27,7 @@ const ( URL_BAENDE_DELETE = "/baende/delete-info/{id}" TEMPLATE_BAENDE = "/baende/" URL_BAENDE_DETAILS = "/baende/details/{id}" - BAENDE_PAGE_SIZE = 150 + BAENDE_PAGE_SIZE = 100 ) func init() { @@ -55,6 +55,7 @@ type BaendeResult struct { EntriesAgents map[string][]*dbmodels.REntriesAgents Items map[string][]*dbmodels.Item Users map[string]*dbmodels.User + ContentsCount map[string]int } type BaendeDetailsResult struct { @@ -136,6 +137,15 @@ func (p *BaendePage) handleRow(engine *templating.Engine, app core.App) HandleFu app.Logger().Error("Failed to get items for entry", "error", err) } + contents, err := dbmodels.Contents_Entry(app, entry.Id) + if err != nil { + app.Logger().Error("Failed to get contents for entry", "error", err) + } + contentsCount := 0 + if contents != nil { + contentsCount = len(contents) + } + var editorUser *dbmodels.User if editorID := entry.Editor(); editorID != "" { user, err := dbmodels.Users_ID(app, editorID) @@ -147,11 +157,12 @@ func (p *BaendePage) handleRow(engine *templating.Engine, app core.App) HandleFu } data := map[string]any{ - "entry": entry, - "items": items, - "editor_user": editorUser, - "is_admin": req.IsAdmin(), - "csrf_token": req.Session().Token, + "entry": entry, + "items": items, + "editor_user": editorUser, + "contents_count": contentsCount, + "is_admin": req.IsAdmin(), + "csrf_token": req.Session().Token, } return engine.Response200(e, "/baende/row/", data, "fragment") @@ -362,6 +373,11 @@ func (p *BaendePage) buildResultData(app core.App, ma pagemodels.IApp, e *core.R return data, fmt.Errorf("failed to get users from cache") } + contentsCount, ok := cacheInterface.GetContentsCount().(map[string]int) + if !ok { + return data, fmt.Errorf("failed to get contents count from cache") + } + // Apply search/letter/filters filteredEntries := allEntries if search != "" { @@ -472,6 +488,7 @@ func (p *BaendePage) buildResultData(app core.App, ma pagemodels.IApp, e *core.R EntriesAgents: entryAgentsMap, Items: itemsMap, Users: usersMap, + ContentsCount: contentsCount, } data["offset"] = offset data["total_count"] = totalCount diff --git a/dbmodels/queries.go b/dbmodels/queries.go index bfd0f98..2f78117 100644 --- a/dbmodels/queries.go +++ b/dbmodels/queries.go @@ -294,6 +294,31 @@ func Items_Entries(app core.App, ids []any) ([]*Item, error) { return ret, err } +type EntryCount struct { + Count int `db:"count"` + ID string `db:"id"` +} + +func CountContentsEntries(app core.App, ids []any) (map[string]int, error) { + if len(ids) == 0 { + return map[string]int{}, nil + } + counts := []EntryCount{} + err := app.RecordQuery(CONTENTS_TABLE). + Select("count(*) as count, " + ENTRIES_TABLE + " as id"). + Where(dbx.HashExp{ENTRIES_TABLE: ids}). + GroupBy(ENTRIES_TABLE). + All(&counts) + if err != nil { + return nil, err + } + ret := make(map[string]int, len(counts)) + for _, c := range counts { + ret[c.ID] = c.Count + } + return ret, nil +} + func Contents_MusenalmID(app core.App, id string) (*Content, error) { ret, err := TableByField[Content](app, CONTENTS_TABLE, MUSENALMID_FIELD, id) return &ret, err diff --git a/pagemodels/page.go b/pagemodels/page.go index c167235..362e4b0 100644 --- a/pagemodels/page.go +++ b/pagemodels/page.go @@ -18,6 +18,7 @@ type BaendeCacheInterface interface { GetEntriesAgents() interface{} // Returns map[string][]*dbmodels.REntriesAgents GetItems() interface{} // Returns map[string][]*dbmodels.Item GetUsers() interface{} // Returns map[string]*dbmodels.User + GetContentsCount() interface{} // Returns map[string]int } type IApp interface { diff --git a/views/routes/baende/body.gohtml b/views/routes/baende/body.gohtml index 5de0a93..92de2d9 100644 --- a/views/routes/baende/body.gohtml +++ b/views/routes/baende/body.gohtml @@ -608,7 +608,7 @@ class="container-normal font-sans mt-10"> " :disabled="loading"> - + diff --git a/views/routes/baende/components/_baende_table.gohtml b/views/routes/baende/components/_baende_table.gohtml index b95d3f4..41117ea 100644 --- a/views/routes/baende/components/_baende_table.gohtml +++ b/views/routes/baende/components/_baende_table.gohtml @@ -157,6 +157,14 @@
Bearbeiten
+ + + + {{- $count := index $model.result.ContentsCount $entry.Id -}} + {{ if $count }}{{ $count }}{{ else }}0{{ end }} + +
Beiträge bearbeiten
+
diff --git a/views/routes/baende/row/body.gohtml b/views/routes/baende/row/body.gohtml index 2e7c7f4..1f9f6cc 100644 --- a/views/routes/baende/row/body.gohtml +++ b/views/routes/baende/row/body.gohtml @@ -21,12 +21,19 @@
Ansehen
{{- if .is_admin -}} - - - - -
Bearbeiten
-
+ + + + +
Bearbeiten
+
+ + + + {{ if .contents_count }}{{ .contents_count }}{{ else }}0{{ end }} + +
Beiträge bearbeiten
+