feat: add web UI, query engine, session management, and 20 E2E tests

- Web UI: login, dashboard, links CRUD, collections, API keys, admin pages
- Query engine: AND/OR/XOR with field filters, tag search, preview endpoint
- Session management: token expiry detection, 401 interceptor, expiry banner
- Links search: tags included, multi-word AND, query mode with set operations
- Collections: static/dynamic, query builder with preview, public tree view
- Save as Collection: convert search results (static) or query (dynamic)
- Dashboard stats: resilient loading with allSettled pattern
- Login page: redesigned with public collections tree view
- Bug fix: query executor None fields crash (notes/description/url/title)
- E2E tests: 20 Playwright tests covering all critical user flows
- All 104 tests passing (84 unit/integration + 20 E2E)
This commit is contained in:
DavidSaylor
2026-05-22 07:46:53 -05:00
parent 77b076c7d7
commit fe4cbc3537
29 changed files with 1410 additions and 78 deletions

View File

@@ -16,6 +16,53 @@ LinkSyncServer replaces the need for workarounds in existing bookmark sync solut
## Features
### Web Interface
The application includes a modern, responsive web interface with:
#### Authentication & Session Management
- **Login page** with credential validation
- **Session expiry detection** - automatically redirects to login when tokens expire
- **Proactive expiry warnings** - shows countdown when session is about to expire (<2 minutes)
- **Graceful logout** - clears local storage and redirects to login
#### Dashboard
- **Quick stats** - displays total links, collections, and API keys (always shows numbers, never `-`)
- **Quick actions** - one-click navigation to create links, collections, or API keys
- **Admin section** - visible only to admin users for user management
#### Links Page
- **Dual search modes**:
- **Simple mode**: Keyword search across title, URL, description, notes, and tags
- **Query mode**: Full set operations with AND, OR, XOR, NOT, parentheses, and field filters
- **Multi-word search**: Space-separated terms are AND-matched (all terms must be present)
- **Tag search**: Tags are included in both simple and query searches
- **Save as Collection**: Convert current search results or query into a collection:
- **Static**: Saves the current result set as a fixed collection
- **Dynamic**: Saves the query expression for live, auto-updating results
- **Full CRUD**: Create, edit, and delete links with all Firefox bookmark fields
#### Collections Page
- **Collection cards** - displays name, description, type, and visibility
- **Static collections**: Manually managed link sets
- **Dynamic collections**: Query-based with live preview:
- **Query builder UI** - input field for query expressions
- **Preview button** - shows matching links before saving
- **Result count** - displays number of matches
- **Query expression display** - shows saved query on collection cards
- **Public/Private toggle** - controls visibility to other users
#### API Keys Page
- **Create API keys** for browser extension sync
- **View active keys** with creation dates
- **Delete keys** to revoke access
#### Admin Page
- **User management** - create, edit, delete users
- **Role assignment** - admin or regular user roles
- **System statistics** - overview of links, collections, users
- **Audit log** - track all changes
### Collections
Two types of collections: