Spaces:
Sleeping
Sleeping
File size: 2,383 Bytes
197ac2a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | import { useMemo, useState } from "react";
import { marked } from "marked";
import SecaoHeader from "../components/SecaoHeader.jsx";
// Divide o Markdown do relatório em seções por "## " para exibir em abas
// (igual ao painel anterior) — não interpreta nem recalcula nada, só
// reformata o texto que o backend já gerou.
function dividirSecoes(md) {
const linhas = (md || "").split("\n");
const secoes = [];
let atual = null;
for (const ln of linhas) {
const m = ln.match(/^##\s+(.*)/);
if (m) {
if (atual) secoes.push(atual);
atual = { titulo: m[1].trim(), corpo: "" };
} else if (atual) {
atual.corpo += ln + "\n";
}
}
if (atual) secoes.push(atual);
return [{ titulo: "Tudo", corpo: md || "" }].concat(
secoes.map((s) => ({ titulo: s.titulo.replace(/^\d+\.\s*/, ""), corpo: "## " + s.titulo + "\n" + s.corpo }))
);
}
export default function Report({ dia }) {
const md = dia.report_markdown || "_Sem relatório._";
const abas = useMemo(() => dividirSecoes(md), [md]);
const [ativa, setAtiva] = useState(0);
function copiar() {
navigator.clipboard.writeText(md);
}
function baixar() {
const blob = new Blob([md], { type: "text/markdown" });
const a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = "relatorio_" + (dia.date || "af") + ".md";
a.click();
}
return (
<div className="card">
<SecaoHeader
icone="📄"
titulo={"Relatório — " + dia.date}
cor="#6366f1"
extra={
<span style={{ display: "flex", gap: 8 }}>
<button className="btn btn-ghost btn-sm" onClick={copiar}>
Copiar
</button>
<button className="btn btn-ghost btn-sm" onClick={baixar}>
Baixar .md
</button>
</span>
}
/>
<div className="tabs">
{abas.map((a, i) => (
<div key={i} className={"tab" + (i === ativa ? " active" : "")} onClick={() => setAtiva(i)}>
{a.titulo}
</div>
))}
</div>
<div id="panels">
{abas.map((a, i) => (
<div
key={i}
className={"panel" + (i === ativa ? " active" : "")}
dangerouslySetInnerHTML={{ __html: marked.parse(a.corpo) }}
/>
))}
</div>
</div>
);
}
|