defmodule Oban.Web.ShortcutsComponent do
use Oban.Web, :live_component
@impl Phoenix.LiveComponent
def render(assigns) do
~H"""
Keyboard Shortcuts
<.list_item description="Go to jobs" shortcut="J" />
<.list_item description="Go to queues" shortcut="Q" />
<.list_item description="Go to crons" shortcut="C" />
<.list_item description="Go to workflows" shortcut="W" />
<.list_item description="Focus search" shortcut="/" />
<.list_item description="Toggle refresh" shortcut="r" />
<.list_item description="Cycle themes" shortcut="t" />
<.list_item description="Open this modal" shortcut="?" />
"""
end
attr :description, :string, required: true
attr :shortcut, :string, required: true
defp list_item(assigns) do
~H"""
{@description}
{@shortcut}
"""
end
# JS
defp show_modal do
%JS{}
|> JS.show(to: "#shortcuts")
|> JS.show(
to: "#shortcuts-bg",
transition: {"transition-all transform ease-out duration-300", "opacity-0", "opacity-100"}
)
|> JS.show(
to: "#shortcuts-container",
transition:
{"transition-all transform ease-out duration-300",
"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95",
"opacity-100 translate-y-0 sm:scale-100"}
)
|> JS.add_class("overflow-hidden", to: "body")
end
defp hide_modal do
%JS{}
|> JS.hide(
to: "#shortcuts-bg",
transition: {"transition-all transform ease-in duration-200", "opacity-100", "opacity-0"}
)
|> JS.hide(
to: "#shortcuts-container",
time: 200,
transition:
{"transition-all transform ease-in duration-200",
"opacity-100 translate-y-0 sm:scale-100",
"opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"}
)
|> JS.hide(to: "#shortcuts", transition: {"block", "block", "hidden"})
|> JS.remove_class("overflow-hidden", to: "body")
|> JS.pop_focus()
end
end