defmodule BDS.Desktop.ShellLive.PanelRenderer do
@moduledoc false
use Phoenix.Component
alias BDS.Desktop.ShellData
alias BDS.Git
alias BDS.Media
alias BDS.Media.Media, as: MediaRecord
alias BDS.PostLinks
alias BDS.Posts
alias BDS.Posts.Post
alias BDS.UI.TaskGrouping
use Gettext, backend: BDS.Gettext
@doc "Render the active panel tab body."
def render_panel_body(assigns) do
case assigns.workbench.panel.active_tab do
:tasks -> render_task_entries(assigns)
:output -> render_output_entries(assigns)
:post_links -> render_post_links(assigns)
:git_log -> render_git_log(assigns)
other -> render_generic_panel(assigns, other)
end
end
@doc "Render the editor toolbar for the current tab."
def render_editor_toolbar(assigns) do
buttons = editor_toolbar_buttons(assigns.current_tab)
assigns = assign(assigns, :editor_toolbar_buttons, buttons)
~H"""
<%= if Enum.any?(@editor_toolbar_buttons) do %>
<%= for button <- @editor_toolbar_buttons do %>
<% end %>
<% end %>
"""
end
defp render_task_entries(assigns) do
entries = TaskGrouping.build_task_entries(Map.get(assigns.task_status, :tasks, []))
collapsed = Map.get(assigns, :collapsed_task_groups) || MapSet.new()
assigns =
assigns
|> assign(:task_entries, entries)
|> assign(:collapsed_task_groups, collapsed)
~H"""
<%= if Enum.empty?(@task_entries) do %>
<%= dgettext("ui", "Tasks") %><%= dgettext("ui", "No background tasks running") %>
<% else %>
<%= for entry <- @task_entries do %>
<%= case entry do %>
<% {:single, task} -> %>
{render_task_row(assigns, task, false)}
<% {:group, group_id, group_name, tasks} -> %>
{render_task_group(assigns, group_id, group_name, tasks)}
<% end %>
<% end %>
<% end %>
"""
end
defp render_task_group(assigns, group_id, group_name, tasks) do
summary = TaskGrouping.summarize_task_group(tasks)
expanded = not MapSet.member?(assigns.collapsed_task_groups, group_id)
assigns =
assigns
|> assign(:group_id, group_id)
|> assign(:group_name, group_name)
|> assign(:group_tasks, tasks)
|> assign(:group_expanded, expanded)
|> assign(:group_meta, task_group_meta(summary))
~H"""
<%= if @group_expanded do %>
<%= for task <- @group_tasks do %>
{render_task_row(assigns, task, true)}
<% end %>
<% end %>
"""
end
defp render_task_row(assigns, task, is_child) do
assigns =
assigns
|> assign(:task, task)
|> assign(:task_child?, is_child)
~H"""
"""
end
# "NN% · X Running · Y Pending" — the breakdown only lists non-zero counts,
# like the old app's summarizeTaskGroup rendering.
defp task_group_meta(summary) do
parts =
[]
|> maybe_append_breakdown(summary.running, dgettext("ui", "Running"))
|> maybe_append_breakdown(summary.pending, dgettext("ui", "Pending"))
suffix = if parts == [], do: "", else: " · " <> Enum.join(parts, " · ")
progress_percent(summary.progress) <> suffix
end
defp maybe_append_breakdown(parts, count, _label) when count <= 0, do: parts
defp maybe_append_breakdown(parts, count, label),
do: parts ++ ["#{count} #{label}"]
defp render_output_entries(assigns) do
~H"""
<%= if Enum.empty?(@output_entries) do %>
<%= dgettext("ui", "Output") %><%= dgettext("ui", "No shell output yet") %>
<% else %>
<%= for entry <- @output_entries do %>
<%= entry.title %><%= entry.message %>
<%= if present?(entry.details) do %>
<%= entry.details %>
<% end %>
<% end %>
<% end %>
"""
end
defp render_post_links(assigns) do
panel_links = assigns[:panel_post_links] || %{backlinks: [], outlinks: []}
assigns =
assigns
|> assign(:backlinks, Map.get(panel_links, :backlinks, []))
|> assign(:outlinks, Map.get(panel_links, :outlinks, []))
~H"""
<%= if Enum.empty?(@backlinks) and Enum.empty?(@outlinks) do %>
<%= dgettext("ui", "Post Links") %><%= dgettext("ui", "No post links yet") %>
<% else %>
<%= if Enum.any?(@backlinks) do %>
<%= dgettext("ui", "Backlinks") %>
<%= for entry <- @backlinks do %>
<% end %>
<% end %>
<%= if Enum.any?(@outlinks) do %>
<%= dgettext("ui", "Links To") %>
<%= for entry <- @outlinks do %>
<% end %>
<% end %>
<% end %>
"""
end
defp render_git_log(assigns) do
entries = assigns[:panel_git_entries] || []
assigns = assign(assigns, :git_entries, entries)
~H"""
<%= if Enum.empty?(@git_entries) do %>
<%= dgettext("ui", "Git Log") %><%= dgettext("ui", "No git history yet") %>