feat(ui): open list items counter on Listen, none on Workspace
New stat listItemsOpenCount: unchecked items in all lists the user sees (own, shared directly or through a group), shown as accent counter on Listen in the header and the mobile bottom bar. Workspace loses its counter. Stats refresh on list events and after deleting an item. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6d720c0c36
commit
c4fc455850
8 files changed
+75
-19
No files matched your search
@@ -0,0 +1,49 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestOpenListItemsCountCoversSharedLists(t *testing.T) {
|
||||
store, err := NewStore(filepath.Join(t.TempDir(), "stats.db"))
|
||||
if err != nil {
|
||||
t.Fatalf("NewStore: %v", err)
|
||||
}
|
||||
defer store.Close()
|
||||
openSharing(t, store)
|
||||
anna, _ := store.CreateUser("anna@example.com", "hash", "Anna", "member")
|
||||
ben, _ := store.CreateUser("ben@example.com", "hash", "Ben", "member")
|
||||
carla, _ := store.CreateUser("carla@example.com", "hash", "Carla", "member")
|
||||
|
||||
addItems := func(owner, listID string, open, done int) {
|
||||
for i := 0; i < open+done; i++ {
|
||||
item, _ := store.CreateListItem(listID, "Eintrag", "", "", i, owner)
|
||||
if i >= open {
|
||||
_, _ = store.ToggleListItem(item.ID, true, owner, "")
|
||||
}
|
||||
}
|
||||
}
|
||||
own, _ := store.CreateList(anna.ID, "Einkauf", "🛒", "shopping")
|
||||
addItems(anna.ID, own.ID, 2, 1)
|
||||
direct, _ := store.CreateList(ben.ID, "Bens Liste", "", "shopping")
|
||||
addItems(ben.ID, direct.ID, 1, 2)
|
||||
if _, err := store.AddListShare(ben.ID, direct.ID, "user", anna.ID, "viewer"); err != nil {
|
||||
t.Fatalf("share: %v", err)
|
||||
}
|
||||
viaGroup, _ := store.CreateList(carla.ID, "WG-Putzplan", "", "shopping")
|
||||
addItems(carla.ID, viaGroup.ID, 3, 0)
|
||||
team, _ := store.CreateTeam("", "WG", "")
|
||||
_ = store.AddTeamMember(team.ID, anna.ID, "member")
|
||||
_ = store.AddTeamMember(team.ID, carla.ID, "admin")
|
||||
if _, err := store.AddListShare(carla.ID, viaGroup.ID, "team", team.ID, "editor"); err != nil {
|
||||
t.Fatalf("team share: %v", err)
|
||||
}
|
||||
foreign, _ := store.CreateList(ben.ID, "Privat", "", "shopping")
|
||||
addItems(ben.ID, foreign.ID, 5, 0)
|
||||
|
||||
st, _ := store.GetDashboardStats(anna.ID)
|
||||
if st.ListItemsOpenCount != 6 || st.ListsCount != 3 {
|
||||
t.Errorf("want 6 open items in 3 lists (own 2 + direct 1 + group 3), got %d in %d", st.ListItemsOpenCount, st.ListsCount)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user