- Remove package-lock.json from .gitignore so npm ci can use it
- Commit updated lock file including vant dependency
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- JoinGroupPage: redirect to login when user is not authenticated
- CLAUDE.md: add env details, path alias, and coding constraints
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- new EventListMobile.vue: upcoming/past sections + expandable detail
with RSVP (going/interested/maybe) + comments + realtime subscription
- new CreateEventSheetMobile.vue: title/desc/location/start/end/max-participants
- new JoinGroupPageMobile.vue: group invite landing (login/join/approval flow)
- new JoinTeamPageMobile.vue: team invite landing (login/join/source-group check)
- GroupViewMobile: add '活动' tab, wire EventListMobile; all 8 tabs now live
- router: wire JoinGroup/JoinTeam mobile views; remove unused mobilePlaceholder
- reuses uat event store (loadEvents/rsvp/cancelRSVP/addComment/removeEvent)
+ sessions API (getTeamSession/joinTeamSession)
All 11 stages complete. Full mobile frontend on uat covering all PC features
including uat-exclusive bulletin board, events, group-scoped games, and
invite landing pages.
build verified: vue-tsc + vite build pass
- rewrite GamesLibraryMobile.vue for uat model (games bound to group, not global):
group selector + search + platform filter + 2-col grid + add/import entries
- new GameDetailSheetMobile.vue: cover/name/aliases/tags/platform + favorite/edit/delete
+ quick-team + comments list with rating
- new AddGameSheetMobile.vue: name/aliases/platform/tags/cover-upload (bound to group)
- new ImportGamesSheetMobile.vue: bulk import via text (name | platform | tags per line)
- router: wire GamesLibrary mobile view
- diverges from master: uat games API requires groupId (addGame/importGames/getGroupGames)
vs master's global getPopularGames/searchGames; mobile rewritten to match uat PC behavior
build verified: vue-tsc + vite build pass
- migrate HomeMobile.vue (status card, current session, groups, popular games)
- migrate GroupsMobile.vue (list + create/join popup + pull refresh)
- migrate NotificationsMobile.vue (invitations/join-requests tabs + app notifications)
- router: wire Home/MobileGroups/MobileNotifications mobile views
- verified: user/group/team/notification stores + groups/invitations APIs all match uat
note: event board NOT added to home (uat PC Home.vue doesn't integrate it either);
events will be handled in stage 11 group detail tab
build verified: vue-tsc + vite build pass
- Add aliases field to games (json array), searchable in game library and team session
- Add edit functionality inside GameDetailDialog (creator/owner/admin can modify)
- Add permission control for delete/edit buttons (only visible to authorized users)
- Scope GameSelectDialog to current group only
- Support aliases in import/export
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Fix UAT nginx static cache rule intercepting /api/files/*.png requests,
use negative lookahead to exclude /api/ paths (same as Dev config)
- Clear el-upload file list after successful game creation to prevent
residual file path showing in next upload
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Change game cover field from URL text to file upload (PocketBase migration)
- AddGameDialog now supports drag-and-drop image upload instead of URL input
- Add getGameCoverUrl() helper using pb.files.getUrl() for cover display
- Fix games listRule/viewRule: group.members.id syntax doesn't work in PB 0.22,
changed to group.members ~ @request.auth.id for correct member visibility
- Update changelog with all v0.3.5 entries
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Fix GroupMembersPanel join requests not loading when navigating
from homepage (onMounted timing issue), replaced with watch
- Fix GroupView pending count not syncing after reject/approve,
added requestHandled event communication between components
- Update changelog with all v0.3.5 fixes and new features
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add prominent pending join request badge on GroupView header
with pulse animation for admins/owners
- Clicking badge smoothly scrolls to request list with highlight
- Add "My Join Requests" section on Profile page
- Show status (pending/approved/rejected), timestamp, and reject reason
- Add API: getMyJoinRequests() to fetch user's full request history
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix clipboard copy error in HTTP environment with execCommand fallback
- Fix team invite page not loading user groups, always showing "join group first"
- Fix JoinGroupPage isMember check using group object instead of user ID
- Fix cancelRSVP deleting all users' RSVP records instead of current user's
- Fix event detail not loading event data itself
- Fix event comment avatar URL missing PocketBase baseUrl prefix
- Fix event creation missing endTime > startTime validation
- Fix event manage/delete permission split (creator+owner vs creator+owner)
- Fix event create button only visible to admins, now all members can create
- Fix event expand not subscribing to comments/RSVP realtime updates
- Fix event relative time not using status field
- Remove duplicate create/join group buttons from header and welcome bar
- Refactor team invite link to use API function
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Home: hide duplicate create/join buttons when user has no groups
- Invite links: /join/group/:id and /join/team/:id pages for one-click joining
- Admin: group admins field, ownership transfer, member management toggle
- Events: new events collection with RSVP (going/interested/maybe) and comments
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Each environment now runs its own PB + LiveKit + Voice Token + frontend
- UAT LiveKit: 7890, Voice Token: 7893 (separate from Dev 7880/7883)
- Remove docker-compose.backend.yml, merge into dev compose
- Delete duplicate bulletin migration files that caused PB crash on startup
- Update CLAUDE.md, nginx configs, and .env files accordingly
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Integrate electron-store for persistent PocketBase auth backup
across localStorage clears and app reinstalls
- Switch build target from portable to nsis to generate latest.yml
for electron-updater generic provider
- Add user confirmation dialogs before download and before install
- Add post-build script to copy .exe/.yml/.nupkg to NAS share and
local electron-update/ directory for nginx volume mount
- Mount ./electron-update into frontend nginx containers via
docker-compose for automatic update file serving
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add --unsafely-treat-insecure-origin-as-secure flag for dev/uat URLs
- Set auto-granted permission handlers for mic/camera in main process
- Adapt useVoiceRoom error message for Electron (no Chrome flags hint)
- Add debug logging to voice-token service and frontend voice API
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- LiveKit WebRTC SFU container in docker-compose
- Voice token microservice (Node.js + Express)
- VoiceRoom page with member grid and controls
- useVoiceRoom composable for LiveKit connection
- Voice entry button in TeamSessionPanel
- Nginx proxy for voice-token service API
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
GamesLibrary auto-cancellation error was caused by missing
$autoCancel:false on all games.ts PocketBase SDK calls.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Make ledger description field optional (was required, caused 400)
- Revert nginx.conf back to 192.168.1.14:8090 (host IP, reliable)
- Keep docker-compose port mapping as 8090:8090
- Add $autoCancel:false to ledger/asset API calls
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Remove 6 duplicate Phase 2 migration files (1776500001-0006) that
failed on restart and blocked Phase 3 migrations from running
- Fix Dev nginx.conf proxy target from 192.168.1.14:8090 to
gamegroup-pb:8090 (Docker internal DNS) since host port 8090 is
not exposed (mapped as 8711:8090)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
PocketBase JS SDK auto-cancels pending requests when a new request
targets the same collection. This causes errors when loadLedgers and
getLedgerSummary run in parallel via Promise.all. Added $autoCancel:false
to all API calls in ledgers.ts and assets.ts, matching project convention.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add group expense tracking (ledger) and public asset inventory (asset) features.
Ledger supports income/expense recording with monthly summary. Asset tracks
group equipment with free-form holder transfer. Both are independent pages
accessible from GroupView navigation.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Group polls with option/rollcall modes, edit by creator, auto-settle
- Multimedia memories with upload, preview, inline video playback
- In-app notifications for poll/team/group events
- Points system and group stats dashboard
- Group detail tabs with icons (activity/polls/memories/stats)
- Fix: nginx file upload size, static cache blocking API, timezone, auto-cancel
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Login: query user by name field, authenticate with username
- Register: add blur-triggered nickname uniqueness validation
- Requires PocketBase users collection listRule/viewRule set to public
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- User input "昵称" stored in `name` field (supports Chinese)
- `username` auto-generated (PocketBase requires ASCII)
- Password rules displayed inline with real-time validation
- All UI displays prefer `name` over `username`
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>