/* ============================================================ KeS Metas — Tarefas (agenda de afazeres da equipe) - Padrão: tarefas de hoje + amanhã - Atrasadas (vencidas e não concluídas) sempre aparecem - Filtro de datas para ver tarefas anteriores - Permissão: líder/admin veem todas; comum vê só as próprias ============================================================ */ const { useState, useRef, useEffect } = React; /* ---- Períodos do filtro de tarefas (inclui datas futuras) ---- */ function rangePreset(name) { const K = window.KES; const iso = K.iso; const today = new Date(K.iso(K.SIM_TODAY) + "T00:00:00"); if (name === "hoje") return { preset: "hoje", start: iso(today), end: iso(today), label: "Hoje" }; if (name === "hojeAmanha") return { preset: "hojeAmanha", start: iso(today), end: iso(K.addDays(today, 1)), label: "Hoje e amanhã" }; if (name === "semana") { const dow = (today.getDay() + 6) % 7; // 0 = segunda const s = K.addDays(today, -dow); return { preset: "semana", start: iso(s), end: iso(K.addDays(s, 6)), label: "Esta semana" }; } if (name === "mes") { const s = new Date(today.getFullYear(), today.getMonth(), 1); const e = new Date(today.getFullYear(), today.getMonth() + 1, 0); return { preset: "mes", start: iso(s), end: iso(e), label: "Este mês" }; } if (name === "mesPassado") { const s = new Date(today.getFullYear(), today.getMonth() - 1, 1); const e = new Date(today.getFullYear(), today.getMonth(), 0); return { preset: "mesPassado", start: iso(s), end: iso(e), label: "Mês passado" }; } return rangePreset("hojeAmanha"); } /* ---- Filtro de período (mesmo visual dos painéis), com datas futuras ---- */ function FiltroPeriodoTarefas({ value, onChange }) { const K = window.KES; const [open, setOpen] = useState(false); const ref = useRef(null); const popRef = useRef(null); useEffect(() => { const h = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }; document.addEventListener("mousedown", h); return () => document.removeEventListener("mousedown", h); }, []); // Mantém o popup dentro da tela em qualquer posição/tamanho. useEffect(() => { if (!open || !popRef.current) return; const el = popRef.current; el.style.transform = ""; const r = el.getBoundingClientRect(); const m = 8; let dx = 0; if (r.right > window.innerWidth - m) dx = (window.innerWidth - m) - r.right; else if (r.left < m) dx = m - r.left; if (dx) el.style.transform = "translateX(" + Math.round(dx) + "px)"; }, [open]); const atalhos = [["hojeAmanha", "Hoje e amanhã"], ["hoje", "Hoje"], ["semana", "Esta semana"], ["mes", "Este mês"], ["mesPassado", "Mês passado"]]; const labelText = value.preset === "custom" ? `${K.fmtBR(value.start)} – ${K.fmtBR(value.end)}` : value.label; return (
{open && (
{atalhos.map(([k, lbl]) => ( ))}
onChange({ ...value, preset: "custom", start: e.target.value, label: "Personalizado" })} /> onChange({ ...value, preset: "custom", end: e.target.value, label: "Personalizado" })} />
)}
); } /* ---- Modal para criar/editar tarefa (reutilizável) ---- */ function TarefaModal({ initial, state, viewer, dispatch, onClose, leadFixo }) { const K = window.KES; const isAdmin = viewer.papel === "admin" || viewer.cargo === "lider"; const editing = !!(initial && initial.id); const hojeISO = K.iso(K.SIM_TODAY); const [f, setF] = useState(initial || { titulo: "", descricao: "", data: hojeISO, hora: "09:00", responsavelId: viewer.id, leadId: leadFixo ? leadFixo.id : "", }); const [err, setErr] = useState(""); const set = (k, v) => setF((s) => ({ ...s, [k]: v })); function salvar() { if (!f.titulo.trim()) return setErr("Descreva a tarefa."); if (!f.data) return setErr("Escolha a data."); const dados = { titulo: f.titulo.trim(), descricao: (f.descricao || "").trim(), data: f.data, hora: f.hora || "", responsavelId: f.responsavelId || viewer.id, leadId: f.leadId || null, criadaPor: viewer.id, }; if (editing) dispatch({ type: "UPDATE_TAREFA", id: initial.id, patch: dados }); else dispatch({ type: "ADD_TAREFA", tarefa: dados }); dispatch({ type: "TOAST", msg: editing ? "Tarefa atualizada." : "Tarefa agendada." }); onClose(); } const leadVinc = leadFixo || (f.leadId ? (state.leads || []).find((l) => l.id === f.leadId) : null); return ( Cancelar {editing ? "Salvar" : "Agendar tarefa"}}> {leadVinc && (
Vinculada ao lead: {leadVinc.nome}{leadVinc.empresa ? " · " + leadVinc.empresa : ""}
)} set("titulo", e.target.value)} placeholder="Ex.: Ligar para o cliente, enviar proposta…" />