diff --git a/web/src/components/common/ui/SelectableButtonGroup.jsx b/web/src/components/common/ui/SelectableButtonGroup.jsx index 097283e7..159dde73 100644 --- a/web/src/components/common/ui/SelectableButtonGroup.jsx +++ b/web/src/components/common/ui/SelectableButtonGroup.jsx @@ -18,6 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React, { useState, useRef } from 'react'; +import { useIsMobile } from '../../../hooks/common/useIsMobile'; import { Divider, Button, Tag, Row, Col, Collapsible } from '@douyinfe/semi-ui'; import { IconChevronDown, IconChevronUp } from '@douyinfe/semi-icons'; @@ -44,6 +45,7 @@ const SelectableButtonGroup = ({ collapseHeight = 200 }) => { const [isOpen, setIsOpen] = useState(false); + const isMobile = useIsMobile(); const perRow = 3; const maxVisibleRows = Math.max(1, Math.floor(collapseHeight / 32)); // Approx row height 32 const needCollapse = collapsible && items.length > perRow * maxVisibleRows; @@ -82,10 +84,16 @@ const SelectableButtonGroup = ({ {items.map((item) => { const isActive = activeValue === item.value; return ( - + - - ), [selectedRowKeys, t, handleCompositionStart, handleCompositionEnd, handleChange, copyText]); - return SearchAndActions; + {/* 移动端筛选按钮 */} + {isMobile && ( + + )} + + ), [selectedRowKeys, t, handleCompositionStart, handleCompositionEnd, handleChange, copyText, isMobile]); + + return ( + <> + {SearchAndActions} + + {/* 移动端筛选Modal */} + {isMobile && ( + setShowFilterModal(false)} + sidebarProps={sidebarProps} + t={t} + /> + )} + + ); }; export default PricingSearchBar; \ No newline at end of file diff --git a/web/src/components/table/model-pricing/PricingSidebar.jsx b/web/src/components/table/model-pricing/PricingSidebar.jsx index 9c6389ba..6c13c014 100644 --- a/web/src/components/table/model-pricing/PricingSidebar.jsx +++ b/web/src/components/table/model-pricing/PricingSidebar.jsx @@ -18,11 +18,11 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; -import { Divider, Button, Switch, Select, Tooltip } from '@douyinfe/semi-ui'; -import { IconHelpCircle } from '@douyinfe/semi-icons'; -import PricingCategories from './sidebar/PricingCategories.jsx'; -import PricingGroups from './sidebar/PricingGroups.jsx'; -import PricingQuotaTypes from './sidebar/PricingQuotaTypes.jsx'; +import { Button } from '@douyinfe/semi-ui'; +import PricingCategories from './filter/PricingCategories'; +import PricingGroups from './filter/PricingGroups'; +import PricingQuotaTypes from './filter/PricingQuotaTypes'; +import PricingDisplaySettings from './filter/PricingDisplaySettings'; const PricingSidebar = ({ showWithRecharge, @@ -79,13 +79,13 @@ const PricingSidebar = ({ return (
- {/* 筛选标题和重置按钮 */}
{t('筛选')}
- {/* 显示设置 */} -
- - {t('显示设置')} - -
-
- {t('以充值价格显示')} - -
- {showWithRecharge && ( -
-
{t('货币单位')}
- -
- )} -
-
- {t('显示倍率')} - - - -
- -
-
-
+ - {/* 模型分类 */} diff --git a/web/src/components/table/model-pricing/PricingTable.jsx b/web/src/components/table/model-pricing/PricingTable.jsx index 3b1bc7b8..4fb2a8e8 100644 --- a/web/src/components/table/model-pricing/PricingTable.jsx +++ b/web/src/components/table/model-pricing/PricingTable.jsx @@ -23,7 +23,7 @@ import { IllustrationNoResult, IllustrationNoResultDark } from '@douyinfe/semi-illustrations'; -import { getPricingTableColumns } from './PricingTableColumns.js'; +import { getPricingTableColumns } from './PricingTableColumns'; const PricingTable = ({ filteredModels, diff --git a/web/src/components/table/model-pricing/sidebar/PricingCategories.jsx b/web/src/components/table/model-pricing/filter/PricingCategories.jsx similarity index 98% rename from web/src/components/table/model-pricing/sidebar/PricingCategories.jsx rename to web/src/components/table/model-pricing/filter/PricingCategories.jsx index 65cb58c7..22eb98a2 100644 --- a/web/src/components/table/model-pricing/sidebar/PricingCategories.jsx +++ b/web/src/components/table/model-pricing/filter/PricingCategories.jsx @@ -18,7 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; -import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup.jsx'; +import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup'; const PricingCategories = ({ activeKey, setActiveKey, modelCategories, categoryCounts, availableCategories, t }) => { const items = Object.entries(modelCategories) diff --git a/web/src/components/table/model-pricing/filter/PricingDisplaySettings.jsx b/web/src/components/table/model-pricing/filter/PricingDisplaySettings.jsx new file mode 100644 index 00000000..b212a404 --- /dev/null +++ b/web/src/components/table/model-pricing/filter/PricingDisplaySettings.jsx @@ -0,0 +1,82 @@ +/* +Copyright (C) 2025 QuantumNous + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +For commercial licensing, please contact support@quantumnous.com +*/ + +import React from 'react'; +import { Divider, Switch, Select, Tooltip } from '@douyinfe/semi-ui'; +import { IconHelpCircle } from '@douyinfe/semi-icons'; + +const PricingDisplaySettings = ({ + showWithRecharge, + setShowWithRecharge, + currency, + setCurrency, + showRatio, + setShowRatio, + t +}) => { + return ( +
+ + {t('显示设置')} + +
+
+ {t('以充值价格显示')} + +
+ {showWithRecharge && ( +
+
{t('货币单位')}
+ +
+ )} +
+
+ {t('显示倍率')} + + + +
+ +
+
+
+ ); +}; + +export default PricingDisplaySettings; \ No newline at end of file diff --git a/web/src/components/table/model-pricing/sidebar/PricingGroups.jsx b/web/src/components/table/model-pricing/filter/PricingGroups.jsx similarity index 99% rename from web/src/components/table/model-pricing/sidebar/PricingGroups.jsx rename to web/src/components/table/model-pricing/filter/PricingGroups.jsx index 32643d76..4b851748 100644 --- a/web/src/components/table/model-pricing/sidebar/PricingGroups.jsx +++ b/web/src/components/table/model-pricing/filter/PricingGroups.jsx @@ -18,7 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; -import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup.jsx'; +import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup'; /** * 分组筛选组件 diff --git a/web/src/components/table/model-pricing/sidebar/PricingQuotaTypes.jsx b/web/src/components/table/model-pricing/filter/PricingQuotaTypes.jsx similarity index 98% rename from web/src/components/table/model-pricing/sidebar/PricingQuotaTypes.jsx rename to web/src/components/table/model-pricing/filter/PricingQuotaTypes.jsx index 373f9f5d..5e6dcceb 100644 --- a/web/src/components/table/model-pricing/sidebar/PricingQuotaTypes.jsx +++ b/web/src/components/table/model-pricing/filter/PricingQuotaTypes.jsx @@ -18,7 +18,7 @@ For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; -import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup.jsx'; +import SelectableButtonGroup from '../../../common/ui/SelectableButtonGroup'; /** * 计费类型筛选组件 diff --git a/web/src/components/table/model-pricing/index.jsx b/web/src/components/table/model-pricing/index.jsx index d79be40c..948285f0 100644 --- a/web/src/components/table/model-pricing/index.jsx +++ b/web/src/components/table/model-pricing/index.jsx @@ -18,4 +18,4 @@ For commercial licensing, please contact support@quantumnous.com */ // 为了向后兼容,这里重新导出新的 PricingPage 组件 -export { default } from './PricingPage.jsx'; \ No newline at end of file +export { default } from './PricingPage'; \ No newline at end of file diff --git a/web/src/components/table/model-pricing/modal/PricingFilterModal.jsx b/web/src/components/table/model-pricing/modal/PricingFilterModal.jsx new file mode 100644 index 00000000..a9602591 --- /dev/null +++ b/web/src/components/table/model-pricing/modal/PricingFilterModal.jsx @@ -0,0 +1,48 @@ +/* +Copyright (C) 2025 QuantumNous + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU Affero General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU Affero General Public License for more details. + +You should have received a copy of the GNU Affero General Public License +along with this program. If not, see . + +For commercial licensing, please contact support@quantumnous.com +*/ + +import React from 'react'; +import { Modal } from '@douyinfe/semi-ui'; +import PricingSidebar from '../PricingSidebar'; + +const PricingFilterModal = ({ + visible, + onClose, + sidebarProps, + t +}) => { + return ( + + + + ); +}; + +export default PricingFilterModal; \ No newline at end of file diff --git a/web/src/i18n/locales/en.json b/web/src/i18n/locales/en.json index 5762533f..50c10a21 100644 --- a/web/src/i18n/locales/en.json +++ b/web/src/i18n/locales/en.json @@ -699,7 +699,6 @@ "个": "indivual", "倍率是本站的计算方式,不同模型有着不同的倍率,并非官方价格的多少倍,请务必知晓。": "The magnification is the calculation method of this website. Different models have different magnifications, which are not multiples of the official price. Please be sure to know.", "所有各厂聊天模型请统一使用OpenAI方式请求,支持OpenAI官方库
Claude()Claude官方格式请求": "Please use the OpenAI method to request all chat models from each factory, and support the OpenAI official library
Claude()Claude official format request", - "复制选中模型": "Copy selected model", "分组说明": "Group description", "倍率是为了方便换算不同价格的模型": "The magnification is to facilitate the conversion of models with different prices.", "点击查看倍率说明": "Click to view the magnification description",