- 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>
- Unify color palette from mixed green/blue/purple to consistent green theme
- Sidebar: add text labels to create/join group buttons for discoverability
- Header: add quick action buttons (create group, join group, notifications)
- Mobile: add hamburger menu with slide-out sidebar and overlay
- Home: add prominent CTA buttons, onboarding card for empty state
- Join group dialog: add search-by-name mode alongside existing ID lookup
- Games library: inline group selector dropdown instead of external selection
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Add UAT PocketBase on port 8712 with separate pb_data_uat
- Add UAT nginx config proxying to UAT PB (port 8712)
- Update Dockerfile to support NGINX_CONF build arg
- Add .gitignore for .playwright-mcp/
- Auto-generated team_sessions migration
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Add dedicated nginx location block for /api/realtime with:
- proxy_buffering off to prevent response buffering
- gzip off to avoid chunked encoding issues
- proxy_read_timeout 86400s for long-lived SSE connections
- Connection '' instead of 'upgrade' for SSE protocol
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Accept invitation: update local userStore status to in_team
- Start game: update userStore status to in_team
- End game: update userStore status to idle, simplify endGame logic
- Add $autoCancel:false to endGame session fetch
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Relax team_sessions collection rules to allow authenticated users to view/update
- Reorder respondInvitation: join session before marking invitation as accepted
- Add $autoCancel: false to prevent request cancellation during invitation flow
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Fix other members' status not visible due to users collection viewRule restriction
- Fix empty status treated as 'away' instead of 'idle' in membersByStatus
- Auto-set creator to 'in_team' status when creating team session
- Filter current user from idle members invite list
- Fix group store isGroupOwner using pb.authStore instead of localStorage
- Add nginx no-cache headers for index.html
- Add join_requests collection migration and join approval flow
- Update groups collection rules and add requireApproval field
- Add Memory types for Phase 2 planning
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
SSE subscriptions trigger concurrent requests to the same endpoints,
causing auto-cancellation errors. Add $autoCancel: false to group
queries that get called from realtime event handlers.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Remove loadFromCookie that overwrites valid localStorage auth data
- Set user status to idle on first login (was empty string)
- Default empty status to idle instead of away
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Fix cookie path to '/' for auth persistence across page refreshes
- Login field now accepts both username and email
- Add 30s polling for group list and team session status refresh
- Add group name uniqueness check before creation
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- New join_requests PocketBase collection for pending join applications
- Group requireApproval field (default true) with owner toggle
- JoinGroupDialog: apply when approval required, direct join when not
- JoinRequestCard component for accept/reject in notifications and group panel
- NotificationPanel shows both invitations and join requests
- GroupMembersPanel shows pending requests and approval switch for owners
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Extract PocketBase validation errors (duplicate email/username/password)
and display them in Chinese. Also improve login error message.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Use @element-plus/icons-vue components for consistent, scalable vector
icons across sidebar navigation, section headers, ratings, and buttons.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Game library: add/delete games per group, JSON/CSV import/export, favorites, star ratings & comments
- Fix team session creation: add creator to members array, handle null currentGroup
- Fix image loading: rename SVG files from .png to .svg extensions
- Add PocketBase migrations for game_comments and game_favorites collections
- Remove seed data script
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Seed 33 popular games across 5 platforms via admin API script
- Add GameDetailDialog with game info and quick-team button
- Update GamesLibrary with game card click to open detail dialog
- Update Home hot games to open detail dialog instead of navigating
- Rewrite invitation accept: frontend auto-joins team + updates status
- Add user status reset on team dissolution (endGame)
- Add start game / dissolve buttons to TeamSessionPanel lifecycle
- Integrate realtime subscriptions in GroupView and Layout
- Add notification store realtime invitation listener
- Add placeholder images for game covers and avatars
- Remove Go hooks, add JS hooks placeholder + Docker mount
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Remove VITE_PB_URL=/api from Dockerfile (SDK auto-appends /api)
- Fix nginx proxy_pass to keep /api/ prefix for PocketBase
- Update pocketbase.ts fallback to window.location.origin
- Update PocketBase proxy target to port 8090
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>