From a65d13468248eb6b219840d1e2dab5266fcab1b6 Mon Sep 17 00:00:00 2001 From: Dusan Vojacek Date: Fri, 10 Apr 2026 22:49:43 +0200 Subject: [PATCH] flwo - denni sankey graf --- docs/04-modules/energy-flows.md | 2 +- frontend/src/pages/EnergyFlows.tsx | 59 ++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/docs/04-modules/energy-flows.md b/docs/04-modules/energy-flows.md index 3baffb7..9036551 100644 --- a/docs/04-modules/energy-flows.md +++ b/docs/04-modules/energy-flows.md @@ -28,7 +28,7 @@ Základní 6 Wh veličin (import/export, PV, baterie, load) zůstává ve Fázi ## UI -- Sankey (`@nivo/sankey`) – součet toků za zvolený měsíc. Síť je ve vizualizaci rozdělena na **Import ze sítě** a **Export do sítě** (jinak by vznikl cyklus síť↔baterie a knihovna hlásí „circular link“). +- Sankey (`@nivo/sankey`) – součet toků za **celý měsíc** nebo za **jeden vybraný den** (rozbalovací pole „Graf a karty“; klik na název dne v tabulce také přepne den). Síť je ve vizualizaci rozdělena na **Import ze sítě** a **Export do sítě** (jinak by vznikl cyklus síť↔baterie a knihovna hlásí „circular link“). - Tři perspektivní karty (FVE / síť / baterie). - Tabulka dnů s rozbalením na 15min intervaly. diff --git a/frontend/src/pages/EnergyFlows.tsx b/frontend/src/pages/EnergyFlows.tsx index 6de83d8..4f102fd 100644 --- a/frontend/src/pages/EnergyFlows.tsx +++ b/frontend/src/pages/EnergyFlows.tsx @@ -1,5 +1,5 @@ import { ChevronDown, ChevronLeft, ChevronRight, ChevronUp } from 'lucide-react' -import { Fragment, useMemo, useState } from 'react' +import { Fragment, useEffect, useMemo, useState } from 'react' import { EnergyFlowSankey, type FlowTotals } from '../components/EnergyFlowSankey' import { useEnergyFlowsDaily, useEnergyFlowsIntervals } from '../hooks/useEnergyFlows' @@ -132,10 +132,23 @@ export default function EnergyFlows() { const [month, setMonth] = useState(currentMonth) const [expandedDay, setExpandedDay] = useState(null) + /** null = součet za celý měsíc; jinak ISO den pro Sankey + perspektivní karty */ + const [scopeDay, setScopeDay] = useState(null) const { days, loading, error, reload } = useEnergyFlowsDaily(siteId, month) - const totals = useMemo(() => (days.length > 0 ? aggregateFlows(days) : null), [days]) + useEffect(() => { + setScopeDay(null) + }, [month]) + + const totals = useMemo(() => { + if (days.length === 0) return null + if (scopeDay) { + const row = days.find((d) => d.day === scopeDay) + if (row) return aggregateFlows([row]) + } + return aggregateFlows(days) + }, [days, scopeDay]) const flowOnly: FlowTotals | null = totals ? { @@ -201,6 +214,30 @@ export default function EnergyFlows() { ) : ( <> + {days.length > 0 && ( +
+ + +
+ )} + {totals && (
@@ -243,7 +280,9 @@ export default function EnergyFlows() { )}
-

Sankey — součet za měsíc

+

+ Sankey — {scopeDay ? fmtDay(scopeDay) : 'celý měsíc (součet)'} +

@@ -281,7 +320,19 @@ export default function EnergyFlows() { {expandedDay === row.day ? : } - {fmtDay(row.day)} + {row.pv_production_kwh.toFixed(1)} {row.grid_import_kwh.toFixed(2)}