1. 23 Jul, 2025 1 commit
    • 🔧 fix: filter out empty string group from pricing groups selector (#1365) · 024dcda9
      Filter out the special empty string group ("": "用户分组") from the
      usable groups in PricingGroups component. This empty group represents
      "user's current group" but contains no data and should not be displayed
      in the group filter options.
      
      - Add filter condition to exclude empty string keys from usableGroup
      - Prevents displaying invalid empty group option in UI
      - Improves user experience by showing only valid selectable groups
      t0ng7u committed
  2. 22 Jul, 2025 22 commits
    • feat: Add skeleton loading animation to SelectableButtonGroup component (#1365) · 3ae8c741
      Add comprehensive loading state support with skeleton animations for the SelectableButtonGroup component, improving user experience during data loading.
      
      Key Changes:
      - Add loading prop to SelectableButtonGroup with minimum 500ms display duration
      - Implement skeleton buttons with proper Semi-UI Skeleton wrapper and active animation
      - Use fixed skeleton count (6 items) to prevent visual jumping during load transitions
      - Pass loading state through all pricing filter components hierarchy:
        - PricingSidebar and PricingFilterModal as container components
        - PricingDisplaySettings, PricingCategories, PricingGroups, PricingQuotaTypes as filter components
      
      Technical Details:
      - Reference CardTable.js implementation for consistent skeleton UI patterns
      - Add useEffect hook for 500ms minimum loading duration control
      - Support both checkbox and regular button skeleton modes
      - Maintain responsive layout compatibility (mobile/desktop)
      - Add proper JSDoc parameter documentation for loading prop
      
      Fixes:
      - Prevent skeleton count sudden changes that caused visual discontinuity
      - Ensure proper skeleton animation with Semi-UI active parameter
      - Maintain consistent loading experience across all filter components
      t0ng7u committed
    • feat: enhance SelectableButtonGroup with checkbox support and refactor pricing… · 6eaaee20
       feat: enhance SelectableButtonGroup with checkbox support and refactor pricing display settings (#1365)
      
      - Add withCheckbox prop to SelectableButtonGroup component for checkbox-prefixed buttons
      - Support both single value and array activeValue for multi-selection scenarios
      - Refactor PricingDisplaySettings to use consistent SelectableButtonGroup styling
      - Replace Switch components with checkbox-enabled SelectableButtonGroup
      - Replace Select dropdown with SelectableButtonGroup for currency selection
      - Maintain unified UI/UX across all pricing filter components
      - Add proper JSDoc documentation for new withCheckbox functionality
      
      This improves visual consistency and provides a more cohesive user experience
      in the model pricing filter interface.
      t0ng7u committed
    • 💄 feat(ui): replace availability indicators with icons in PricingTableColumns (#1365) · e007b26b
      Summary
      • Swapped out the old availability UI for clearer icon-based feedback.
      • Users now see a green check icon when their group can use a model and a red × icon (with tooltip) when it cannot.
      
      Details
      1. Imports
         • Removed deprecated `IconVerify`.
         • Added `IconCheckCircleStroked`  and `IconClose`  for new states.
      
      2. Availability column
         • `renderAvailable` now
           – Shows a green `IconCheckCircleStroked` inside a popover (“Your group can use this model”).
           – Shows a red `IconClose` inside a popover (“你的分组无权使用该模型”) when the model is inaccessible.
           – Eliminates the empty cell/grey tag fallback.
      
      3. Group tag
         • Updated selected-group tag to use `IconCheckCircleStroked` for visual consistency.
      
      Result
      Improves UX by providing explicit visual cues for model availability and removes ambiguous blank cells.
      t0ng7u committed
    • ️ refactor(model-pricing): extract `resetPricingFilters` utility and eliminate duplication (#1365) · e22ef769
      Centralize filter-reset logic to improve maintainability and consistency.
      
      - Add `resetPricingFilters` helper to `web/src/helpers/utils.js`, encapsulating all reset actions (search, category, currency, ratio, group, quota type, etc.).
      - Update `PricingFilterModal.jsx` and `PricingSidebar.jsx` to import and use the new utility instead of keeping their own duplicate `handleResetFilters`.
      - Removes repeated code, ensures future changes to reset behavior require modification in only one place, and keeps components lean.
      t0ng7u committed
    • 🔧 refactor(pricing-filters): extract display settings & improve mobile layout (#1365) · 9bab77ad
      * **PricingDisplaySettings.jsx**
        • Extracted display settings (recharge price, currency, ratio toggle) from PricingSidebar
        • Maintains complete styling and functionality as standalone component
      
      * **SelectableButtonGroup.jsx**
        • Added isMobile detection with conditional Col spans
        • Mobile: `span={12}` (2 buttons per row) for better touch experience
        • Desktop: preserved responsive grid `xs={24} sm={24} md={24} lg={12} xl={8}`
      
      * **PricingSidebar.jsx**
        • Updated imports to use new PricingDisplaySettings component
        • Simplified component structure while preserving reset logic
      
      These changes enhance code modularity and provide optimized mobile UX for filter button groups across the pricing interface.
      t0ng7u committed
    • 📌 fix(pricing-search): make search bar sticky within PricingContent (#1365) · cff8c3ac
      * Added `position: sticky; top: 0; z-index: 5;` to search bar container
        – keeps the bar fixed while the table body scrolls
      * Preserves previous padding, border and background styles
      * Improves usability by ensuring quick access to search & actions during long list navigation
      
      • PricingTable
        • Added `compactMode` prop; strips fixed columns and sets `scroll={compactMode ? undefined : { x: 'max-content' }}`
        • Processes columns to remove `fixed` in compact mode
      
      • PricingPage & index.css
        • Added `.pricing-scroll-hide` utility to hide Y-axis scrollbar for `Sider` & `Content`
      
      • Responsive / style refinements
        • Sidebar width adjusted to 460px
        • Scrollbars hidden uniformly across pricing modules
      
      These changes complete the model-pricing UI refactor, ensuring clean scrolling, responsive filters, and fixed availability column for better usability.
      t0ng7u committed
    • feat(ui): enhance pricing table & filters with responsive button-group, fixed… · f845a96f
       feat(ui): enhance pricing table & filters with responsive button-group, fixed column, scroll tweaks (#1365)
      
      • SelectableButtonGroup
        • Added optional collapsible support with gradient mask & toggle
        • Dynamic tagCount badge support for groups / quota types
        • Switched to responsive Row/Col (`xs 24`, `sm 24`, `lg 12`, `xl 8`) for fluid layout
        • Shows expand button only when item count exceeds visible rows
      
      • Sidebar filters
        • PricingGroups & PricingQuotaTypes now pass tag counts to button-group
        • Counts derived from current models & quota_type
      
      • PricingTableColumns
        • Moved “Availability” column to far right; fixed via `fixed: 'right'`
        • Re-ordered columns and preserved ratio / price logic
      
      • PricingTable
        • Added `compactMode` prop; strips fixed columns and sets `scroll={compactMode ? undefined : { x: 'max-content' }}`
        • Processes columns to remove `fixed` in compact mode
      
      • PricingPage & index.css
        • Added `.pricing-scroll-hide` utility to hide Y-axis scrollbar for `Sider` & `Content`
      
      • Responsive / style refinements
        • Sidebar width adjusted to 460px
        • Scrollbars hidden uniformly across pricing modules
      
      These changes complete the model-pricing UI refactor, ensuring clean scrolling, responsive filters, and fixed availability column for better usability.
      t0ng7u committed
    • 🎨 feat(model-pricing): refactor layout and component structure (#1365) · 1c22e03a
      * Re-architected model-pricing page into modular components:
        * PricingPage / PricingSidebar / PricingContent
        * Removed obsolete `ModelPricing*` components and column defs
      * Introduced reusable `SelectableButtonGroup` in `common/ui`
        * Supports Row/Col grid (3 per row)
        * Optional collapsible mode with gradient mask & toggle
      * Rebuilt filter panels with the new button-group:
        * Model categories, token groups, and quota types
        * Added dynamic `tagCount` badges to display item totals
      * Extended `useModelPricingData` hook
        * Added `filterGroup` and `filterQuotaType` state and logic
      * Updated PricingTable columns & sidebar reset logic to respect new states
      * Ensured backward compatibility via re-export in `index.jsx`
      * Polished styling, icons and i18n keys
      t0ng7u committed
    • 🐛 fix(EditChannelModal): hide empty “API Config” card for VolcEngine Ark/Doubao (type 45) · 5bd8dd78
      The VolcEngine Ark/Doubao channel now has a hard-coded base URL inside the backend, so it no longer requires any API-address settings on the front-end side.
      Previously, the input field was hidden but the surrounding “API Config” card still rendered, leaving a blank, confusing section.
      
      Changes made
      • Added `showApiConfigCard` flag (true when `inputs.type !== 45`) right after the state declarations.
      • Wrapped the entire “API Config” card in a conditional render driven by this flag.
      • Removed the duplicate declaration of `showApiConfigCard` further down in the component to avoid shadowing and improve readability.
      
      Scope verification
      • Checked all other channel types: every remaining type either displays a dedicated API-related input/banner (3, 8, 22, 36, 37, 40, …) or falls back to the generic “custom API address” field.
      • Therefore, only type 45 requires the card to be fully hidden.
      
      Result
      The “Edit Channel” modal now shows no empty card for the VolcEngine Ark/Doubao channel, leading to a cleaner and more intuitive UI while preserving behaviour for all other channels.
      t0ng7u committed
    • Merge pull request #1416 from feitianbubu/pr/opt-video-channel · d0990034
      chore: opt video channel and platform
      IcedTangerine committed
    • 🌐 feat: implement left-right pagination layout with i18n support · 2f55960b
      - Add left-right pagination layout for desktop (total info on left, controls on right)
      - Keep mobile layout centered with pagination controls only
      - Implement proper i18n support for pagination text using react-i18next
      - Add pagination translations for Chinese and English
      - Standardize t function usage across all table components to use xxxData.t pattern
      - Update CardPro footer layout to support justify-between on desktop
      - Use CSS variable --semi-color-text-2 for consistent text styling
      - Disable built-in Pagination showTotal to avoid duplication
      
      Components updated:
      - CardPro: Enhanced footer layout with responsive design
      - createCardProPagination: Added i18n support and custom total text
      - All table components: Unified t function usage pattern
      - i18n files: Added pagination-related translations
      
      The pagination now displays "Showing X to Y of Z items" on desktop
      and maintains existing centered layout on mobile devices.
      t0ng7u committed
    • ️ refactor: restructure ModelPricing component into modular architecture · a2fc86a2
      - Break down monolithic ModelPricing.js (685 lines) into focused components:
        * ModelPricingHeader.jsx - top status card with pricing information
        * ModelPricingTabs.jsx - model category navigation tabs
        * ModelPricingFilters.jsx - search and action controls
        * ModelPricingTable.jsx - data table with pricing details
        * ModelPricingColumnDefs.js - table column definitions and renderers
      
      - Create custom hook useModelPricingData.js for centralized state management:
        * Consolidate all business logic and API calls
        * Manage pricing calculations and data transformations
        * Handle search, filtering, and UI interactions
      
      - Follow project conventions matching other table components:
        * Adopt same file structure as channels/, users/, tokens/ modules
        * Maintain consistent naming patterns and component organization
        * Preserve all original functionality including responsive design
      
      - Update import paths:
        * Remove obsolete ModelPricing.js file
        * Update Pricing page to use new ModelPricingPage component
        * Fix missing import references
      
      Benefits:
      - Improved maintainability with single-responsibility components
      - Enhanced code reusability and testability
      - Better team collaboration with modular structure
      - Consistent codebase architecture across all table components
      t0ng7u committed
    • Merge pull request #1410 from feitianbubu/pr/fix-page-param · 5c1f07ae
      fix: page query param is p
      Calcium-Ion committed
    • Merge pull request #1415 from feitianbubu/pr/fix-relayError-nil · 72afb727
      fix: avoid relayError nil panic
      Calcium-Ion committed
    • fix: add Think field to OllamaRequest and support extra parameters in… · c5ec332a
      fix: add Think field to OllamaRequest and support extra parameters in GeneralOpenAIRequest. (close #1125
      )
      CaIon committed
  3. 21 Jul, 2025 16 commits
  4. 20 Jul, 2025 1 commit