ldc-ovoteam/resources/ts/back/Components/Table/DataTableSearch.tsx

89 lines
2.2 KiB
TypeScript
Raw Permalink Normal View History

2026-03-30 14:17:31 +02:00
import { DeleteIcon } from "lucide-react";
import { type ReactNode, type SubmitEvent, useState } from "react";
2026-03-30 14:17:31 +02:00
import BtnOptionnalLinkWithTooltip from "@/back/Components/BtnOptionnalLinkWithTooltip";
import InputError from "@/back/Components/InputError";
import SimpleString from "@/back/Components/Inputs/SimpleString";
import AddFilterToUrl from "@/back/lib/filters";
import trans from "@/hooks/use-translations";
2026-03-30 14:17:31 +02:00
interface DataTableSearchProps {
2026-03-30 14:17:31 +02:00
modelRoute: string;
prefixRoute: string;
2026-03-30 14:17:31 +02:00
searchFields: string;
isArchiveRoute?: boolean;
children?: ReactNode;
}
2026-03-30 14:17:31 +02:00
export default function DataTableSearch({
modelRoute,
prefixRoute,
2026-03-30 14:17:31 +02:00
searchFields,
isArchiveRoute = false,
children,
}: DataTableSearchProps) {
const routeSearch = route().params.search;
const [search, setSearch] = useState<string | null>(routeSearch);
2026-03-30 14:17:31 +02:00
const submit = (e: SubmitEvent) => {
2026-03-30 14:17:31 +02:00
if (!search) return;
e.preventDefault();
const params = {
...route().params,
search,
};
AddFilterToUrl({
modelRoute: modelRoute,
prefixRoute: prefixRoute,
2026-03-30 14:17:31 +02:00
params,
isArchiveRoute,
});
};
const onDeleteSearch = () => {
setSearch(null);
const params = {
...route().params,
search: undefined,
};
AddFilterToUrl({
modelRoute: modelRoute,
prefixRoute: prefixRoute,
2026-03-30 14:17:31 +02:00
params,
isArchiveRoute,
});
};
return (
<>
<form
onSubmit={submit}
className="flex justify-between items-end gap-2 mb-4"
>
<SimpleString
name="search"
label={trans("uwil-backend::back.table_search", {
2026-03-30 14:17:31 +02:00
params: { searchFields },
})}
placeholder="ex: John Doe"
value={search ?? undefined}
wordCounter={false}
setData={(name, value) => {
setSearch(value);
}}
className="w-[calc(100%-40px-0.5rem)]"
/>
{children}
<BtnOptionnalLinkWithTooltip
content={<DeleteIcon />}
tooltipContent={
<p>{trans("uwil-backend::back.table_search_reset")}</p>
2026-03-30 14:17:31 +02:00
}
type="button"
variant="destructive"
onClick={onDeleteSearch}
/>
</form>
<InputError all />
</>
);
}