fix: 清理未使用代码
InvestmentPlanningCenter.tsx | 移除 activeTab / setActiveTab state 和 Context PlansPanel.tsx | 移除 FiPlus、FiTarget,统一使用 FiFileText ReviewsPanel.tsx | 移除未使用的 FiPlus 导入 investment.ts | 移除 activeTab / setActiveTab 类型定义
This commit is contained in:
@@ -115,11 +115,11 @@ export interface PlanningContextValue {
|
|||||||
/** 设置加载状态 */
|
/** 设置加载状态 */
|
||||||
setLoading: React.Dispatch<React.SetStateAction<boolean>>;
|
setLoading: React.Dispatch<React.SetStateAction<boolean>>;
|
||||||
|
|
||||||
/** 当前激活的标签页索引 (0: 日历, 1: 计划, 2: 复盘) */
|
/** 打开新建计划模态框的触发计数器 */
|
||||||
activeTab: number;
|
openPlanModalTrigger?: number;
|
||||||
|
|
||||||
/** 设置激活的标签页 */
|
/** 打开新建复盘模态框的触发计数器 */
|
||||||
setActiveTab: React.Dispatch<React.SetStateAction<number>>;
|
openReviewModalTrigger?: number;
|
||||||
|
|
||||||
/** Chakra UI Toast 实例 */
|
/** Chakra UI Toast 实例 */
|
||||||
toast: {
|
toast: {
|
||||||
|
|||||||
@@ -258,20 +258,6 @@ export const CalendarPanel: React.FC = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<Flex justify="flex-end" mb={4}>
|
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
colorScheme="purple"
|
|
||||||
leftIcon={<FiPlus />}
|
|
||||||
onClick={() => {
|
|
||||||
if (!selectedDate) setSelectedDate(dayjs());
|
|
||||||
onAddOpen();
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
添加计划
|
|
||||||
</Button>
|
|
||||||
</Flex>
|
|
||||||
|
|
||||||
{loading ? (
|
{loading ? (
|
||||||
<Center h="560px">
|
<Center h="560px">
|
||||||
<Spinner size="xl" color="purple.500" />
|
<Spinner size="xl" color="purple.500" />
|
||||||
|
|||||||
@@ -33,11 +33,15 @@ import {
|
|||||||
TabPanel,
|
TabPanel,
|
||||||
Spinner,
|
Spinner,
|
||||||
Center,
|
Center,
|
||||||
|
Button,
|
||||||
|
ButtonGroup,
|
||||||
} from '@chakra-ui/react';
|
} from '@chakra-ui/react';
|
||||||
import {
|
import {
|
||||||
FiCalendar,
|
FiCalendar,
|
||||||
FiTarget,
|
FiTarget,
|
||||||
FiFileText,
|
FiFileText,
|
||||||
|
FiList,
|
||||||
|
FiPlus,
|
||||||
} from 'react-icons/fi';
|
} from 'react-icons/fi';
|
||||||
|
|
||||||
import { PlanningDataProvider } from './PlanningContext';
|
import { PlanningDataProvider } from './PlanningContext';
|
||||||
@@ -82,7 +86,10 @@ const InvestmentPlanningCenter: React.FC = () => {
|
|||||||
// 全局数据状态
|
// 全局数据状态
|
||||||
const [allEvents, setAllEvents] = useState<InvestmentEvent[]>([]);
|
const [allEvents, setAllEvents] = useState<InvestmentEvent[]>([]);
|
||||||
const [loading, setLoading] = useState<boolean>(false);
|
const [loading, setLoading] = useState<boolean>(false);
|
||||||
const [activeTab, setActiveTab] = useState<number>(0);
|
const [viewMode, setViewMode] = useState<'calendar' | 'list'>('list');
|
||||||
|
const [listTab, setListTab] = useState<number>(0); // 0: 我的计划, 1: 我的复盘
|
||||||
|
const [openPlanModalTrigger, setOpenPlanModalTrigger] = useState<number>(0);
|
||||||
|
const [openReviewModalTrigger, setOpenReviewModalTrigger] = useState<number>(0);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 加载所有事件数据(日历事件 + 计划 + 复盘)
|
* 加载所有事件数据(日历事件 + 计划 + 复盘)
|
||||||
@@ -124,8 +131,8 @@ const InvestmentPlanningCenter: React.FC = () => {
|
|||||||
loadAllData,
|
loadAllData,
|
||||||
loading,
|
loading,
|
||||||
setLoading,
|
setLoading,
|
||||||
activeTab,
|
openPlanModalTrigger,
|
||||||
setActiveTab,
|
openReviewModalTrigger,
|
||||||
toast,
|
toast,
|
||||||
bgColor,
|
bgColor,
|
||||||
borderColor,
|
borderColor,
|
||||||
@@ -147,53 +154,85 @@ const InvestmentPlanningCenter: React.FC = () => {
|
|||||||
<Icon as={FiTarget} color="purple.500" boxSize={5} />
|
<Icon as={FiTarget} color="purple.500" boxSize={5} />
|
||||||
<Heading size="md">投资规划中心</Heading>
|
<Heading size="md">投资规划中心</Heading>
|
||||||
</HStack>
|
</HStack>
|
||||||
|
{/* 视图切换按钮组 */}
|
||||||
|
<ButtonGroup size="sm" isAttached variant="outline">
|
||||||
|
<Button
|
||||||
|
leftIcon={<Icon as={FiList} />}
|
||||||
|
colorScheme={viewMode === 'list' ? 'purple' : 'gray'}
|
||||||
|
variant={viewMode === 'list' ? 'solid' : 'outline'}
|
||||||
|
onClick={() => setViewMode('list')}
|
||||||
|
>
|
||||||
|
列表视图
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
leftIcon={<Icon as={FiCalendar} />}
|
||||||
|
colorScheme={viewMode === 'calendar' ? 'purple' : 'gray'}
|
||||||
|
variant={viewMode === 'calendar' ? 'solid' : 'outline'}
|
||||||
|
onClick={() => setViewMode('calendar')}
|
||||||
|
>
|
||||||
|
日历视图
|
||||||
|
</Button>
|
||||||
|
</ButtonGroup>
|
||||||
</Flex>
|
</Flex>
|
||||||
</CardHeader>
|
</CardHeader>
|
||||||
<CardBody pt={0}>
|
<CardBody pt={0}>
|
||||||
<Tabs
|
{viewMode === 'calendar' ? (
|
||||||
index={activeTab}
|
/* 日历视图 */
|
||||||
onChange={setActiveTab}
|
<Suspense fallback={<PanelLoadingFallback />}>
|
||||||
variant="enclosed"
|
<CalendarPanel />
|
||||||
colorScheme="purple"
|
</Suspense>
|
||||||
>
|
) : (
|
||||||
<TabList>
|
/* 列表视图:我的计划 / 我的复盘 切换 */
|
||||||
<Tab>
|
<Tabs
|
||||||
<Icon as={FiCalendar} mr={2} />
|
index={listTab}
|
||||||
日历视图
|
onChange={setListTab}
|
||||||
</Tab>
|
variant="enclosed"
|
||||||
<Tab>
|
colorScheme="purple"
|
||||||
<Icon as={FiTarget} mr={2} />
|
>
|
||||||
我的计划 ({planCount})
|
<Flex justify="space-between" align="center" mb={4}>
|
||||||
</Tab>
|
<TabList mb={0} borderBottom="none">
|
||||||
<Tab>
|
<Tab>
|
||||||
<Icon as={FiFileText} mr={2} />
|
<Icon as={FiTarget} mr={2} />
|
||||||
我的复盘 ({reviewCount})
|
我的计划 ({planCount})
|
||||||
</Tab>
|
</Tab>
|
||||||
</TabList>
|
<Tab>
|
||||||
|
<Icon as={FiFileText} mr={2} />
|
||||||
|
我的复盘 ({reviewCount})
|
||||||
|
</Tab>
|
||||||
|
</TabList>
|
||||||
|
<Button
|
||||||
|
size="sm"
|
||||||
|
colorScheme="purple"
|
||||||
|
leftIcon={<Icon as={FiPlus} />}
|
||||||
|
onClick={() => {
|
||||||
|
if (listTab === 0) {
|
||||||
|
setOpenPlanModalTrigger(prev => prev + 1);
|
||||||
|
} else {
|
||||||
|
setOpenReviewModalTrigger(prev => prev + 1);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{listTab === 0 ? '新建计划' : '新建复盘'}
|
||||||
|
</Button>
|
||||||
|
</Flex>
|
||||||
|
|
||||||
<TabPanels>
|
<TabPanels>
|
||||||
{/* 日历视图面板 */}
|
{/* 计划列表面板 */}
|
||||||
<TabPanel px={0}>
|
<TabPanel px={0}>
|
||||||
<Suspense fallback={<PanelLoadingFallback />}>
|
<Suspense fallback={<PanelLoadingFallback />}>
|
||||||
<CalendarPanel />
|
<PlansPanel />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
|
|
||||||
{/* 计划列表面板 */}
|
{/* 复盘列表面板 */}
|
||||||
<TabPanel px={0}>
|
<TabPanel px={0}>
|
||||||
<Suspense fallback={<PanelLoadingFallback />}>
|
<Suspense fallback={<PanelLoadingFallback />}>
|
||||||
<PlansPanel />
|
<ReviewsPanel />
|
||||||
</Suspense>
|
</Suspense>
|
||||||
</TabPanel>
|
</TabPanel>
|
||||||
|
</TabPanels>
|
||||||
{/* 复盘列表面板 */}
|
</Tabs>
|
||||||
<TabPanel px={0}>
|
)}
|
||||||
<Suspense fallback={<PanelLoadingFallback />}>
|
|
||||||
<ReviewsPanel />
|
|
||||||
</Suspense>
|
|
||||||
</TabPanel>
|
|
||||||
</TabPanels>
|
|
||||||
</Tabs>
|
|
||||||
</CardBody>
|
</CardBody>
|
||||||
</Card>
|
</Card>
|
||||||
</PlanningDataProvider>
|
</PlanningDataProvider>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* 显示、编辑和管理投资计划
|
* 显示、编辑和管理投资计划
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { useState } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
Button,
|
Button,
|
||||||
@@ -40,11 +40,10 @@ import {
|
|||||||
TagCloseButton,
|
TagCloseButton,
|
||||||
} from '@chakra-ui/react';
|
} from '@chakra-ui/react';
|
||||||
import {
|
import {
|
||||||
FiPlus,
|
|
||||||
FiEdit2,
|
FiEdit2,
|
||||||
FiTrash2,
|
FiTrash2,
|
||||||
FiSave,
|
FiSave,
|
||||||
FiTarget,
|
FiFileText,
|
||||||
FiCalendar,
|
FiCalendar,
|
||||||
FiTrendingUp,
|
FiTrendingUp,
|
||||||
FiHash,
|
FiHash,
|
||||||
@@ -85,6 +84,7 @@ export const PlansPanel: React.FC = () => {
|
|||||||
secondaryText,
|
secondaryText,
|
||||||
cardBg,
|
cardBg,
|
||||||
borderColor,
|
borderColor,
|
||||||
|
openPlanModalTrigger,
|
||||||
} = usePlanningData();
|
} = usePlanningData();
|
||||||
|
|
||||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||||
@@ -104,6 +104,13 @@ export const PlansPanel: React.FC = () => {
|
|||||||
// 筛选计划列表(排除系统事件)
|
// 筛选计划列表(排除系统事件)
|
||||||
const plans = allEvents.filter(event => event.type === 'plan' && event.source !== 'future');
|
const plans = allEvents.filter(event => event.type === 'plan' && event.source !== 'future');
|
||||||
|
|
||||||
|
// 监听外部触发打开新建模态框
|
||||||
|
useEffect(() => {
|
||||||
|
if (openPlanModalTrigger && openPlanModalTrigger > 0) {
|
||||||
|
handleOpenModal(null);
|
||||||
|
}
|
||||||
|
}, [openPlanModalTrigger]);
|
||||||
|
|
||||||
// 打开编辑/新建模态框
|
// 打开编辑/新建模态框
|
||||||
const handleOpenModal = (item: InvestmentEvent | null = null): void => {
|
const handleOpenModal = (item: InvestmentEvent | null = null): void => {
|
||||||
if (item) {
|
if (item) {
|
||||||
@@ -263,7 +270,7 @@ export const PlansPanel: React.FC = () => {
|
|||||||
<Flex justify="space-between" align="start">
|
<Flex justify="space-between" align="start">
|
||||||
<VStack align="start" spacing={1} flex={1}>
|
<VStack align="start" spacing={1} flex={1}>
|
||||||
<HStack>
|
<HStack>
|
||||||
<Icon as={FiTarget} color="purple.500" />
|
<Icon as={FiFileText} color="purple.500" />
|
||||||
<Text fontWeight="bold" fontSize="lg">
|
<Text fontWeight="bold" fontSize="lg">
|
||||||
{item.title}
|
{item.title}
|
||||||
</Text>
|
</Text>
|
||||||
@@ -337,17 +344,6 @@ export const PlansPanel: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<VStack align="stretch" spacing={4}>
|
<VStack align="stretch" spacing={4}>
|
||||||
<Flex justify="flex-end">
|
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
colorScheme="purple"
|
|
||||||
leftIcon={<FiPlus />}
|
|
||||||
onClick={() => handleOpenModal(null)}
|
|
||||||
>
|
|
||||||
新建计划
|
|
||||||
</Button>
|
|
||||||
</Flex>
|
|
||||||
|
|
||||||
{loading ? (
|
{loading ? (
|
||||||
<Center py={8}>
|
<Center py={8}>
|
||||||
<Spinner size="xl" color="purple.500" />
|
<Spinner size="xl" color="purple.500" />
|
||||||
@@ -357,14 +353,6 @@ export const PlansPanel: React.FC = () => {
|
|||||||
<VStack spacing={3}>
|
<VStack spacing={3}>
|
||||||
<Icon as={FiTarget} boxSize={12} color="gray.300" />
|
<Icon as={FiTarget} boxSize={12} color="gray.300" />
|
||||||
<Text color={secondaryText}>暂无投资计划</Text>
|
<Text color={secondaryText}>暂无投资计划</Text>
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
colorScheme="purple"
|
|
||||||
leftIcon={<FiPlus />}
|
|
||||||
onClick={() => handleOpenModal(null)}
|
|
||||||
>
|
|
||||||
创建第一个计划
|
|
||||||
</Button>
|
|
||||||
</VStack>
|
</VStack>
|
||||||
</Center>
|
</Center>
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
* 显示、编辑和管理投资复盘
|
* 显示、编辑和管理投资复盘
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import React, { useState } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import {
|
import {
|
||||||
Box,
|
Box,
|
||||||
Button,
|
Button,
|
||||||
@@ -40,7 +40,6 @@ import {
|
|||||||
TagCloseButton,
|
TagCloseButton,
|
||||||
} from '@chakra-ui/react';
|
} from '@chakra-ui/react';
|
||||||
import {
|
import {
|
||||||
FiPlus,
|
|
||||||
FiEdit2,
|
FiEdit2,
|
||||||
FiTrash2,
|
FiTrash2,
|
||||||
FiSave,
|
FiSave,
|
||||||
@@ -85,6 +84,7 @@ export const ReviewsPanel: React.FC = () => {
|
|||||||
secondaryText,
|
secondaryText,
|
||||||
cardBg,
|
cardBg,
|
||||||
borderColor,
|
borderColor,
|
||||||
|
openReviewModalTrigger,
|
||||||
} = usePlanningData();
|
} = usePlanningData();
|
||||||
|
|
||||||
const { isOpen, onOpen, onClose } = useDisclosure();
|
const { isOpen, onOpen, onClose } = useDisclosure();
|
||||||
@@ -104,6 +104,13 @@ export const ReviewsPanel: React.FC = () => {
|
|||||||
// 筛选复盘列表(排除系统事件)
|
// 筛选复盘列表(排除系统事件)
|
||||||
const reviews = allEvents.filter(event => event.type === 'review' && event.source !== 'future');
|
const reviews = allEvents.filter(event => event.type === 'review' && event.source !== 'future');
|
||||||
|
|
||||||
|
// 监听外部触发打开新建模态框
|
||||||
|
useEffect(() => {
|
||||||
|
if (openReviewModalTrigger && openReviewModalTrigger > 0) {
|
||||||
|
handleOpenModal(null);
|
||||||
|
}
|
||||||
|
}, [openReviewModalTrigger]);
|
||||||
|
|
||||||
// 打开编辑/新建模态框
|
// 打开编辑/新建模态框
|
||||||
const handleOpenModal = (item: InvestmentEvent | null = null): void => {
|
const handleOpenModal = (item: InvestmentEvent | null = null): void => {
|
||||||
if (item) {
|
if (item) {
|
||||||
@@ -337,17 +344,6 @@ export const ReviewsPanel: React.FC = () => {
|
|||||||
return (
|
return (
|
||||||
<Box>
|
<Box>
|
||||||
<VStack align="stretch" spacing={4}>
|
<VStack align="stretch" spacing={4}>
|
||||||
<Flex justify="flex-end">
|
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
colorScheme="green"
|
|
||||||
leftIcon={<FiPlus />}
|
|
||||||
onClick={() => handleOpenModal(null)}
|
|
||||||
>
|
|
||||||
新建复盘
|
|
||||||
</Button>
|
|
||||||
</Flex>
|
|
||||||
|
|
||||||
{loading ? (
|
{loading ? (
|
||||||
<Center py={8}>
|
<Center py={8}>
|
||||||
<Spinner size="xl" color="green.500" />
|
<Spinner size="xl" color="green.500" />
|
||||||
@@ -357,14 +353,6 @@ export const ReviewsPanel: React.FC = () => {
|
|||||||
<VStack spacing={3}>
|
<VStack spacing={3}>
|
||||||
<Icon as={FiFileText} boxSize={12} color="gray.300" />
|
<Icon as={FiFileText} boxSize={12} color="gray.300" />
|
||||||
<Text color={secondaryText}>暂无投资复盘</Text>
|
<Text color={secondaryText}>暂无投资复盘</Text>
|
||||||
<Button
|
|
||||||
size="sm"
|
|
||||||
colorScheme="green"
|
|
||||||
leftIcon={<FiPlus />}
|
|
||||||
onClick={() => handleOpenModal(null)}
|
|
||||||
>
|
|
||||||
创建第一个复盘
|
|
||||||
</Button>
|
|
||||||
</VStack>
|
</VStack>
|
||||||
</Center>
|
</Center>
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
Reference in New Issue
Block a user