pelopo
Flop Phoenix - how to filter on all fields declared as filterable?
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
Marked As Solved
pelopo
All is sorted now. I had to use compound_fields and also add the new virtual field that would combine both fields to the list of filterable:
@derive {
Flop.Schema,
filterable: [:country_code, :country_name, :search],
sortable: [:country_id, :country_code, :country_name],
default_limit: 10,
adapter_opts: [
compound_fields: [
search: [:country_code, :country_name]
]
]
}
and I had to change my convoluted query into a simpler Flop’s query.
def list_countries2(params) do
Flop.validate_and_run(
Country,
params,
for: Country,
default_limit: 5,
default_order: [asc: :country_name]
)
end
1
Popular in Questions
I’m brand new to Phoenix and I have stripped one of the demo applications to the bone. I just want to get an svg up on the screen. Here i...
New
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
If I have a post route which an argument:
post /my_post_route/:my_param1, MyController.my_post_handler
How would get the post params ...
New
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
Good day to you all.
I have been struggling to get a query involving like and ilike to work.
Can anyone assist me on this, please?
pro...
New
I’ve got an issue with an app and I’ve no idea of how to troubleshoot it. I’m hoping someone here might have seen something similar.
I p...
New
I tried installing
elixir 1.11.2
erlang 23.3.4
via asdf in my zsh shell. Enabled the versions locally and globally.
When I list them ...
New
Other popular topics
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
What is the proper way to load a module from a file in to IEX?
In the python world, doing something like this pretty standard:
from ....
New
Hello!
tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability.
After spen...
New
Hi,
I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
I am trying to run a deploy with docker and I successfully runned with this command:
docker build -t romenigld/blog-prod .
but when I t...
New
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









