Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions app/dashboard/crm/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ export default async function CrmPage({
style={{
borderRight: "0.5px solid rgba(255,255,255,0.08)",
overflowY: "auto",
minHeight: 0,
padding: 10,
// Isola a pintura e impede o scroll de "vazar" pra página —
// junto com content-visibility nas linhas, deixa o scroll
Expand All @@ -143,7 +144,7 @@ export default async function CrmPage({
/>
</div>

<div className="crm-thread-pane" style={{ minWidth: 0 }}>
<div className="crm-thread-pane" style={{ minWidth: 0, minHeight: 0 }}>
{lead ? (
<Thread
key={lead.id}
Expand All @@ -167,7 +168,7 @@ export default async function CrmPage({

{aba === "kanban" && (
<div className="glass" style={{ height: "100%", padding: 16, overflow: "hidden" }}>
<Kanban etapas={etapas} leads={leads} corPorEmpresa={corPorEmpresa} />
<Kanban etapas={etapas} leads={leads} corPorEmpresa={corPorEmpresa} etiquetas={etiquetas} />
</div>
)}

Expand Down
53 changes: 50 additions & 3 deletions components/crm/ConversasFiltravel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type { CrmInstanciaRow } from "@/lib/crm-instancias-actions"
import {
PERIODOS_CONVERSA,
calcularRangeConversa,
formatarDataBR,
type PeriodoConversaKey,
} from "@/lib/crm-periodos"
import { casaBusca } from "@/lib/crm-busca"
Expand Down Expand Up @@ -40,12 +41,33 @@ export default function ConversasFiltravel({
const [aberto, setAberto] = useState(false)
const [etiquetaId, setEtiquetaId] = useState<string | null>(null)
const [periodo, setPeriodo] = useState<PeriodoConversaKey>("todos")
const [dataDe, setDataDe] = useState("")
const [dataAte, setDataAte] = useState("")
const [busca, setBusca] = useState("")

const hoje = useMemo(() => new Date(), [])

// "Personalizado…": o usuário escolhe as datas — só "de" já filtra aquele
// dia único; "até" preenchido também estende pro intervalo. Enquanto
// nenhuma data foi escolhida ainda, cai no fallback (sem filtro) do
// calcularRangeConversa, igual ao período "Personalizado" do Calendário.
const rangePersonalizado = useMemo(() => {
if (periodo !== "personalizado" || !dataDe) return null
const iniD = new Date(`${dataDe}T00:00:00`)
const fimD = dataAte
? new Date(`${dataAte}T23:59:59.999`)
: new Date(`${dataDe}T23:59:59.999`)
return iniD.getTime() <= fimD.getTime()
? { inicio: iniD, fim: fimD }
: { inicio: new Date(`${dataAte}T00:00:00`), fim: new Date(`${dataDe}T23:59:59.999`) }
}, [periodo, dataDe, dataAte])

const range = useMemo(
() => calcularRangeConversa(periodo, hoje),
[periodo, hoje]
() =>
periodo === "personalizado"
? rangePersonalizado
: calcularRangeConversa(periodo, hoje),
[periodo, hoje, rangePersonalizado]
)

const leadsFiltrados = useMemo(() => {
Expand All @@ -69,11 +91,16 @@ export default function ConversasFiltravel({
const etiquetaAtiva = etiquetaId
? etiquetas.find((e) => e.id === etiquetaId)
: null
const periodoLabel = PERIODOS_CONVERSA.find((p) => p.chave === periodo)?.label
const periodoLabel =
periodo === "personalizado" && rangePersonalizado
? `${formatarDataBR(rangePersonalizado.inicio)} – ${formatarDataBR(rangePersonalizado.fim)}`
: PERIODOS_CONVERSA.find((p) => p.chave === periodo)?.label

function limpar() {
setEtiquetaId(null)
setPeriodo("todos")
setDataDe("")
setDataAte("")
setBusca("")
}

Expand Down Expand Up @@ -189,6 +216,26 @@ export default function ConversasFiltravel({
</option>
))}
</select>
{periodo === "personalizado" && (
<div className="flex items-center gap-1" style={{ marginTop: 8 }}>
<input
type="date"
value={dataDe}
onChange={(e) => setDataDe(e.target.value)}
className="glass-input"
style={{ fontSize: 12, padding: "6px 8px", borderRadius: 8, flex: 1, minWidth: 0 }}
/>
<span style={{ fontSize: 11, color: "var(--text-4)" }}>até</span>
<input
type="date"
value={dataAte}
onChange={(e) => setDataAte(e.target.value)}
placeholder="Opcional"
className="glass-input"
style={{ fontSize: 12, padding: "6px 8px", borderRadius: 8, flex: 1, minWidth: 0 }}
/>
</div>
)}
</div>

{temFiltro && (
Expand Down
2 changes: 1 addition & 1 deletion components/crm/InformacoesContato.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ export default function InformacoesContato({
</div>
{campos.length === 0 ? (
<p style={{ fontSize: 12, color: "var(--text-4)" }}>
Nenhum campo extra ainda — ex: CPF, aniversário, indicação…
Nenhum campo extra ainda. Ex: CPF, aniversário, indicação…
</p>
) : (
<div style={{ display: "flex", flexDirection: "column", gap: 8 }}>
Expand Down
Loading