Hi, I’ve declared two fields as filterable in the schema.
Schema
//territory/country.ex
@derive {
Flop.Schema,
filterable: [:country_code, :country_name],
sortable: [:country_id, :country_code, :country_name],
default_limit: 10
}
schema "countries" do
field :country_id, :integer
field :country_code, :string
field :country_name, :string
field :iso3, :string
timestamps(type: :utc_datetime)
end
I’ve created a search function
Search Function
//territory.ex
def list_countries2(params) do
# Convert search parameter to a query condition
base_query = from c in Country
query = case get_in(params, ["filters", "0", "value"]) do
value when is_binary(value) and value != "" ->
pattern = "%#{String.replace(value, ~r/[%_]/, "\\\\\\0")}%"
from c in base_query,
where: fragment("lower(?) LIKE lower(?) OR lower(?) LIKE lower(?)",
c.country_name, ^pattern,
c.country_code, ^pattern)
_ ->
base_query
end
Flop.validate_and_run(
query,
params,
for: Country,
default_limit: 5,
default_order: [asc: :country_name]
)
end
I’ve created a filter_form
Search Function
attr :fields, :list, required: true
attr :meta, Flop.Meta, required: true
attr :id, :string, default: nil
attr :on_change, :string, default: "update-filter"
attr :target, :string, default: nil
def filter_form(%{meta: meta} = assigns) do
assigns = assign(assigns, form: Phoenix.Component.to_form(meta), meta: nil)
~H"""
<.form
for={@form}
id={@id}
phx-target={@target}
phx-change={@on_change}
phx-submit={@on_change}
>
<.filter_fields :let={i} form={@form} fields={@fields}>
<.input
field={i.field}
type={i.type}
phx-debounce={120}
{i.rest}
/>
</.filter_fields>
</.form>
"""
end
//flop_components.ex
I’ve added a search box to the component in the template
heex template
//index.html.heex
<.filter_form
fields={[country_name: [op: :like, autofocus: true, type: "search", phx_debounce: "150", placeholder: "Search Country, Code..."]]}
meta={@meta}
id="country-filter-form"
/>
But…when I search, I can only search in the one field - country_name. If I add another filterable field country_code in the heex template, it adds entire another search box for that field.
I need to have one search box and to be able to search for all the fields that are declared in the Flop.Schema as filterable. How to do it? Thanks