import { FC, useEffect } from "react"; import { BaseField } from "../form/base/BaseField"; import { FilterFieldType, FilterLocal, filter_window } from "./utils/types"; import { FieldTypeInput } from "../form/field/type/TypeInput"; import { FieldModifier } from "./FieldModifier"; import { useLocal } from "lib/utils/use-local"; import { FieldCheckbox } from "../form/field/type/TypeCheckbox"; import { SingleOption } from "../form/field/type/TypeSingleOption"; import { MultiOption } from "../form/field/type/TypeMultiOption"; export const FilterField: FC<{ filter: FilterLocal; name?: string; label?: string; type: FilterFieldType; modifiers?: any[]; }> = ({ filter, name, label, type, modifiers }) => { const internal = useLocal({ render_timeout: null as any, search_timeout: null as any, }); if (!name) return <>No Name; if (!filter.fm) return
Loading...
; const fm = filter.fm; filter.types[name] = type; const singleOptions = ["equal", "not_equal"]; const multiOptions = ["includes", "excludes"]; useEffect(() => { clearTimeout(internal.render_timeout); internal.render_timeout = setTimeout(() => { filter_window.prasiContext.render(); }, 500); }, [fm]); let show_modifier = filter.mode !== "inline"; const arg = { name: name || "", fm, label: label || name || "", render: internal.render, prefix: show_modifier ? () => ( { filter.modifiers[name] = modifier; filter.render(); filter_window.prasiContext.render(); }} modifier={filter.modifiers[name]} type={type} /> ) : undefined, onLoad() { return [{ label: "halo", value: "asda" }]; }, subType: singleOptions.includes(filter.modifiers[name]) ? "dropdown" : "typeahead", }; return ( {(field) => { if (type === "search-all") { return (
{ // clearTimeout(internal.search_timeout); // filter.form?.submit(); }} spellCheck={false} className="c-flex-1 c-transition-all c-bg-transparent c-outline-none c-px-2 c-text-sm c-w-full" onChange={(e) => { field.fm.data[name] = e.currentTarget.value; field.fm.render(); clearTimeout(internal.search_timeout); if (!field.fm.data[name]) { fm.submit(); } else { internal.search_timeout = setTimeout(() => { fm?.submit(); }, 1500); } }} onKeyDown={(e) => { if (e.key === "Enter") { clearTimeout(internal.search_timeout); fm?.submit(); } }} />
); } return ( <> {type === "text" && ( )} {type === "number" && ( <> {filter.modifiers[name] === "between" && ( )} )} {type === "date" && ( <> {filter.modifiers[name] === "between" && ( )} )} {type === "boolean" && ( )} {type === "options" && ( <> {singleOptions.includes(filter.modifiers[name]) && ( )} {multiOptions.includes(filter.modifiers[name]) && ( )} )} ); }}
); };