Add web UI for WebDAV files and CardDAV contacts

Files browser (web/files):
- Alphabetical listing grouped folders-then-files
- Upload via button or drag-and-drop, including whole folders
- Folder creation
- Fixed layout for long filenames without spaces (table-fixed + break-all)

Contacts (web/contacts):
- Full CRUD for CardDAV contacts (create/edit/delete)
- VCF import (multi-card files) and export (single/all)
- Photo upload with preview, birthday field
- TYPE labels (private/business) for phone, email, address
- Repeatable multi-input rows for phones/emails/addresses instead of textareas
- Sanitizes a known malformed TYPE parameter pattern from some vCard
  exporters (e.g. Nextcloud Contacts) that otherwise caused phone numbers
  to be silently dropped on import

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-08-20 15:06:39 +02:00
co-authored by Copilot
parent 65cd24a192
commit 3fa0297715
15 changed files with 3174 additions and 8 deletions
+7 -1
View File
@@ -13,7 +13,13 @@ templ Layout(title string, username string) {
<body class="h-full text-gray-900">
<nav class="bg-white border-b border-gray-200">
<div class="max-w-4xl mx-auto px-4 py-3 flex items-center justify-between">
<a href="/web/" class="font-semibold text-lg tracking-tight">nidus</a>
<div class="flex items-center gap-6">
<a href="/web/" class="font-semibold text-lg tracking-tight">nidus</a>
if username != "" {
<a href="/web/files/" class="text-sm text-gray-600 hover:text-indigo-600">Files</a>
<a href="/web/contacts" class="text-sm text-gray-600 hover:text-indigo-600">Contacts</a>
}
</div>
if username != "" {
<div class="flex items-center gap-4 text-sm text-gray-600">
<span>{ username }</span>