fix: resolve 15+ UX issues across the full app

- CreateItemDialog: shared Zustand store for dialog state
- TopBar: use store instead of router.push navigation
- TaskDetailPanel: dynamic domain fetch from /api/domains
- TodayTasksWidget: domain name resolution from UUIDs
- ProjectProgressWidget: fetch real progress, default to 0
- Calendar page: domain filter fetches from API dynamically
- Habits page: edit/delete dropdown with AlertDialog
- Projects page: domain name display + delete button
- Notes page: domain picker on creation, names in list
- Settings domains: add color picker input
- Tasks list view: MoreHorizontal wired to edit/delete
- HabitCard: domain resolution + edit/delete dropdown
- PocketBase compat: add JSDoc migration comment
This commit is contained in:
2026-07-25 02:22:01 +00:00
parent 73335484f8
commit 953a947874
18 changed files with 474 additions and 586 deletions
+15 -2
View File
@@ -65,6 +65,8 @@ interface Backlink {
export default function NotesPage() {
const [notes, setNotes] = useState<Note[]>([]);
const [selectedNote, setSelectedNote] = useState<Note | null>(null);
const [domainForCreate, setDomainForCreate] = useState('personal');
const [domainOptions, setDomainOptions] = useState<{id: string; name: string}[]>([]);
const [backlinks, setBacklinks] = useState<Backlink[]>([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
@@ -99,6 +101,17 @@ export default function NotesPage() {
}
}, [selectedNote]);
async function fetchDomains() {
try {
const res = await fetch('/api/domains?sort=sort_order');
if (res.ok) {
const data = await res.json();
setDomainOptions(data.items || []);
if (data.items?.length > 0) setDomainForCreate(data.items[0].id);
}
} catch {}
}
async function fetchNotes() {
setLoading(true);
setError(null);
@@ -141,7 +154,7 @@ export default function NotesPage() {
body: JSON.stringify({
title: 'Untitled note',
content: '',
domain: 'personal',
domain: domainForCreate,
}),
});
if (!response.ok) throw new Error('Unable to create note.');
@@ -304,7 +317,7 @@ export default function NotesPage() {
{new Date(note.updated).toLocaleDateString()}
</p>
<Badge variant="outline" className="mt-1 text-xs">
{note.domain}
{domainOptions.find(d => d.id === note.domain)?.name || note.domain}
</Badge>
</div>
</div>