Better encapsulation for universal search

This commit is contained in:
Claudio Ortolina
2025-08-30 22:30:43 +03:00
parent 7358608eca
commit a755633877
5 changed files with 46 additions and 40 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ defmodule MusicLibraryWeb.Layouts do
""" """
use MusicLibraryWeb, :html use MusicLibraryWeb, :html
alias Phoenix.LiveView.ColocatedHook import MusicLibraryWeb.UniversalSearchLive.Index, only: [universal_search_trigger: 1]
embed_templates "layouts/*" embed_templates "layouts/*"
@@ -38,37 +38,7 @@
</div> </div>
</div> </div>
<div class="flex space-x-2 md:space-x-4 items-center"> <div class="flex space-x-2 md:space-x-4 items-center">
<script :type={ColocatedHook} name=".SearchGlobalShortcut"> <.universal_search_trigger />
export default {
mounted() {
const universalSearchButton = document.querySelector("#universal-search-button");
document.addEventListener("keydown", (event) => {
switch (event.key) {
case "k":
if (event.metaKey || event.ctrlKey) {
event.preventDefault();
universalSearchButton.click();
}
break;
default:
break;
}
});
},
};
</script>
<.button
id="universal-search-button"
variant="ghost"
title={gettext("Search (Ctrl+K)")}
phx-click="open_modal"
phx-target="#universal-search"
phx-hook=".SearchGlobalShortcut"
>
<span class="sr-only">{gettext("Search (Ctrl+K)")}</span>
<.icon name="hero-magnifying-glass" class="h-5 w-5" />
</.button>
<.dropdown placement="bottom-end"> <.dropdown placement="bottom-end">
<:toggle> <:toggle>
<button class="flex items-center text-zinc-500 hover:text-zinc-700 dark:text-zinc-300 dark:hover:text-zinc-200 gap-x-2"> <button class="flex items-center text-zinc-500 hover:text-zinc-700 dark:text-zinc-300 dark:hover:text-zinc-200 gap-x-2">
@@ -150,9 +120,4 @@
</div> </div>
</main> </main>
<div> {MusicLibraryWeb.UniversalSearchLive.Index.live(@socket)}
{live_render(@socket, MusicLibraryWeb.UniversalSearchLive.Index,
id: "universal-search",
session: %{}
)}
</div>
@@ -4,6 +4,47 @@ defmodule MusicLibraryWeb.UniversalSearchLive.Index do
import MusicLibraryWeb.SearchComponents import MusicLibraryWeb.SearchComponents
alias MusicLibrary.Search alias MusicLibrary.Search
alias Phoenix.LiveView.ColocatedHook
def live(socket) do
live_render(socket, __MODULE__, id: "universal-search", session: %{})
end
def universal_search_trigger(assigns) do
~H"""
<script :type={ColocatedHook} name=".SearchGlobalShortcut">
export default {
mounted() {
const universalSearchButton = document.querySelector("#universal-search-button");
document.addEventListener("keydown", (event) => {
switch (event.key) {
case "k":
if (event.metaKey || event.ctrlKey) {
event.preventDefault();
universalSearchButton.click();
}
break;
default:
break;
}
});
},
};
</script>
<.button
id="universal-search-button"
variant="ghost"
title={gettext("Search (Ctrl+K)")}
phx-click="open_modal"
phx-target="#universal-search"
phx-hook=".SearchGlobalShortcut"
>
<span class="sr-only">{gettext("Search (Ctrl+K)")}</span>
<.icon name="hero-magnifying-glass" class="h-5 w-5" />
</.button>
"""
end
@impl true @impl true
def mount(_params, _session, socket) do def mount(_params, _session, socket) do
+1 -1
View File
@@ -1135,7 +1135,7 @@ msgstr[1] ""
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: lib/music_library_web/components/layouts/app.html.heex #: lib/music_library_web/live/universal_search_live/index.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search (Ctrl+K)" msgid "Search (Ctrl+K)"
msgstr "" msgstr ""
+1 -1
View File
@@ -1135,7 +1135,7 @@ msgstr[1] ""
msgid "Close" msgid "Close"
msgstr "" msgstr ""
#: lib/music_library_web/components/layouts/app.html.heex #: lib/music_library_web/live/universal_search_live/index.ex
#, elixir-autogen, elixir-format #, elixir-autogen, elixir-format
msgid "Search (Ctrl+K)" msgid "Search (Ctrl+K)"
msgstr "" msgstr ""