diff --git a/display/frontend/src/components/EpaperPreview.tsx b/display/frontend/src/components/EpaperPreview.tsx index 5efaf79..efc5840 100644 --- a/display/frontend/src/components/EpaperPreview.tsx +++ b/display/frontend/src/components/EpaperPreview.tsx @@ -49,6 +49,21 @@ interface EpaperPreviewProps { const SCALE = 0.6; +const ICON_SYMBOLS: Record = { + thermometer: '🌡', + droplet: '💧', + wind: '🌬', + pressure: '⏱', + sun: '☀', + bolt: '⚡', + gauge: '📊', + wifi: '📶', + battery: '🔋', + check: '✅', + warning: '⚠', + clock: '🕐', +}; + export default function EpaperPreview({ layoutId, elements, layoutWidth = 800, layoutHeight = 480 }: EpaperPreviewProps) { const [liveElements, setLiveElements] = useState(null); const [displayId, setDisplayId] = useState(null); @@ -170,7 +185,7 @@ export default function EpaperPreview({ layoutId, elements, layoutWidth = 800, l display: 'flex', flexDirection: 'column', justifyContent: 'space-between', }}>
- {el.icon ? `[${el.icon}] ` : ''}{el.label || ''} + {el.icon ? (ICON_SYMBOLS[el.icon] || el.icon) + ' ' : ''}{el.label || ''}
{el.value ?? '—'} {el.unit || ''} diff --git a/display/frontend/src/pages/Datapoints.tsx b/display/frontend/src/pages/Datapoints.tsx index e3609d9..a941fda 100644 --- a/display/frontend/src/pages/Datapoints.tsx +++ b/display/frontend/src/pages/Datapoints.tsx @@ -40,6 +40,16 @@ export default function Datapoints() { } } + async function handleDelete(id: number) { + if (!confirm('Datenpunkt wirklich loeschen?')) return; + try { + await api.del(`/api/datapoints/${id}`); + load(); + } catch (e) { + setError((e as Error).message); + } + } + return (

Datenpunkte

@@ -55,11 +65,12 @@ export default function Datapoints() { Einheit Quelle Status + Aktion {datapoints.length === 0 && ( - Keine Datenpunkte vorhanden + Keine Datenpunkte vorhanden )} {datapoints.map((dp) => ( @@ -83,6 +94,9 @@ export default function Datapoints() { {dp.source_type} + + + ))} diff --git a/display/middleware/src/api/routes/datapoints.ts b/display/middleware/src/api/routes/datapoints.ts index c4eb61f..4718e7c 100644 --- a/display/middleware/src/api/routes/datapoints.ts +++ b/display/middleware/src/api/routes/datapoints.ts @@ -3,6 +3,7 @@ import { getAllDatapoints, getDatapointById, updateDatapoint, + deleteDatapoint, } from '../../modules/datapoints/datapoint-manager'; const router = Router(); @@ -38,4 +39,15 @@ router.put('/:id', (req, res): void => { } }); +// DELETE /api/datapoints/:id +router.delete('/:id', (req, res): void => { + try { + const deleted = deleteDatapoint(parseInt(req.params.id)); + if (!deleted) { res.status(404).json({ error: 'Datapoint not found' }); return; } + res.status(204).send(); + } catch (err) { + res.status(500).json({ error: (err as Error).message }); + } +}); + export default router; diff --git a/display/middleware/src/modules/datapoints/datapoint-manager.ts b/display/middleware/src/modules/datapoints/datapoint-manager.ts index 6e64e5c..4157b8a 100644 --- a/display/middleware/src/modules/datapoints/datapoint-manager.ts +++ b/display/middleware/src/modules/datapoints/datapoint-manager.ts @@ -118,6 +118,12 @@ export function createDatapointFromPg( return db.prepare('SELECT * FROM datapoints WHERE id = ?').get(id) as Datapoint; } +export function deleteDatapoint(id: number): boolean { + const db = getDb(); + const result = db.prepare('DELETE FROM datapoints WHERE id = ?').run(id); + return (result.changes as number) > 0; +} + export function getDatapointByTopicId(topicId: number): Datapoint | undefined { const db = getDb(); return db