- Add SSEViewer component for interactive SSE message inspection
* Display SSE data stream with collapsible panels
* Show parsed JSON with syntax highlighting
* Display key information badges (content, tokens, finish reason)
* Support copy individual or all SSE messages
* Show error messages with detailed information
- Support Ctrl+V to paste images in chat input
* Enable image paste in CustomInputRender component
* Auto-detect and add pasted images to image list
* Show toast notifications for paste results
- Add complete i18n support for 6 languages
* Chinese (zh): Complete translations
* English (en): Complete translations
* Japanese (ja): Add 28 new translations
* French (fr): Add 28 new translations
* Russian (ru): Add 28 new translations
* Vietnamese (vi): Add 32 new translations
- Update .gitignore to exclude data directory
Add comprehensive French translation glossary document to standardize key project terminology. The glossary includes translations for core concepts, model-related terms, user management, recharge & redemption, channel management, and security terms. This ensures consistency and accuracy in French translations across the project, with specific guidance on technical terms and contextual usage.
Extracted the User Agreement and Privacy Policy presentation into a
reusable DocumentRenderer component (web/src/components/common/DocumentRenderer).
Unified rendering logic and i18n source for these documents, removed the
legacy contentDetector utility, and updated the related pages to use the
new component. Adjusted controller/backend (controller/misc.go) and locale
files to support the new rendering approach.
This improves reuse, maintainability, and future extensibility.
Add early return when Epay client is missing in controller/topup.go to avoid panic
Introduce handleKeywordChange in TopupHistoryModal.jsx to reset page to 1 when keyword updates
Wire input onChange to new handler; minor UX improvement to avoid empty results on pagination mismatch
Enable searching topup records by trade_no across both admin-wide and user-only views.
Frontend
- TopupHistoryModal.jsx:
- Add search input with prefix icon (IconSearch) to filter by order number
- Send `keyword` query param to backend; works with both endpoints:
- Admin: GET /api/user/topup?p=1&page_size=10&keyword=...
- User: GET /api/user/topup/self?p=1&page_size=10&keyword=...
- Keep endpoint auto-switching based on role (isAdmin)
- Minor UI polish: outlined admin action button; keep Coins icon for amount
Backend
- model/topup.go:
- Add SearchUserTopUps(userId, keyword, pageInfo)
- Add SearchAllTopUps(keyword, pageInfo)
- Both support pagination and `trade_no LIKE %keyword%` filtering (ordered by id desc)
- controller/topup.go:
- GetUserTopUps / GetAllTopUps accept optional `keyword` and route to search functions when present
Routes
- No new endpoints; search is enabled via `keyword` on existing:
- GET /api/user/topup
- GET /api/user/topup/self
Affected files
- model/topup.go
- controller/topup.go
- web/src/components/topup/modals/TopupHistoryModal.jsx