import { useState } from 'react'; import { Title, Text, Stack, Group, Button, Table, Badge, Card, ActionIcon, Loader, Center, Select, SimpleGrid, Tooltip, } from '@mantine/core'; import { IconPlus, IconArrowLeft, IconTrash, IconEdit, } from '@tabler/icons-react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { useParams, useNavigate } from 'react-router-dom'; import { notifications } from '@mantine/notifications'; import api from '../../services/api'; import { AssessmentChangeForm } from './components/AssessmentChangeForm'; import { ProjectionChart } from './components/ProjectionChart'; const fmt = (v: number) => v.toLocaleString('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }); const statusColors: Record = { draft: 'gray', active: 'blue', approved: 'green', archived: 'red', }; const changeTypeLabels: Record = { dues_increase: 'Dues Increase', dues_decrease: 'Dues Decrease', special_assessment: 'Special Assessment', }; const changeTypeColors: Record = { dues_increase: 'green', dues_decrease: 'orange', special_assessment: 'violet', }; export function AssessmentScenarioDetailPage() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const queryClient = useQueryClient(); const [addOpen, setAddOpen] = useState(false); const [editAsmt, setEditAsmt] = useState(null); const { data: scenario, isLoading } = useQuery({ queryKey: ['board-planning-scenario', id], queryFn: async () => { const { data } = await api.get(`/board-planning/scenarios/${id}`); return data; }, }); const { data: projection, isLoading: projLoading } = useQuery({ queryKey: ['board-planning-projection', id], queryFn: async () => { const { data } = await api.get(`/board-planning/scenarios/${id}/projection`); return data; }, enabled: !!id, }); const addMutation = useMutation({ mutationFn: (dto: any) => api.post(`/board-planning/scenarios/${id}/assessments`, dto), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['board-planning-scenario', id] }); queryClient.invalidateQueries({ queryKey: ['board-planning-projection', id] }); setAddOpen(false); notifications.show({ message: 'Assessment change added', color: 'green' }); }, }); const updateMutation = useMutation({ mutationFn: ({ asmtId, ...dto }: any) => api.put(`/board-planning/assessments/${asmtId}`, dto), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['board-planning-scenario', id] }); queryClient.invalidateQueries({ queryKey: ['board-planning-projection', id] }); setEditAsmt(null); notifications.show({ message: 'Assessment change updated', color: 'green' }); }, }); const removeMutation = useMutation({ mutationFn: (asmtId: string) => api.delete(`/board-planning/assessments/${asmtId}`), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['board-planning-scenario', id] }); queryClient.invalidateQueries({ queryKey: ['board-planning-projection', id] }); notifications.show({ message: 'Assessment change removed', color: 'orange' }); }, }); const statusMutation = useMutation({ mutationFn: (status: string) => api.put(`/board-planning/scenarios/${id}`, { status }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['board-planning-scenario', id] }); queryClient.invalidateQueries({ queryKey: ['board-planning-scenarios'] }); }, }); if (isLoading) return
; if (!scenario) return
Scenario not found
; const assessments = scenario.assessments || []; return ( {/* Header */} navigate('/board-planning/assessments')}>
{scenario.name} {scenario.status} {scenario.description && {scenario.description}}