- Migrated all Pages from Material-UI to HTML+CSS (GroupsOverviewPage, ManagementPortalPage, ModerationGroupImagesPage, ModerationGroupsPage, PublicGroupImagesPage, SlideshowPage, MultiUploadPage) - Added comprehensive typography system in App.css (h1-h3, p, utility classes) - Added global Material-UI font overrides for Open Sans - Removed redundant fontFamily: 'roboto' from all components - Fixed button alignment in ImageGalleryCard (margin-top: auto) - Removed emojis from titles for cleaner UI - Standardized button padding (12px 30px) across application - Improved code consistency and maintainability with centralized CSS approach
141 lines
3.9 KiB
JavaScript
141 lines
3.9 KiB
JavaScript
import React from 'react';
|
|
import { TextField, Typography, Grid, Box } from '@mui/material';
|
|
|
|
function DescriptionInput({
|
|
metadata = {},
|
|
onMetadataChange
|
|
}) {
|
|
|
|
const handleFieldChange = (field, value) => {
|
|
const updatedMetadata = {
|
|
...metadata,
|
|
[field]: value
|
|
};
|
|
onMetadataChange(updatedMetadata);
|
|
};
|
|
|
|
const currentYear = new Date().getFullYear();
|
|
|
|
const fieldLabelSx = {
|
|
fontSize: '14px',
|
|
color: '#555555',
|
|
marginBottom: '8px',
|
|
display: 'block'
|
|
};
|
|
|
|
const sectionTitleSx = {
|
|
fontSize: '18px',
|
|
color: '#333333',
|
|
marginBottom: '15px',
|
|
display: 'block',
|
|
fontWeight: 500
|
|
};
|
|
|
|
const textFieldSx = {
|
|
width: '100%',
|
|
marginBottom: '15px',
|
|
'& .MuiOutlinedInput-root': {
|
|
borderRadius: '8px'
|
|
}
|
|
};
|
|
|
|
const requiredFieldSx = {
|
|
'& .MuiOutlinedInput-root': {
|
|
borderRadius: '8px',
|
|
'& fieldset': {
|
|
borderColor: '#E57373'
|
|
}
|
|
}
|
|
};
|
|
|
|
const optionalFieldSx = {
|
|
'& .MuiOutlinedInput-root': {
|
|
borderRadius: '8px',
|
|
'& fieldset': {
|
|
borderColor: '#E0E0E0'
|
|
}
|
|
}
|
|
};
|
|
|
|
const characterCountSx = {
|
|
fontSize: '12px',
|
|
color: '#999999',
|
|
textAlign: 'right',
|
|
marginTop: '-10px',
|
|
marginBottom: '10px'
|
|
};
|
|
|
|
const requiredIndicatorSx = { color: '#E57373', fontSize: '16px' };
|
|
const optionalIndicatorSx = { color: '#9E9E9E', fontSize: '12px' };
|
|
|
|
return (
|
|
<Box sx={{ marginTop: '20px', marginBottom: '20px' }}>
|
|
<Grid container spacing={2}>
|
|
<Grid item xs={12} sm={6}>
|
|
<Typography sx={fieldLabelSx}>
|
|
Jahr <Box component="span" sx={requiredIndicatorSx}>*</Box>
|
|
</Typography>
|
|
<TextField
|
|
sx={{ ...textFieldSx, ...requiredFieldSx }}
|
|
variant="outlined"
|
|
type="number"
|
|
value={metadata.year || currentYear}
|
|
onChange={(e) => handleFieldChange('year', parseInt(e.target.value))}
|
|
placeholder={currentYear.toString()}
|
|
inputProps={{
|
|
min: 1900,
|
|
max: currentYear + 10
|
|
}}
|
|
/>
|
|
</Grid>
|
|
|
|
<Grid item xs={12} sm={6}>
|
|
<Typography sx={fieldLabelSx}>
|
|
Titel <Box component="span" sx={requiredIndicatorSx}>*</Box>
|
|
</Typography>
|
|
<TextField
|
|
sx={{ ...textFieldSx, ...requiredFieldSx }}
|
|
variant="outlined"
|
|
value={metadata.title || ''}
|
|
onChange={(e) => handleFieldChange('title', e.target.value)}
|
|
placeholder="z.B. Wohnzimmer Renovierung"
|
|
inputProps={{ maxLength: 100 }}
|
|
/>
|
|
</Grid>
|
|
|
|
<Grid item xs={12}>
|
|
<Typography sx={fieldLabelSx}>
|
|
Beschreibung <Box component="span" sx={optionalIndicatorSx}>(optional)</Box>
|
|
</Typography>
|
|
<TextField
|
|
sx={{ ...textFieldSx, ...optionalFieldSx }}
|
|
multiline
|
|
rows={3}
|
|
variant="outlined"
|
|
value={metadata.description || ''}
|
|
onChange={(e) => handleFieldChange('description', e.target.value)}
|
|
placeholder="Detaillierte Beschreibung des Projekts..."
|
|
inputProps={{ maxLength: 500 }}
|
|
/>
|
|
<Box sx={characterCountSx}>{(metadata.description || '').length} / 500 Zeichen</Box>
|
|
</Grid>
|
|
|
|
<Grid item xs={12}>
|
|
<Typography sx={fieldLabelSx}>
|
|
Name/Ersteller <Box component="span" sx={optionalIndicatorSx}>(optional)</Box>
|
|
</Typography>
|
|
<TextField
|
|
sx={{ ...textFieldSx, ...optionalFieldSx }}
|
|
variant="outlined"
|
|
value={metadata.name || ''}
|
|
onChange={(e) => handleFieldChange('name', e.target.value)}
|
|
placeholder="Dein Name oder Projektersteller"
|
|
inputProps={{ maxLength: 50 }}
|
|
/>
|
|
</Grid>
|
|
</Grid>
|
|
</Box>
|
|
);
|
|
}
|
|
|
|
export default DescriptionInput; |