Compare commits

...

4 commits

Author SHA1 Message Date
4f90ccb047 Add deploy local script 2024-05-18 20:51:40 +05:30
0881246d57 Refactor service live for clarity 2024-05-18 20:51:16 +05:30
a0eb9cd518 Fix login UI 2024-05-18 17:36:57 +05:30
9b898a6506 Fix UI layout 2024-05-18 17:36:14 +05:30
6 changed files with 165 additions and 125 deletions

8
deploy-local.sh Normal file
View file

@ -0,0 +1,8 @@
#!/bin/sh
doas service freedive onestop
doas pkg remove -y freedive
mix package
doas pkg install -U -y freedive-0.1.0.pkg
doas service freedive onestart
doas tail -f /var/log/freedive/freedive.log

View file

@ -81,9 +81,7 @@ defmodule Freedive.Api.Service do
broadcast(:stdlog, %{name: name, log: std_to_log(reason)}) broadcast(:stdlog, %{name: name, log: std_to_log(reason)})
end end
if command in ["start", "stop", "restart"] do
broadcast(:refreshed, service_details(name)) broadcast(:refreshed, service_details(name))
end
{:noreply, state} {:noreply, state}
end end

View file

@ -107,8 +107,7 @@ defmodule FreediveWeb.ServiceLive do
socket socket
|> assign(:selected_item, %{ |> assign(:selected_item, %{
socket.assigns.selected_item socket.assigns.selected_item
| log: socket.assigns.selected_item.log ++ payload.log, | log: socket.assigns.selected_item.log ++ payload.log
busy: false
}) })
else else
socket socket
@ -137,6 +136,24 @@ defmodule FreediveWeb.ServiceLive.Components do
attr :details, :string, default: nil, doc: "details" attr :details, :string, default: nil, doc: "details"
def items_block(%{details: true} = assigns) do def items_block(%{details: true} = assigns) do
~H"""
<.back_link selected_item={@selected_item} />
<.service_header selected_item={@selected_item} />
<.std_log selected_item={@selected_item} />
<.basic_commands selected_item={@selected_item} />
<.extra_commands selected_item={@selected_item} />
"""
end
def items_block(assigns) do
~H"""
<%= for {_name, item} <- @items do %>
<.service_preview item={item} selected_item={@selected_item} />
<% end %>
"""
end
def back_link(assigns) do
~H""" ~H"""
<.link <.link
class="panel-block pt-1 has-background-light" class="panel-block pt-1 has-background-light"
@ -148,96 +165,119 @@ defmodule FreediveWeb.ServiceLive.Components do
</span> </span>
<div class="mt-2 ml-2">Back</div> <div class="mt-2 ml-2">Back</div>
</.link> </.link>
"""
end
<.panel_media> def service_header(assigns) do
<:icon> ~H"""
<.panel_block>
<.icon_raw for={@selected_item.icon} color="auto" size="3rem" aria-hidden="true" /> <.icon_raw for={@selected_item.icon} color="auto" size="3rem" aria-hidden="true" />
<%!-- <Lucideicons.accessibility height="2rem" width="2rem" /> --%> <div class="column">
</:icon>
<.title is-4> <.title is-4>
<%= @selected_item.name %> <%= @selected_item.name %>
<%= if @selected_item.running do %>
<.icon for="circle-play" color="lightgreen" aria-hidden="true" />
<% else %>
<.icon for="circle-stop" color="gray" aria-hidden="true" />
<% end %>
<%= if @selected_item.enabled do %>
<.icon for="circle-check" color="lightgreen" aria-hidden="true" />
<% else %>
<.icon for="circle-x" color="gray" aria-hidden="true" />
<% end %>
</.title> </.title>
<.subtitle> <.subtitle>
<%= @selected_item.description %> <%= @selected_item.description %>
</.subtitle> </.subtitle>
<:actions>
<div class="columns">
<div class="column is-narrow">
<%= if @selected_item.running do %>
<.icon for="circle-play" color="green" aria-hidden="true" />
<% else %>
<.icon for="circle-stop" color="red" aria-hidden="true" />
<% end %>
<%= if @selected_item.enabled do %>
<.icon for="circle-check" color="green" aria-hidden="true" />
<% else %>
<.icon for="circle-x" color="red" aria-hidden="true" />
<% end %>
</div> </div>
</div> </.panel_block>
</:actions> """
</.panel_media> end
<%= if Map.has_key?(@selected_item, :log) and @selected_item.log != [] do %> def service_preview(assigns) do
<.panel_media> ~H"""
<:icon> <.panel_block
<.icon for="terminal" color="gray" aria-hidden="true" /> class={"#{if @selected_item != nil and @selected_item.name == @item.name, do: "pt-2 has-background-info-light", else: "pt-2"}"}
</:icon> phx-click="tap"
<:actions></:actions> phx-value-name={@item.name}
<pre><code><%= Enum.join(@selected_item.log, "\n") %></code></pre> >
</.panel_media>
<.icon_raw for={@item.icon} color="auto" size="1.8rem" aria-hidden="true" />
<span class="is-size-5 px-4">
<%= @item.name %>
</span>
<%= if @item.running do %>
<.icon for="circle-play" size="1rem" color="lightgreen" aria-hidden="true" />
<% else %>
<.icon for="circle-stop" size="1rem" color="gray" aria-hidden="true" />
<% end %> <% end %>
<%= if @item.enabled do %>
<.icon for="circle-check" size="1rem" color="lightgreen" aria-hidden="true" />
<% else %>
<.icon for="circle-x" size="1rem" color="gray" aria-hidden="true" />
<% end %>
</.panel_block>
"""
end
<.panel_media> def basic_commands(assigns) do
<:icon> ~H"""
<%!-- <.icon for="terminal" color="auto" size="3rem" aria-hidden="true" /> --%> <.panel_block_div>
</:icon> <%= if @selected_item.running do %>
<.icon_raw for="power" color="lightgreen" size="2rem" class="ml-2 mr-5" aria-hidden="true" />
<:actions> <% else %>
<div class="columns is-mobile"> <.icon_raw for="power" color="gray" size="2rem" class="ml-2 mr-5" aria-hidden="true" />
<% end %>
<div class="columns is-fullwidth mr-4">
<%= if @selected_item.running do %> <%= if @selected_item.running do %>
<div class="column is-narrow">
<button <button
class="button is-warning" class="button is-warning column is-2 m-2 is-fullwidth"
phx-click="action:restart" phx-click="action:restart"
phx-value-name={@selected_item.name} phx-value-name={@selected_item.name}
{if @selected_item.busy, do: [disabled: true], else: []} {if @selected_item.busy, do: [disabled: true], else: []}
> >
Restart Restart
</button> </button>
</div>
<div class="column">
<button <button
class="button is-danger" class="button is-danger column is-2 m-2 is-fullwidth"
phx-click="action:stop" phx-click="action:stop"
phx-value-name={@selected_item.name} phx-value-name={@selected_item.name}
{if @selected_item.busy, do: [disabled: true], else: []} {if @selected_item.busy, do: [disabled: true], else: []}
> >
Stop Stop
</button> </button>
</div>
<% else %> <% else %>
<div class="column">
<button <button
class="button is-success" class="button is-success column is-2 m-2 is-fullwidth"
phx-click="action:start" phx-click="action:start"
phx-value-name={@selected_item.name} phx-value-name={@selected_item.name}
{if @selected_item.busy, do: [disabled: true], else: []} {if @selected_item.busy, do: [disabled: true], else: []}
> >
Start Start
</button> </button>
</div>
<% end %> <% end %>
</div> </div>
</:actions> </.panel_block_div>
"""
end
<%= if @selected_item.commands do %> def extra_commands(assigns) do
~H"""
<%= if @selected_item.commands != [] and @selected_item.commands != nil do %>
<.panel_block_div>
<.icon_raw
for="inspection-panel"
color="auto"
size="2rem"
class="ml-1 mr-5"
aria-hidden="true"
/>
<div class="columns is-fullwidth mr-4">
<%= for command <- @selected_item.commands do %> <%= for command <- @selected_item.commands do %>
<button <button
class="button is-info" class="button is-info column is-2 m-2 is-fullwidth"
phx-disable-with="..."
phx-click={"command:#{command}"} phx-click={"command:#{command}"}
phx-value-name={@selected_item.name} phx-value-name={@selected_item.name}
{if @selected_item.busy, do: [disabled: true], else: []} {if @selected_item.busy, do: [disabled: true], else: []}
@ -245,28 +285,16 @@ defmodule FreediveWeb.ServiceLive.Components do
<%= command %> <%= command %>
</button> </button>
<% end %> <% end %>
</div>
</.panel_block_div>
<% end %> <% end %>
</.panel_media>
""" """
end end
def items_block(assigns) do def std_log(assigns) do
~H""" ~H"""
<%= for {_name, item} <- @items do %> <%= if Map.has_key?(@selected_item, :log) and @selected_item.log != [] do %>
<div> <pre class="panel-block is-fullwidth"><code><%= Enum.join(@selected_item.log, "\n") %></code></pre>
<.link
class={"panel-block pt-1 #{if @selected_item != nil and @selected_item.name == item.name, do: "has-background-info-light"}"}
phx-click="tap"
phx-value-name={item.name}
>
<span class="panel-icon">
<.icon for={item.icon} color="auto" aria-hidden="true" />
</span>
<div class="mt-2 ml-2">
<%= item.name %>
</div>
</.link>
</div>
<% end %> <% end %>
""" """
end end

View file

@ -5,14 +5,14 @@ defmodule FreediveWeb.UserLoginLive do
~H""" ~H"""
<.hero> <.hero>
<.container> <.container>
<.block> <.section>
<.title is-4> <.title is-4>
Log in to account Log in to account
</.title> </.title>
<.subtitle is-6 has-text-grey> <.subtitle is-6 has-text-grey>
freedive@hostname freedive@hostname
</.subtitle> </.subtitle>
</.block> </.section>
<.column is-6-desktop> <.column is-6-desktop>
<.simple_form for={@form} id="login_form" action={~p"/users/log_in"} phx-update="ignore"> <.simple_form for={@form} id="login_form" action={~p"/users/log_in"} phx-update="ignore">

View file

@ -37,7 +37,9 @@ defmodule Liliform.Page do
phx-click="filter" phx-click="filter"
phx-value-key={filter.key} phx-value-key={filter.key}
> >
<span class="is-size-5">
<%= filter.title %> <%= filter.title %>
</span>
</a> </a>
<% end %> <% end %>
</.panel_tabs> </.panel_tabs>
@ -50,7 +52,11 @@ defmodule Liliform.Page do
phx-click="filter" phx-click="filter"
phx-value-key={filter.key} phx-value-key={filter.key}
> >
<.icon for={filter.icon} color={if filter.active, do: "gray", else: "auto"} /> <.icon_raw
for={filter.icon}
size="2rem"
color={if filter.active, do: "gray", else: "auto"}
/>
</a> </a>
<% end %> <% end %>
</.panel_tabs> </.panel_tabs>

View file

@ -99,11 +99,11 @@ defmodule Liliform.Panel do
~H""" ~H"""
<div class={["panel-block", @class]} {@rest}> <div class={["panel-block", @class]} {@rest}>
<.media class="is-fullwidth"> <.media>
<.media_left> <.media_left>
<%= render_slot(@icon) %> <%= render_slot(@icon) %>
</.media_left> </.media_left>
<.media_content class="is-fullwidth"> <.media_content>
<%= render_slot(@inner_block) %> <%= render_slot(@inner_block) %>
</.media_content> </.media_content>
<.media_right> <.media_right>