fix: fixed tag suggestions

This commit is contained in:
2026-06-30 21:48:15 +02:00
parent 5f77641f3f
commit c2b2b1ff11
11 changed files with 534 additions and 403 deletions

View File

@@ -3,7 +3,7 @@ defmodule BDS.Desktop.ShellLive.PostEditor do
use Phoenix.LiveComponent
alias BDS.{AI, Metadata, Posts, Preview}
alias BDS.{AI, Embeddings, Metadata, Posts, Preview}
alias BDS.Desktop.ShellData
alias BDS.Desktop.ShellLive.{EditorImageDrop, Notify}
alias BDS.Desktop.ShellLive.PostEditor.{DraftManagement, ListValues, Persistence, PostMetadata}
@@ -12,7 +12,6 @@ defmodule BDS.Desktop.ShellLive.PostEditor do
import DraftManagement,
only: [
current_draft: 4,
editing_canonical_language?: 3,
normalize_language: 2,
normalize_mode: 1,
@@ -288,6 +287,10 @@ defmodule BDS.Desktop.ShellLive.PostEditor do
{:noreply, do_detect_language(socket)}
end
def handle_event("focus_post_editor_tags", _params, socket) do
{:noreply, socket |> load_tag_semantic_suggestions() |> build_data()}
end
def handle_event("add_post_editor_tag", %{"tag" => tag}, socket) do
{:noreply, do_add_list_value(socket, :tags, tag)}
end
@@ -325,6 +328,19 @@ defmodule BDS.Desktop.ShellLive.PostEditor do
{:noreply, socket}
end
# Semantic tag suggestions read the embeddings index (no live model call), so
# they work offline; suggest_tags/2 returns [] when similarity is disabled.
defp load_tag_semantic_suggestions(socket) do
case socket.assigns.post do
%Post{} = post ->
{:ok, suggestions} = Embeddings.suggest_tags(post.id, [])
assign(socket, :tag_semantic_suggestions, suggestions)
_other ->
socket
end
end
defp component_current_draft(socket, post, metadata, active_language) do
persisted = persisted_form(post, metadata, active_language)
Map.get(socket.assigns.drafts, active_language, persisted)
@@ -344,6 +360,7 @@ defmodule BDS.Desktop.ShellLive.PostEditor do
active_language: canonical,
drafts: %{},
tag_query: "",
tag_semantic_suggestions: [],
category_query: "",
quick_actions_open?: false,
mode: :markdown,
@@ -435,6 +452,11 @@ defmodule BDS.Desktop.ShellLive.PostEditor do
Tags.list_tags(post.project_id),
socket.assigns.tag_query
),
tag_semantic_suggestions:
Enum.reject(
socket.assigns.tag_semantic_suggestions || [],
&(&1 in tag_values(form))
),
category_suggestions:
category_suggestions(
form,
@@ -959,7 +981,7 @@ defmodule BDS.Desktop.ShellLive.PostEditor do
active_language = socket.assigns.active_language
post = socket.assigns.post
metadata = socket.assigns.project_metadata
draft = current_draft(socket.assigns, post, metadata, active_language)
draft = component_current_draft(socket, post, metadata, active_language)
updated = Map.put(draft, field, value)
assign(socket, :drafts, Map.put(socket.assigns.drafts, active_language, updated))
end

View File

@@ -173,9 +173,22 @@
value={@post_editor.tag_query}
placeholder={dgettext("ui", "Add tag")}
autocomplete="off"
phx-focus="focus_post_editor_tags"
phx-target={@myself}
/>
</div>
<%= if String.trim(@post_editor.tag_query || "") == "" and Enum.any?(@post_editor.tag_semantic_suggestions) do %>
<div class="tag-suggestions tag-suggestions-semantic mt-2 flex flex-col">
<div class="tag-suggestion-section-label"><%= dgettext("ui", "Suggested tags") %></div>
<%= for name <- @post_editor.tag_semantic_suggestions do %>
<button class="tag-suggestion ai-suggested" type="button" phx-click="add_post_editor_tag" phx-value-tag={name} phx-target={@myself}>
<span class="tag-suggestion-name"><%= name %></span>
</button>
<% end %>
</div>
<% end %>
<%= if String.trim(@post_editor.tag_query || "") != "" and (Enum.any?(@post_editor.tag_suggestions) or @post_editor.tag_query_addable?) do %>
<div class="tag-suggestions mt-2 flex flex-col">
<%= for tag <- @post_editor.tag_suggestions do %>