fix: fixed CSM-008

This commit is contained in:
2026-05-09 14:17:32 +02:00
parent 88c689ee55
commit 24e9e9a022
5 changed files with 264 additions and 26 deletions

View File

@@ -33,6 +33,7 @@ defmodule BDS.Desktop.ShellLive do
alias BDS.Desktop.ShellLive.{
ChatSurface,
Layout,
PanelRenderer,
SessionUtil,
ShellCommandRunner,
SidebarCreate,
@@ -171,6 +172,8 @@ defmodule BDS.Desktop.ShellLive do
|> assign(:chat_editor_request_refs, %{})
|> assign(:shell_overlay, nil)
|> assign(:output_entries, [])
|> assign(:panel_post_links, %{backlinks: [], outlinks: []})
|> assign(:panel_git_entries, [])
|> reload_shell(workbench)
|> tap(&sync_menu_bar_locale/1)}
end
@@ -567,22 +570,60 @@ defmodule BDS.Desktop.ShellLive do
page_language = socket.assigns[:page_language] || ShellData.ui_language()
offline_mode = Map.get(socket.assigns, :offline_mode, true)
sidebar_data = socket.assigns[:sidebar_data] || %{}
current_tab = current_tab(workbench)
prev_tab = socket.assigns[:current_tab]
prev_panel_tab =
case socket.assigns[:workbench] do
%Workbench{panel: %{active_tab: tab}} -> tab
_ -> nil
end
socket =
socket
|> assign(:workbench, workbench)
|> assign(:activity_buttons, activity_buttons)
|> assign(
:sidebar_header,
active_sidebar_label(activity_buttons, workbench.active_view, sidebar_data)
)
|> assign(:panel_tabs, ShellData.panel_tabs(workbench))
|> assign(:current_tab, current_tab)
|> assign(:editor_meta, ShellData.editor_meta(task_status))
|> assign(
:status,
ShellData.status_bar(workbench, task_status, dashboard,
ui_language: page_language,
offline_mode: offline_mode
)
)
if panel_data_stale?(current_tab, prev_tab, workbench.panel.active_tab, prev_panel_tab) do
refresh_panel_data(socket)
else
socket
end
end
defp panel_data_stale?(current_tab, prev_tab, panel_tab, prev_panel_tab) do
current_tab != prev_tab or panel_tab != prev_panel_tab
end
defp refresh_panel_data(socket) do
panel_tab = socket.assigns.workbench.panel.active_tab
socket
|> assign(:workbench, workbench)
|> assign(:activity_buttons, activity_buttons)
|> assign(
:sidebar_header,
active_sidebar_label(activity_buttons, workbench.active_view, sidebar_data)
:panel_post_links,
if(panel_tab == :post_links,
do: PanelRenderer.fetch_post_link_entries(socket.assigns),
else: socket.assigns[:panel_post_links] || %{backlinks: [], outlinks: []}
)
)
|> assign(:panel_tabs, ShellData.panel_tabs(workbench))
|> assign(:current_tab, current_tab(workbench))
|> assign(:editor_meta, ShellData.editor_meta(task_status))
|> assign(
:status,
ShellData.status_bar(workbench, task_status, dashboard,
ui_language: page_language,
offline_mode: offline_mode
:panel_git_entries,
if(panel_tab == :git_log,
do: PanelRenderer.fetch_git_log_entries(socket.assigns),
else: socket.assigns[:panel_git_entries] || []
)
)
end

View File

@@ -105,12 +105,12 @@ defmodule BDS.Desktop.ShellLive.PanelRenderer do
end
defp render_post_links(assigns) do
links = post_link_entries(assigns)
panel_links = assigns[:panel_post_links] || %{backlinks: [], outlinks: []}
assigns =
assigns
|> assign(:backlinks, Map.get(links, :backlinks, []))
|> assign(:outlinks, Map.get(links, :outlinks, []))
|> assign(:backlinks, Map.get(panel_links, :backlinks, []))
|> assign(:outlinks, Map.get(panel_links, :outlinks, []))
~H"""
<%= if Enum.empty?(@backlinks) and Enum.empty?(@outlinks) do %>
@@ -161,7 +161,7 @@ defmodule BDS.Desktop.ShellLive.PanelRenderer do
end
defp render_git_log(assigns) do
entries = git_log_entries(assigns)
entries = assigns[:panel_git_entries] || []
assigns = assign(assigns, :git_entries, entries)
~H"""
@@ -196,7 +196,7 @@ defmodule BDS.Desktop.ShellLive.PanelRenderer do
"""
end
defp post_link_entries(assigns) do
def fetch_post_link_entries(assigns) do
case assigns.current_tab do
%{type: :post, id: post_id} ->
%{
@@ -226,7 +226,7 @@ defmodule BDS.Desktop.ShellLive.PanelRenderer do
|> Enum.reject(&is_nil/1)
end
defp git_log_entries(assigns) do
def fetch_git_log_entries(assigns) do
case git_history_target(assigns.current_tab) do
nil ->
[]

View File

@@ -30,7 +30,13 @@ defmodule BDS.Desktop.ShellLive.TabHelpers do
Enum.reduce(tabs, %{}, fn tab, acc ->
key = {tab.type, tab.id}
existing_meta = Map.get(tab_meta, key, %{})
synced_meta = merge_missing_meta(existing_meta, derived_tab_meta(tab))
synced_meta =
if meta_complete?(existing_meta) do
existing_meta
else
merge_missing_meta(existing_meta, derived_tab_meta(tab))
end
if map_size(synced_meta) == 0 do
acc
@@ -198,6 +204,12 @@ defmodule BDS.Desktop.ShellLive.TabHelpers do
defp derived_tab_meta(_tab), do: %{}
defp meta_complete?(%{title: title, subtitle: subtitle})
when is_binary(title) and title != "" and is_binary(subtitle) and subtitle != "",
do: true
defp meta_complete?(_), do: false
defp merge_missing_meta(existing_meta, fresh_meta) do
existing_meta
|> maybe_put_missing(:title, Map.get(fresh_meta, :title))