import React, { useState, useEffect } from 'react'; import { Drawer, Form, Select, InputNumber, Button, Space, Typography, Card, Row, Col, Tooltip, message, Alert, SettingOutlined, InfoCircleOutlined, DollarOutlined, CalculatorOutlined, SaveOutlined, CloseOutlined, } from '@/shared/antd-imports'; import { useTranslation } from 'react-i18next'; import { useAppDispatch } from '@/hooks/useAppDispatch'; import { useAppSelector } from '@/hooks/useAppSelector'; import { updateProjectFinanceCurrency, fetchProjectFinancesSilent, } from '@/features/projects/finance/project-finance.slice'; import { updateProjectCurrency, getProject } from '@/features/project/project.slice'; import { projectFinanceApiService } from '@/api/project-finance-ratecard/project-finance.api.service'; import { CURRENCY_OPTIONS } from '@/shared/currencies'; const { Text } = Typography; interface ProjectBudgetSettingsDrawerProps { visible: boolean; onClose: () => void; projectId: string; } const ProjectBudgetSettingsDrawer: React.FC = ({ visible, onClose, projectId, }) => { const { t } = useTranslation('project-view-finance'); const dispatch = useAppDispatch(); const [form] = Form.useForm(); const [loading, setLoading] = useState(false); const [hasChanges, setHasChanges] = useState(false); // Get project data from Redux const financeProject = useAppSelector(state => state.projectFinancesReducer.project); const { project } = useAppSelector(state => state.projectReducer); const activeGroup = useAppSelector(state => state.projectFinancesReducer.activeGroup); const billableFilter = useAppSelector(state => state.projectFinancesReducer.billableFilter); // Form initial values const initialValues = { budget: project?.budget || 0, currency: financeProject?.currency || 'USD', }; // Set form values when drawer opens useEffect(() => { if (visible && (project || financeProject)) { form.setFieldsValue(initialValues); setHasChanges(false); } }, [visible, project, financeProject, form]); // Handle form value changes const handleValuesChange = () => { setHasChanges(true); }; // Handle save const handleSave = async () => { try { setLoading(true); const values = await form.validateFields(); // Update budget if changed if (values.budget !== project?.budget) { await projectFinanceApiService.updateProjectBudget(projectId, values.budget); } // Update currency if changed if (values.currency !== financeProject?.currency) { await projectFinanceApiService.updateProjectCurrency( projectId, values.currency.toUpperCase() ); dispatch(updateProjectCurrency(values.currency)); dispatch(updateProjectFinanceCurrency(values.currency)); } message.success('Project settings updated successfully'); setHasChanges(false); // Reload project finances after save dispatch( fetchProjectFinancesSilent({ projectId, groupBy: activeGroup, billableFilter, resetExpansions: true, }) ); // Also refresh the main project data to update budget statistics dispatch(getProject(projectId)); onClose(); } catch (error) { console.error('Failed to update project settings:', error); message.error('Failed to update project settings'); } finally { setLoading(false); } }; // Handle cancel const handleCancel = () => { if (hasChanges) { form.setFieldsValue(initialValues); setHasChanges(false); } onClose(); }; return ( Project Budget Settings } width={480} open={visible} onClose={handleCancel} footer={ } >
{/* Budget Configuration */} Budget Configuration } size="small" style={{ marginBottom: 16 }} > Project Budget } >