fix(kanban): eliminar botón duplicado + exportar en tab bar

- Eliminado botón kanban duplicado en contenido de 'Mis leads'
- Botón 'Exportar' movido al final de la barra de pestañas (junto a Kanban)
- Exportar aparece en leads, oportunidades y apartados
- Un solo botón Kanban/Lista visible en todas las pestañas
This commit is contained in:
2026-09-08 09:12:47 +00:00
parent 8212fd919e
commit 8f39b7178c

View File

@@ -510,12 +510,14 @@ function TabsCrm({
onCambiar, onCambiar,
vistaKanban, vistaKanban,
onToggleKanban, onToggleKanban,
onExportar,
}: { }: {
activa: TabCrm activa: TabCrm
conteos: Record<TabCrm, number> conteos: Record<TabCrm, number>
onCambiar: (tab: TabCrm) => void onCambiar: (tab: TabCrm) => void
vistaKanban: boolean vistaKanban: boolean
onToggleKanban: () => void onToggleKanban: () => void
onExportar?: () => void
}) { }) {
const tabs: { id: TabCrm; titulo: string }[] = [ const tabs: { id: TabCrm; titulo: string }[] = [
{ id: 'leads', titulo: 'Mis leads' }, { id: 'leads', titulo: 'Mis leads' },
@@ -549,13 +551,24 @@ function TabsCrm({
) )
})} })}
{activa !== 'tablero' && ( {activa !== 'tablero' && (
<div className="ml-auto flex gap-1">
{onExportar && (
<button
type="button"
onClick={onExportar}
className="rounded-lg border border-[#D1D5DB] bg-white px-3 py-1.5 text-xs font-medium text-[#374151] shadow-sm transition-all hover:bg-[#F9FAFB] dark:border-[#334155] dark:bg-[#0F172A] dark:text-[#CBD5E1] dark:hover:bg-[#1E293B]"
>
📥 Exportar
</button>
)}
<button <button
type="button" type="button"
onClick={onToggleKanban} onClick={onToggleKanban}
className="ml-auto rounded-lg border border-[#D1D5DB] bg-white px-3 py-1.5 text-xs font-medium text-[#374151] shadow-sm transition-all hover:bg-[#F9FAFB] dark:border-[#334155] dark:bg-[#0F172A] dark:text-[#CBD5E1] dark:hover:bg-[#1E293B]" className="rounded-lg border border-[#D1D5DB] bg-white px-3 py-1.5 text-xs font-medium text-[#374151] shadow-sm transition-all hover:bg-[#F9FAFB] dark:border-[#334155] dark:bg-[#0F172A] dark:text-[#CBD5E1] dark:hover:bg-[#1E293B]"
> >
{vistaKanban ? '📋 Lista' : '📊 Kanban'} {vistaKanban ? '📋 Lista' : '📊 Kanban'}
</button> </button>
</div>
)} )}
</div> </div>
) )
@@ -1036,25 +1049,18 @@ export default function MiDiaPage({ accionesSesion }: { accionesSesion: Acciones
onCambiar={setTabCrm} onCambiar={setTabCrm}
vistaKanban={vistaKanban} vistaKanban={vistaKanban}
onToggleKanban={() => setVistaKanban(!vistaKanban)} onToggleKanban={() => setVistaKanban(!vistaKanban)}
onExportar={
tabCrm === 'leads' ? () => exportarLeads(resumen.misLeads.filter((l) => l.fuente === 'lead')) :
tabCrm === 'oportunidades' ? () => exportarOportunidades(resumen.misOportunidades.items) :
tabCrm === 'apartados' ? () => exportarApartados(resumen.misApartados) :
undefined
}
/> />
{tabCrm !== 'tablero' && ( {tabCrm !== 'tablero' && (
<FiltrosAvanzados valor={filtros} onChange={setFiltros} /> <FiltrosAvanzados valor={filtros} onChange={setFiltros} />
)} )}
{/* Toggle Kanban / Lista */}
{tabCrm === 'leads' && (
<div className="mb-3 flex justify-end">
<button
type="button"
onClick={() => setVistaKanban((v) => !v)}
className="rounded-lg border border-[#D1D5DB] bg-white px-3 py-1.5 text-xs font-medium text-[#374151] shadow-sm transition-all duration-100 ease-out hover:bg-[#F9FAFB] dark:bg-[#0F172A] dark:border-[#334155] dark:text-[#CBD5E1]"
>
{vistaKanban ? '📋 Lista' : '📊 Kanban'}
</button>
</div>
)}
{tabCrm === 'leads' && (() => { {tabCrm === 'leads' && (() => {
const leadsFiltrados = aplicarFiltros( const leadsFiltrados = aplicarFiltros(
resumen.misLeads.filter((l) => l.fuente === 'lead'), resumen.misLeads.filter((l) => l.fuente === 'lead'),
@@ -1067,15 +1073,7 @@ export default function MiDiaPage({ accionesSesion }: { accionesSesion: Acciones
) )
return ( return (
<> <>
<div className="mb-2 flex justify-end">
<button
type="button"
onClick={() => exportarLeads(leadsFiltrados)}
className="rounded-lg border border-[#D1D5DB] bg-white px-3 py-1.5 text-xs font-medium text-[#374151] shadow-sm transition-all duration-100 ease-out hover:bg-[#F9FAFB] dark:bg-[#0F172A] dark:border-[#334155] dark:text-[#CBD5E1]"
>
Exportar
</button>
</div>
{leadsFiltrados.length === 0 ? ( {leadsFiltrados.length === 0 ? (
<EstadoVacio mensaje="Sin leads asignados" /> <EstadoVacio mensaje="Sin leads asignados" />
) : vistaKanban ? ( ) : vistaKanban ? (
@@ -1125,15 +1123,7 @@ export default function MiDiaPage({ accionesSesion }: { accionesSesion: Acciones
) )
return ( return (
<> <>
<div className="mb-2 flex justify-end">
<button
type="button"
onClick={() => exportarOportunidades(opsFiltradas)}
className="rounded-lg border border-[#D1D5DB] bg-white px-3 py-1.5 text-xs font-medium text-[#374151] shadow-sm transition-all duration-100 ease-out hover:bg-[#F9FAFB] dark:bg-[#0F172A] dark:border-[#334155] dark:text-[#CBD5E1]"
>
Exportar
</button>
</div>
{opsFiltradas.length === 0 ? ( {opsFiltradas.length === 0 ? (
<EstadoVacio mensaje="Sin oportunidades asignadas" /> <EstadoVacio mensaje="Sin oportunidades asignadas" />
) : vistaKanban ? ( ) : vistaKanban ? (
@@ -1178,15 +1168,7 @@ export default function MiDiaPage({ accionesSesion }: { accionesSesion: Acciones
) )
return ( return (
<> <>
<div className="mb-2 flex justify-end">
<button
type="button"
onClick={() => exportarApartados(apartadosFiltrados)}
className="rounded-lg border border-[#D1D5DB] bg-white px-3 py-1.5 text-xs font-medium text-[#374151] shadow-sm transition-all duration-100 ease-out hover:bg-[#F9FAFB] dark:bg-[#0F172A] dark:border-[#334155] dark:text-[#CBD5E1]"
>
Exportar
</button>
</div>
{apartadosFiltrados.length === 0 ? ( {apartadosFiltrados.length === 0 ? (
<EstadoVacio mensaje="Sin apartados asignados" /> <EstadoVacio mensaje="Sin apartados asignados" />
) : vistaKanban ? ( ) : vistaKanban ? (