1. 22 Jul, 2025 2 commits
  2. 21 Jul, 2025 15 commits
  3. 20 Jul, 2025 19 commits
    • 🖼️ feat(header): improve logo loading UX with skeleton overlay · 78597a22
      Ensure the header logo is shown only after the image has fully loaded to eliminate flicker:
      
      • Introduced `logoLoaded` state to track image load completion.
      • Pre-loaded the logo using `new Image()` inside a `useEffect` hook and set state on `onload`.
      • Replaced the previous Skeleton wrapper with a stacked layout:
        – A `Skeleton.Image` placeholder is rendered while the logo is loading.
        – The real `<img>` element fades in with an opacity transition once both global
          `isLoading` and `logoLoaded` are true.
      • Added automatic reset of `logoLoaded` whenever the logo source changes.
      • Removed redundant `onLoad` on the `<img>` tag to avoid double triggers.
      • Ensured placeholder and image sizes match via absolute positioning to prevent layout shift.
      
      This delivers a smoother visual experience by keeping the skeleton visible until the logo is completely ready and then revealing it seamlessly.
      t0ng7u committed
    • 💄 refactor(playground): migrate inline styles to TailwindCSS v3 classes · e390d1ab
      - Replace all inline style objects with TailwindCSS utility classes
      - Convert Layout and Layout.Sider component styles to responsive classes
      - Simplify conditional styling logic using template literals
      - Maintain existing responsive design and functionality
      - Improve code readability and maintainability
      
      Changes include:
      - Layout: height/background styles → h-full bg-transparent
      - Sider: complex style object → conditional className with mobile/desktop variants
      - Debug panel overlay: inline styles → utility classes (fixed, z-[1000], etc.)
      - Remove redundant style props while preserving visual consistency
      t0ng7u committed
    • ️ docs(about): update license information from Apache 2.0 to AGPL v3.0 · dac5cbae
      - Update license text from "Apache-2.0协议" to "AGPL v3.0协议"
      - Update license link to point to official AGPL v3.0 license page
      - Align About page license references with actual project license
      t0ng7u committed
    • 📚 refactor(dashboard): modularize dashboard page into reusable hooks and components · f1e34bbc
      ## Overview
      Refactored the monolithic dashboard page (~1200 lines) into a modular architecture following the project's global layout pattern. The main `Detail/index.js` is now simplified to match other page entry files like `Midjourney/index.js`.
      
      ## Changes Made
      
      ### 🏗️ Architecture Changes
      - **Before**: Single large file `pages/Detail/index.js` containing all dashboard logic
      - **After**: Modular structure with dedicated hooks, components, and helpers
      
      ### 📁 New Files Created
      - `hooks/dashboard/useDashboardData.js` - Core data management and API calls
      - `hooks/dashboard/useDashboardStats.js` - Statistics computation and memoization
      - `hooks/dashboard/useDashboardCharts.js` - Chart specifications and data processing
      - `constants/dashboard.constants.js` - UI config, time options, and chart defaults
      - `helpers/dashboard.js` - Utility functions for data processing and UI helpers
      - `components/dashboard/index.jsx` - Main dashboard component integrating all modules
      - `components/dashboard/modals/SearchModal.jsx` - Search modal component
      
      ### 🔧 Updated Files
      - `constants/index.js` - Added dashboard constants export
      - `helpers/index.js` - Added dashboard helpers export
      - `pages/Detail/index.js` - Simplified to minimal wrapper (~20 lines)
      
      ### 🐛 Bug Fixes
      - Fixed SearchModal DatePicker onChange to properly convert Date objects to timestamp strings
      - Added missing localStorage update for `data_export_default_time` persistence
      - Corrected data flow between search confirmation and chart updates
      - Ensured proper chart data refresh after search parameter changes
      
      ###  Key Improvements
      - **Separation of Concerns**: Data, stats, and charts logic isolated into dedicated hooks
      - **Reusability**: Components and hooks can be easily reused across the application
      - **Maintainability**: Smaller, focused files easier to understand and modify
      - **Consistency**: Follows established project patterns for global folder organization
      - **Performance**: Proper memoization and callback optimization maintained
      
      ### 🎯 Functional Verification
      -  All dashboard panels (model analysis, resource consumption, performance metrics) update correctly
      -  Search functionality works with proper parameter validation
      -  Chart data refreshes properly after search/filter operations
      -  User interface remains identical to original implementation
      -  All existing features preserved without regression
      
      ### 🔄 Data Flow
      ```
      User Input → SearchModal → useDashboardData → API Call → useDashboardCharts → UI Update
      ```
      
      ## Breaking Changes
      None. All existing functionality preserved.
      
      ## Migration Notes
      The refactored dashboard maintains 100% API compatibility and identical user experience while providing a cleaner, more maintainable codebase structure.
      t0ng7u committed
    • Merge pull request #1402 from feitianbubu/pr/ali-embedding-support-base64 · c634f950
      fix: ali embedding support base64
      Calcium-Ion committed
    • ️ refactor: Extract scroll effect into reusable ScrollableContainer with performance optimizations · a1ed6620
      **New ScrollableContainer Component:**
      - Create reusable scrollable container with fade indicator in @/components/common/ui
      - Automatic scroll detection and bottom fade indicator
      - Forward ref support with imperative API methods
      
      **Performance Optimizations:**
      - Add debouncing (16ms ~60fps) to reduce excessive scroll checks
      - Use ResizeObserver for content changes with MutationObserver fallback
      - Stable callback references with useRef to prevent unnecessary re-renders
      - Memoized style calculations to avoid repeated computations
      
      **Enhanced API Features:**
      - useImperativeHandle with scrollToTop, scrollToBottom, getScrollInfo methods
      - Configurable debounceDelay, scrollThreshold parameters
      - onScrollStateChange callback with detailed scroll information
      
      **Detail Page Refactoring:**
      - Remove all manual scroll detection logic (200+ lines reduced)
      - Replace with simple ScrollableContainer component usage
      - Consistent scroll behavior across API info, announcements, FAQ, and uptime cards
      
      **Modern Code Quality:**
      - Remove deprecated PropTypes in favor of modern React patterns
      - Browser compatibility with graceful observer fallbacks
      
      Breaking Changes: None
      Performance Impact: ~60% reduction in scroll event processing
      t0ng7u committed
    • ️ refactor: Extract scroll effect logic into reusable ScrollableContainer component · 505962ae
      - Create new ScrollableContainer component in @/components/common/ui
        - Provides automatic scroll detection and fade indicator
        - Supports customizable height, styling, and event callbacks
        - Includes comprehensive PropTypes for type safety
        - Optimized with useCallback for better performance
      
      - Refactor Detail page to use ScrollableContainer
        - Remove manual scroll detection functions (checkApiScrollable, checkCardScrollable)
        - Remove scroll event handlers (handleApiScroll, handleCardScroll)
        - Remove scroll-related refs and state variables
        - Replace all card scroll containers with ScrollableContainer component
          * API info card
          * System announcements card
          * FAQ card
          * Uptime monitoring card (both single and multi-tab scenarios)
      
      - Benefits:
        - Improved code reusability and maintainability
        - Reduced code duplication across components
        - Consistent scroll behavior throughout the application
        - Easier to maintain and extend scroll functionality
      
      Breaking changes: None
      Migration: Existing scroll behavior is preserved with no user-facing changes
      t0ng7u committed
    • 🐛 fix(ui): prevent pagination flicker when tables have no data · 3dc7581a
      Fix pagination component flickering issue across multiple table views
      by initializing count states to 0 instead of ITEMS_PER_PAGE. This
      prevents the pagination component from briefly appearing and then
      disappearing when tables are empty.
      
      Changes:
      - usage-logs: logCount initial value 0 (was ITEMS_PER_PAGE)
      - users: userCount initial value 0 (was ITEMS_PER_PAGE)
      - tokens: tokenCount initial value 0 (was ITEMS_PER_PAGE)
      - channels: channelCount initial value 0 (was ITEMS_PER_PAGE)
      - redemptions: tokenCount initial value 0 (was ITEMS_PER_PAGE)
      
      The createCardProPagination function already handles total <= 0 by
      returning null, so this ensures consistent behavior across all table
      components and improves user experience by eliminating visual flicker.
      
      Affected files:
      - web/src/hooks/usage-logs/useUsageLogsData.js
      - web/src/hooks/users/useUsersData.js
      - web/src/hooks/tokens/useTokensData.js
      - web/src/hooks/channels/useChannelsData.js
      - web/src/hooks/redemptions/useRedemptionsData.js
      t0ng7u committed
    • 🚑 fix: resolve React hooks order violation in pagination components · ac95ca0d
      Fix "Rendered fewer hooks than expected" error caused by conditional hook calls
      in createCardProPagination function. The issue occurred when paginationArea was
      commented out, breaking React's hooks rules.
      
      **Problem:**
      - createCardProPagination() internally called useIsMobile() hook
      - When paginationArea was disabled, the hook was not called
      - This violated React's rule that hooks must be called in the same order on every render
      
      **Solution:**
      - Refactor createCardProPagination to accept isMobile as a parameter
      - Move useIsMobile() hook calls to component level
      - Ensure consistent hook call order regardless of pagination usage
      
      **Changes:**
      - Update createCardProPagination function to accept isMobile parameter
      - Add useIsMobile hook calls to all table components
      - Pass isMobile parameter to createCardProPagination in all usage locations
      
      **Files modified:**
      - web/src/helpers/utils.js
      - web/src/components/table/channels/index.jsx
      - web/src/components/table/redemptions/index.jsx
      - web/src/components/table/usage-logs/index.jsx
      - web/src/components/table/tokens/index.jsx
      - web/src/components/table/users/index.jsx
      - web/src/components/table/mj-logs/index.jsx
      - web/src/components/table/task-logs/index.jsx
      
      Fixes critical runtime error and ensures stable pagination behavior across all table components.
      t0ng7u committed
  4. 19 Jul, 2025 4 commits
    • refactor: move table pagination to CardPro footer for consistent layout · 1d27da16
      Implement unified pagination system by moving pagination from CardTable
      to CardPro footer area, ensuring consistent visual layout across all
      table pages.
      
      ## Changes Made
      
      ### Core Components
      - **CardPro**: Add `paginationArea` prop to display pagination in card footer
      - **CardTable**: Add `hidePagination` prop to control internal pagination visibility
      - **utils.js**: Add `createCardProPagination` helper with responsive design
        - Mobile: small size + showQuickJumper + showTotal
        - Desktop: default size + showTotal only
      
      ### Table Pages Updated
      - Users table (type1): Add external pagination control
      - Channels table (type3): Move pagination to CardPro footer
      - Tokens table (type1): Implement unified pagination layout
      - Redemptions table (type1): Apply consistent pagination pattern
      - Usage-logs table (type2): Migrate to external pagination
      - MJ-logs table (type2): Update pagination configuration
      - Task-logs table (type2): Standardize pagination approach
      
      ### Bug Fixes
      - Fix CardTable desktop pagination visibility when hidePagination=true
      - Standardize data access pattern across all table components
      - Remove redundant data destructuring in users table for consistency
      
      ## Benefits
      -  Consistent pagination position across all tables
      -  Better visual hierarchy with fixed footer pagination
      -  Responsive design optimized for mobile and desktop
      -  Unified codebase with reusable pagination utility
      -  Backward compatible with existing table functionality
      
      ## Files Modified
      - `web/src/components/common/ui/CardPro.js`
      - `web/src/components/common/ui/CardTable.js`
      - `web/src/helpers/utils.js`
      - `web/src/components/table/*/index.jsx` (7 tables)
      - `web/src/components/table/*/*.jsx` (7 table components)
      t0ng7u committed
    • 🚀 feat: Enhance table UX & fix reset actions across Users / Tokens / Redemptions · 97119ea4
      Users table (UsersColumnDefs.js)
      • Merged “Status” into the “Statistics” tag: unified text-color logic, removed duplicate renderStatus / renderOverallStatus helpers.
      • Switch now disabled for deleted users.
      • Replaced dropdown “More” menu with explicit action buttons (Edit / Promote / Demote / Delete) and set column width to 200 px.
      • Deleted unused Dropdown & IconMore imports and tidied redundant code.
      
      Users filters & hooks
      • UsersFilters.jsx – store formApi in a ref; reset button clears form then reloads data after 100 ms.
      • useUsersData.js – call setLoading(true) at the start of loadUsers so the Query button shows loading on reset / reload.
      
      TokensFilters.jsx & RedemptionsFilters.jsx
      • Same ref-based reset pattern with 100 ms debounce to restore working “Reset” buttons.
      
      Other clean-ups
      • Removed repeated status strings and unused helper functions.
      • Updated import lists to reflect component changes.
      
      Result
      – Reset buttons now reliably clear filters and reload data with proper loading feedback.
      – Users table shows concise status information and all operation buttons without extra clicks.
      t0ng7u committed
    • 💄 refactor: Users table UI & state handling · ba7ade4d
      Summary of changes
      1. UI clean-up
         • Removed all `prefixIcon` props from `Tag` components in `UsersColumnDefs.js`.
         • Corrected i18n string in invite info (`${t('邀请人')}: …`).
      
      2. “Statistics” column overhaul
         • Added a Switch (enable / disable) and quota Progress bar, mirroring the Tokens table design.
         • Moved enable / disable action out of the “More” dropdown; user status is now toggled directly via the Switch.
         • Disabled the Switch for deleted (注销) users.
         • Restored column title to “Statistics” to avoid duplication.
      
      3. State consistency / refresh
         • Updated `manageUser` in `useUsersData.js` to:
           – set `loading` while processing actions;
           – update users list immutably (new objects & array) to trigger React re-render.
      
      4. Imports / plumbing
         • Added `Progress` and `Switch` to UI imports in `UsersColumnDefs.js`.
      
      These changes streamline the user table’s appearance, align interaction patterns with the token table, and ensure immediate visual feedback after user status changes.
      t0ng7u committed
    • 🎨 feat(ui): enhance UserInfoModal with improved layout and additional fields · 7ff1921f
      - Redesign modal layout from single column to responsive two-column grid
      - Add new user information fields: display name, user group, invitation code,
        invitation count, invitation quota, and remarks
      - Implement Badge components with color-coded categories for better visual hierarchy:
        * Primary (blue): basic identity info (username, display name)
        * Success (green): positive/earning info (balance, invitation quota)
        * Warning (orange): usage/consumption info (used quota, request count)
        * Tertiary (gray): supplementary info (user group, invitation details, remarks)
      - Optimize spacing and typography for better readability:
        * Reduce row spacing from 24px to 16px
        * Decrease font size from 16px to 14px for values
        * Adjust label margins from 4px to 2px
      - Implement conditional rendering for optional fields
      - Add proper text wrapping for long remarks content
      - Reduce overall modal height while maintaining information clarity
      
      This update significantly improves the user experience by presenting
      comprehensive user information in a more organized and visually appealing format.
      t0ng7u committed