1. 19 Jul, 2025 7 commits
  2. 18 Jul, 2025 29 commits
    • fix(cardpro): Keep actions & search areas mounted on mobile to auto-load RPM/TPM · 784b7531
      This commit addresses an issue where RPM and TPM statistics did not load automatically on mobile devices.
      
      Key changes
      • Replaced conditional rendering with persistent rendering of `actionsArea` and `searchArea` in `CardPro` and applied the `hidden` CSS class when the sections should be concealed.
      • Ensures internal hooks (e.g. `useUsageLogsData`) always run, allowing stats to be fetched without requiring the user to tap “Show Actions”.
      • Maintains existing desktop behaviour; only mobile handling is affected.
      
      Files updated
      • `web/src/components/common/ui/CardPro.js`
      
      Result
      Mobile users now see up-to-date RPM/TPM (and other statistics) immediately after page load, improving usability and consistency with the desktop experience.
      t0ng7u committed
    • 🎨 chore: integrate ESLint header automation with AGPL-3.0 notice · 0990561f
      • Added `.eslintrc.cjs`
        - Enables `header` + `react-hooks` plugins
        - Inserts standardized AGPL-3.0 license banner for © 2025 QuantumNous
        - JS/JSX parsing & JSX support configured
      
      • Installed dev-deps: `eslint`, `eslint-plugin-header`, `eslint-plugin-react-hooks`
      
      • Updated `web/package.json` scripts
        - `eslint` → lint with cache
        - `eslint:fix` → auto-insert/repair license headers
      
      • Executed `eslint --fix` to prepend license banner to all JS/JSX files
      
      • Ignored runtime cache
        - Added `.eslintcache` to `.gitignore` & `.dockerignore`
      
      Result: consistent AGPL-3.0 license headers, reproducible linting across local dev & CI.
      t0ng7u committed
    • 🎨 style(card-table): replace Tailwind border‐gray util with Semi UI border… · a91e7215
      🎨 style(card-table): replace Tailwind border‐gray util with Semi UI border variable for consistent theming
      
      Detailed changes
      1. Removed `border-gray-200` Tailwind utility from two `<div>` elements in `web/src/components/common/ui/CardTable.js`.
      2. Added inline style `borderColor: 'var(--semi-color-border)'` while keeping existing `border-b border-dashed` classes.
      3. Ensures all borders use Semi UI’s design token, keeping visual consistency across light/dark themes and custom palettes.
      
      Why
      • Aligns component styling with Semi UI’s design system.
      • Avoids hard-coded colors and prevents theme mismatch issues on future updates.
      
      No breaking changes; visual update only.
      t0ng7u committed
    • 💄 refactor(CardTable): proper empty-state handling & pagination visibility on mobile · f5a0b927
      • Imported Semi-UI `Empty` component.
      • Detect when `dataSource` is empty on mobile card view:
        – Renders supplied `empty` placeholder (`tableProps.empty`) or a default `<Empty description="No Data" />`.
        – Suppresses the mobile `Pagination` component to avoid blank pages.
      • Pagination now renders only when `dataSource.length > 0`, preserving UX parity with desktop tables.
      t0ng7u committed
    • 📱 feat(ui): Introduce responsive `CardTable` with mobile card view, dynamic skeletons & pagination · 3c1652ff
      1. Add `web/src/components/common/ui/CardTable.js`
         • Renders Semi-UI `Table` on desktop; on mobile, transforms each row into a rounded `Card`.
         • Supports all standard `Table` props, including `rowSelection`, `scroll`, `pagination`, etc.
         • Adds mobile pagination via Semi-UI `Pagination`.
         • Implements a 500 ms minimum, active Skeleton loader that mimics real column layout (including operation-button row).
      
      2. Replace legacy `Table` with `CardTable`
         • Updated all major data pages: Channels, MJ-Logs, Redemptions, Tokens, Task-Logs, Usage-Logs and Users.
         • Removed unused `Table` imports; kept behaviour on desktop unchanged.
      
      3. UI polish
         • Right-aligned operation buttons and sensitive fields (e.g., token keys) inside mobile cards.
         • Improved Skeleton placeholders to better reflect actual UI hierarchy and preserve the active animation.
      
      These changes dramatically improve the mobile experience while retaining full functionality on larger screens.
      t0ng7u committed
    • 🌟 feat(ui): reusable CompactModeToggle & mobile-friendly CardPro · 8d964629
      Summary
      -------
      Introduce a reusable compact-mode toggle component and greatly improve the CardPro header for small screens.  Removes duplicated code, adds i18n support, and refines overall responsiveness.
      
      Details
      -------
      🎨  UI / Components
      • Create `common/ui/CompactModeToggle.js`
        – Provides a single source of truth for switching between “Compact list” and “Adaptive list”
        – Automatically hides itself on mobile devices via `useIsMobile()`
      
      • Refactor table modules to use the new component
        – `Users`, `Tokens`, `Redemptions`, `Channels`, `TaskLogs`, `MjLogs`, `UsageLogs`
        – Deletes legacy in-file toggle buttons & reduces repetition
      
      📱  CardPro improvements
      • Hide `actionsArea` and `searchArea` on mobile, showing a single “Show Actions / Hide Actions” toggle button
      • Add i18n: texts are now pulled from injected `t()` function (`显示操作项` / `隐藏操作项` etc.)
      • Extend PropTypes to accept the `t` prop; supply a safe fallback
      • Minor cleanup: remove legacy DOM observers & flag CSS, simplify logic
      
      🔧  Integration
      • Pass the `t` translation function to every `CardPro` usage across table pages
      • Remove temporary custom class hooks after logic simplification
      
      Benefits
      --------
      ✓ Consistent, DRY compact-mode handling across the entire dashboard
      ✓ Better mobile experience with decluttered headers
      ✓ Full translation support for newly added strings
      ✓ Easier future maintenance (single compact toggle, unified CardPro API)
      t0ng7u committed
    • ️ refactor(channels): migrate edit components to modals structure · 7ae715c7
      Move EditChannel and EditTagModal from standalone pages to modal components
      within the channels module structure for consistency with other table modules.
      
      Changes:
      - Move EditChannel.js → components/table/channels/modals/EditChannelModal.jsx
      - Move EditTagModal.js → components/table/channels/modals/EditTagModal.jsx
      - Update import paths in channels/index.jsx
      - Remove standalone routes for EditChannel from App.js
      - Delete original files from pages/Channel/
      
      This change aligns the channels module with the established modular pattern
      used by tokens, users, redemptions, and other table modules, centralizing
      all channel management functionality within integrated modal components
      instead of separate page routes.
      
      BREAKING CHANGE: EditChannel standalone routes (/console/channel/edit/:id
      and /console/channel/add) have been removed. All channel editing is now
      handled through modal components within the main channels page.
      t0ng7u committed
    • 🏗️ refactor: complete table module architecture unification and cleanup · 09557101
      BREAKING CHANGE: Removed standalone user edit routes and intermediate export files
      
      ## Major Refactoring
      - Decompose 673-line monolithic UsersTable.js into 8 specialized components
      - Extract column definitions to UsersColumnDefs.js with render functions
      - Create dedicated UsersActions.jsx for action buttons
      - Create UsersFilters.jsx for search and filtering logic
      - Create UsersDescription.jsx for description area
      - Extract all data management logic to useUsersData.js hook
      - Move AddUser.js and EditUser.js to users/modals/ folder as modal components
      - Create 4 new confirmation modal components (Promote, Demote, EnableDisable, Delete)
      - Implement pure UsersTable.jsx component for table rendering only
      - Create main container component users/index.jsx to compose all subcomponents
      
      ## Import Path Optimization
      - Remove 6 intermediate re-export files: ChannelsTable.js, TokensTable.js, RedemptionsTable.js, UsageLogsTable.js, MjLogsTable.js, TaskLogsTable.js
      - Update all pages to import directly from module folders (e.g., '../../components/table/tokens')
      - Standardize naming convention: all pages import as XxxTable while internal components use XxxPage
      
      ## Route Cleanup
      - Remove obsolete EditUser imports and routes from App.js (/console/user/edit, /console/user/edit/:id)
      - Delete original monolithic files: UsersTable.js, AddUser.js, EditUser.js
      
      ## Architecture Benefits
      - Unified modular pattern across all table modules (tokens, redemptions, users, channels, logs)
      - Consistent file organization and naming conventions
      - Better separation of concerns and maintainability
      - Enhanced reusability and testability
      - Eliminated unnecessary intermediate layers
      - Improved import clarity and performance
      
      All existing functionality preserved with significantly improved code organization.
      t0ng7u committed
    • ️ refactor(users): modularize UsersTable component into microcomponent architecture · f2c2a352
      BREAKING CHANGE: Removed standalone user edit routes (/console/user/edit, /console/user/edit/:id)
      
      - Decompose 673-line monolithic UsersTable.js into 8 specialized components
      - Extract column definitions to UsersColumnDefs.js with render functions
      - Create dedicated UsersActions.jsx for action buttons
      - Create UsersFilters.jsx for search and filtering logic
      - Create UsersDescription.jsx for description area
      - Extract all data management logic to useUsersData.js hook
      - Move AddUser.js and EditUser.js to users/modals/ folder as modal components
      - Create 4 new confirmation modal components (Promote, Demote, EnableDisable, Delete)
      - Implement pure UsersTable.jsx component for table rendering only
      - Create main container component users/index.jsx to compose all subcomponents
      - Update import paths in pages/User/index.js to use new modular structure
      - Remove obsolete EditUser imports and routes from App.js
      - Delete original monolithic files: UsersTable.js, AddUser.js, EditUser.js
      
      The new architecture follows the same modular pattern as tokens and redemptions modules:
      - Consistent file organization across all table modules
      - Better separation of concerns and maintainability
      - Enhanced reusability and testability
      - Unified modal management approach
      
      All existing functionality preserved with improved code organization.
      t0ng7u committed
    • ️ refactor(components): restructure RedemptionsTable to modular architecture · 1e0b56ac
      Refactor the monolithic RedemptionsTable component (614 lines) into a clean,
      modular structure following the established tokens component pattern.
      
      ### Changes Made:
      
      **New Components:**
      - `RedemptionsColumnDefs.js` - Extract table column definitions and render logic
      - `RedemptionsActions.jsx` - Extract action buttons (add, batch copy, clear invalid)
      - `RedemptionsFilters.jsx` - Extract search and filter form components
      - `RedemptionsDescription.jsx` - Extract description area component
      - `redemptions/index.jsx` - Main container component managing state and composition
      
      **New Hook:**
      - `useRedemptionsData.js` - Extract all data management, CRUD operations, and business logic
      
      **New Constants:**
      - `redemption.constants.js` - Extract redemption status, actions, and form constants
      
      **Architecture Changes:**
      - Transform RedemptionsTable.jsx into pure table rendering component
      - Move state management and component composition to index.jsx
      - Implement consistent prop drilling pattern matching tokens module
      - Add memoization for performance optimization
      - Centralize translation function distribution
      
      ### Benefits:
      - **Maintainability**: Each component has single responsibility
      - **Reusability**: Components and hooks can be used elsewhere
      - **Testability**: Individual modules can be unit tested
      - **Team Collaboration**: Multiple developers can work on different modules
      - **Consistency**: Follows established architectural patterns
      
      ### File Structure:
      ```
      redemptions/
      ├── index.jsx                    # Main container (state + composition)
      ├── RedemptionsTable.jsx        # Pure table component
      ├── RedemptionsActions.jsx      # Action buttons
      ├── RedemptionsFilters.jsx      # Search/filter form
      ├── RedemptionsDescription.jsx  # Description area
      └── RedemptionsColumnDefs.js    # Column definitions
      t0ng7u committed
    • ️ refactor: modularize TokensTable component into maintainable architecture · 67df60e7
      - Split monolithic 922-line TokensTable.js into modular components:
        * useTokensData.js: Custom hook for centralized state and logic management
        * TokensColumnDefs.js: Column definitions and rendering functions
        * TokensTable.jsx: Pure table component for rendering
        * TokensActions.jsx: Actions area (add, copy, delete tokens)
        * TokensFilters.jsx: Search form component with keyword and token filters
        * TokensDescription.jsx: Description area with compact mode toggle
        * index.jsx: Main orchestrator component
      
      - Features preserved:
        * Token status management with switch controls
        * Quota progress bars and visual indicators
        * Model limitations display with vendor avatars
        * IP restrictions handling and display
        * Chat integrations with dropdown menu
        * Batch operations (copy, delete) with confirmations
        * Key visibility toggle and copy functionality
        * Compact mode for responsive layouts
        * Search and filtering capabilities
        * Pagination and loading states
      
      - Improvements:
        * Better separation of concerns
        * Enhanced reusability and testability
        * Simplified maintenance and debugging
        * Consistent modular architecture pattern
        * Performance optimizations with useMemo
        * Backward compatibility maintained
      
      This refactoring follows the same successful pattern used for LogsTable, MjLogsTable, and TaskLogsTable, significantly improving code maintainability while preserving all existing functionality.
      t0ng7u committed
    • ️ refactor: restructure TaskLogsTable into modular component architecture · baffe556
      Refactor the monolithic TaskLogsTable component (802 lines) into a modular,
      maintainable architecture following the established pattern from LogsTable
      and MjLogsTable refactors.
      
      ## What Changed
      
      ### 🏗️ Architecture
      - Split large single file into focused, single-responsibility components
      - Introduced custom hook `useTaskLogsData` for centralized state management
      - Created dedicated column definitions file for better organization
      - Implemented modal components for user interactions
      
      ### 📁 New Structure
      ```
      web/src/components/table/task-logs/
      ├── index.jsx                       # Main page component orchestrator
      ├── TaskLogsTable.jsx              # Pure table rendering component
      ├── TaskLogsActions.jsx            # Actions area (task records + compact mode)
      ├── TaskLogsFilters.jsx            # Search form component
      ├── TaskLogsColumnDefs.js          # Column definitions and renderers
      └── modals/
          ├── ColumnSelectorModal.jsx    # Column visibility settings
          └── ContentModal.jsx           # Content viewer for JSON data
      
      web/src/hooks/task-logs/
      └── useTaskLogsData.js             # Custom hook for state & logic
      ```
      
      ### 🎯 Key Improvements
      - **Maintainability**: Clear separation of concerns, easier to understand
      - **Reusability**: Modular components can be reused independently
      - **Performance**: Optimized with `useMemo` for column rendering
      - **Testing**: Single-responsibility components easier to test
      - **Developer Experience**: Better code organization and readability
      
      ### 🎨 Task-Specific Features Preserved
      - All task type rendering with icons (MUSIC, LYRICS, video generation)
      - Platform-specific rendering (Suno, Kling, Jimeng) with distinct colors
      - Progress indicators for task completion status
      - Video preview links for successful video generation tasks
      - Admin-only columns for channel information
      - Status rendering with appropriate colors and icons
      
      ### 🔧 Technical Details
      - Centralized all business logic in `useTaskLogsData` custom hook
      - Extracted comprehensive column definitions with Lucide React icons
      - Split complex UI into focused components (table, actions, filters, modals)
      - Maintained responsive design patterns for mobile compatibility
      - Preserved admin permission handling for restricted features
      - Optimized spacing and layout (reduced gap from 4 to 2 for better density)
      
      ### 🎮 Platform Support
      - **Suno**: Music and lyrics generation with music icons
      - **Kling**: Video generation with video icons
      - **Jimeng**: Video generation with distinct purple styling
      
      ### 🐛 Fixes
      - Improved component prop passing patterns
      - Enhanced type safety through better state management
      - Optimized rendering performance with proper memoization
      - Streamlined export pattern using `export { default }`
      
      ## Breaking Changes
      None - all existing imports and functionality preserved.
      t0ng7u committed
    • ️ refactor: restructure MjLogsTable into modular component architecture · 51695bef
      Refactor the monolithic MjLogsTable component (971 lines) into a modular,
      maintainable architecture following the same pattern as LogsTable refactor.
      
      ## What Changed
      
      ### 🏗️ Architecture
      - Split large single file into focused, single-responsibility components
      - Introduced custom hook `useMjLogsData` for centralized state management
      - Created dedicated column definitions file for better organization
      - Implemented specialized modal components for Midjourney-specific features
      
      ### 📁 New Structure
      ```
      web/src/components/table/mj-logs/
      ├── index.jsx                    # Main page component orchestrator
      ├── MjLogsTable.jsx             # Pure table rendering component
      ├── MjLogsActions.jsx           # Actions area (banner + compact mode)
      ├── MjLogsFilters.jsx           # Search form component
      ├── MjLogsColumnDefs.js         # Column definitions and renderers
      └── modals/
          ├── ColumnSelectorModal.jsx # Column visibility settings
          └── ContentModal.jsx        # Content viewer (text + image preview)
      
      web/src/hooks/mj-logs/
      └── useMjLogsData.js            # Custom hook for state & logic
      ```
      
      ### 🎯 Key Improvements
      - **Maintainability**: Clear separation of concerns, easier to understand
      - **Reusability**: Modular components can be reused independently
      - **Performance**: Optimized with `useMemo` for column rendering
      - **Testing**: Single-responsibility components easier to test
      - **Developer Experience**: Better code organization and readability
      
      ### 🎨 Midjourney-Specific Features Preserved
      - All task type rendering with icons (IMAGINE, UPSCALE, VARIATION, etc.)
      - Status rendering with appropriate colors and icons
      - Image preview functionality for generated artwork
      - Progress indicators for task completion
      - Admin-only columns for channel and submission results
      - Banner notification system for callback settings
      
      ### 🔧 Technical Details
      - Centralized all business logic in `useMjLogsData` custom hook
      - Extracted comprehensive column definitions with Lucide React icons
      - Split complex UI into focused components (table, actions, filters, modals)
      - Maintained responsive design patterns for mobile compatibility
      - Preserved admin permission handling for restricted features
      
      ### 🐛 Fixes
      - Improved component prop passing patterns
      - Enhanced type safety through better state management
      - Optimized rendering performance with proper memoization
      
      ## Breaking Changes
      None - all existing imports and functionality preserved.
      t0ng7u committed
    • ️ refactor: restructure LogsTable into modular component architecture · acf6ec93
      Refactor the monolithic LogsTable component (1453 lines) into a modular,
      maintainable architecture following the channels table pattern.
      
      ## What Changed
      
      ### 🏗️ Architecture
      - Split single large file into focused, single-responsibility components
      - Introduced custom hook `useLogsData` for centralized state management
      - Created dedicated column definitions file for better organization
      - Implemented modal components for user interactions
      
      ### 📁 New Structure
      ```
      web/src/components/table/usage-logs/
      ├── index.jsx                    # Main page component orchestrator
      ├── LogsTable.jsx               # Pure table rendering component
      ├── LogsActions.jsx             # Actions area (stats + compact mode)
      ├── LogsFilters.jsx             # Search form component
      ├── LogsColumnDefs.js           # Column definitions and renderers
      └── modals/
          ├── ColumnSelectorModal.jsx # Column visibility settings
          └── UserInfoModal.jsx       # User information display
      
      web/src/hooks/logs/
      └── useLogsData.js              # Custom hook for state & logic
      ```
      
      ### 🎯 Key Improvements
      - **Maintainability**: Clear separation of concerns, easier to understand
      - **Reusability**: Modular components can be reused independently
      - **Performance**: Optimized with `useMemo` for column rendering
      - **Testing**: Single-responsibility components easier to test
      - **Developer Experience**: Better code organization and readability
      
      ### 🔧 Technical Details
      - Preserved all existing functionality and user experience
      - Maintained backward compatibility through existing import path
      - Centralized all business logic in `useLogsData` custom hook
      - Extracted column definitions to separate module with render functions
      - Split complex UI into focused components (table, actions, filters, modals)
      
      ### 🐛 Fixes
      - Fixed Semi UI component import issues (`Typography.Paragraph`)
      - Resolved module export dependencies
      - Maintained consistent prop passing patterns
      
      ## Breaking Changes
      None - all existing imports and functionality preserved.
      t0ng7u committed
    • Merge pull request #1352 from wzxjohn/feature/simple_stripe · af652718
      Add stripe support and fix wrong top up loading state
      IcedTangerine committed
    • 🚀 feat(web/channels): Deep modular refactor of Channels table · 217c657e
      1. Split monolithic `ChannelsTable` (2200+ LOC) into focused components
         • `channels/index.jsx` – composition entry
         • `ChannelsTable.jsx` – pure `<Table>` rendering
         • `ChannelsActions.jsx` – bulk & settings toolbar
         • `ChannelsFilters.jsx` – search / create / column-settings form
         • `ChannelsTabs.jsx` – type tabs
         • `ChannelsColumnDefs.js` – column definitions & render helpers
         • `modals/` – BatchTag, ColumnSelector, ModelTest modals
      
      2. Extract domain hook
         • Moved `useChannelsData.js` → `src/hooks/channels/useChannelsData.js`
           – centralises state, API calls, pagination, filters, batch ops
           – now exports `setActivePage`, fixing tab / status switch errors
      
      3. Update wiring
         • All sub-components consume data via `useChannelsData` props
         • Adjusted import paths after hook relocation
      
      4. Clean legacy file
         • Legacy `components/table/ChannelsTable.js` now re-exports new module
      
      5. Bug fixes
         • Tab switching, status filter & tag aggregation restored
         • Column selector & batch actions operate via unified hook
      
      This commit completes the first phase of modularising the Channels feature, laying groundwork for consistent, maintainable table architecture across the app.
      t0ng7u committed
    • Merge pull request #1362 from KamiPasi/patch-1 · f7fa5fd2
      🔧 refactor(user_usable_group): enhance concurrency control with mutex…
      Calcium-Ion committed
    • Merge pull request #1393 from feitianbubu/pr/fix-mysql-default-false · 3fabcac4
      fix: mySQL does not support default false
      Calcium-Ion committed
    • Merge pull request #1381 from feitianbubu/pr/task-origin-name · 38091f43
      feat: video priority use origin model name
      Calcium-Ion committed
    • Merge pull request #1190 from feitianbubu/fix-nil-request-id · 09e6dbcc
      fix: default request ID to 'SYSTEM' for background tasks
      Calcium-Ion committed
    • Merge pull request #1349 from feitianbubu/pr/fix-kling-image-mode-name · 4a46b50e
      fix: KlingText2VideoRequest image and model_name
      Calcium-Ion committed
    • Merge pull request #1363 from feitianbubu/pr/add-jimeng-image · 066d4a79
      feat: 增加即梦生图功能
      Calcium-Ion committed
    • 🗑️ refactor(table): remove custom `formatPageText` from all table components · eac90f67
      Eliminated the manual `formatPageText` function that previously rendered
      pagination text (e.g. “第 {{start}} - {{end}} 条,共 {{total}} 条”) in each
      Table. Pagination now relies on the default Semi UI text or the global
      i18n configuration, reducing duplication and making future language
      updates centralized.
      
      Why
      ---
      * Keeps table components cleaner and more maintainable.
      * Ensures pagination text automatically respects the app-wide i18n
        settings without per-component overrides.
      t0ng7u committed
    • 🎉 feat(i18n): integrate Semi UI LocaleProvider with dynamic i18next language support · 9496156d
      Add Semi UI internationalization to the project by wrapping the root
      component tree with `LocaleProvider`. A new `SemiLocaleWrapper`
      component maps the current `i18next` language code to the corresponding
      Semi locale (currently `zh_CN` and `en_GB`) and falls back to Chinese
      when no match is found.
      
      Key changes
      -----------
      1. web/src/index.js
         • Import `LocaleProvider`, `useTranslation`, and Semi locale files.
         • Introduce `SemiLocaleWrapper` to determine `semiLocale` from
           `i18next.language` using a concise prefix-based mapping.
         • Wrap `PageLayout` with `SemiLocaleWrapper` inside the existing
           `ThemeProvider`.
      
      2. Ensures that all Semi components automatically display the correct
         language when the app language is switched via i18next.
      
      BREAKING CHANGE
      ---------------
      Applications embedding this project must now ensure that `i18next`
      initialization occurs before React render so that `LocaleProvider`
      receives the correct initial language.
      t0ng7u committed
  3. 17 Jul, 2025 4 commits
    • 🎨 refactor(ui): scope table scrolling to console cards & refine overall layout · b0e7b9ae
      Summary
      Implement a dedicated, reusable scrolling mechanism for all console-table pages while keeping header and sidebar fixed, plus related layout improvements.
      
      Key Changes
      • Added `.table-scroll-card` utility class
       – Provides flex column layout and internal vertical scrolling
       – Desktop height: `calc(100vh - 110px)`; Mobile (<768 px) height: `calc(100vh - 77px)`
       – Hides scrollbars cross-browser (`-ms-overflow-style`, `scrollbar-width`, `::-webkit-scrollbar`)
      • Replaced global `.semi-card` scrolling rules with `.table-scroll-card` to avoid affecting non-table cards
      • Updated table components (Channels, Tokens, Users, Logs, MjLogs, TaskLogs, Redemptions) to use the new class
      • PageLayout
       – Footer is now suppressed for all `/console` routes
       – Confirmed only central content area scrolls; header & sidebar remain fixed
      • Restored hidden scrollbar rules for `.semi-layout-content` and removed unnecessary global overrides
      • Minor CSS cleanup & comment improvements for readability
      
      Result
      Console table pages now fill the viewport with smooth, internal scrolling and no visible scrollbars, while other cards and pages remain unaffected.
      t0ng7u committed
    • 📚 docs: add comprehensive Web-interface API reference (excluding Relay) · 38bc3bad
      A new Markdown file `docs/api/web_api.md` has been added that documents all backend REST endpoints used by the Web UI.
      
      Details:
      • Lists every `/api`, `/dashboard`, and `/v1/dashboard` route relevant to the Web front-end
      • Excludes every Relay-specific path to keep scope focused on Web operations
      • Groups endpoints by functional module (initialisation, public info, user, channel, token, logging, etc.)
      • Specifies HTTP method, path, required auth level, and concise description for each entry
      • Includes an auth-level legend and update-date placeholder for future maintenance
      
      No application logic was modified; this is documentation-only and improves developer onboarding and API discoverability.
      t0ng7u committed
    • 🌐 feat: add configurable USD exchange-rate support across backend & frontend · 9f957da5
      Backend
      - setting/payment.go: introduce default `USDExchangeRate` (7.3)
      - model/option.go:
        • inject `USDExchangeRate` into `InitOptionMap`
        • persist & sync value in `updateOptionMap`
      - controller/misc.go: expose `usd_exchange_rate` via `/api/status`
      
      Frontend
      - OperationSetting.js & SettingsGeneral.js:
        • extend state/inputs with `USDExchangeRate`
        • add form field “美元汇率 (non-top-up rate, pricing only)”
      - ModelPricing.js already consumes `status.usd_exchange_rate`; no change needed
      
      API
      - Administrators can update the rate via `PUT /api/option` (key: `USDExchangeRate`)
      - All clients receive the latest rate through `GET /api/status`
      
      This closes the end-to-end flow for displaying model prices in both USD and CNY based on a configurable exchange rate.
      t0ng7u committed