fix: resolve all MUI v9 TypeScript build errors

- Move system props (fontWeight, lineHeight, display, alignItems, etc.) into sx
- Fix Lucide icon color prop (no sx support)
- Merge duplicate sx attributes
- Remove unused variables (location, _needId, v)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Benjamin Sutter
2026-05-15 10:37:07 +02:00
parent 67e4baf860
commit e20e0e9a2e
12 changed files with 164 additions and 183 deletions
+22 -28
View File
@@ -53,7 +53,7 @@ export default function AISearch() {
<Box> <Box>
{/* Page Header */} {/* Page Header */}
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2 }}> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2 }}>
<Typography variant="h5" fontWeight={700} color="text.primary"> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">
AI Bedarfsanalyse AI Bedarfsanalyse
</Typography> </Typography>
<Typography variant="body2" color="text.secondary"> <Typography variant="body2" color="text.secondary">
@@ -66,7 +66,7 @@ export default function AISearch() {
{step === 'input' && ( {step === 'input' && (
<Box> <Box>
<Card sx={{ maxWidth: 680, mx: 'auto', p: 3 }}> <Card sx={{ maxWidth: 680, mx: 'auto', p: 3 }}>
<Typography variant="subtitle1" fontWeight={600} mb={2}> <Typography variant="subtitle1" sx={{ fontWeight: 600, mb: 2 }}>
Flächenbedarf beschreiben Flächenbedarf beschreiben
</Typography> </Typography>
<TextField <TextField
@@ -76,10 +76,10 @@ export default function AISearch() {
placeholder="Beispiel: Wir suchen 8001.000 m² Bürofläche in Zürich-West, verfügbar ab September 2025, Budget max. 45 CHF/m². Wichtig: gute ÖV-Anbindung, moderne Infrastruktur." placeholder="Beispiel: Wir suchen 8001.000 m² Bürofläche in Zürich-West, verfügbar ab September 2025, Budget max. 45 CHF/m². Wichtig: gute ÖV-Anbindung, moderne Infrastruktur."
value={inputText} value={inputText}
onChange={e => setInputText(e.target.value)} onChange={e => setInputText(e.target.value)}
inputProps={{ maxLength: 2000 }} slotProps={{ htmlInput: { maxLength: 2000 } }}
sx={{ mb: 1 }} sx={{ mb: 1 }}
/> />
<Typography variant="caption" color="text.secondary" display="block" textAlign="right" mb={2}> <Typography variant="caption" color="text.secondary" sx={{ display: 'block', textAlign: 'right', mb: 2 }}>
{inputText.length}/2000 {inputText.length}/2000
</Typography> </Typography>
<Button <Button
@@ -92,17 +92,17 @@ export default function AISearch() {
> >
Analysieren Analysieren
</Button> </Button>
<Typography variant="caption" color="text.secondary" display="block" textAlign="center"> <Typography variant="caption" color="text.secondary" sx={{ display: 'block', textAlign: 'center' }}>
Die KI extrahiert automatisch Kriterien, Standortpräferenzen und Budget aus Ihrer Beschreibung. Die KI extrahiert automatisch Kriterien, Standortpräferenzen und Budget aus Ihrer Beschreibung.
</Typography> </Typography>
</Card> </Card>
{/* Example Queries */} {/* Example Queries */}
<Box sx={{ maxWidth: 680, mx: 'auto', mt: 2 }}> <Box sx={{ maxWidth: 680, mx: 'auto', mt: 2 }}>
<Typography variant="caption" color="text.secondary" display="block" mb={1}> <Typography variant="caption" color="text.secondary" sx={{ display: 'block', mb: 1 }}>
Beispiele: Beispiele:
</Typography> </Typography>
<Stack direction="row" spacing={1} flexWrap="wrap" gap={1}> <Stack direction="row" spacing={1} sx={{ flexWrap: 'wrap', gap: 1 }}>
{EXAMPLE_QUERIES.map(q => ( {EXAMPLE_QUERIES.map(q => (
<Chip <Chip
key={q} key={q}
@@ -135,7 +135,7 @@ export default function AISearch() {
<Box className="grid grid-cols-2 gap-4" sx={{ mb: 3 }}> <Box className="grid grid-cols-2 gap-4" sx={{ mb: 3 }}>
{/* Left: Extracted Criteria */} {/* Left: Extracted Criteria */}
<Card sx={{ p: 3 }}> <Card sx={{ p: 3 }}>
<Typography variant="subtitle1" fontWeight={600} mb={2}> <Typography variant="subtitle1" sx={{ fontWeight: 600, mb: 2 }}>
Extrahierte Kriterien Extrahierte Kriterien
</Typography> </Typography>
@@ -161,8 +161,7 @@ export default function AISearch() {
<Box> <Box>
<Typography <Typography
variant="caption" variant="caption"
fontWeight={600} sx={{ fontWeight: 600, color: ConfidenceColor(extractedCriteria.confidence) }}
sx={{ color: ConfidenceColor(extractedCriteria.confidence) }}
> >
Flächenbedarf Flächenbedarf
</Typography> </Typography>
@@ -177,8 +176,7 @@ export default function AISearch() {
<Box> <Box>
<Typography <Typography
variant="caption" variant="caption"
fontWeight={600} sx={{ fontWeight: 600, color: ConfidenceColor(extractedCriteria.confidence) }}
sx={{ color: ConfidenceColor(extractedCriteria.confidence) }}
> >
Budget Budget
</Typography> </Typography>
@@ -193,8 +191,7 @@ export default function AISearch() {
<Box> <Box>
<Typography <Typography
variant="caption" variant="caption"
fontWeight={600} sx={{ fontWeight: 600, color: ConfidenceColor(0.5) }}
sx={{ color: ConfidenceColor(0.5) }}
> >
Unternehmen Unternehmen
</Typography> </Typography>
@@ -208,8 +205,7 @@ export default function AISearch() {
<Box> <Box>
<Typography <Typography
variant="caption" variant="caption"
fontWeight={600} sx={{ fontWeight: 600, color: ConfidenceColor(0.85) }}
sx={{ color: ConfidenceColor(0.85) }}
> >
Standort Standort
</Typography> </Typography>
@@ -223,8 +219,7 @@ export default function AISearch() {
<Box> <Box>
<Typography <Typography
variant="caption" variant="caption"
fontWeight={600} sx={{ fontWeight: 600, color: ConfidenceColor(0.85) }}
sx={{ color: ConfidenceColor(0.85) }}
> >
Verfügbarkeit Verfügbarkeit
</Typography> </Typography>
@@ -238,8 +233,7 @@ export default function AISearch() {
<Box> <Box>
<Typography <Typography
variant="caption" variant="caption"
fontWeight={600} sx={{ fontWeight: 600, color: ConfidenceColor(0.85) }}
sx={{ color: ConfidenceColor(0.85) }}
> >
Objekttyp Objekttyp
</Typography> </Typography>
@@ -252,8 +246,8 @@ export default function AISearch() {
{/* Assumptions */} {/* Assumptions */}
{extractedCriteria.assumptions.length > 0 && ( {extractedCriteria.assumptions.length > 0 && (
<Box mt={3}> <Box sx={{ mt: 3 }}>
<Typography variant="caption" fontWeight={600} color="text.secondary" display="block" mb={1}> <Typography variant="caption" sx={{ fontWeight: 600, display: 'block', mb: 1 }} color="text.secondary">
Annahmen der KI Annahmen der KI
</Typography> </Typography>
<Stack spacing={0.5}> <Stack spacing={0.5}>
@@ -268,11 +262,11 @@ export default function AISearch() {
{/* Missing Fields */} {/* Missing Fields */}
{extractedCriteria.missingFields.length > 0 && ( {extractedCriteria.missingFields.length > 0 && (
<Box mt={2}> <Box sx={{ mt: 2 }}>
<Typography variant="caption" fontWeight={600} color="text.secondary" display="block" mb={1}> <Typography variant="caption" sx={{ fontWeight: 600, display: 'block', mb: 1 }} color="text.secondary">
Fehlende Informationen Fehlende Informationen
</Typography> </Typography>
<Stack direction="row" spacing={0.5} flexWrap="wrap" gap={0.5}> <Stack direction="row" spacing={0.5} sx={{ flexWrap: 'wrap', gap: 0.5 }}>
{extractedCriteria.missingFields.map(f => ( {extractedCriteria.missingFields.map(f => (
<Chip <Chip
key={f} key={f}
@@ -289,17 +283,17 @@ export default function AISearch() {
{/* Right: Follow-up Questions */} {/* Right: Follow-up Questions */}
<Card sx={{ p: 3 }}> <Card sx={{ p: 3 }}>
<Typography variant="subtitle1" fontWeight={600} mb={0.5}> <Typography variant="subtitle1" sx={{ fontWeight: 600, mb: 0.5 }}>
Rückfragen der KI Rückfragen der KI
</Typography> </Typography>
<Typography variant="caption" color="text.secondary" display="block" mb={2}> <Typography variant="caption" color="text.secondary" sx={{ display: 'block', mb: 2 }}>
Diese Fragen sind optional verbessern jedoch die Trefferqualität. Diese Fragen sind optional verbessern jedoch die Trefferqualität.
</Typography> </Typography>
<Stack spacing={3}> <Stack spacing={3}>
{extractedCriteria.followUpQuestions.map((q, i) => ( {extractedCriteria.followUpQuestions.map((q, i) => (
<Box key={i}> <Box key={i}>
<Typography variant="body2" fontWeight={500} mb={1}> <Typography variant="body2" sx={{ fontWeight: 500, mb: 1 }}>
{i + 1}. {q} {i + 1}. {q}
</Typography> </Typography>
<TextField <TextField
+9 -11
View File
@@ -107,7 +107,7 @@ export default function Compare() {
return ( return (
<Box> <Box>
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2 }}> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2 }}>
<Typography variant="h5" fontWeight={700}>Vergleich</Typography> <Typography variant="h5" sx={{ fontWeight: 700 }}>Vergleich</Typography>
</Box> </Box>
<Box sx={{ px: 3, py: 3 }}> <Box sx={{ px: 3, py: 3 }}>
<EmptyState <EmptyState
@@ -149,14 +149,13 @@ export default function Compare() {
{ {
label: 'Datenqualität', label: 'Datenqualität',
getValue: p => p.dataQuality.score, getValue: p => p.dataQuality.score,
format: (v, p) => ( format: (_v, p) => (
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}> <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
<Box sx={{ width: 80 }}> <Box sx={{ width: 80 }}>
<LinearProgress <LinearProgress
variant="determinate" variant="determinate"
value={p.dataQuality.score * 100} value={p.dataQuality.score * 100}
sx={{ height: 6, borderRadius: 3 }} sx={{ height: 6, borderRadius: 3, color: p.dataQuality.score >= 0.8 ? 'success' : p.dataQuality.score >= 0.6 ? 'warning' : 'error' }}
color={p.dataQuality.score >= 0.8 ? 'success' : p.dataQuality.score >= 0.6 ? 'warning' : 'error'}
/> />
</Box> </Box>
<Typography variant="caption">{Math.round(p.dataQuality.score * 100)}%</Typography> <Typography variant="caption">{Math.round(p.dataQuality.score * 100)}%</Typography>
@@ -173,9 +172,8 @@ export default function Compare() {
{ {
label: 'Risiko', label: 'Risiko',
getValue: p => p.riskLevel ?? null, getValue: p => p.riskLevel ?? null,
format: (v, p) => ( format: (_v, p) => (
<Chip <Chip label={getRiskLabel(p.riskLevel)}
label={getRiskLabel(p.riskLevel)}
size="small" size="small"
color={getRiskColor(p.riskLevel)} color={getRiskColor(p.riskLevel)}
variant="outlined" variant="outlined"
@@ -213,7 +211,7 @@ export default function Compare() {
{/* Page Header */} {/* Page Header */}
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}> <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>
<Typography variant="h5" fontWeight={700}>Vergleich</Typography> <Typography variant="h5" sx={{ fontWeight: 700 }}>Vergleich</Typography>
<Chip label={`${orderedProperties.length} Objekte`} size="small" /> <Chip label={`${orderedProperties.length} Objekte`} size="small" />
</Box> </Box>
<Button variant="outlined" size="small" color="error" onClick={clearCompare}> <Button variant="outlined" size="small" color="error" onClick={clearCompare}>
@@ -233,7 +231,7 @@ export default function Compare() {
<TableCell key={p.id} sx={{ borderLeft: '1px solid #f1f5f9', minWidth: 220 }}> <TableCell key={p.id} sx={{ borderLeft: '1px solid #f1f5f9', minWidth: 220 }}>
<Box sx={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 1 }}> <Box sx={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', gap: 1 }}>
<Box> <Box>
<Typography variant="body2" fontWeight={600}>{p.title}</Typography> <Typography variant="body2" sx={{ fontWeight: 600 }}>{p.title}</Typography>
<Chip <Chip
label={getResultTypeLabel(p.resultType)} label={getResultTypeLabel(p.resultType)}
size="small" size="small"
@@ -302,9 +300,9 @@ export default function Compare() {
{/* Add more prompt */} {/* Add more prompt */}
{orderedProperties.length < 3 && ( {orderedProperties.length < 3 && (
<Card sx={{ p: 2.5, mt: 2, border: '2px dashed #e2e8f0', boxShadow: 'none' }}> <Card sx={{ p: 2.5, mt: 2, border: '2px dashed #e2e8f0', boxShadow: 'none' }}>
<Stack direction="row" alignItems="center" justifyContent="space-between"> <Stack direction="row" sx={{ alignItems: 'center', justifyContent: 'space-between' }}>
<Box> <Box>
<Typography variant="subtitle2" fontWeight={600}>Weiteres Objekt hinzufügen</Typography> <Typography variant="subtitle2" sx={{ fontWeight: 600 }}>Weiteres Objekt hinzufügen</Typography>
<Typography variant="caption" color="text.secondary"> <Typography variant="caption" color="text.secondary">
Bis zu {3 - orderedProperties.length} weitere{orderedProperties.length < 2 ? 's' : ''} Objekt{orderedProperties.length < 2 ? '' : 'e'} möglich Bis zu {3 - orderedProperties.length} weitere{orderedProperties.length < 2 ? 's' : ''} Objekt{orderedProperties.length < 2 ? '' : 'e'} möglich
</Typography> </Typography>
+17 -22
View File
@@ -20,7 +20,7 @@ import {
Columns2, Columns2,
} from 'lucide-react' } from 'lucide-react'
import { useQuery } from '@tanstack/react-query' import { useQuery } from '@tanstack/react-query'
import { useNavigate, useLocation } from 'react-router' import { useNavigate } from 'react-router'
import { propertyService } from '../../services/propertyService' import { propertyService } from '../../services/propertyService'
import { matchService } from '../../services/matchService' import { matchService } from '../../services/matchService'
import { needService } from '../../services/needService' import { needService } from '../../services/needService'
@@ -104,12 +104,12 @@ function ResultCard({ property, match, onCompare, isInCompare }: ResultCardProps
fontSize: 11, fontSize: 11,
}} }}
/> />
<Typography variant="h6" fontWeight={600}> <Typography variant="h6" sx={{ fontWeight: 600 }}>
{property.title} {property.title}
</Typography> </Typography>
</Box> </Box>
<Box sx={{ display: 'flex', alignItems: 'baseline', gap: 0.5 }}> <Box sx={{ display: 'flex', alignItems: 'baseline', gap: 0.5 }}>
<Typography variant="h4" fontWeight={800} sx={{ color: scoreColor }}> <Typography variant="h4" sx={{ fontWeight: 800, color: scoreColor }}>
{match.matchScore} {match.matchScore}
</Typography> </Typography>
<Typography variant="body2" color="text.secondary">/100</Typography> <Typography variant="body2" color="text.secondary">/100</Typography>
@@ -117,7 +117,7 @@ function ResultCard({ property, match, onCompare, isInCompare }: ResultCardProps
</Box> </Box>
{/* Property details row */} {/* Property details row */}
<Stack direction="row" spacing={2.5} sx={{ mb: 1.5 }} flexWrap="wrap"> <Stack direction="row" spacing={2.5} sx={{ mb: 1.5, flexWrap: 'wrap' }}>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}> <Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>
<MapPin size={14} color="#64748b" /> <MapPin size={14} color="#64748b" />
<Typography variant="body2" color="text.secondary"> <Typography variant="body2" color="text.secondary">
@@ -150,10 +150,10 @@ function ResultCard({ property, match, onCompare, isInCompare }: ResultCardProps
{match.positiveFactors.length > 0 && ( {match.positiveFactors.length > 0 && (
<Box sx={{ mb: 1 }}> <Box sx={{ mb: 1 }}>
<Typography variant="caption" fontWeight={600} color="text.secondary" display="block" mb={0.5}> <Typography variant="caption" sx={{ fontWeight: 600, display: 'block', mb: 0.5 }} color="text.secondary">
Positive Faktoren Positive Faktoren
</Typography> </Typography>
<Stack direction="row" spacing={0.5} flexWrap="wrap" gap={0.5}> <Stack direction="row" spacing={0.5} sx={{ flexWrap: 'wrap', gap: 0.5 }}>
{match.positiveFactors.slice(0, 3).map((f, i) => ( {match.positiveFactors.slice(0, 3).map((f, i) => (
<Chip <Chip
key={i} key={i}
@@ -168,9 +168,9 @@ function ResultCard({ property, match, onCompare, isInCompare }: ResultCardProps
{match.tradeoffs.length > 0 && ( {match.tradeoffs.length > 0 && (
<Alert severity="warning" sx={{ py: 0.5, px: 1.5, mb: 1, '& .MuiAlert-message': { fontSize: 12 } }}> <Alert severity="warning" sx={{ py: 0.5, px: 1.5, mb: 1, '& .MuiAlert-message': { fontSize: 12 } }}>
<Typography variant="caption" fontWeight={600} display="block" mb={0.5}>Abwägungen</Typography> <Typography variant="caption" sx={{ fontWeight: 600, display: 'block', mb: 0.5 }}>Abwägungen</Typography>
{match.tradeoffs.slice(0, 2).map((t, i) => ( {match.tradeoffs.slice(0, 2).map((t, i) => (
<Typography key={i} variant="caption" display="block"> <Typography key={i} variant="caption" sx={{ display: 'block' }}>
{t.criterion}: {t.concern} {t.criterion}: {t.concern}
</Typography> </Typography>
))} ))}
@@ -178,7 +178,7 @@ function ResultCard({ property, match, onCompare, isInCompare }: ResultCardProps
)} )}
{/* Confidence + Quality row */} {/* Confidence + Quality row */}
<Stack direction="row" spacing={2.5} alignItems="center" sx={{ mb: 1.5 }} flexWrap="wrap"> <Stack direction="row" spacing={2.5} sx={{ alignItems: 'center', mb: 1.5, flexWrap: 'wrap' }}>
<Typography variant="caption"> <Typography variant="caption">
<span style={{ color: '#64748b' }}>Konfidenz </span> <span style={{ color: '#64748b' }}>Konfidenz </span>
<strong style={{ color: match.confidenceLevel >= 0.8 ? '#1a7a4a' : match.confidenceLevel >= 0.6 ? '#d97706' : '#c0392b' }}> <strong style={{ color: match.confidenceLevel >= 0.8 ? '#1a7a4a' : match.confidenceLevel >= 0.6 ? '#d97706' : '#c0392b' }}>
@@ -191,11 +191,9 @@ function ResultCard({ property, match, onCompare, isInCompare }: ResultCardProps
<LinearProgress <LinearProgress
variant="determinate" variant="determinate"
value={property.dataQuality.score * 100} value={property.dataQuality.score * 100}
sx={{ height: 6, borderRadius: 3 }} sx={{ height: 6, borderRadius: 3, color:
color={
property.dataQuality.score >= 0.8 ? 'success' : property.dataQuality.score >= 0.8 ? 'success' :
property.dataQuality.score >= 0.6 ? 'warning' : 'error' property.dataQuality.score >= 0.6 ? 'warning' : 'error' }}
}
/> />
</Box> </Box>
<Typography variant="caption" color="text.secondary"> <Typography variant="caption" color="text.secondary">
@@ -203,8 +201,7 @@ function ResultCard({ property, match, onCompare, isInCompare }: ResultCardProps
</Typography> </Typography>
</Box> </Box>
{property.riskLevel && ( {property.riskLevel && (
<Chip <Chip label={getRiskLabel(property.riskLevel)}
label={getRiskLabel(property.riskLevel)}
size="small" size="small"
color={getRiskChipColor(property.riskLevel)} color={getRiskChipColor(property.riskLevel)}
variant="outlined" variant="outlined"
@@ -246,8 +243,6 @@ function ResultCard({ property, match, onCompare, isInCompare }: ResultCardProps
export default function Results() { export default function Results() {
const navigate = useNavigate() const navigate = useNavigate()
const location = useLocation()
const _needId = (location.state as { needId?: string } | null)?.needId ?? 'need-001'
const [filterSource, setFilterSource] = useState<FilterSource>('ALL') const [filterSource, setFilterSource] = useState<FilterSource>('ALL')
const [sortBy, setSortBy] = useState<SortBy>('score') const [sortBy, setSortBy] = useState<SortBy>('score')
@@ -320,7 +315,7 @@ export default function Results() {
{/* Page Header */} {/* Page Header */}
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2, display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<Box> <Box>
<Typography variant="h5" fontWeight={700} color="text.primary"> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">
{sorted.length} Treffer gefunden {sorted.length} Treffer gefunden
</Typography> </Typography>
<Typography variant="body2" color="text.secondary"> <Typography variant="body2" color="text.secondary">
@@ -335,7 +330,7 @@ export default function Results() {
<Card sx={{ bgcolor: '#eff6ff', p: 2, mb: 2, border: '1px solid #bfdbfe' }}> <Card sx={{ bgcolor: '#eff6ff', p: 2, mb: 2, border: '1px solid #bfdbfe' }}>
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}> <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<Box> <Box>
<Typography variant="subtitle2" fontWeight={600} color="#1e3a5f"> <Typography variant="subtitle2" sx={{ fontWeight: 600 }} color="#1e3a5f">
Aktive Suche: {activeNeed.companyName} Aktive Suche: {activeNeed.companyName}
</Typography> </Typography>
<Typography variant="caption" color="text.secondary"> <Typography variant="caption" color="text.secondary">
@@ -358,7 +353,7 @@ export default function Results() {
{/* Filter/Sort bar */} {/* Filter/Sort bar */}
<Card sx={{ p: 1.5, mb: 2 }}> <Card sx={{ p: 1.5, mb: 2 }}>
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 1 }}> <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 1 }}>
<Stack direction="row" spacing={0.5} flexWrap="wrap" gap={0.5}> <Stack direction="row" spacing={0.5} sx={{ flexWrap: 'wrap', gap: 0.5 }}>
{(['ALL', ResultType.VERIFIED_PORTFOLIO, ResultType.EXTERNAL_MARKET, ResultType.FUTURE_AVAILABILITY] as FilterSource[]).map(source => { {(['ALL', ResultType.VERIFIED_PORTFOLIO, ResultType.EXTERNAL_MARKET, ResultType.FUTURE_AVAILABILITY] as FilterSource[]).map(source => {
const labels: Record<FilterSource, string> = { const labels: Record<FilterSource, string> = {
ALL: 'Alle', ALL: 'Alle',
@@ -390,7 +385,7 @@ export default function Results() {
})} })}
</Stack> </Stack>
<Stack direction="row" spacing={0.5} alignItems="center"> <Stack direction="row" spacing={0.5} sx={{ alignItems: 'center' }}>
<Typography variant="caption" color="text.secondary">Sortierung:</Typography> <Typography variant="caption" color="text.secondary">Sortierung:</Typography>
{([['score', 'Relevanz'], ['area', 'Fläche'], ['rent', 'Mietpreis']] as [SortBy, string][]).map(([val, label]) => ( {([['score', 'Relevanz'], ['area', 'Fläche'], ['rent', 'Mietpreis']] as [SortBy, string][]).map(([val, label]) => (
<Chip <Chip
@@ -448,7 +443,7 @@ export default function Results() {
boxShadow: '0 -4px 12px rgba(0,0,0,0.15)', boxShadow: '0 -4px 12px rgba(0,0,0,0.15)',
}} }}
> >
<Typography variant="body2" fontWeight={600}> <Typography variant="body2" sx={{ fontWeight: 600 }}>
{compareTray.length} Objekte zum Vergleich ausgewählt {compareTray.length} Objekte zum Vergleich ausgewählt
</Typography> </Typography>
<Stack direction="row" spacing={1}> <Stack direction="row" spacing={1}>
+4 -5
View File
@@ -62,7 +62,7 @@ export default function Shortlists() {
}} }}
> >
<Box> <Box>
<Typography variant="h5" fontWeight={700} color="text.primary"> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">
Shortlists Shortlists
</Typography> </Typography>
<Typography variant="body2" color="text.secondary"> <Typography variant="body2" color="text.secondary">
@@ -94,7 +94,7 @@ export default function Shortlists() {
}} }}
> >
<Box> <Box>
<Typography variant="subtitle1" fontWeight={700}> <Typography variant="subtitle1" sx={{ fontWeight: 700 }}>
{sl.title} {sl.title}
</Typography> </Typography>
<Typography variant="body2" color="text.secondary"> <Typography variant="body2" color="text.secondary">
@@ -135,8 +135,7 @@ export default function Shortlists() {
}} }}
/> />
<ListItemText <ListItemText
primary={prop} primary={<Typography variant="body2">{prop}</Typography>}
primaryTypographyProps={{ variant: 'body2' }}
/> />
</ListItem> </ListItem>
))} ))}
@@ -163,7 +162,7 @@ export default function Shortlists() {
bgcolor: '#fafafa', bgcolor: '#fafafa',
}} }}
> >
<Typography variant="body2" color="text.secondary" textAlign="center"> <Typography variant="body2" color="text.secondary" sx={{ textAlign: 'center' }}>
Objekte aus den Suchergebnissen zur Shortlist hinzufügen Objekte aus den Suchergebnissen zur Shortlist hinzufügen
</Typography> </Typography>
</Card> </Card>
+10 -10
View File
@@ -124,7 +124,7 @@ export default function AIMonitoring() {
> >
<Box sx={{ flex: 1 }}> <Box sx={{ flex: 1 }}>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}> <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>
<Typography variant="h5" fontWeight={700} color="text.primary"> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">
AI Monitoring AI Monitoring
</Typography> </Typography>
<Chip <Chip
@@ -154,10 +154,10 @@ export default function AIMonitoring() {
<Box className="grid grid-cols-4 gap-4" sx={{ mb: 3 }}> <Box className="grid grid-cols-4 gap-4" sx={{ mb: 3 }}>
{HEALTH_METRICS.map(m => ( {HEALTH_METRICS.map(m => (
<Card key={m.label} sx={{ p: 2.5 }}> <Card key={m.label} sx={{ p: 2.5 }}>
<Typography variant="overline" color="text.secondary" lineHeight={1.4} display="block"> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4, display: 'block' }}>
{m.label} {m.label}
</Typography> </Typography>
<Typography variant="h3" fontWeight={800} sx={{ color: m.color }}> <Typography variant="h3" sx={{ fontWeight: 800, color: m.color }}>
{m.value} {m.value}
</Typography> </Typography>
<Typography variant="caption" color="text.secondary"> <Typography variant="caption" color="text.secondary">
@@ -170,7 +170,7 @@ export default function AIMonitoring() {
<Box className="grid grid-cols-2 gap-4" sx={{ mb: 3 }}> <Box className="grid grid-cols-2 gap-4" sx={{ mb: 3 }}>
{/* Confidence Distribution */} {/* Confidence Distribution */}
<Card sx={{ p: 2.5 }}> <Card sx={{ p: 2.5 }}>
<Typography variant="subtitle1" fontWeight={600} mb={2}> <Typography variant="subtitle1" sx={{ fontWeight: 600, mb: 2 }}>
Konfidenzverteilung Konfidenzverteilung
</Typography> </Typography>
@@ -182,7 +182,7 @@ export default function AIMonitoring() {
<Stack spacing={2}> <Stack spacing={2}>
<Box> <Box>
<Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}> <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}>
<Typography variant="body2" fontWeight={500}>Hoch (&gt;85%)</Typography> <Typography variant="body2" sx={{ fontWeight: 500 }}>Hoch (&gt;85%)</Typography>
<Typography variant="body2" color="text.secondary">{highConf} Objekte</Typography> <Typography variant="body2" color="text.secondary">{highConf} Objekte</Typography>
</Box> </Box>
<LinearProgress <LinearProgress
@@ -194,7 +194,7 @@ export default function AIMonitoring() {
</Box> </Box>
<Box> <Box>
<Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}> <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}>
<Typography variant="body2" fontWeight={500}>Mittel (6585%)</Typography> <Typography variant="body2" sx={{ fontWeight: 500 }}>Mittel (6585%)</Typography>
<Typography variant="body2" color="text.secondary">{midConf} Objekte</Typography> <Typography variant="body2" color="text.secondary">{midConf} Objekte</Typography>
</Box> </Box>
<LinearProgress <LinearProgress
@@ -206,7 +206,7 @@ export default function AIMonitoring() {
</Box> </Box>
<Box> <Box>
<Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}> <Box sx={{ display: 'flex', justifyContent: 'space-between', mb: 0.5 }}>
<Typography variant="body2" fontWeight={500}>Niedrig (&lt;65%)</Typography> <Typography variant="body2" sx={{ fontWeight: 500 }}>Niedrig (&lt;65%)</Typography>
<Typography variant="body2" color="text.secondary">{lowConf} Objekte</Typography> <Typography variant="body2" color="text.secondary">{lowConf} Objekte</Typography>
</Box> </Box>
<LinearProgress <LinearProgress
@@ -222,7 +222,7 @@ export default function AIMonitoring() {
{/* Anomaly Alerts */} {/* Anomaly Alerts */}
<Card sx={{ p: 2.5 }}> <Card sx={{ p: 2.5 }}>
<Typography variant="subtitle1" fontWeight={600} mb={2}> <Typography variant="subtitle1" sx={{ fontWeight: 600, mb: 2 }}>
Anomalien Anomalien
</Typography> </Typography>
<Stack spacing={1.5}> <Stack spacing={1.5}>
@@ -239,7 +239,7 @@ export default function AIMonitoring() {
{/* Recent AI Decisions */} {/* Recent AI Decisions */}
<Card> <Card>
<Box sx={{ px: 2.5, py: 2, borderBottom: '1px solid #f1f5f9' }}> <Box sx={{ px: 2.5, py: 2, borderBottom: '1px solid #f1f5f9' }}>
<Typography variant="subtitle1" fontWeight={600}> <Typography variant="subtitle1" sx={{ fontWeight: 600 }}>
Letzte KI-Entscheidungen Letzte KI-Entscheidungen
</Typography> </Typography>
</Box> </Box>
@@ -260,7 +260,7 @@ export default function AIMonitoring() {
<Typography variant="caption" color="text.secondary">{d.timestamp}</Typography> <Typography variant="caption" color="text.secondary">{d.timestamp}</Typography>
</TableCell> </TableCell>
<TableCell> <TableCell>
<Typography variant="body2" fontWeight={500}>{d.type}</Typography> <Typography variant="body2" sx={{ fontWeight: 500 }}>{d.type}</Typography>
</TableCell> </TableCell>
<TableCell>{getConfidenceBadge(d.confidence)}</TableCell> <TableCell>{getConfidenceBadge(d.confidence)}</TableCell>
<TableCell> <TableCell>
+10 -10
View File
@@ -141,7 +141,7 @@ export default function Governance() {
}} }}
> >
<Box> <Box>
<Typography variant="h5" fontWeight={700} color="text.primary"> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">
Governance & Aktivitätslog Governance & Aktivitätslog
</Typography> </Typography>
<Typography variant="body2" color="text.secondary"> <Typography variant="body2" color="text.secondary">
@@ -157,28 +157,28 @@ export default function Governance() {
{/* Stats row */} {/* Stats row */}
<Box className="grid grid-cols-3 gap-4" sx={{ mb: 3 }}> <Box className="grid grid-cols-3 gap-4" sx={{ mb: 3 }}>
<Card sx={{ p: 2.5 }}> <Card sx={{ p: 2.5 }}>
<Typography variant="overline" color="text.secondary" lineHeight={1.4} display="block"> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4, display: 'block' }}>
Ereignisse gesamt Ereignisse gesamt
</Typography> </Typography>
<Typography variant="h3" fontWeight={700}> <Typography variant="h3" sx={{ fontWeight: 700 }}>
{events.length} {events.length}
</Typography> </Typography>
<Typography variant="caption" color="text.secondary">Alle Aktivitäten</Typography> <Typography variant="caption" color="text.secondary">Alle Aktivitäten</Typography>
</Card> </Card>
<Card sx={{ p: 2.5 }}> <Card sx={{ p: 2.5 }}>
<Typography variant="overline" color="text.secondary" lineHeight={1.4} display="block"> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4, display: 'block' }}>
Ereignisse heute Ereignisse heute
</Typography> </Typography>
<Typography variant="h3" fontWeight={700}> <Typography variant="h3" sx={{ fontWeight: 700 }}>
{todayCount} {todayCount}
</Typography> </Typography>
<Typography variant="caption" color="text.secondary">Heutige Aktivitäten</Typography> <Typography variant="caption" color="text.secondary">Heutige Aktivitäten</Typography>
</Card> </Card>
<Card sx={{ p: 2.5 }}> <Card sx={{ p: 2.5 }}>
<Typography variant="overline" color="text.secondary" lineHeight={1.4} display="block"> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4, display: 'block' }}>
Aktive Benutzer Aktive Benutzer
</Typography> </Typography>
<Typography variant="h3" fontWeight={700}> <Typography variant="h3" sx={{ fontWeight: 700 }}>
{uniqueUsers} {uniqueUsers}
</Typography> </Typography>
<Typography variant="caption" color="text.secondary">Unterschiedliche Nutzer</Typography> <Typography variant="caption" color="text.secondary">Unterschiedliche Nutzer</Typography>
@@ -186,7 +186,7 @@ export default function Governance() {
</Box> </Box>
{/* Filter chips */} {/* Filter chips */}
<Stack direction="row" spacing={0.5} flexWrap="wrap" gap={0.5} sx={{ mb: 2 }}> <Stack direction="row" spacing={0.5} sx={{ flexWrap: 'wrap', gap: 0.5, mb: 2 }}>
<Chip <Chip
label="Alle" label="Alle"
size="small" size="small"
@@ -218,7 +218,7 @@ export default function Governance() {
{/* Activity Timeline */} {/* Activity Timeline */}
<Card sx={{ p: 2.5 }}> <Card sx={{ p: 2.5 }}>
<Typography variant="subtitle1" fontWeight={600} mb={2}> <Typography variant="subtitle1" sx={{ fontWeight: 600, mb: 2 }}>
Aktivitätslog Aktivitätslog
</Typography> </Typography>
@@ -278,7 +278,7 @@ export default function Governance() {
{getEventDescription(event)} {getEventDescription(event)}
</Typography> </Typography>
{event.notes && ( {event.notes && (
<Typography variant="caption" color="text.secondary" display="block" mt={0.25}> <Typography variant="caption" color="text.secondary" sx={{ display: 'block', mt: 0.25 }}>
{event.notes} {event.notes}
</Typography> </Typography>
)} )}
+16 -17
View File
@@ -141,7 +141,7 @@ export default function ReviewQueue() {
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2, display: 'flex', alignItems: 'center', gap: 2 }}> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid #e2e8f0', px: 3, py: 2, display: 'flex', alignItems: 'center', gap: 2 }}>
<Box> <Box>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}> <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>
<Typography variant="h5" fontWeight={700} color="text.primary"> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">
Review Queue Review Queue
</Typography> </Typography>
{totalPending > 0 && ( {totalPending > 0 && (
@@ -162,10 +162,10 @@ export default function ReviewQueue() {
{/* Stats row */} {/* Stats row */}
<Box className="grid grid-cols-2 gap-4" sx={{ mb: 3 }}> <Box className="grid grid-cols-2 gap-4" sx={{ mb: 3 }}>
<Card sx={{ p: 2.5 }}> <Card sx={{ p: 2.5 }}>
<Typography variant="overline" color="text.secondary" lineHeight={1.4} display="block"> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4, display: 'block' }}>
Offene Reviews Offene Reviews
</Typography> </Typography>
<Typography variant="h3" fontWeight={700} sx={{ color: totalPending > 0 ? 'warning.main' : 'text.primary' }}> <Typography variant="h3" sx={{ fontWeight: 700, color: totalPending > 0 ? 'warning.main' : 'text.primary' }}>
{totalPending} {totalPending}
</Typography> </Typography>
<Typography variant="caption" color="text.secondary"> <Typography variant="caption" color="text.secondary">
@@ -173,10 +173,10 @@ export default function ReviewQueue() {
</Typography> </Typography>
</Card> </Card>
<Card sx={{ p: 2.5 }}> <Card sx={{ p: 2.5 }}>
<Typography variant="overline" color="text.secondary" lineHeight={1.4} display="block"> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4, display: 'block' }}>
Signale zur Prüfung Signale zur Prüfung
</Typography> </Typography>
<Typography variant="h3" fontWeight={700} sx={{ color: signalItems.length > 0 ? 'warning.main' : 'text.primary' }}> <Typography variant="h3" sx={{ fontWeight: 700, color: signalItems.length > 0 ? 'warning.main' : 'text.primary' }}>
{signalItems.length} {signalItems.length}
</Typography> </Typography>
<Typography variant="caption" color="text.secondary"> <Typography variant="caption" color="text.secondary">
@@ -190,7 +190,7 @@ export default function ReviewQueue() {
{/* Left: Item List */} {/* Left: Item List */}
<Card sx={{ p: 0, overflow: 'hidden' }}> <Card sx={{ p: 0, overflow: 'hidden' }}>
<Box sx={{ px: 2, py: 1.5, borderBottom: '1px solid #f1f5f9' }}> <Box sx={{ px: 2, py: 1.5, borderBottom: '1px solid #f1f5f9' }}>
<Typography variant="subtitle2" fontWeight={600}> <Typography variant="subtitle2" sx={{ fontWeight: 600 }}>
Ausstehende Elemente Ausstehende Elemente
</Typography> </Typography>
</Box> </Box>
@@ -240,10 +240,10 @@ export default function ReviewQueue() {
} }
</Box> </Box>
<Box sx={{ flex: 1, minWidth: 0 }}> <Box sx={{ flex: 1, minWidth: 0 }}>
<Typography variant="body2" fontWeight={500} noWrap> <Typography variant="body2" sx={{ fontWeight: 500 }} noWrap>
{item.title} {item.title}
</Typography> </Typography>
<Stack direction="row" spacing={0.5} mt={0.5} flexWrap="wrap"> <Stack direction="row" spacing={0.5} sx={{ mt: 0.5, flexWrap: 'wrap' }}>
<Chip <Chip
label={getPriorityLabel(item.confidence)} label={getPriorityLabel(item.confidence)}
size="small" size="small"
@@ -284,7 +284,7 @@ export default function ReviewQueue() {
fontWeight: 600, fontWeight: 600,
}} }}
/> />
<Typography variant="subtitle2" fontWeight={600}> <Typography variant="subtitle2" sx={{ fontWeight: 600 }}>
{selectedItem.title} {selectedItem.title}
</Typography> </Typography>
</Box> </Box>
@@ -295,23 +295,22 @@ export default function ReviewQueue() {
<Stack spacing={1} sx={{ mb: 2 }}> <Stack spacing={1} sx={{ mb: 2 }}>
<Box sx={{ display: 'flex', gap: 3 }}> <Box sx={{ display: 'flex', gap: 3 }}>
<Box> <Box>
<Typography variant="caption" color="text.secondary" display="block">Konfidenz</Typography> <Typography variant="caption" color="text.secondary" sx={{ display: 'block' }}>Konfidenz</Typography>
<Typography variant="body2" fontWeight={600}> <Typography variant="body2" sx={{ fontWeight: 600 }}>
{Math.round(selectedItem.confidence * 100)}% {Math.round(selectedItem.confidence * 100)}%
</Typography> </Typography>
</Box> </Box>
{selectedItem.probability != null && ( {selectedItem.probability != null && (
<Box> <Box>
<Typography variant="caption" color="text.secondary" display="block">Wahrscheinlichkeit</Typography> <Typography variant="caption" color="text.secondary" sx={{ display: 'block' }}>Wahrscheinlichkeit</Typography>
<Typography variant="body2" fontWeight={600}> <Typography variant="body2" sx={{ fontWeight: 600 }}>
{Math.round(selectedItem.probability * 100)}% {Math.round(selectedItem.probability * 100)}%
</Typography> </Typography>
</Box> </Box>
)} )}
<Box> <Box>
<Typography variant="caption" color="text.secondary" display="block">Risiko</Typography> <Typography variant="caption" color="text.secondary" sx={{ display: 'block' }}>Risiko</Typography>
<Chip <Chip label={getRiskLabel(selectedItem.risk)}
label={getRiskLabel(selectedItem.risk)}
size="small" size="small"
color={getRiskColor(selectedItem.risk)} color={getRiskColor(selectedItem.risk)}
variant="outlined" variant="outlined"
@@ -329,7 +328,7 @@ export default function ReviewQueue() {
<Divider sx={{ mb: 2 }} /> <Divider sx={{ mb: 2 }} />
{/* Notes */} {/* Notes */}
<Typography variant="caption" fontWeight={600} color="text.secondary" display="block" mb={1}> <Typography variant="caption" sx={{ fontWeight: 600, display: 'block', mb: 1 }} color="text.secondary">
Notizen Notizen
</Typography> </Typography>
<TextField <TextField
+18 -20
View File
@@ -76,7 +76,7 @@ export default function DataQuality() {
<Box> <Box>
{/* Page Header */} {/* Page Header */}
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }}> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }}>
<Typography variant="h5" fontWeight={700} color="text.primary">Datenqualität</Typography> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">Datenqualität</Typography>
<Typography variant="body2" color="text.secondary">Vollständigkeit und Aktualität der Objektdaten</Typography> <Typography variant="body2" color="text.secondary">Vollständigkeit und Aktualität der Objektdaten</Typography>
</Box> </Box>
@@ -87,8 +87,8 @@ export default function DataQuality() {
<Box className="grid grid-cols-3 gap-4"> <Box className="grid grid-cols-3 gap-4">
{/* Avg Quality Score */} {/* Avg Quality Score */}
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Typography variant="overline" color="text.secondary" display="block">Ø Qualitätsscore</Typography> <Typography variant="overline" color="text.secondary" sx={{ display: 'block' }}>Ø Qualitätsscore</Typography>
<Typography variant="h4" fontWeight={700} sx={{ color: avgScore >= 0.8 ? '#1a7a4a' : avgScore >= 0.6 ? '#d97706' : '#c0392b' }}> <Typography variant="h4" sx={{ fontWeight: 700, color: avgScore >= 0.8 ? '#1a7a4a' : avgScore >= 0.6 ? '#d97706' : '#c0392b' }}>
{Math.round(avgScore * 100)}% {Math.round(avgScore * 100)}%
</Typography> </Typography>
<Box sx={{ mt: 1 }}> <Box sx={{ mt: 1 }}>
@@ -103,11 +103,10 @@ export default function DataQuality() {
{/* Critical Issues */} {/* Critical Issues */}
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Typography variant="overline" color="text.secondary" display="block">Kritische Felder fehlen</Typography> <Typography variant="overline" color="text.secondary" sx={{ display: 'block' }}>Kritische Felder fehlen</Typography>
<Typography <Typography
variant="h4" variant="h4"
fontWeight={700} sx={{ fontWeight: 700, color: criticalIssues.length > 2 ? '#c0392b' : criticalIssues.length > 0 ? '#d97706' : '#1a7a4a' }}
sx={{ color: criticalIssues.length > 2 ? '#c0392b' : criticalIssues.length > 0 ? '#d97706' : '#1a7a4a' }}
> >
{criticalIssues.length} {criticalIssues.length}
</Typography> </Typography>
@@ -118,11 +117,10 @@ export default function DataQuality() {
{/* Stale Data */} {/* Stale Data */}
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Typography variant="overline" color="text.secondary" display="block">Veraltete Daten</Typography> <Typography variant="overline" color="text.secondary" sx={{ display: 'block' }}>Veraltete Daten</Typography>
<Typography <Typography
variant="h4" variant="h4"
fontWeight={700} sx={{ fontWeight: 700, color: staleData.length > 2 ? '#c0392b' : staleData.length > 0 ? '#d97706' : '#1a7a4a' }}
sx={{ color: staleData.length > 2 ? '#c0392b' : staleData.length > 0 ? '#d97706' : '#1a7a4a' }}
> >
{staleData.length} {staleData.length}
</Typography> </Typography>
@@ -196,13 +194,13 @@ export default function DataQuality() {
<Table size="small"> <Table size="small">
<TableHead> <TableHead>
<TableRow sx={{ bgcolor: 'grey.50' }}> <TableRow sx={{ bgcolor: 'grey.50' }}>
<TableCell><Typography variant="caption" fontWeight={600}>Objekt</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Objekt</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Quelle</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Quelle</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Score</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Score</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Kritische Felder</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Kritische Felder</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Optionale Felder</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Optionale Felder</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Aktualität</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Aktualität</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Warnungen</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Warnungen</Typography></TableCell>
</TableRow> </TableRow>
</TableHead> </TableHead>
<TableBody> <TableBody>
@@ -220,7 +218,7 @@ export default function DataQuality() {
> >
{/* Objekt */} {/* Objekt */}
<TableCell> <TableCell>
<Typography variant="body2" fontWeight={500}>{property.title}</Typography> <Typography variant="body2" sx={{ fontWeight: 500 }}>{property.title}</Typography>
</TableCell> </TableCell>
{/* Quelle */} {/* Quelle */}
@@ -234,7 +232,7 @@ export default function DataQuality() {
<TableCell> <TableCell>
<Box sx={{ width: 100 }}> <Box sx={{ width: 100 }}>
<Box className="flex items-center justify-between mb-1"> <Box className="flex items-center justify-between mb-1">
<Typography variant="caption" fontWeight={700} sx={{ color: score >= 0.8 ? '#1a7a4a' : score >= 0.6 ? '#d97706' : '#c0392b' }}> <Typography variant="caption" sx={{ fontWeight: 700, color: score >= 0.8 ? '#1a7a4a' : score >= 0.6 ? '#d97706' : '#c0392b' }}>
{Math.round(score * 100)}% {Math.round(score * 100)}%
</Typography> </Typography>
</Box> </Box>
@@ -257,7 +255,7 @@ export default function DataQuality() {
<Chip key={f} label={f} color="error" size="small" variant="outlined" /> <Chip key={f} label={f} color="error" size="small" variant="outlined" />
))} ))}
{missingCritical.length > 2 && ( {missingCritical.length > 2 && (
<Typography variant="caption" color="error.main" fontWeight={600}> <Typography variant="caption" sx={{ fontWeight: 600 }} color="error.main">
+{missingCritical.length - 2} weitere +{missingCritical.length - 2} weitere
</Typography> </Typography>
)} )}
@@ -280,7 +278,7 @@ export default function DataQuality() {
<TableCell> <TableCell>
<Chip <Chip
label={getFreshnessLabel(property.dataQuality.freshness)} label={getFreshnessLabel(property.dataQuality.freshness)}
color={getFreshnessColor(property.dataQuality.freshness)} sx={{ color: getFreshnessColor(property.dataQuality.freshness) }}
size="small" size="small"
/> />
</TableCell> </TableCell>
+12 -13
View File
@@ -88,7 +88,7 @@ export default function FutureAvailability() {
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }} className="flex items-center gap-3"> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }} className="flex items-center gap-3">
<Box className="flex-1"> <Box className="flex-1">
<Box className="flex items-center gap-2"> <Box className="flex items-center gap-2">
<Typography variant="h5" fontWeight={700} color="text.primary">Marktchancen</Typography> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">Marktchancen</Typography>
<Chip <Chip
label="Shadow Intelligence Layer" label="Shadow Intelligence Layer"
size="small" size="small"
@@ -105,20 +105,20 @@ export default function FutureAvailability() {
{/* Stats Row */} {/* Stats Row */}
<Box className="grid grid-cols-4 gap-4"> <Box className="grid grid-cols-4 gap-4">
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Typography variant="overline" color="text.secondary" display="block">Signale gesamt</Typography> <Typography variant="overline" color="text.secondary" sx={{ display: 'block' }}>Signale gesamt</Typography>
<Typography variant="h4" fontWeight={700}>{totalCount}</Typography> <Typography variant="h4" sx={{ fontWeight: 700 }}>{totalCount}</Typography>
</Card> </Card>
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Typography variant="overline" color="text.secondary" display="block">Verifiziert</Typography> <Typography variant="overline" color="text.secondary" sx={{ display: 'block' }}>Verifiziert</Typography>
<Typography variant="h4" fontWeight={700} sx={{ color: '#1a7a4a' }}>{verifiedCount}</Typography> <Typography variant="h4" sx={{ fontWeight: 700, color: '#1a7a4a' }}>{verifiedCount}</Typography>
</Card> </Card>
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Typography variant="overline" color="text.secondary" display="block">Hohe Wahrscheinlichkeit</Typography> <Typography variant="overline" color="text.secondary" sx={{ display: 'block' }}>Hohe Wahrscheinlichkeit</Typography>
<Typography variant="h4" fontWeight={700} sx={{ color: '#1e3a5f' }}>{highProbCount}</Typography> <Typography variant="h4" sx={{ fontWeight: 700, color: '#1e3a5f' }}>{highProbCount}</Typography>
</Card> </Card>
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Typography variant="overline" color="text.secondary" display="block">Ø Wahrscheinlichkeit</Typography> <Typography variant="overline" color="text.secondary" sx={{ display: 'block' }}>Ø Wahrscheinlichkeit</Typography>
<Typography variant="h4" fontWeight={700} sx={{ color: getProbabilityColor(avgProbability) === 'success' ? '#1a7a4a' : getProbabilityColor(avgProbability) === 'warning' ? '#d97706' : '#c0392b' }}> <Typography variant="h4" sx={{ fontWeight: 700, color: getProbabilityColor(avgProbability) === 'success' ? '#1a7a4a' : getProbabilityColor(avgProbability) === 'warning' ? '#d97706' : '#c0392b' }}>
{Math.round(avgProbability * 100)}% {Math.round(avgProbability * 100)}%
</Typography> </Typography>
</Card> </Card>
@@ -138,8 +138,7 @@ export default function FutureAvailability() {
size="small" size="small"
sx={{ bgcolor: getSignalTypeColor(signal.signalType), color: 'white', fontWeight: 600 }} sx={{ bgcolor: getSignalTypeColor(signal.signalType), color: 'white', fontWeight: 600 }}
/> />
<Chip <Chip label={signal.sensitivityLevel === 'PUBLIC' ? 'Öffentlich' : signal.sensitivityLevel === 'CONFIDENTIAL' ? 'Vertraulich' : 'Intern'}
label={signal.sensitivityLevel === 'PUBLIC' ? 'Öffentlich' : signal.sensitivityLevel === 'CONFIDENTIAL' ? 'Vertraulich' : 'Intern'}
size="small" size="small"
variant="outlined" variant="outlined"
color={signal.sensitivityLevel === 'CONFIDENTIAL' ? 'error' : 'default'} color={signal.sensitivityLevel === 'CONFIDENTIAL' ? 'error' : 'default'}
@@ -148,7 +147,7 @@ export default function FutureAvailability() {
{/* Location */} {/* Location */}
<Box className="mb-2"> <Box className="mb-2">
<Typography variant="body1" fontWeight={500}>{signal.locationHint}</Typography> <Typography variant="body1" sx={{ fontWeight: 500 }}>{signal.locationHint}</Typography>
{signal.companyName && ( {signal.companyName && (
<Typography variant="body2" color="text.secondary">{signal.companyName}</Typography> <Typography variant="body2" color="text.secondary">{signal.companyName}</Typography>
)} )}
@@ -158,7 +157,7 @@ export default function FutureAvailability() {
<Box className="mb-2"> <Box className="mb-2">
<Box className="flex items-center justify-between mb-1"> <Box className="flex items-center justify-between mb-1">
<Typography variant="caption" color="text.secondary">Wahrscheinlichkeit</Typography> <Typography variant="caption" color="text.secondary">Wahrscheinlichkeit</Typography>
<Typography variant="body2" fontWeight={700} sx={{ color: signal.probability > 0.7 ? '#1a7a4a' : signal.probability >= 0.5 ? '#d97706' : '#c0392b' }}> <Typography variant="body2" sx={{ fontWeight: 700, color: signal.probability > 0.7 ? '#1a7a4a' : signal.probability >= 0.5 ? '#d97706' : '#c0392b' }}>
{Math.round(signal.probability * 100)}% {Math.round(signal.probability * 100)}%
</Typography> </Typography>
</Box> </Box>
+6 -6
View File
@@ -119,7 +119,7 @@ export default function MatchCenter() {
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }} className="flex items-center justify-between"> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }} className="flex items-center justify-between">
<Box> <Box>
<Box className="flex items-center gap-2"> <Box className="flex items-center gap-2">
<Typography variant="h5" fontWeight={700} color="text.primary">Match Center</Typography> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">Match Center</Typography>
<Chip label={`${matches.length} Matches`} size="small" sx={{ bgcolor: '#1e3a5f', color: 'white', fontWeight: 700 }} /> <Chip label={`${matches.length} Matches`} size="small" sx={{ bgcolor: '#1e3a5f', color: 'white', fontWeight: 700 }} />
</Box> </Box>
<Typography variant="body2" color="text.secondary">KI-gestützte Objekt-Bedarfs-Analyse</Typography> <Typography variant="body2" color="text.secondary">KI-gestützte Objekt-Bedarfs-Analyse</Typography>
@@ -163,13 +163,13 @@ export default function MatchCenter() {
<Box className="flex gap-4"> <Box className="flex gap-4">
{/* Left column: score */} {/* Left column: score */}
<Box sx={{ width: 80, flexShrink: 0, textAlign: 'center' }} className="flex flex-col items-center gap-1"> <Box sx={{ width: 80, flexShrink: 0, textAlign: 'center' }} className="flex flex-col items-center gap-1">
<Typography variant="h3" fontWeight={700} sx={{ color: getScoreColor(match.matchStrength) }}> <Typography variant="h3" sx={{ fontWeight: 700, color: getScoreColor(match.matchStrength) }}>
{match.matchScore} {match.matchScore}
</Typography> </Typography>
<Typography variant="caption" color="text.secondary">/ 100</Typography> <Typography variant="caption" color="text.secondary">/ 100</Typography>
<Chip <Chip
label={getMatchStrengthLabel(match.matchStrength)} label={getMatchStrengthLabel(match.matchStrength)}
color={getMatchStrengthColor(match.matchStrength)} sx={{ color: getMatchStrengthColor(match.matchStrength) }}
size="small" size="small"
/> />
</Box> </Box>
@@ -179,7 +179,7 @@ export default function MatchCenter() {
{/* Property info */} {/* Property info */}
<Box className="flex items-center gap-1"> <Box className="flex items-center gap-1">
<Building2 size={16} color="#1e3a5f" /> <Building2 size={16} color="#1e3a5f" />
<Typography variant="h6" fontWeight={600}> <Typography variant="h6" sx={{ fontWeight: 600 }}>
{property?.title ?? match.propertyId} {property?.title ?? match.propertyId}
</Typography> </Typography>
</Box> </Box>
@@ -233,12 +233,12 @@ export default function MatchCenter() {
<Box sx={{ width: 160, flexShrink: 0, textAlign: 'right' }} className="flex flex-col gap-2 items-end"> <Box sx={{ width: 160, flexShrink: 0, textAlign: 'right' }} className="flex flex-col gap-2 items-end">
<Chip <Chip
label={`Konfidenz: ${getConfidenceLabel(match.confidenceLevel)}`} label={`Konfidenz: ${getConfidenceLabel(match.confidenceLevel)}`}
color={getConfidenceColor(match.confidenceLevel)} sx={{ color: getConfidenceColor(match.confidenceLevel) }}
size="small" size="small"
/> />
<Chip <Chip
label={getRiskLabel(match.riskLevel)} label={getRiskLabel(match.riskLevel)}
color={getRiskColor(match.riskLevel)} sx={{ color: getRiskColor(match.riskLevel) }}
size="small" size="small"
variant="outlined" variant="outlined"
/> />
+19 -20
View File
@@ -132,7 +132,7 @@ export default function Properties() {
{/* Page Header */} {/* Page Header */}
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }} className="flex items-center justify-between"> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }} className="flex items-center justify-between">
<Box className="flex items-center gap-2"> <Box className="flex items-center gap-2">
<Typography variant="h5" fontWeight={700} color="text.primary">Objekte</Typography> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">Objekte</Typography>
<Chip label={properties.length} size="small" sx={{ bgcolor: '#1e3a5f', color: 'white', fontWeight: 700 }} /> <Chip label={properties.length} size="small" sx={{ bgcolor: '#1e3a5f', color: 'white', fontWeight: 700 }} />
</Box> </Box>
<Tooltip title="In Entwicklung"> <Tooltip title="In Entwicklung">
@@ -216,16 +216,16 @@ export default function Properties() {
<Table stickyHeader size="small"> <Table stickyHeader size="small">
<TableHead> <TableHead>
<TableRow sx={{ bgcolor: 'grey.50' }}> <TableRow sx={{ bgcolor: 'grey.50' }}>
<TableCell><Typography variant="caption" fontWeight={600}>Objekt</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Objekt</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Typ</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Typ</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Standort</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Standort</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Fläche</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Fläche</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Miete/m²</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Miete/m²</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Quelle</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Quelle</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Konfidenz</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Konfidenz</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Datenqualität</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Datenqualität</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Verfügbarkeit</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Verfügbarkeit</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Aktionen</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Aktionen</Typography></TableCell>
</TableRow> </TableRow>
</TableHead> </TableHead>
<TableBody> <TableBody>
@@ -239,7 +239,7 @@ export default function Properties() {
> >
{/* Objekt */} {/* Objekt */}
<TableCell> <TableCell>
<Typography variant="body2" fontWeight={500}>{property.title}</Typography> <Typography variant="body2" sx={{ fontWeight: 500 }}>{property.title}</Typography>
<Typography variant="caption" color="text.secondary"> <Typography variant="caption" color="text.secondary">
{property.address.street} {property.address.houseNumber}, {property.address.city} {property.address.street} {property.address.houseNumber}, {property.address.city}
</Typography> </Typography>
@@ -285,8 +285,7 @@ export default function Properties() {
<TableCell> <TableCell>
<Typography <Typography
variant="body2" variant="body2"
fontWeight={600} sx={{ fontWeight: 600, color: getConfidenceColor(property.confidenceScore) }}
sx={{ color: getConfidenceColor(property.confidenceScore) }}
> >
{Math.round(property.confidenceScore * 100)}% {Math.round(property.confidenceScore * 100)}%
</Typography> </Typography>
@@ -299,17 +298,17 @@ export default function Properties() {
<Box> <Box>
{property.dataQuality.missingCriticalFields.length > 0 && ( {property.dataQuality.missingCriticalFields.length > 0 && (
<Box> <Box>
<Typography variant="caption" fontWeight={600}>Kritische Felder fehlen:</Typography> <Typography variant="caption" sx={{ fontWeight: 600 }}>Kritische Felder fehlen:</Typography>
{property.dataQuality.missingCriticalFields.map(f => ( {property.dataQuality.missingCriticalFields.map(f => (
<Typography key={f} variant="caption" display="block"> {f}</Typography> <Typography key={f} variant="caption" sx={{ display: 'block' }}> {f}</Typography>
))} ))}
</Box> </Box>
)} )}
{property.dataQuality.warnings.length > 0 && ( {property.dataQuality.warnings.length > 0 && (
<Box mt={0.5}> <Box sx={{ mt: 0.5 }}>
<Typography variant="caption" fontWeight={600}>Warnungen:</Typography> <Typography variant="caption" sx={{ fontWeight: 600 }}>Warnungen:</Typography>
{property.dataQuality.warnings.map((w, i) => ( {property.dataQuality.warnings.map((w, i) => (
<Typography key={i} variant="caption" display="block"> {w}</Typography> <Typography key={i} variant="caption" sx={{ display: 'block' }}> {w}</Typography>
))} ))}
</Box> </Box>
)} )}
@@ -337,7 +336,7 @@ export default function Properties() {
<TableCell> <TableCell>
<Chip <Chip
label={getAvailabilityLabel(property.availabilityStatus)} label={getAvailabilityLabel(property.availabilityStatus)}
color={getAvailabilityColor(property.availabilityStatus)} sx={{ color: getAvailabilityColor(property.availabilityStatus) }}
size="small" size="small"
/> />
</TableCell> </TableCell>
+21 -21
View File
@@ -91,7 +91,7 @@ export default function SupplyDashboard() {
<Box> <Box>
{/* Page Header */} {/* Page Header */}
<Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }}> <Box sx={{ bgcolor: 'white', borderBottom: '1px solid', borderColor: 'divider', px: 3, py: 2 }}>
<Typography variant="h5" fontWeight={700} color="text.primary">Supply Dashboard</Typography> <Typography variant="h5" sx={{ fontWeight: 700 }} color="text.primary">Supply Dashboard</Typography>
<Typography variant="body2" color="text.secondary">Portfolioübersicht und aktuelle Kennzahlen</Typography> <Typography variant="body2" color="text.secondary">Portfolioübersicht und aktuelle Kennzahlen</Typography>
</Box> </Box>
@@ -104,10 +104,10 @@ export default function SupplyDashboard() {
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Box className="flex flex-col gap-1"> <Box className="flex flex-col gap-1">
<Box className="flex items-center justify-between"> <Box className="flex items-center justify-between">
<Typography variant="overline" color="text.secondary" lineHeight={1.4}>Objekte</Typography> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4 }}>Objekte</Typography>
<Building2 size={20} color="#1e3a5f" /> <Building2 size={20} color="#1e3a5f" />
</Box> </Box>
<Typography variant="h3" fontWeight={700} color="text.primary">{properties.length}</Typography> <Typography variant="h3" sx={{ fontWeight: 700 }} color="text.primary">{properties.length}</Typography>
<Typography variant="caption" color="text.secondary">Gesamtportfolio</Typography> <Typography variant="caption" color="text.secondary">Gesamtportfolio</Typography>
</Box> </Box>
</Card> </Card>
@@ -116,10 +116,10 @@ export default function SupplyDashboard() {
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Box className="flex flex-col gap-1"> <Box className="flex flex-col gap-1">
<Box className="flex items-center justify-between"> <Box className="flex items-center justify-between">
<Typography variant="overline" color="text.secondary" lineHeight={1.4}>Aktive Matches</Typography> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4 }}>Aktive Matches</Typography>
<Target size={20} color="#1a7a4a" /> <Target size={20} color="#1a7a4a" />
</Box> </Box>
<Typography variant="h3" fontWeight={700} color="text.primary">{matches.length}</Typography> <Typography variant="h3" sx={{ fontWeight: 700 }} color="text.primary">{matches.length}</Typography>
<Typography variant="caption" color="text.secondary">KI-generierte Matches</Typography> <Typography variant="caption" color="text.secondary">KI-generierte Matches</Typography>
</Box> </Box>
</Card> </Card>
@@ -128,10 +128,10 @@ export default function SupplyDashboard() {
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Box className="flex flex-col gap-1"> <Box className="flex flex-col gap-1">
<Box className="flex items-center justify-between"> <Box className="flex items-center justify-between">
<Typography variant="overline" color="text.secondary" lineHeight={1.4}>Ø Datenqualität</Typography> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4 }}>Ø Datenqualität</Typography>
<BarChart2 size={20} color={avgQuality >= 0.8 ? '#1a7a4a' : avgQuality >= 0.6 ? '#d97706' : '#c0392b'} /> <BarChart2 size={20} color={avgQuality >= 0.8 ? '#1a7a4a' : avgQuality >= 0.6 ? '#d97706' : '#c0392b'} />
</Box> </Box>
<Typography variant="h3" fontWeight={700} sx={{ color: avgQualityColor }}> <Typography variant="h3" sx={{ fontWeight: 700, color: avgQualityColor }}>
{Math.round(avgQuality * 100)}% {Math.round(avgQuality * 100)}%
</Typography> </Typography>
<Typography variant="caption" color="text.secondary">Durchschnittlicher Score</Typography> <Typography variant="caption" color="text.secondary">Durchschnittlicher Score</Typography>
@@ -142,10 +142,10 @@ export default function SupplyDashboard() {
<Card sx={{ elevation: 1, p: 2.5 }}> <Card sx={{ elevation: 1, p: 2.5 }}>
<Box className="flex flex-col gap-1"> <Box className="flex flex-col gap-1">
<Box className="flex items-center justify-between"> <Box className="flex items-center justify-between">
<Typography variant="overline" color="text.secondary" lineHeight={1.4}>Prüfungen ausstehend</Typography> <Typography variant="overline" color="text.secondary" sx={{ lineHeight: 1.4 }}>Prüfungen ausstehend</Typography>
<AlertTriangle size={20} color="#d97706" /> <AlertTriangle size={20} color="#d97706" />
</Box> </Box>
<Typography variant="h3" fontWeight={700} sx={{ color: pendingReview > 0 ? 'warning.main' : 'text.primary' }}> <Typography variant="h3" sx={{ fontWeight: 700, color: pendingReview > 0 ? 'warning.main' : 'text.primary' }}>
{pendingReview} {pendingReview}
</Typography> </Typography>
<Typography variant="caption" color="text.secondary">Kritische Felder fehlen</Typography> <Typography variant="caption" color="text.secondary">Kritische Felder fehlen</Typography>
@@ -156,15 +156,15 @@ export default function SupplyDashboard() {
{/* Section 2 - Portfolio Overview */} {/* Section 2 - Portfolio Overview */}
<Box className="grid grid-cols-3 gap-4"> <Box className="grid grid-cols-3 gap-4">
<Card sx={{ elevation: 1, borderTop: '4px solid #1e3a5f', p: 2.5 }}> <Card sx={{ elevation: 1, borderTop: '4px solid #1e3a5f', p: 2.5 }}>
<Typography variant="h4" fontWeight={700} color="text.primary">{verifiedCount}</Typography> <Typography variant="h4" sx={{ fontWeight: 700 }} color="text.primary">{verifiedCount}</Typography>
<Typography variant="body2" color="text.secondary">Verified Portfolio</Typography> <Typography variant="body2" color="text.secondary">Verified Portfolio</Typography>
</Card> </Card>
<Card sx={{ elevation: 1, borderTop: '4px solid #d97706', p: 2.5 }}> <Card sx={{ elevation: 1, borderTop: '4px solid #d97706', p: 2.5 }}>
<Typography variant="h4" fontWeight={700} color="text.primary">{marketCount}</Typography> <Typography variant="h4" sx={{ fontWeight: 700 }} color="text.primary">{marketCount}</Typography>
<Typography variant="body2" color="text.secondary">Marktinserate</Typography> <Typography variant="body2" color="text.secondary">Marktinserate</Typography>
</Card> </Card>
<Card sx={{ elevation: 1, borderTop: '4px solid #7c3aed', p: 2.5 }}> <Card sx={{ elevation: 1, borderTop: '4px solid #7c3aed', p: 2.5 }}>
<Typography variant="h4" fontWeight={700} color="text.primary">{futureCount}</Typography> <Typography variant="h4" sx={{ fontWeight: 700 }} color="text.primary">{futureCount}</Typography>
<Typography variant="body2" color="text.secondary">Zukunftssignale</Typography> <Typography variant="body2" color="text.secondary">Zukunftssignale</Typography>
</Card> </Card>
</Box> </Box>
@@ -175,11 +175,11 @@ export default function SupplyDashboard() {
<Table> <Table>
<TableHead> <TableHead>
<TableRow sx={{ bgcolor: 'grey.50' }}> <TableRow sx={{ bgcolor: 'grey.50' }}>
<TableCell><Typography variant="caption" fontWeight={600}>Objekt</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Objekt</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Unternehmen</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Unternehmen</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Score</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Score</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Stärke</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Stärke</Typography></TableCell>
<TableCell><Typography variant="caption" fontWeight={600}>Aktion</Typography></TableCell> <TableCell><Typography variant="caption" sx={{ fontWeight: 600 }}>Aktion</Typography></TableCell>
</TableRow> </TableRow>
</TableHead> </TableHead>
<TableBody> <TableBody>
@@ -188,19 +188,19 @@ export default function SupplyDashboard() {
return ( return (
<TableRow key={match.id} hover> <TableRow key={match.id} hover>
<TableCell> <TableCell>
<Typography variant="body2" fontWeight={500}>{property?.title ?? match.propertyId}</Typography> <Typography variant="body2" sx={{ fontWeight: 500 }}>{property?.title ?? match.propertyId}</Typography>
</TableCell> </TableCell>
<TableCell> <TableCell>
<Typography variant="body2" color="text.secondary">{match.needId}</Typography> <Typography variant="body2" color="text.secondary">{match.needId}</Typography>
</TableCell> </TableCell>
<TableCell> <TableCell>
<Box className="flex items-center gap-2"> <Box className="flex items-center gap-2">
<Typography variant="body2" fontWeight={700}>{match.matchScore}</Typography> <Typography variant="body2" sx={{ fontWeight: 700 }}>{match.matchScore}</Typography>
<Box sx={{ width: 80 }}> <Box sx={{ width: 80 }}>
<LinearProgress <LinearProgress
variant="determinate" variant="determinate"
value={match.matchScore} value={match.matchScore}
color={match.matchStrength === MatchStrength.STRONG ? 'success' : match.matchStrength === MatchStrength.MODERATE ? 'warning' : 'error'} sx={{ color: match.matchStrength === MatchStrength.STRONG ? 'success' : match.matchStrength === MatchStrength.MODERATE ? 'warning' : 'error' }}
/> />
</Box> </Box>
</Box> </Box>
@@ -208,7 +208,7 @@ export default function SupplyDashboard() {
<TableCell> <TableCell>
<Chip <Chip
label={getMatchStrengthLabel(match.matchStrength)} label={getMatchStrengthLabel(match.matchStrength)}
color={getMatchStrengthColor(match.matchStrength)} sx={{ color: getMatchStrengthColor(match.matchStrength) }}
size="small" size="small"
/> />
</TableCell> </TableCell>