feat: filtering in sidebars

This commit is contained in:
2026-04-25 20:51:01 +02:00
parent 55b3071696
commit cec170c9c0
11 changed files with 1125 additions and 33 deletions

View File

@@ -42,6 +42,15 @@ defmodule BDS.Desktop.Router do
|> Plug.Conn.send_resp(200, BDS.Desktop.ShellController.projects_json())
end
post "/api/sidebar" do
{:ok, body, conn} = Plug.Conn.read_body(conn)
payload = if body == "", do: %{}, else: Jason.decode!(body)
conn
|> Plug.Conn.put_resp_content_type("application/json")
|> Plug.Conn.send_resp(200, BDS.Desktop.ShellController.sidebar_json(payload))
end
post "/api/projects" do
{:ok, body, conn} = Plug.Conn.read_body(conn)
payload = if body == "", do: %{}, else: Jason.decode!(body)

View File

@@ -1,6 +1,8 @@
defmodule BDS.Desktop.ShellController do
@moduledoc false
alias BDS.UI.Sidebar
def index_html do
BDS.UI.ShellPage.render()
end
@@ -48,6 +50,28 @@ defmodule BDS.Desktop.ShellController do
end
end
def sidebar_json(payload) when is_map(payload) do
view = Map.get(payload, "view") || Map.get(payload, :view)
filters = Map.get(payload, "filters") || Map.get(payload, :filters) || %{}
data =
try do
case active_project_id() do
nil -> Sidebar.view(nil, view, filters)
project_id -> Sidebar.view(project_id, view, filters)
end
rescue
error in [Exqlite.Error, DBConnection.OwnershipError] ->
if match?(%Exqlite.Error{}, error) and not String.contains?(Exception.message(error), "no such table") do
reraise error, __STACKTRACE__
end
Sidebar.view(nil, view, filters)
end
Jason.encode!(%{status: "ok", view: view, data: data})
end
defp normalize_error(error) when is_map(error), do: error
defp normalize_error(error), do: %{message: inspect(error)}
@@ -149,6 +173,17 @@ defmodule BDS.Desktop.ShellController do
}
end
defp active_project_id do
BDS.Projects.shell_snapshot().active_project_id
rescue
error in [Exqlite.Error, DBConnection.OwnershipError] ->
if match?(%Exqlite.Error{}, error) and not String.contains?(Exception.message(error), "no such table") do
reraise error, __STACKTRACE__
end
nil
end
defp present?(value) when is_binary(value), do: String.trim(value) != ""
defp present?(_value), do: false