feat: 功能: │ │

│ │ - 新增 showModeToggle, currentMode, onModeToggle 等 props                                                                                      │ │
│ │ - 支持显示模式切换按钮("精简模式" / "查看详情")                                                                                              │ │
│ │ - 根据模式动态显示按钮文案和图标
This commit is contained in:
zdl
2025-11-07 19:31:42 +08:00
parent 2da71a3c03
commit 63fb8a3aa8

View File

@@ -9,6 +9,7 @@ import {
Heading, Heading,
Badge, Badge,
IconButton, IconButton,
Button,
useColorModeValue, useColorModeValue,
} from '@chakra-ui/react'; } from '@chakra-ui/react';
import { ChevronDownIcon, ChevronUpIcon } from '@chakra-ui/icons'; import { ChevronDownIcon, ChevronUpIcon } from '@chakra-ui/icons';
@@ -21,22 +22,53 @@ import { ChevronDownIcon, ChevronUpIcon } from '@chakra-ui/icons';
* @param {Function} props.onToggle - 切换展开/收起的回调 * @param {Function} props.onToggle - 切换展开/收起的回调
* @param {number} props.count - 可选的数量徽章 * @param {number} props.count - 可选的数量徽章
* @param {React.ReactNode} props.subscriptionBadge - 可选的会员标签组件 * @param {React.ReactNode} props.subscriptionBadge - 可选的会员标签组件
* @param {boolean} props.showModeToggle - 是否显示模式切换按钮(默认 false
* @param {string} props.currentMode - 当前模式:'detailed' | 'simple'
* @param {Function} props.onModeToggle - 模式切换回调
* @param {boolean} props.isLocked - 是否锁定(不可展开)
*/ */
const CollapsibleHeader = ({ title, isOpen, onToggle, count = null, subscriptionBadge = null }) => { const CollapsibleHeader = ({
title,
isOpen,
onToggle,
count = null,
subscriptionBadge = null,
showModeToggle = false,
currentMode = 'detailed',
onModeToggle = null,
isLocked = false
}) => {
const sectionBg = useColorModeValue('gray.50', 'gray.750'); const sectionBg = useColorModeValue('gray.50', 'gray.750');
const hoverBg = useColorModeValue('gray.100', 'gray.700'); const hoverBg = useColorModeValue('gray.100', 'gray.700');
const headingColor = useColorModeValue('gray.700', 'gray.200'); const headingColor = useColorModeValue('gray.700', 'gray.200');
// 获取按钮文案
const getButtonText = () => {
if (currentMode === 'simple') {
return '查看详情'; // 简单模式时,按钮显示"查看详情"
}
return '精简模式'; // 详细模式时,按钮显示"精简模式"
};
// 获取按钮图标
const getButtonIcon = () => {
if (currentMode === 'simple') {
return null; // 简单模式不显示图标
}
// 详细模式:展开显示向上箭头,收起显示向下箭头
return isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />;
};
return ( return (
<Flex <Flex
justify="space-between" justify="space-between"
align="center" align="center"
cursor="pointer" cursor={showModeToggle ? 'default' : 'pointer'}
onClick={onToggle} onClick={showModeToggle ? undefined : onToggle}
p={3} p={3}
bg={sectionBg} bg={sectionBg}
borderRadius="md" borderRadius="md"
_hover={{ bg: hoverBg }} _hover={showModeToggle ? {} : { bg: hoverBg }}
transition="background 0.2s" transition="background 0.2s"
> >
<HStack spacing={2}> <HStack spacing={2}>
@@ -54,12 +86,32 @@ const CollapsibleHeader = ({ title, isOpen, onToggle, count = null, subscription
</Badge> </Badge>
)} )}
</HStack> </HStack>
{/* 只有 showModeToggle=true 时才显示模式切换按钮 */}
{showModeToggle && onModeToggle && (
<Button
size="sm"
variant="ghost"
colorScheme="blue"
rightIcon={getButtonIcon()}
onClick={(e) => {
e.stopPropagation();
onModeToggle(e);
}}
>
{getButtonText()}
</Button>
)}
{/* showModeToggle=false 时显示原有的 IconButton */}
{!showModeToggle && (
<IconButton <IconButton
icon={isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />} icon={isOpen ? <ChevronUpIcon /> : <ChevronDownIcon />}
size="sm" size="sm"
variant="ghost" variant="ghost"
aria-label={isOpen ? '收起' : '展开'} aria-label={isOpen ? '收起' : '展开'}
/> />
)}
</Flex> </Flex>
); );
}; };