import type { ReactNode } from 'react'; import { NavIcon } from '../../NavIcon'; import { __ } from '../../../lib/i18n'; export type SortFieldOption = { value: string; label: string }; type Props = { searchValue: string; onSearchChange: (v: string) => void; searchPlaceholder: string; /** Grey out search (e.g. when another filter makes search unavailable). */ searchDisabled?: boolean; sortField: string; sortFieldOptions: SortFieldOption[]; onSortFieldChange: (v: string) => void; sortOrder: 'asc' | 'desc'; onSortOrderToggle: () => void; /** Extra controls (e.g. column visibility) shown after sort controls. */ trailing?: ReactNode; }; const selectClass = 'rounded-xl border border-slate-200 bg-white px-3 py-2 text-sm font-medium text-slate-700 shadow-sm focus:border-brand-500 focus:outline-none focus:ring-2 focus:ring-brand-500/20 dark:border-slate-600 dark:bg-slate-800 dark:text-slate-200'; /** * Search + sort row for entity list pages (reusable). */ export function ListSearchToolbar({ searchValue, onSearchChange, searchPlaceholder, searchDisabled = false, sortField, sortFieldOptions, onSortFieldChange, sortOrder, onSortOrderToggle, trailing, }: Props) { return (
onSearchChange(e.target.value)} placeholder={searchPlaceholder} disabled={searchDisabled} className="w-full rounded-xl border border-slate-200 bg-slate-50/80 py-2.5 pl-10 pr-3 text-sm text-slate-900 placeholder:text-slate-400 focus:border-brand-500 focus:bg-white focus:outline-none focus:ring-2 focus:ring-brand-500/20 disabled:cursor-not-allowed disabled:opacity-50 dark:border-slate-600 dark:bg-slate-800/80 dark:text-white dark:placeholder:text-slate-500 dark:focus:bg-slate-800" autoComplete="off" />
{trailing ? (
{trailing}
) : null}
); }