Commit Graph

45 Commits

Author SHA1 Message Date
de29f5445e feat(postcard): split create into sent/received, add pending status and mark-sent flow 2026-07-15 19:04:54 +08:00
d79aaea4ae fix(web): correct country_to form parameter name mismatch in create and edit routes 2026-07-10 23:07:56 +08:00
ad6f2b2ff2 refactor(model): rename Postcard.country -> country_to for clear semantics - country_from: origin country (where postcard was sent from) - country_to: destination country (where postcard was sent to) - Profile.country remains as user's home country - Updated all routes, schemas, templates, and API endpoints 2026-07-07 13:43:39 +08:00
b5716ff340 fix(dashboard): sort recent activity by updated_at so delivered/received cards also appear 2026-07-07 13:23:39 +08:00
a071b3dde4 feat(postcard): profile country, country_from, per-user card number uniqueness, public page overhaul - Profile: add country field for default origin country - Postcard: add country_from field, auto-fill from profile.country on create - card_number uniqueness: change from global to per-user (profile_id + card_number) - Public pages: remove card_number display, only show cards with image_front - Public pages: show country as from→to format - Index page: no time display, add register button, fix lightbox with prev/next - Infinite scroll: add /api/public/cards endpoints and IntersectionObserver - Internal pages: update postcards list/detail for country_from display - i18n: add profiles.country_ph, pc_form.country_from, pc_detail.route 2026-07-07 12:32:24 +08:00
bd664d23be feat(ui): add landing page with random public postcards for unauthenticated visitors 2026-07-07 12:05:44 +08:00
8a4500f723 chore: remove scripts and export_i18n.py from git, add to .gitignore 2026-07-07 11:35:00 +08:00
137304090a chore: stage changes before history rewrite 2026-07-07 11:28:18 +08:00
a619b919be feat(showcase): add temporary language switcher for visitors with cookie persistence 2026-07-07 09:57:20 +08:00
591ad3e178 refactor(i18n): move translations to JSON files under app/locales, dynamic language switch 2026-07-07 09:46:50 +08:00
6a49fedfbb feat(api): add public RESTful API with API key auth and documentation page 2026-07-07 09:22:11 +08:00
14c226d082 fix(postcards): remove card number format restriction and forced uppercase 2026-07-06 23:14:12 +08:00
f448a900f5 feat(i18n): add English localization with per-user language preference and navbar toggle 2026-07-06 22:07:05 +08:00
68c88a7910 feat(postcards): add notes field to postcards with edit, detail, and truncated list display 2026-07-06 21:07:28 +08:00
f6db3a4f55 feat(dashboard): split country stats into sent/received bar charts side by side 2026-07-06 20:41:39 +08:00
31eb6dcfc9 feat(dashboard): add country distribution bar chart using Chart.js 2026-07-06 20:20:46 +08:00
91b4ff8ed4 feat(postcards): auto-fill today date on status change, card_number always uppercase 2026-07-06 20:06:42 +08:00
9db6b849d4 feat(profiles): notes shown on postcards page, save stays on current page 2026-07-06 19:39:54 +08:00
b6d43b3db4 feat(profiles): add private notes field per profile, visible only to owner 2026-07-06 19:36:29 +08:00
755409f386 feat(admin-invites): show registered usernames per invite code, track invited_by_code_id on User 2026-07-06 08:37:49 +08:00
293a021500 fix(admin-invites): left-align create card conditional fields, convert local datetime to UTC on save 2026-07-06 08:35:55 +08:00
9aab88ae8f fix(invites): register strftime Jinja2 filter, fix 500 error on admin invites page 2026-07-06 08:24:20 +08:00
b10be81505 fix(admin-invites): display times in Asia/Shanghai (CST) instead of UTC 2026-07-06 08:20:14 +08:00
b58956937e feat(invite): add invite code registration system 2026-07-06 01:13:07 +08:00
741b51ad6c feat(showcase): sort postcards by time descending 2026-07-06 00:27:39 +08:00
66ba163ef6 feat(showcase): lightbox, checkbox per-card toggle, lazyload, fix toggle Y-align, remove navbar on public page 2026-07-06 00:24:03 +08:00
2c0229b12f fix(settings): use Query alias for tab param, fix showcase tab persistence 2026-07-06 00:10:30 +08:00
e0ef607a05 fix(showcase): tab stay, Y-center toggle, group postcards by sent/received, hide navbar on public page, remove profiles/xx/showcase 2026-07-06 00:05:15 +08:00
c550289527 refactor(ui): merge showcase settings into settings page tab, fix profile showcase GET route, fix layout 2026-07-05 23:56:28 +08:00
148cfdf2a4 feat(showcase): add public showcase page with per-profile/per-postcard visibility controls 2026-07-05 23:45:23 +08:00
61190328a4 feat(dashboard): mobile 2-col stats, add relative time to recent activity 2026-07-05 23:03:35 +08:00
a4714db073 feat(ui): redesign dashboard as global overview with stats, progress bar, recent activity 2026-07-05 22:32:16 +08:00
a212021997 feat(ui): redesign profiles page with card layout showing postcard stats 2026-07-05 22:27:13 +08:00
5b6b2ccef8 fix: clear arrival_time and disable field when status is sent 2026-07-05 22:15:40 +08:00
84e4e457db feat(ui): redesign postcards list with tabs, row layout, country dropdown filter 2026-07-05 22:12:33 +08:00
005e6a09b5 fix(ui): username change no longer requires password confirmation 2026-07-05 22:03:59 +08:00
ae2ed2d961 feat: add user settings page (change username/password) and remove public registration 2026-07-05 22:01:24 +08:00
5607485c6a feat(ui): add mark-delivered button on sent postcards with auto today date 2026-07-05 21:45:32 +08:00
7a62ff0818 feat(ui): show country flag emoji next to country codes 2026-07-05 21:40:46 +08:00
9692ff8ade feat(auth): add remember me option with persistent DB sessions 2026-07-05 21:28:58 +08:00
2bd914532e feat: always display country code in uppercase (model validates + oninput) 2026-07-05 21:22:57 +08:00
9decb570c2 feat(ui): rich dashboard cards with countries and recent postcards 2026-07-05 19:22:10 +08:00
d7850d200f feat: add profile rename, all postcard fields required 2026-07-05 19:00:25 +08:00
e66515ce72 fix(ui): shrink badges, card_number format XX-1234567, date-only fields 2026-07-05 16:26:22 +08:00
0eca60300f feat: initial postcard manager - FastAPI + Jinja2 + SQLite 2026-07-05 16:06:03 +08:00