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>
  );
}