From 5d3fc7d0c4f4fdff6ac02792a681585745de9681 Mon Sep 17 00:00:00 2001 From: Brian Manifold Date: Mon, 26 Aug 2024 14:57:41 -0700 Subject: [PATCH] feat(portal): Update Client index page to search all columns (#6377) Why: * Currently, when searching on the Client index page in the portal, the only field being searched is the Client name. This commit adds the ability to search either the Client name or the Actor name. Closes: #5738 --- .../domain/lib/domain/clients/client/query.ex | 21 +++++++++++++++++++ elixir/apps/web/lib/web/live/actors/show.ex | 1 + elixir/apps/web/lib/web/live/clients/index.ex | 3 +++ 3 files changed, 25 insertions(+) diff --git a/elixir/apps/domain/lib/domain/clients/client/query.ex b/elixir/apps/domain/lib/domain/clients/client/query.ex index f9a5bb3fe..ba3d65f90 100644 --- a/elixir/apps/domain/lib/domain/clients/client/query.ex +++ b/elixir/apps/domain/lib/domain/clients/client/query.ex @@ -112,10 +112,31 @@ defmodule Domain.Clients.Client.Query do title: "Name", type: {:string, :websearch}, fun: &filter_by_name_fts/2 + }, + %Domain.Repo.Filter{ + name: :client_or_actor_name, + title: "Client Name or Actor Name", + type: {:string, :websearch}, + fun: &filter_by_client_or_actor_name/2 } ] def filter_by_name_fts(queryable, name) do {queryable, dynamic([clients: clients], fulltext_search(clients.name, ^name))} end + + def filter_by_client_or_actor_name(queryable, name) do + queryable = + with_named_binding(queryable, :actor, fn queryable, binding -> + join(queryable, :inner, [clients: clients], actor in assoc(clients, ^binding), + as: ^binding + ) + end) + + {queryable, + dynamic( + [clients: clients, actor: actor], + fulltext_search(clients.name, ^name) or fulltext_search(actor.name, ^name) + )} + end end diff --git a/elixir/apps/web/lib/web/live/actors/show.ex b/elixir/apps/web/lib/web/live/actors/show.ex index 5ab78a547..7113cae39 100644 --- a/elixir/apps/web/lib/web/live/actors/show.ex +++ b/elixir/apps/web/lib/web/live/actors/show.ex @@ -31,6 +31,7 @@ defmodule Web.Actors.Show do |> assign_live_table("clients", query_module: Clients.Client.Query, sortable_fields: [], + hide_filters: [:client_or_actor_name], callback: &handle_clients_update!/2 ) |> assign_live_table("flows", diff --git a/elixir/apps/web/lib/web/live/clients/index.ex b/elixir/apps/web/lib/web/live/clients/index.ex index 355181c88..f70fa2126 100644 --- a/elixir/apps/web/lib/web/live/clients/index.ex +++ b/elixir/apps/web/lib/web/live/clients/index.ex @@ -15,6 +15,9 @@ defmodule Web.Clients.Index do sortable_fields: [ {:clients, :name} ], + hide_filters: [ + :name + ], callback: &handle_clients_update!/2 )