<%= for item <- section.items || [] do %>
<% end %>
<% end %>
<%= if Enum.empty?(@sidebar_data.sections || []) do %>
<%= translated(@sidebar_data.empty_message || "No items") %>
<% end %>
"""
end
defp render_media_sidebar(assigns) do
~H"""
<%= if Enum.any?(@sidebar_data.items || []) do %>
<%= for item <- @sidebar_data.items || [] do %>
<% end %>
<% else %>
<%= translated(@sidebar_data.empty_message || "No items") %>
<% end %>
"""
end
defp render_entity_sidebar(assigns) do
~H"""
<%= if Enum.any?(@sidebar_data.items || []) do %>
<%= for item <- @sidebar_data.items || [] do %>
<% end %>
<% else %>
<%= translated(@sidebar_data.empty_message || "No items") %>
<% end %>
"""
end
defp render_nav_sidebar(assigns) do
~H"""
<%= for item <- @sidebar_data.items || [] do %>
<% end %>
"""
end
defp render_default_sidebar(assigns) do
~H"""
<%= for section <- @sidebar_data.sections || [] do %>
<%= translated(section.title) %>
<%= for item <- section.items || [] do %>
<%= item.title || "" %>
<% end %>
<% end %>
"""
end
defp render_panel_body(assigns) do
case assigns.workbench.panel.active_tab do
:tasks -> render_task_entries(assigns)
:output -> render_output_entries(assigns)
:git_log -> render_git_log(assigns)
other -> render_generic_panel(assigns, other)
end
end
defp render_task_entries(assigns) do
~H"""
<%= if Enum.empty?(@task_status.tasks || []) do %>
<%= translated("Git Log") %><%= translated("Working tree integration is not wired yet in the shell, but the tab is selectable and ready for command output.") %>
"""
end
defp render_generic_panel(assigns, tab) do
assigns = assign(assigns, :panel_label, ShellData.route_label(tab))
~H"""
<%= @panel_label %><%= translated("The shared lower panel is available for tasks, output, git details, and editor-specific diagnostics.") %>
"""
end
defp translated(text, bindings \\ %{}), do: ShellData.translate(text, bindings)
defp panel_tab_label(:tasks), do: translated("Tasks")
defp panel_tab_label(:output), do: translated("Output")
defp panel_tab_label(:git_log), do: translated("Git Log")
defp panel_tab_label(tab), do: ShellData.route_label(tab)
defp activity_label("AI Assistant"), do: "Chat"
defp activity_label("Source Control"), do: "Git"
defp activity_label(label), do: translated(label)
defp active_sidebar_label(activity_buttons, active_view, sidebar_data) do
Enum.find_value(activity_buttons, translated(sidebar_data.title || ""), fn button ->
if button.id == active_view, do: activity_label(button.label), else: nil
end)
end
defp sidebar_header_label(label), do: translated(label)
defp timeline_height(entry, entries) do
max_count =
entries
|> Enum.map(&(&1.count || 0))
|> Enum.max(fn -> 1 end)
max(4, ((entry.count || 0) / max_count) * 100)
end
defp format_sidebar_timestamp(nil), do: ""
defp format_sidebar_timestamp(timestamp) do
timestamp
|> DateTime.from_unix!(:millisecond)
|> Calendar.strftime("%x")
end
defp image_media?(item), do: String.starts_with?(to_string(item.mime_type || ""), "image/")
defp media_thumbnail_class(item) do
if image_media?(item), do: "media-thumbnail has-image", else: "media-thumbnail"
end
defp media_thumbnail_glyph(mime_type) do
case String.split(to_string(mime_type || ""), "/", parts: 2) do
["image", _rest] -> "IMG"
["video", _rest] -> "VID"
["audio", _rest] -> "AUD"
["application", _rest] -> "DOC"
_other -> "FILE"
end
end
end