+
+
+
+
+
{monthLabel(data.month)}
+
+ {t.period(d(data.period.from), d(data.period.to))}
+
+
+
+ {data.month !== data.currentMonth ? (
+
+ ) : null}
+
+ {data.canWrite ? (
+
+
+
+
+
+
+
+ askOrRun("copy")}
+ >
+
+ {t.copyPrevious}
+
+
+ askOrRun("actuals")}>
+
+ {t.fromActuals}
+
+
+
+
+ ) : null}
+
+
+
+
+
+
+
+
+
+
+ {data.hasBudget ? (
+
+ ) : null}
+
+
+ {t.totals.monthProgress(data.elapsedDays, data.totalDays, String(monthPct))}
+ {tt.ratioBp !== null ? ` · %${Math.round(tt.ratioBp / 100)}` : ""}
+
+ {tt.plannedMinor ? {t.totals.planned(formatMoney(tt.plannedMinor))} : null}
+ {data.hasBudget && tt.unbudgetedMinor ? (
+
+ {t.totals.unbudgeted}: {formatMoney(tt.unbudgetedMinor)}
+
+ ) : null}
+
+ {data.includesHidden ? (
+ {t.includesHidden}
+ ) : null}
+
+
+
+ {warnings.length ? (
+
+
+ {t.warnings(warnings.length)}
+
+ ) : null}
+
+ {!data.hasBudget ? (
+
+
{t.empty}
+
{t.emptyHint}
+ {data.canWrite ? (
+
+
+
+
+
+ ) : null}
+
+ ) : null}
+
+ {data.lines.length ? (
+
+ {data.lines.map((l) => (
+
+ ))}
+
+ ) : data.hasBudget ? (
+
{t.noSpending}
+ ) : null}
+
+ {pending?.kind === "edit" ?
: null}
+
!o && close()}>
+
+
+ {t.replaceTitle}
+
+ {t.replaceDescription}
+ {pending?.kind === "replace" && pending.source === "actuals"
+ ? ` ${t.fromActualsHint}`
+ : ""}
+
+
+
+ {tr.common.cancel}
+
+
+
+
+
+ );
+}
+
+function Line({ line: l, marker }: { line: BudgetLineView; marker: number }) {
+ const hasLimit = l.limitMinor !== null;
+ return (
+