67cb58ed0b
Buscador de Proyectos: ahora busca tambien en actividades y tareas de cualquier proyecto (antes solo nombre/codigo del proyecto). Resultados en un panel flotante con la ruta completa "Proyecto - Actividad - Tarea"; clic navega al proyecto y abre la actividad encontrada (pestaña Tareas si el resultado era una tarea). Buscador de Actividades (dentro de un proyecto): busca tambien en las tareas de esa actividad, mismo panel con "Actividad - Tarea". Nuevo GET /api/search?q=...&projectId= (global o acotado a un proyecto). Nuevos componentes/hooks reutilizables: SearchResultsDropdown, useDebouncedValue. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
25 lines
1007 B
React
25 lines
1007 B
React
// Generico: el llamador arma `items` como [{ key, breadcrumb: [..partes..], onClick }] — este
|
|
// componente solo los pinta como "parte1 - parte2 - parte3", clicables, en un panel flotante bajo
|
|
// el buscador. Reutilizado por el buscador global de Proyectos ("Proyecto - Actividad - Tarea") y
|
|
// por el buscador de Actividades dentro de un proyecto ("Actividad - Tarea").
|
|
export function SearchResultsDropdown({ items, emptyLabel }) {
|
|
return (
|
|
<div className="search-results-dropdown">
|
|
{items.length === 0 ? (
|
|
<div className="search-results-empty">{emptyLabel}</div>
|
|
) : (
|
|
items.map((item) => (
|
|
<button key={item.key} type="button" className="search-results-item" onClick={item.onClick}>
|
|
{item.breadcrumb.map((part, i) => (
|
|
<span key={i}>
|
|
{i > 0 && <span className="search-results-sep"> — </span>}
|
|
{part}
|
|
</span>
|
|
))}
|
|
</button>
|
|
))
|
|
)}
|
|
</div>
|
|
);
|
|
}
|