Files
property-match/src/pages/demand/Shortlists.tsx
T
Benjamin Sutter 65130efca7 feat: F015 shortlist management
3-panel Shortlists page with left list, center detail, right decision brief panel. AddToShortlistDialog wired into result feed cards and match detail. Full DRAFT→REVIEW_READY→FINALIZED workflow, AI-generated decision brief draft, duplicate prevention, and compare-view integration.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-16 21:10:06 +02:00

80 lines
2.4 KiB
TypeScript

import { Box, Paper, Typography } from '@mui/material'
import { useShortlists } from '../../hooks/useShortlists'
import { useShortlistStore } from '../../stores/shortlistStore'
import {
ShortlistList,
ShortlistDetail,
DecisionBriefDraftPanel,
AddToShortlistDialog,
} from '../../components/shortlist'
const PANEL_HEADER_SX = {
px: 2,
py: 1.5,
borderBottom: '1px solid #e2e8f0',
bgcolor: 'white',
position: 'sticky' as const,
top: 0,
zIndex: 1,
flexShrink: 0,
}
export default function Shortlists() {
const { data: shortlists = [], isLoading } = useShortlists()
const { selectedShortlistId } = useShortlistStore()
const selectedShortlist = shortlists.find(s => s.id === selectedShortlistId) ?? null
return (
<Box sx={{ display: 'flex', height: 'calc(100vh - 64px)', overflow: 'hidden' }}>
{/* Left: shortlist list */}
<Paper elevation={0} sx={{
width: 260,
flexShrink: 0,
display: 'flex',
flexDirection: 'column',
borderRadius: 0,
borderRight: '1px solid #e2e8f0',
overflow: 'hidden',
}}>
<Box sx={PANEL_HEADER_SX}>
<Typography variant="subtitle2" sx={{ fontWeight: 700 }}>Shortlists</Typography>
<Typography variant="caption" color="text.secondary">{shortlists.length} gespeichert</Typography>
</Box>
<ShortlistList shortlists={shortlists} isLoading={isLoading} />
</Paper>
{/* Center: detail */}
<Box sx={{ flex: 1, display: 'flex', flexDirection: 'column', overflow: 'hidden', bgcolor: '#f8fafc' }}>
{selectedShortlist ? (
<ShortlistDetail shortlist={selectedShortlist} />
) : (
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'center', flex: 1 }}>
<Typography variant="body2" color="text.secondary">
Shortlist aus der Liste wählen
</Typography>
</Box>
)}
</Box>
{/* Right: decision brief — only when a shortlist is selected */}
{selectedShortlist && (
<Paper elevation={0} sx={{
width: 280,
flexShrink: 0,
display: 'flex',
flexDirection: 'column',
borderRadius: 0,
borderLeft: '1px solid #e2e8f0',
overflow: 'hidden',
}}>
<DecisionBriefDraftPanel shortlistId={selectedShortlist.id} />
</Paper>
)}
<AddToShortlistDialog />
</Box>
)
}