noahsettersten commited on
Commit
3280f20
1 Parent(s): aeeeee4

feat: Search for codes by code or description

Browse files
lib/medical_transcription/coding.ex CHANGED
@@ -35,10 +35,14 @@ defmodule MedicalTranscription.Coding do
35
  num_rows >= 14_567
36
  end
37
 
38
- def get_all_code_vectors do
39
- # TODO: Limit this to a subset of codes for now. This will instead become a search function for auto-complete from
40
- # the UI.
41
- Repo.all(from v in CodeVector, limit: 100)
 
 
 
 
42
  end
43
 
44
  @doc """
 
35
  num_rows >= 14_567
36
  end
37
 
38
+ def search_for_code_vector(""), do: []
39
+
40
+ def search_for_code_vector(text) when is_binary(text) do
41
+ Repo.all(
42
+ from v in CodeVector,
43
+ where: ilike(v.code, ^"%#{text}%") or ilike(v.description, ^"%#{text}%"),
44
+ limit: 5
45
+ )
46
  end
47
 
48
  @doc """
lib/medical_transcription_web/components/code_select.ex CHANGED
@@ -10,37 +10,44 @@ defmodule MedicalTranscriptionWeb.Components.CodeSelect do
10
  def mount(socket) do
11
  socket =
12
  socket
 
13
  |> assign(:codes, [])
14
  |> assign(:selected_code, nil)
15
 
16
  {:ok, socket}
17
  end
18
 
19
- @impl Phoenix.LiveComponent
20
- def update_many(assigns_sockets) do
21
- codes = lookup_codes()
22
-
23
- Enum.map(assigns_sockets, fn {_assigns, socket} ->
24
- assign(socket, :codes, codes)
25
- end)
26
- end
27
-
28
  @impl Phoenix.LiveComponent
29
  def render(assigns) do
30
  ~H"""
31
  <div>
32
  <%= if is_nil(@selected_code) do %>
33
- <select
34
- class="w-full rounded"
35
- phx-change="choose-code"
36
- phx-blur="choose-code"
37
- phx-target={@myself}
38
- >
39
- <option value="0">Choose another code...</option>
40
- <%= for code <- @codes do %>
41
- <option value={code.code}><%= code.code %>: <%= code.description %></option>
42
- <% end %>
43
- </select>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  <% else %>
45
  <p class="leading-normal font-bold text-type-black-primary uppercase">
46
  User-selected code
@@ -60,13 +67,16 @@ defmodule MedicalTranscriptionWeb.Components.CodeSelect do
60
  end
61
 
62
  @impl Phoenix.LiveComponent
63
- def handle_event("choose-code", %{"value" => code}, socket) do
64
- selected_code = Enum.find(socket.assigns.codes, &(&1.code == code))
65
 
66
- {:noreply, assign(socket, :selected_code, selected_code)}
67
  end
68
 
69
- defp lookup_codes do
70
- MedicalTranscription.Coding.get_all_code_vectors()
 
 
 
71
  end
72
  end
 
10
  def mount(socket) do
11
  socket =
12
  socket
13
+ |> assign(:form, to_form(%{"search_term" => ""}))
14
  |> assign(:codes, [])
15
  |> assign(:selected_code, nil)
16
 
17
  {:ok, socket}
18
  end
19
 
 
 
 
 
 
 
 
 
 
20
  @impl Phoenix.LiveComponent
21
  def render(assigns) do
22
  ~H"""
23
  <div>
24
  <%= if is_nil(@selected_code) do %>
25
+ <.form for={@form} phx-change="suggest-code" phx-target={@myself}>
26
+ <.input
27
+ type="text"
28
+ field={@form[:search_term]}
29
+ class="w-full rounded"
30
+ style={if length(@codes) > 0, do: "border-radius: 0.25rem 0.25rem 0 0 !important;"}
31
+ placeholder="Search for another code..."
32
+ phx-change="suggest-code"
33
+ phx-target={@myself}
34
+ />
35
+ </.form>
36
+
37
+ <%= if length(@codes) > 0 do %>
38
+ <div class="border-l border-r border-b border-zinc-400">
39
+ <%= for code <- @codes do %>
40
+ <p
41
+ class="px-2 py-1 text-sm border-b border-zinc-100 hover:bg-blue-200"
42
+ phx-click="choose-code"
43
+ phx-value-code={code.code}
44
+ phx-target={@myself}
45
+ >
46
+ <%= code.code %>: <%= code.description %>
47
+ </p>
48
+ <% end %>
49
+ </div>
50
+ <% end %>
51
  <% else %>
52
  <p class="leading-normal font-bold text-type-black-primary uppercase">
53
  User-selected code
 
67
  end
68
 
69
  @impl Phoenix.LiveComponent
70
+ def handle_event("suggest-code", %{"search_term" => text}, socket) do
71
+ suggested_codes = MedicalTranscription.Coding.search_for_code_vector(text)
72
 
73
+ {:noreply, assign(socket, :codes, suggested_codes)}
74
  end
75
 
76
+ @impl Phoenix.LiveComponent
77
+ def handle_event("choose-code", %{"code" => code}, socket) do
78
+ selected_code = Enum.find(socket.assigns.codes, &(&1.code == code))
79
+
80
+ {:noreply, assign(socket, :selected_code, selected_code)}
81
  end
82
  end