From 824313f10620ca9ce68381b7dfd7d653f9848aac Mon Sep 17 00:00:00 2001 From: Chili Palmer Date: Wed, 15 Jul 2026 19:54:30 +0200 Subject: [PATCH] feat: vi-style command prompt in the TUI for menu shell commands (issue #26) --- README.md | 4 +- lib/bds/tui.ex | 196 +++++++++++++++++++++++++++++- priv/gettext/de/LC_MESSAGES/ui.po | 111 +++++++++++------ priv/gettext/en/LC_MESSAGES/ui.po | 111 +++++++++++------ priv/gettext/es/LC_MESSAGES/ui.po | 111 +++++++++++------ priv/gettext/fr/LC_MESSAGES/ui.po | 111 +++++++++++------ priv/gettext/it/LC_MESSAGES/ui.po | 111 +++++++++++------ priv/gettext/ui.pot | 111 +++++++++++------ specs/tui.allium | 13 ++ test/bds/tui_test.exs | 92 ++++++++++++++ 10 files changed, 739 insertions(+), 232 deletions(-) diff --git a/README.md b/README.md index a266b34..d52bccd 100644 --- a/README.md +++ b/README.md @@ -194,7 +194,9 @@ appears in every open shell. ### TUI keys `↑/↓` or `j/k` navigate · `enter` open · `n` new post · `1-5` switch view -(posts/media/templates/scripts/tags) · `r` refresh · in the editor: +(posts/media/templates/scripts/tags) · `:` command prompt (metadata +diff, validate site, force render, rebuilds, …) · `?` command help · +`r` refresh · in the editor: `ctrl+s` save, `ctrl+p` publish, `ctrl+e` word-wrapped preview, `ctrl+t` title, `ctrl+l` language, `ctrl+g` AI suggestions (airplane-mode gated), `esc` back · `ctrl+q` quit. diff --git a/lib/bds/tui.ex b/lib/bds/tui.ex index 956c9a1..c3217b0 100644 --- a/lib/bds/tui.ex +++ b/lib/bds/tui.ex @@ -10,7 +10,9 @@ defmodule BDS.TUI do ## Keys Sidebar focus: `↑/↓`/`j/k` navigate, `enter` open, `n` new post, - `1..5` switch view (posts/media/templates/scripts/tags), `r` refresh. + `1..5` switch view (posts/media/templates/scripts/tags), `r` refresh, + `:` vi-style command prompt over the Blog-menu shell commands, `?` + command help (commands whose report/apply UI is GUI-only are marked). Editor focus: text keys edit, `ctrl+s` save, `ctrl+p` publish, `ctrl+e` word-wrapped preview, `ctrl+t` edit title, `ctrl+l` cycle language, `ctrl+g` AI suggestions, `esc` back to sidebar. `ctrl+q` @@ -49,6 +51,10 @@ defmodule BDS.TUI do # shuts the VM down instead of leaving a headless server behind. stop_vm_on_exit: Keyword.get(opts, :stop_vm_on_exit, false), stop_fun: Keyword.get(opts, :stop_fun, &System.stop/0), + command_executor: + Keyword.get(opts, :command_executor, &BDS.Desktop.ShellCommands.execute/1), + command: nil, + task_polling: false, project_id: project_id, view: "posts", sidebar: nil, @@ -79,6 +85,10 @@ defmodule BDS.TUI do def handle_event(%ExRatatui.Event.Key{code: "q", modifiers: ["ctrl"]}, state), do: {:stop, state} + def handle_event(%ExRatatui.Event.Key{kind: "press"} = key, %{command: command} = state) + when command != nil, + do: command_key(key, state) + def handle_event(%ExRatatui.Event.Key{code: "esc"}, %{image: image} = state) when image != nil, do: {:noreply, %{state | image: nil}} @@ -106,6 +116,12 @@ defmodule BDS.TUI do defp sidebar_key(%{code: "r"}, state), do: {:noreply, load_sidebar(state)} + defp sidebar_key(%{code: ":"}, state), + do: {:noreply, %{state | command: %{input: "", selected: 0, help?: false}}} + + defp sidebar_key(%{code: "?"}, state), + do: {:noreply, %{state | command: %{input: "", selected: 0, help?: true}}} + defp sidebar_key(%{code: "n"}, %{project_id: project_id} = state) when is_binary(project_id) do case Posts.create_post(%{project_id: project_id, title: "", content: ""}) do @@ -131,6 +147,52 @@ defmodule BDS.TUI do defp sidebar_key(_key, state), do: {:noreply, state} + # ── Events: command prompt (vi-style) ──────────────────────────────────── + + defp command_key(%{code: "esc"}, state), do: {:noreply, %{state | command: nil}} + + defp command_key(_key, %{command: %{help?: true}} = state), + do: {:noreply, %{state | command: nil}} + + defp command_key(%{code: "enter"}, %{command: command} = state) do + case Enum.at(filtered_commands(command.input), command.selected) do + nil -> + {:noreply, + toast(%{state | command: nil}, ":" <> command.input, dgettext("ui", "Unknown command."))} + + entry -> + {:noreply, run_command(%{state | command: nil}, entry)} + end + end + + defp command_key(%{code: "down"}, %{command: command} = state) do + count = length(filtered_commands(command.input)) + {:noreply, put_in(state.command.selected, min(command.selected + 1, max(count - 1, 0)))} + end + + defp command_key(%{code: "up"}, %{command: command} = state), + do: {:noreply, put_in(state.command.selected, max(command.selected - 1, 0))} + + defp command_key(%{code: "backspace"}, %{command: command} = state) do + {:noreply, + %{state | command: %{command | input: String.slice(command.input, 0..-2//1), selected: 0}}} + end + + # `:?` — the vi way to reach help from the prompt. + defp command_key(%{code: "?"}, %{command: %{input: ""}} = state), + do: {:noreply, put_in(state.command.help?, true)} + + defp command_key(%{code: code, modifiers: []}, %{command: command} = state) + when byte_size(code) >= 1 do + if String.length(code) == 1 do + {:noreply, %{state | command: %{command | input: command.input <> code, selected: 0}}} + else + {:noreply, state} + end + end + + defp command_key(_key, state), do: {:noreply, state} + # ── Events: editor focus ───────────────────────────────────────────────── defp editor_key(%{code: "esc"}, %{editor: %{editing_title?: true}} = state), @@ -239,6 +301,20 @@ defmodule BDS.TUI do {:noreply, toast(%{state | busy: false}, dgettext("ui", "AI Suggestions"), inspect(reason))} end + def handle_info(:poll_tasks, %{task_polling: true} = state) do + case BDS.Tasks.status_snapshot() do + %{running_task_message: message} when is_binary(message) and message != "" -> + Process.send_after(self(), :poll_tasks, 1_000) + {:noreply, %{state | status: message}} + + _idle -> + {:noreply, + %{state | task_polling: false} + |> load_sidebar() + |> toast(dgettext("ui", "Tasks"), dgettext("ui", "All tasks finished."))} + end + end + def handle_info(_message, state), do: {:noreply, state} # ── Render ─────────────────────────────────────────────────────────────── @@ -261,7 +337,8 @@ defmodule BDS.TUI do sidebar_widgets(state, sidebar_rect) ++ main_widgets(state, main_rect) ++ status_widgets(state, status_rect) ++ - image_widgets(state, body_rect) + image_widgets(state, body_rect) ++ + command_widgets(state, body_rect) end defp view_tabs(state, rect) do @@ -390,11 +467,46 @@ defmodule BDS.TUI do ] end + defp command_widgets(%{command: nil}, _rect), do: [] + + defp command_widgets(%{command: command}, rect) do + overlay = %Rect{ + x: rect.x + 4, + y: rect.y + 1, + width: max(rect.width - 8, 20), + height: max(rect.height - 2, 6) + } + + gui_marker = dgettext("ui", "[report/apply in GUI]") + + items = + Enum.map(filtered_commands(command.input), fn entry -> + marker = if entry.gui, do: " " <> gui_marker, else: "" + "#{entry.action} — #{entry.label}#{marker}" + end) + + title = + if command.help? do + dgettext("ui", "Commands — esc to close") + else + ":" <> command.input + end + + [ + {%List{ + items: items, + selected: if(command.help?, do: nil, else: command.selected), + highlight_style: %Style{fg: :black, bg: :cyan}, + block: %Block{title: title, borders: [:all]} + }, overlay} + ] + end + defp default_status(%{focus: :sidebar}), do: dgettext( "ui", - "enter open · n new post · 1-5 views · r refresh · ctrl+q quit" + "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" ) defp default_status(%{focus: :editor}), @@ -605,6 +717,84 @@ defmodule BDS.TUI do defp editor_title(editor), do: Metadata.display_title(editor.title, editor.post.slug, editor.post.id) + # ── Shell commands (main-menu functionality) ───────────────────────────── + + # The parameterless Blog-menu commands. `gui: true` marks commands whose + # report/apply follow-up UI exists only in the GUI shell for now — the + # command still runs here, but reviewing and applying its report (repair, + # orphan import, validation apply) needs the desktop app. + defp commands do + [ + %{action: "metadata_diff", label: dgettext("ui", "Metadata Diff"), gui: true}, + %{action: "validate_site", label: dgettext("ui", "Validate Site"), gui: true}, + %{action: "force_render_site", label: dgettext("ui", "Force Render Site"), gui: false}, + %{action: "generate_sitemap", label: dgettext("ui", "Generate Site"), gui: false}, + %{action: "rebuild_database", label: dgettext("ui", "Rebuild Database"), gui: false}, + %{action: "reindex_text", label: dgettext("ui", "Reindex Text"), gui: false}, + %{ + action: "rebuild_embedding_index", + label: dgettext("ui", "Rebuild Embedding Index"), + gui: false + }, + %{action: "regenerate_calendar", label: dgettext("ui", "Regenerate Calendar"), gui: false}, + %{ + action: "validate_translations", + label: dgettext("ui", "Validate Translations"), + gui: true + }, + %{ + action: "fill_missing_translations", + label: dgettext("ui", "Fill Missing Translations"), + gui: false + }, + %{action: "find_duplicates", label: dgettext("ui", "Find Duplicate Posts"), gui: true}, + %{action: "upload_site", label: dgettext("ui", "Upload Site"), gui: false}, + %{action: "open_in_browser", label: dgettext("ui", "Open in Browser"), gui: false} + ] + end + + defp filtered_commands(""), do: commands() + + defp filtered_commands(input) do + needle = String.downcase(input) + + Enum.filter(commands(), fn entry -> + String.contains?(entry.action, needle) or String.contains?(String.downcase(entry.label), needle) + end) + end + + defp run_command(state, entry) do + case state.command_executor.(entry.action) do + {:ok, %{kind: "task_queued", title: title, message: message}} -> + state + |> toast(title, message) + |> start_task_polling() + + {:ok, %{kind: "open_url", title: title, url: url}} -> + toast(state, title, url) + + {:ok, %{kind: kind, title: title, message: message}} + when kind in ["output", "open_editor"] -> + toast(state, title, message) + + {:ok, _other} -> + toast(state, entry.label, dgettext("ui", "Command completed")) + + {:error, %{message: message}} -> + toast(state, entry.label, message) + + {:error, reason} -> + toast(state, entry.label, inspect(reason)) + end + end + + defp start_task_polling(%{task_polling: true} = state), do: state + + defp start_task_polling(state) do + Process.send_after(self(), :poll_tasks, 1_000) + %{state | task_polling: true} + end + # ── Media preview ──────────────────────────────────────────────────────── defp open_media(state, media_id) do diff --git a/priv/gettext/de/LC_MESSAGES/ui.po b/priv/gettext/de/LC_MESSAGES/ui.po index 20b2391..5fb01cf 100644 --- a/priv/gettext/de/LC_MESSAGES/ui.po +++ b/priv/gettext/de/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "KI-Einstellungen" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:224 -#: lib/bds/tui.ex:227 -#: lib/bds/tui.ex:230 -#: lib/bds/tui.ex:238 -#: lib/bds/tui.ex:575 +#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:291 +#: lib/bds/tui.ex:299 +#: lib/bds/tui.ex:686 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "KI-Vorschlaege" @@ -572,6 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "Unveränderte Diff-Blöcke einklappen" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 +#: lib/bds/tui.ex:779 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "Befehl abgeschlossen" @@ -589,7 +590,7 @@ msgstr "Bestaetigen" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:348 +#: lib/bds/tui.ex:424 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1029,6 +1030,7 @@ msgid "Filename" msgstr "Dateiname" #: lib/bds/desktop/menu_bar.ex:254 +#: lib/bds/tui.ex:745 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "Fehlende Übersetzungen ergänzen" @@ -1039,6 +1041,7 @@ msgid "Find" msgstr "Suchen" #: lib/bds/desktop/menu_bar.ex:255 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "Doppelte Beiträge finden" @@ -1065,6 +1068,7 @@ msgid "Gallery" msgstr "Galerie" #: lib/bds/desktop/menu_bar.ex:256 +#: lib/bds/tui.ex:729 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "Website generieren" @@ -1385,9 +1389,9 @@ msgstr "Maximale Beiträge pro Seite" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:489 -#: lib/bds/tui.ex:619 -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:600 +#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:811 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1430,6 +1434,7 @@ msgstr "Metadaten" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 +#: lib/bds/tui.ex:726 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1475,7 +1480,7 @@ msgstr "Neue Seite" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:115 +#: lib/bds/tui.ex:130 #, elixir-autogen, elixir-format msgid "New Post" msgstr "Neuer Beitrag" @@ -1764,6 +1769,7 @@ msgid "Open Settings" msgstr "Einstellungen öffnen" #: lib/bds/desktop/menu_bar.ex:217 +#: lib/bds/tui.ex:750 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "Im Browser öffnen" @@ -1911,8 +1917,8 @@ msgstr "Beitrag gespeichert" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:488 -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:599 +#: lib/bds/tui.ex:610 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2036,12 +2042,14 @@ msgid "Ready to import:" msgstr "Bereit zum Import:" #: lib/bds/desktop/menu_bar.ex:248 +#: lib/bds/tui.ex:730 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "Datenbank neu aufbauen" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 +#: lib/bds/tui.ex:734 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "Embedding-Index neu aufbauen" @@ -2099,6 +2107,7 @@ msgid "Refresh Translation" msgstr "Übersetzung aktualisieren" #: lib/bds/desktop/menu_bar.ex:252 +#: lib/bds/tui.ex:737 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "Kalender neu erzeugen" @@ -2109,6 +2118,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "Fehlende Vorschaubilder neu erzeugen" #: lib/bds/desktop/menu_bar.ex:249 +#: lib/bds/tui.ex:731 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "Text neu indizieren" @@ -2294,7 +2304,7 @@ msgstr "Scripting-Funktionen werden in der Neufassung auf Anwendungsebene konfig #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:491 +#: lib/bds/tui.ex:602 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2542,7 +2552,7 @@ msgstr "Schlagwortname" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:492 +#: lib/bds/tui.ex:603 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2554,6 +2564,7 @@ msgstr "Tags" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 +#: lib/bds/tui.ex:312 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "Aufgaben" @@ -2598,7 +2609,7 @@ msgstr "Template-Syntax ist gültig" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:490 +#: lib/bds/tui.ex:601 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2821,6 +2832,7 @@ msgid "Updated URLs" msgstr "Aktualisierte URLs" #: lib/bds/desktop/menu_bar.ex:259 +#: lib/bds/tui.ex:749 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "Website hochladen" @@ -2848,11 +2860,13 @@ msgid "Validate" msgstr "Validieren" #: lib/bds/desktop/menu_bar.ex:258 +#: lib/bds/tui.ex:727 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "Website validieren" #: lib/bds/desktop/menu_bar.ex:253 +#: lib/bds/tui.ex:740 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "Übersetzungen validieren" @@ -3517,6 +3531,7 @@ msgid "Suggested tags" msgstr "Vorgeschlagene Tags" #: lib/bds/desktop/menu_bar.ex:257 +#: lib/bds/tui.ex:728 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "Website vollständig neu generieren" @@ -3613,87 +3628,82 @@ msgstr "OK" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "Der Endpunkt hat keine Modelle zurückgegeben. Sie können einen Modellnamen weiterhin manuell eingeben." -#: lib/bds/tui.ex:576 +#: lib/bds/tui.ex:687 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "KI ist im Flugmodus ohne lokalen Endpunkt nicht verfügbar." -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:811 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "Diese Datei konnte nicht geladen werden." -#: lib/bds/tui.ex:123 +#: lib/bds/tui.ex:138 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "Die Bearbeitung dieses Eintrags ist in der Terminal-Oberfläche noch nicht verfügbar." -#: lib/bds/tui.ex:227 +#: lib/bds/tui.ex:288 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "Keine Vorschläge erhalten." -#: lib/bds/tui.ex:619 +#: lib/bds/tui.ex:808 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "Nur Bilder können in der Vorschau angezeigt werden." -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:610 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "Beitrag nicht gefunden." -#: lib/bds/tui.ex:303 +#: lib/bds/tui.ex:379 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "Drücken Sie Enter, um %{name} in der Vorschau anzuzeigen." -#: lib/bds/tui.ex:546 +#: lib/bds/tui.ex:657 #, elixir-autogen, elixir-format msgid "Published." msgstr "Veröffentlicht." -#: lib/bds/tui.ex:562 +#: lib/bds/tui.ex:673 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "Speichern Sie vor dem Sprachwechsel." -#: lib/bds/tui.ex:547 +#: lib/bds/tui.ex:658 #, elixir-autogen, elixir-format msgid "Saved." msgstr "Gespeichert." -#: lib/bds/tui.ex:306 +#: lib/bds/tui.ex:382 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "Wählen Sie einen Eintrag aus und öffnen Sie ihn mit Enter." -#: lib/bds/tui.ex:224 +#: lib/bds/tui.ex:285 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "Vorschläge übernommen." -#: lib/bds/tui.ex:318 +#: lib/bds/tui.ex:394 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "Titel (Strg+T zum Bearbeiten)" -#: lib/bds/tui.ex:317 +#: lib/bds/tui.ex:393 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "Titel (Bearbeitung — Enter zum Bestätigen)" -#: lib/bds/tui.ex:365 +#: lib/bds/tui.ex:441 #, elixir-autogen, elixir-format msgid "Working…" msgstr "Wird bearbeitet…" -#: lib/bds/tui.ex:394 -#, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit" -msgstr "Enter Öffnen · N Neuer Beitrag · 1-5 Ansichten · R Aktualisieren · Strg+Q Beenden" - -#: lib/bds/tui.ex:386 +#: lib/bds/tui.ex:462 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "Esc zum Schließen" @@ -3730,12 +3740,37 @@ msgstr "Serveradresse (user@host oder user@host:port), Public-Key-Authentifizier msgid "Use the form user@host or user@host:port." msgstr "Verwenden Sie das Format user@host oder user@host:port." -#: lib/bds/tui.ex:337 +#: lib/bds/tui.ex:413 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "Vorschau (ctrl+e zum Bearbeiten)" -#: lib/bds/tui.ex:401 +#: lib/bds/tui.ex:512 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "Strg+S Speichern · Strg+P Veröffentlichen · Strg+E Vorschau · Strg+T Titel · Strg+L Sprache · Strg+G KI · Esc Zurück" + +#: lib/bds/tui.ex:312 +#, elixir-autogen, elixir-format +msgid "All tasks finished." +msgstr "Alle Aufgaben abgeschlossen." + +#: lib/bds/tui.ex:488 +#, elixir-autogen, elixir-format +msgid "Commands — esc to close" +msgstr "Befehle — Esc zum Schließen" + +#: lib/bds/tui.ex:159 +#, elixir-autogen, elixir-format +msgid "Unknown command." +msgstr "Unbekannter Befehl." + +#: lib/bds/tui.ex:478 +#, elixir-autogen, elixir-format +msgid "[report/apply in GUI]" +msgstr "[Bericht/Anwenden in der GUI]" + +#: lib/bds/tui.ex:505 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" +msgstr "Enter Öffnen · N Neuer Beitrag · 1-5 Ansichten · : Befehle · ? Hilfe · R Aktualisieren · Strg+Q Beenden" diff --git a/priv/gettext/en/LC_MESSAGES/ui.po b/priv/gettext/en/LC_MESSAGES/ui.po index 3de942a..487a446 100644 --- a/priv/gettext/en/LC_MESSAGES/ui.po +++ b/priv/gettext/en/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:224 -#: lib/bds/tui.ex:227 -#: lib/bds/tui.ex:230 -#: lib/bds/tui.ex:238 -#: lib/bds/tui.ex:575 +#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:291 +#: lib/bds/tui.ex:299 +#: lib/bds/tui.ex:686 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "" @@ -572,6 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 +#: lib/bds/tui.ex:779 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "" @@ -589,7 +590,7 @@ msgstr "" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:348 +#: lib/bds/tui.ex:424 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1029,6 +1030,7 @@ msgid "Filename" msgstr "" #: lib/bds/desktop/menu_bar.ex:254 +#: lib/bds/tui.ex:745 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "" @@ -1039,6 +1041,7 @@ msgid "Find" msgstr "" #: lib/bds/desktop/menu_bar.ex:255 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "" @@ -1065,6 +1068,7 @@ msgid "Gallery" msgstr "" #: lib/bds/desktop/menu_bar.ex:256 +#: lib/bds/tui.ex:729 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "" @@ -1385,9 +1389,9 @@ msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:489 -#: lib/bds/tui.ex:619 -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:600 +#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:811 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1430,6 +1434,7 @@ msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 +#: lib/bds/tui.ex:726 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1475,7 +1480,7 @@ msgstr "" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:115 +#: lib/bds/tui.ex:130 #, elixir-autogen, elixir-format msgid "New Post" msgstr "" @@ -1764,6 +1769,7 @@ msgid "Open Settings" msgstr "" #: lib/bds/desktop/menu_bar.ex:217 +#: lib/bds/tui.ex:750 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "" @@ -1911,8 +1917,8 @@ msgstr "" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:488 -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:599 +#: lib/bds/tui.ex:610 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2036,12 +2042,14 @@ msgid "Ready to import:" msgstr "" #: lib/bds/desktop/menu_bar.ex:248 +#: lib/bds/tui.ex:730 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 +#: lib/bds/tui.ex:734 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "" @@ -2099,6 +2107,7 @@ msgid "Refresh Translation" msgstr "" #: lib/bds/desktop/menu_bar.ex:252 +#: lib/bds/tui.ex:737 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "" @@ -2109,6 +2118,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "" #: lib/bds/desktop/menu_bar.ex:249 +#: lib/bds/tui.ex:731 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "" @@ -2294,7 +2304,7 @@ msgstr "" #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:491 +#: lib/bds/tui.ex:602 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2542,7 +2552,7 @@ msgstr "" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:492 +#: lib/bds/tui.ex:603 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2554,6 +2564,7 @@ msgstr "" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 +#: lib/bds/tui.ex:312 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "" @@ -2598,7 +2609,7 @@ msgstr "" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:490 +#: lib/bds/tui.ex:601 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2821,6 +2832,7 @@ msgid "Updated URLs" msgstr "" #: lib/bds/desktop/menu_bar.ex:259 +#: lib/bds/tui.ex:749 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "" @@ -2848,11 +2860,13 @@ msgid "Validate" msgstr "" #: lib/bds/desktop/menu_bar.ex:258 +#: lib/bds/tui.ex:727 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "" #: lib/bds/desktop/menu_bar.ex:253 +#: lib/bds/tui.ex:740 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "" @@ -3517,6 +3531,7 @@ msgid "Suggested tags" msgstr "" #: lib/bds/desktop/menu_bar.ex:257 +#: lib/bds/tui.ex:728 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "" @@ -3613,87 +3628,82 @@ msgstr "" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "" -#: lib/bds/tui.ex:576 +#: lib/bds/tui.ex:687 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "" -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:811 #, elixir-autogen, elixir-format, fuzzy msgid "Could not load this file." msgstr "" -#: lib/bds/tui.ex:123 +#: lib/bds/tui.ex:138 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "" -#: lib/bds/tui.ex:227 +#: lib/bds/tui.ex:288 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "" -#: lib/bds/tui.ex:619 +#: lib/bds/tui.ex:808 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "" -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:610 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "" -#: lib/bds/tui.ex:303 +#: lib/bds/tui.ex:379 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "" -#: lib/bds/tui.ex:546 +#: lib/bds/tui.ex:657 #, elixir-autogen, elixir-format, fuzzy msgid "Published." msgstr "" -#: lib/bds/tui.ex:562 +#: lib/bds/tui.ex:673 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "" -#: lib/bds/tui.ex:547 +#: lib/bds/tui.ex:658 #, elixir-autogen, elixir-format, fuzzy msgid "Saved." msgstr "" -#: lib/bds/tui.ex:306 +#: lib/bds/tui.ex:382 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "" -#: lib/bds/tui.ex:224 +#: lib/bds/tui.ex:285 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "" -#: lib/bds/tui.ex:318 +#: lib/bds/tui.ex:394 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "" -#: lib/bds/tui.ex:317 +#: lib/bds/tui.ex:393 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "" -#: lib/bds/tui.ex:365 +#: lib/bds/tui.ex:441 #, elixir-autogen, elixir-format, fuzzy msgid "Working…" msgstr "" -#: lib/bds/tui.ex:394 -#, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit" -msgstr "" - -#: lib/bds/tui.ex:386 +#: lib/bds/tui.ex:462 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "" @@ -3730,12 +3740,37 @@ msgstr "" msgid "Use the form user@host or user@host:port." msgstr "" -#: lib/bds/tui.ex:337 +#: lib/bds/tui.ex:413 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "" -#: lib/bds/tui.ex:401 +#: lib/bds/tui.ex:512 #, elixir-autogen, elixir-format, fuzzy msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "" + +#: lib/bds/tui.ex:312 +#, elixir-autogen, elixir-format +msgid "All tasks finished." +msgstr "" + +#: lib/bds/tui.ex:488 +#, elixir-autogen, elixir-format +msgid "Commands — esc to close" +msgstr "" + +#: lib/bds/tui.ex:159 +#, elixir-autogen, elixir-format, fuzzy +msgid "Unknown command." +msgstr "" + +#: lib/bds/tui.ex:478 +#, elixir-autogen, elixir-format +msgid "[report/apply in GUI]" +msgstr "" + +#: lib/bds/tui.ex:505 +#, elixir-autogen, elixir-format, fuzzy +msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" +msgstr "" diff --git a/priv/gettext/es/LC_MESSAGES/ui.po b/priv/gettext/es/LC_MESSAGES/ui.po index f7148b2..778be1e 100644 --- a/priv/gettext/es/LC_MESSAGES/ui.po +++ b/priv/gettext/es/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "Configuración de IA" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:224 -#: lib/bds/tui.ex:227 -#: lib/bds/tui.ex:230 -#: lib/bds/tui.ex:238 -#: lib/bds/tui.ex:575 +#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:291 +#: lib/bds/tui.ex:299 +#: lib/bds/tui.ex:686 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "Sugerencias de IA" @@ -572,6 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "Contraer bloques de diff sin cambios" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 +#: lib/bds/tui.ex:779 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "Comando completado" @@ -589,7 +590,7 @@ msgstr "Confirmar" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:348 +#: lib/bds/tui.ex:424 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1029,6 +1030,7 @@ msgid "Filename" msgstr "Nombre de archivo" #: lib/bds/desktop/menu_bar.ex:254 +#: lib/bds/tui.ex:745 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "Completar traducciones faltantes" @@ -1039,6 +1041,7 @@ msgid "Find" msgstr "Buscar" #: lib/bds/desktop/menu_bar.ex:255 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "Buscar entradas duplicadas" @@ -1065,6 +1068,7 @@ msgid "Gallery" msgstr "Galeria" #: lib/bds/desktop/menu_bar.ex:256 +#: lib/bds/tui.ex:729 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "Generar sitio" @@ -1385,9 +1389,9 @@ msgstr "Máximo de publicaciones por página" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:489 -#: lib/bds/tui.ex:619 -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:600 +#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:811 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1430,6 +1434,7 @@ msgstr "Metadatos" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 +#: lib/bds/tui.ex:726 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1475,7 +1480,7 @@ msgstr "Nueva página" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:115 +#: lib/bds/tui.ex:130 #, elixir-autogen, elixir-format msgid "New Post" msgstr "Nueva entrada" @@ -1764,6 +1769,7 @@ msgid "Open Settings" msgstr "Abrir Ajustes" #: lib/bds/desktop/menu_bar.ex:217 +#: lib/bds/tui.ex:750 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "Abrir en el navegador" @@ -1911,8 +1917,8 @@ msgstr "Artículo guardado" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:488 -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:599 +#: lib/bds/tui.ex:610 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2036,12 +2042,14 @@ msgid "Ready to import:" msgstr "Listo para importar:" #: lib/bds/desktop/menu_bar.ex:248 +#: lib/bds/tui.ex:730 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "Reconstruir base de datos" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 +#: lib/bds/tui.ex:734 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "Reconstruir índice de embeddings" @@ -2099,6 +2107,7 @@ msgid "Refresh Translation" msgstr "Actualizar traducción" #: lib/bds/desktop/menu_bar.ex:252 +#: lib/bds/tui.ex:737 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "Regenerar calendario" @@ -2109,6 +2118,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "Regenerar miniaturas faltantes" #: lib/bds/desktop/menu_bar.ex:249 +#: lib/bds/tui.ex:731 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "Reindexar texto" @@ -2294,7 +2304,7 @@ msgstr "Las capacidades de scripts se configuran en la capa de aplicación en la #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:491 +#: lib/bds/tui.ex:602 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2542,7 +2552,7 @@ msgstr "Nombre de la etiqueta" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:492 +#: lib/bds/tui.ex:603 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2554,6 +2564,7 @@ msgstr "Etiquetas" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 +#: lib/bds/tui.ex:312 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "Tareas" @@ -2598,7 +2609,7 @@ msgstr "La sintaxis de la plantilla es válida" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:490 +#: lib/bds/tui.ex:601 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2821,6 +2832,7 @@ msgid "Updated URLs" msgstr "URLs actualizadas" #: lib/bds/desktop/menu_bar.ex:259 +#: lib/bds/tui.ex:749 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "Subir sitio" @@ -2848,11 +2860,13 @@ msgid "Validate" msgstr "Validar" #: lib/bds/desktop/menu_bar.ex:258 +#: lib/bds/tui.ex:727 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "Validar sitio" #: lib/bds/desktop/menu_bar.ex:253 +#: lib/bds/tui.ex:740 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "Validar traducciones" @@ -3517,6 +3531,7 @@ msgid "Suggested tags" msgstr "Etiquetas sugeridas" #: lib/bds/desktop/menu_bar.ex:257 +#: lib/bds/tui.ex:728 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "Forzar la regeneración del sitio" @@ -3613,87 +3628,82 @@ msgstr "OK" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "El endpoint no devolvió ningún modelo. Aún puedes escribir el nombre de un modelo manualmente." -#: lib/bds/tui.ex:576 +#: lib/bds/tui.ex:687 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "La IA no está disponible en modo avión sin un punto de conexión local." -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:811 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "No se pudo cargar este archivo." -#: lib/bds/tui.ex:123 +#: lib/bds/tui.ex:138 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "La edición de este elemento aún no está disponible en la interfaz de terminal." -#: lib/bds/tui.ex:227 +#: lib/bds/tui.ex:288 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "No se recibieron sugerencias." -#: lib/bds/tui.ex:619 +#: lib/bds/tui.ex:808 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "Solo se pueden previsualizar imágenes." -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:610 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "Entrada no encontrada." -#: lib/bds/tui.ex:303 +#: lib/bds/tui.ex:379 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "Pulsa Intro para previsualizar %{name}." -#: lib/bds/tui.ex:546 +#: lib/bds/tui.ex:657 #, elixir-autogen, elixir-format msgid "Published." msgstr "Publicado." -#: lib/bds/tui.ex:562 +#: lib/bds/tui.ex:673 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "Guarda antes de cambiar de idioma." -#: lib/bds/tui.ex:547 +#: lib/bds/tui.ex:658 #, elixir-autogen, elixir-format msgid "Saved." msgstr "Guardado." -#: lib/bds/tui.ex:306 +#: lib/bds/tui.ex:382 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "Selecciona una entrada y pulsa Intro para abrirla." -#: lib/bds/tui.ex:224 +#: lib/bds/tui.ex:285 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "Sugerencias aplicadas." -#: lib/bds/tui.ex:318 +#: lib/bds/tui.ex:394 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "Título (ctrl+t para editar)" -#: lib/bds/tui.ex:317 +#: lib/bds/tui.ex:393 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "Título (edición — Intro para confirmar)" -#: lib/bds/tui.ex:365 +#: lib/bds/tui.ex:441 #, elixir-autogen, elixir-format msgid "Working…" msgstr "Procesando…" -#: lib/bds/tui.ex:394 -#, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit" -msgstr "intro abrir · n nueva entrada · 1-5 vistas · r actualizar · ctrl+q salir" - -#: lib/bds/tui.ex:386 +#: lib/bds/tui.ex:462 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "esc para cerrar" @@ -3730,12 +3740,37 @@ msgstr "Dirección del servidor (user@host o user@host:port), autenticación de msgid "Use the form user@host or user@host:port." msgstr "Usa el formato user@host o user@host:port." -#: lib/bds/tui.ex:337 +#: lib/bds/tui.ex:413 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "Vista previa (ctrl+e para editar)" -#: lib/bds/tui.ex:401 +#: lib/bds/tui.ex:512 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "ctrl+s guardar · ctrl+p publicar · ctrl+e vista previa · ctrl+t título · ctrl+l idioma · ctrl+g IA · esc volver" + +#: lib/bds/tui.ex:312 +#, elixir-autogen, elixir-format +msgid "All tasks finished." +msgstr "Todas las tareas han terminado." + +#: lib/bds/tui.ex:488 +#, elixir-autogen, elixir-format +msgid "Commands — esc to close" +msgstr "Comandos — esc para cerrar" + +#: lib/bds/tui.ex:159 +#, elixir-autogen, elixir-format +msgid "Unknown command." +msgstr "Comando desconocido." + +#: lib/bds/tui.ex:478 +#, elixir-autogen, elixir-format +msgid "[report/apply in GUI]" +msgstr "[informe/aplicación en la GUI]" + +#: lib/bds/tui.ex:505 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" +msgstr "intro abrir · n nueva entrada · 1-5 vistas · : comandos · ? ayuda · r actualizar · ctrl+q salir" diff --git a/priv/gettext/fr/LC_MESSAGES/ui.po b/priv/gettext/fr/LC_MESSAGES/ui.po index 3fe8afe..88a6f5b 100644 --- a/priv/gettext/fr/LC_MESSAGES/ui.po +++ b/priv/gettext/fr/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "Paramètres IA" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:224 -#: lib/bds/tui.ex:227 -#: lib/bds/tui.ex:230 -#: lib/bds/tui.ex:238 -#: lib/bds/tui.ex:575 +#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:291 +#: lib/bds/tui.ex:299 +#: lib/bds/tui.ex:686 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "Suggestions IA" @@ -572,6 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "Réduire les blocs de diff inchangés" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 +#: lib/bds/tui.ex:779 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "Commande terminée" @@ -589,7 +590,7 @@ msgstr "Confirmer" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:348 +#: lib/bds/tui.ex:424 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1029,6 +1030,7 @@ msgid "Filename" msgstr "Nom de fichier" #: lib/bds/desktop/menu_bar.ex:254 +#: lib/bds/tui.ex:745 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "Compléter les traductions manquantes" @@ -1039,6 +1041,7 @@ msgid "Find" msgstr "Rechercher" #: lib/bds/desktop/menu_bar.ex:255 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "Trouver les doublons" @@ -1065,6 +1068,7 @@ msgid "Gallery" msgstr "Galerie" #: lib/bds/desktop/menu_bar.ex:256 +#: lib/bds/tui.ex:729 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "Générer le site" @@ -1385,9 +1389,9 @@ msgstr "Nombre maximal d’articles par page" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:489 -#: lib/bds/tui.ex:619 -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:600 +#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:811 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1430,6 +1434,7 @@ msgstr "Métadonnées" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 +#: lib/bds/tui.ex:726 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1475,7 +1480,7 @@ msgstr "Nouvelle page" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:115 +#: lib/bds/tui.ex:130 #, elixir-autogen, elixir-format msgid "New Post" msgstr "Nouvel article" @@ -1764,6 +1769,7 @@ msgid "Open Settings" msgstr "Ouvrir les Réglages" #: lib/bds/desktop/menu_bar.ex:217 +#: lib/bds/tui.ex:750 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "Ouvrir dans le navigateur" @@ -1911,8 +1917,8 @@ msgstr "Article enregistré" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:488 -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:599 +#: lib/bds/tui.ex:610 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2036,12 +2042,14 @@ msgid "Ready to import:" msgstr "Prêt à importer :" #: lib/bds/desktop/menu_bar.ex:248 +#: lib/bds/tui.ex:730 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "Reconstruire la base de données" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 +#: lib/bds/tui.ex:734 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "Reconstruire l’index d’embeddings" @@ -2099,6 +2107,7 @@ msgid "Refresh Translation" msgstr "Actualiser la traduction" #: lib/bds/desktop/menu_bar.ex:252 +#: lib/bds/tui.ex:737 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "Régénérer le calendrier" @@ -2109,6 +2118,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "Régénérer les vignettes manquantes" #: lib/bds/desktop/menu_bar.ex:249 +#: lib/bds/tui.ex:731 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "Réindexer le texte" @@ -2294,7 +2304,7 @@ msgstr "Les capacités de script sont configurées au niveau de l’application #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:491 +#: lib/bds/tui.ex:602 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2542,7 +2552,7 @@ msgstr "Nom du mot-clé" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:492 +#: lib/bds/tui.ex:603 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2554,6 +2564,7 @@ msgstr "Tags" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 +#: lib/bds/tui.ex:312 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "Tâches" @@ -2598,7 +2609,7 @@ msgstr "La syntaxe du template est valide" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:490 +#: lib/bds/tui.ex:601 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2821,6 +2832,7 @@ msgid "Updated URLs" msgstr "URLs mises à jour" #: lib/bds/desktop/menu_bar.ex:259 +#: lib/bds/tui.ex:749 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "Téléverser le site" @@ -2848,11 +2860,13 @@ msgid "Validate" msgstr "Valider" #: lib/bds/desktop/menu_bar.ex:258 +#: lib/bds/tui.ex:727 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "Valider le site" #: lib/bds/desktop/menu_bar.ex:253 +#: lib/bds/tui.ex:740 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "Valider les traductions" @@ -3517,6 +3531,7 @@ msgid "Suggested tags" msgstr "Tags suggérés" #: lib/bds/desktop/menu_bar.ex:257 +#: lib/bds/tui.ex:728 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "Forcer la régénération du site" @@ -3613,87 +3628,82 @@ msgstr "OK" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "Le point de terminaison n'a renvoyé aucun modèle. Vous pouvez toujours saisir un nom de modèle manuellement." -#: lib/bds/tui.ex:576 +#: lib/bds/tui.ex:687 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "L'IA n'est pas disponible en mode avion sans point de terminaison local." -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:811 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "Impossible de charger ce fichier." -#: lib/bds/tui.ex:123 +#: lib/bds/tui.ex:138 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "La modification de cet élément n'est pas encore disponible dans l'interface du terminal." -#: lib/bds/tui.ex:227 +#: lib/bds/tui.ex:288 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "Aucune suggestion reçue." -#: lib/bds/tui.ex:619 +#: lib/bds/tui.ex:808 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "Seules les images peuvent être prévisualisées." -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:610 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "Article introuvable." -#: lib/bds/tui.ex:303 +#: lib/bds/tui.ex:379 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "Appuyez sur Entrée pour prévisualiser %{name}." -#: lib/bds/tui.ex:546 +#: lib/bds/tui.ex:657 #, elixir-autogen, elixir-format msgid "Published." msgstr "Publié." -#: lib/bds/tui.ex:562 +#: lib/bds/tui.ex:673 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "Enregistrez avant de changer de langue." -#: lib/bds/tui.ex:547 +#: lib/bds/tui.ex:658 #, elixir-autogen, elixir-format msgid "Saved." msgstr "Enregistré." -#: lib/bds/tui.ex:306 +#: lib/bds/tui.ex:382 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "Sélectionnez une entrée et appuyez sur Entrée pour l'ouvrir." -#: lib/bds/tui.ex:224 +#: lib/bds/tui.ex:285 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "Suggestions appliquées." -#: lib/bds/tui.ex:318 +#: lib/bds/tui.ex:394 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "Titre (ctrl+t pour modifier)" -#: lib/bds/tui.ex:317 +#: lib/bds/tui.ex:393 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "Titre (édition — Entrée pour confirmer)" -#: lib/bds/tui.ex:365 +#: lib/bds/tui.ex:441 #, elixir-autogen, elixir-format msgid "Working…" msgstr "Traitement en cours…" -#: lib/bds/tui.ex:394 -#, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit" -msgstr "entrée ouvrir · n nouvel article · 1-5 vues · r actualiser · ctrl+q quitter" - -#: lib/bds/tui.ex:386 +#: lib/bds/tui.ex:462 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "échap pour fermer" @@ -3730,12 +3740,37 @@ msgstr "Adresse du serveur (user@host ou user@host:port), authentification par c msgid "Use the form user@host or user@host:port." msgstr "Utilisez le format user@host ou user@host:port." -#: lib/bds/tui.ex:337 +#: lib/bds/tui.ex:413 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "Aperçu (ctrl+e pour modifier)" -#: lib/bds/tui.ex:401 +#: lib/bds/tui.ex:512 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "ctrl+s enregistrer · ctrl+p publier · ctrl+e aperçu · ctrl+t titre · ctrl+l langue · ctrl+g IA · échap retour" + +#: lib/bds/tui.ex:312 +#, elixir-autogen, elixir-format +msgid "All tasks finished." +msgstr "Toutes les tâches sont terminées." + +#: lib/bds/tui.ex:488 +#, elixir-autogen, elixir-format +msgid "Commands — esc to close" +msgstr "Commandes — échap pour fermer" + +#: lib/bds/tui.ex:159 +#, elixir-autogen, elixir-format +msgid "Unknown command." +msgstr "Commande inconnue." + +#: lib/bds/tui.ex:478 +#, elixir-autogen, elixir-format +msgid "[report/apply in GUI]" +msgstr "[rapport/application dans la GUI]" + +#: lib/bds/tui.ex:505 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" +msgstr "entrée ouvrir · n nouvel article · 1-5 vues · : commandes · ? aide · r actualiser · ctrl+q quitter" diff --git a/priv/gettext/it/LC_MESSAGES/ui.po b/priv/gettext/it/LC_MESSAGES/ui.po index 66e19db..2917539 100644 --- a/priv/gettext/it/LC_MESSAGES/ui.po +++ b/priv/gettext/it/LC_MESSAGES/ui.po @@ -81,11 +81,11 @@ msgstr "Impostazioni IA" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:224 -#: lib/bds/tui.ex:227 -#: lib/bds/tui.ex:230 -#: lib/bds/tui.ex:238 -#: lib/bds/tui.ex:575 +#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:291 +#: lib/bds/tui.ex:299 +#: lib/bds/tui.ex:686 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "Suggerimenti IA" @@ -572,6 +572,7 @@ msgid "Collapse unchanged diff hunks" msgstr "Comprimi i blocchi diff invariati" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 +#: lib/bds/tui.ex:779 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "Comando completato" @@ -589,7 +590,7 @@ msgstr "Conferma" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:348 +#: lib/bds/tui.ex:424 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1029,6 +1030,7 @@ msgid "Filename" msgstr "Nome file" #: lib/bds/desktop/menu_bar.ex:254 +#: lib/bds/tui.ex:745 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "Completa traduzioni mancanti" @@ -1039,6 +1041,7 @@ msgid "Find" msgstr "Trova" #: lib/bds/desktop/menu_bar.ex:255 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "Trova post duplicati" @@ -1065,6 +1068,7 @@ msgid "Gallery" msgstr "Galleria" #: lib/bds/desktop/menu_bar.ex:256 +#: lib/bds/tui.ex:729 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "Genera sito" @@ -1385,9 +1389,9 @@ msgstr "Numero massimo di post per pagina" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:489 -#: lib/bds/tui.ex:619 -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:600 +#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:811 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1430,6 +1434,7 @@ msgstr "Metadati" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 +#: lib/bds/tui.ex:726 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1475,7 +1480,7 @@ msgstr "Nuova pagina" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:115 +#: lib/bds/tui.ex:130 #, elixir-autogen, elixir-format msgid "New Post" msgstr "Nuovo post" @@ -1764,6 +1769,7 @@ msgid "Open Settings" msgstr "Apri Impostazioni" #: lib/bds/desktop/menu_bar.ex:217 +#: lib/bds/tui.ex:750 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "Apri nel browser" @@ -1911,8 +1917,8 @@ msgstr "Articolo salvato" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:488 -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:599 +#: lib/bds/tui.ex:610 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2036,12 +2042,14 @@ msgid "Ready to import:" msgstr "Pronto per importare:" #: lib/bds/desktop/menu_bar.ex:248 +#: lib/bds/tui.ex:730 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "Ricostruisci database" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 +#: lib/bds/tui.ex:734 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "Ricostruisci indice embeddings" @@ -2099,6 +2107,7 @@ msgid "Refresh Translation" msgstr "Aggiorna traduzione" #: lib/bds/desktop/menu_bar.ex:252 +#: lib/bds/tui.ex:737 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "Rigenera calendario" @@ -2109,6 +2118,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "Rigenera miniature mancanti" #: lib/bds/desktop/menu_bar.ex:249 +#: lib/bds/tui.ex:731 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "Reindicizza testo" @@ -2294,7 +2304,7 @@ msgstr "Le capacità di scripting sono configurate a livello applicativo nella r #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:491 +#: lib/bds/tui.ex:602 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2542,7 +2552,7 @@ msgstr "Nome del tag" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:492 +#: lib/bds/tui.ex:603 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2554,6 +2564,7 @@ msgstr "Tag" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 +#: lib/bds/tui.ex:312 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "Attività" @@ -2598,7 +2609,7 @@ msgstr "La sintassi del template è valida" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:490 +#: lib/bds/tui.ex:601 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2821,6 +2832,7 @@ msgid "Updated URLs" msgstr "URL aggiornati" #: lib/bds/desktop/menu_bar.ex:259 +#: lib/bds/tui.ex:749 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "Carica sito" @@ -2848,11 +2860,13 @@ msgid "Validate" msgstr "Valida" #: lib/bds/desktop/menu_bar.ex:258 +#: lib/bds/tui.ex:727 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "Valida sito" #: lib/bds/desktop/menu_bar.ex:253 +#: lib/bds/tui.ex:740 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "Valida traduzioni" @@ -3517,6 +3531,7 @@ msgid "Suggested tags" msgstr "Tag suggeriti" #: lib/bds/desktop/menu_bar.ex:257 +#: lib/bds/tui.ex:728 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "Forza la rigenerazione del sito" @@ -3613,87 +3628,82 @@ msgstr "OK" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "L'endpoint non ha restituito alcun modello. Puoi comunque digitare manualmente il nome di un modello." -#: lib/bds/tui.ex:576 +#: lib/bds/tui.ex:687 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "L'IA non è disponibile in modalità aereo senza un endpoint locale." -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:811 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "Impossibile caricare questo file." -#: lib/bds/tui.ex:123 +#: lib/bds/tui.ex:138 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "La modifica di questo elemento non è ancora disponibile nell'interfaccia del terminale." -#: lib/bds/tui.ex:227 +#: lib/bds/tui.ex:288 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "Nessun suggerimento ricevuto." -#: lib/bds/tui.ex:619 +#: lib/bds/tui.ex:808 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "Solo le immagini possono essere visualizzate in anteprima." -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:610 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "Post non trovato." -#: lib/bds/tui.ex:303 +#: lib/bds/tui.ex:379 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "Premi Invio per l'anteprima di %{name}." -#: lib/bds/tui.ex:546 +#: lib/bds/tui.ex:657 #, elixir-autogen, elixir-format msgid "Published." msgstr "Pubblicato." -#: lib/bds/tui.ex:562 +#: lib/bds/tui.ex:673 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "Salva prima di cambiare lingua." -#: lib/bds/tui.ex:547 +#: lib/bds/tui.ex:658 #, elixir-autogen, elixir-format msgid "Saved." msgstr "Salvato." -#: lib/bds/tui.ex:306 +#: lib/bds/tui.ex:382 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "Seleziona una voce e premi Invio per aprirla." -#: lib/bds/tui.ex:224 +#: lib/bds/tui.ex:285 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "Suggerimenti applicati." -#: lib/bds/tui.ex:318 +#: lib/bds/tui.ex:394 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "Titolo (ctrl+t per modificare)" -#: lib/bds/tui.ex:317 +#: lib/bds/tui.ex:393 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "Titolo (modifica — Invio per confermare)" -#: lib/bds/tui.ex:365 +#: lib/bds/tui.ex:441 #, elixir-autogen, elixir-format msgid "Working…" msgstr "Elaborazione…" -#: lib/bds/tui.ex:394 -#, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit" -msgstr "invio apri · n nuovo post · 1-5 viste · r aggiorna · ctrl+q esci" - -#: lib/bds/tui.ex:386 +#: lib/bds/tui.ex:462 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "esc per chiudere" @@ -3730,12 +3740,37 @@ msgstr "Indirizzo del server (user@host o user@host:port), autenticazione a chia msgid "Use the form user@host or user@host:port." msgstr "Usa il formato user@host o user@host:port." -#: lib/bds/tui.ex:337 +#: lib/bds/tui.ex:413 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "Anteprima (ctrl+e per modificare)" -#: lib/bds/tui.ex:401 +#: lib/bds/tui.ex:512 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "ctrl+s salva · ctrl+p pubblica · ctrl+e anteprima · ctrl+t titolo · ctrl+l lingua · ctrl+g IA · esc indietro" + +#: lib/bds/tui.ex:312 +#, elixir-autogen, elixir-format +msgid "All tasks finished." +msgstr "Tutte le attività sono terminate." + +#: lib/bds/tui.ex:488 +#, elixir-autogen, elixir-format +msgid "Commands — esc to close" +msgstr "Comandi — esc per chiudere" + +#: lib/bds/tui.ex:159 +#, elixir-autogen, elixir-format +msgid "Unknown command." +msgstr "Comando sconosciuto." + +#: lib/bds/tui.ex:478 +#, elixir-autogen, elixir-format +msgid "[report/apply in GUI]" +msgstr "[report/applicazione nella GUI]" + +#: lib/bds/tui.ex:505 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" +msgstr "invio apri · n nuovo post · 1-5 viste · : comandi · ? aiuto · r aggiorna · ctrl+q esci" diff --git a/priv/gettext/ui.pot b/priv/gettext/ui.pot index 1338eee..30ada55 100644 --- a/priv/gettext/ui.pot +++ b/priv/gettext/ui.pot @@ -94,11 +94,11 @@ msgstr "" #: lib/bds/desktop/shell_live/overlay_manager.ex:72 #: lib/bds/desktop/shell_live/post_editor.ex:920 #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:43 -#: lib/bds/tui.ex:224 -#: lib/bds/tui.ex:227 -#: lib/bds/tui.ex:230 -#: lib/bds/tui.ex:238 -#: lib/bds/tui.ex:575 +#: lib/bds/tui.ex:285 +#: lib/bds/tui.ex:288 +#: lib/bds/tui.ex:291 +#: lib/bds/tui.ex:299 +#: lib/bds/tui.ex:686 #, elixir-autogen, elixir-format msgid "AI Suggestions" msgstr "" @@ -585,6 +585,7 @@ msgid "Collapse unchanged diff hunks" msgstr "" #: lib/bds/desktop/shell_live/overlay_manager.ex:422 +#: lib/bds/tui.ex:779 #, elixir-autogen, elixir-format msgid "Command completed" msgstr "" @@ -602,7 +603,7 @@ msgstr "" #: lib/bds/desktop/shell_live/post_editor_html/post_editor.html.heex:375 #: lib/bds/desktop/shell_live/script_editor_html/script_editor.html.heex:34 #: lib/bds/desktop/shell_live/template_editor_html/template_editor.html.heex:32 -#: lib/bds/tui.ex:348 +#: lib/bds/tui.ex:424 #: lib/bds/ui/sidebar.ex:764 #, elixir-autogen, elixir-format msgid "Content" @@ -1042,6 +1043,7 @@ msgid "Filename" msgstr "" #: lib/bds/desktop/menu_bar.ex:254 +#: lib/bds/tui.ex:745 #, elixir-autogen, elixir-format msgid "Fill Missing Translations" msgstr "" @@ -1052,6 +1054,7 @@ msgid "Find" msgstr "" #: lib/bds/desktop/menu_bar.ex:255 +#: lib/bds/tui.ex:748 #, elixir-autogen, elixir-format msgid "Find Duplicate Posts" msgstr "" @@ -1078,6 +1081,7 @@ msgid "Gallery" msgstr "" #: lib/bds/desktop/menu_bar.ex:256 +#: lib/bds/tui.ex:729 #, elixir-autogen, elixir-format msgid "Generate Site" msgstr "" @@ -1398,9 +1402,9 @@ msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:762 #: lib/bds/desktop/shell_live/sidebar_components.ex:654 #: lib/bds/desktop/shell_live/sidebar_delete.ex:175 -#: lib/bds/tui.ex:489 -#: lib/bds/tui.ex:619 -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:600 +#: lib/bds/tui.ex:808 +#: lib/bds/tui.ex:811 #: lib/bds/ui/registry.ex:30 #: lib/bds/ui/registry.ex:100 #: lib/bds/ui/sidebar.ex:558 @@ -1443,6 +1447,7 @@ msgstr "" #: lib/bds/desktop/shell_live/misc_editor.ex:214 #: lib/bds/desktop/shell_live/misc_editor.ex:226 #: lib/bds/desktop/shell_live/misc_editor.ex:448 +#: lib/bds/tui.ex:726 #: lib/bds/ui/registry.ex:111 #, elixir-autogen, elixir-format msgid "Metadata Diff" @@ -1488,7 +1493,7 @@ msgstr "" #: lib/bds/desktop/menu_bar.ex:214 #: lib/bds/desktop/shell_live/sidebar_create.ex:41 -#: lib/bds/tui.ex:115 +#: lib/bds/tui.ex:130 #, elixir-autogen, elixir-format msgid "New Post" msgstr "" @@ -1777,6 +1782,7 @@ msgid "Open Settings" msgstr "" #: lib/bds/desktop/menu_bar.ex:217 +#: lib/bds/tui.ex:750 #, elixir-autogen, elixir-format msgid "Open in Browser" msgstr "" @@ -1924,8 +1930,8 @@ msgstr "" #: lib/bds/desktop/menu_bar.ex:233 #: lib/bds/desktop/shell_live/misc_editor.ex:664 #: lib/bds/desktop/shell_live/misc_editor.ex:761 -#: lib/bds/tui.ex:488 -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:599 +#: lib/bds/tui.ex:610 #: lib/bds/ui/registry.ex:14 #: lib/bds/ui/sidebar.ex:271 #, elixir-autogen, elixir-format @@ -2049,12 +2055,14 @@ msgid "Ready to import:" msgstr "" #: lib/bds/desktop/menu_bar.ex:248 +#: lib/bds/tui.ex:730 #, elixir-autogen, elixir-format msgid "Rebuild Database" msgstr "" #: lib/bds/desktop/menu_bar.ex:250 #: lib/bds/desktop/shell_live/settings_editor_html/settings_editor.html.heex:381 +#: lib/bds/tui.ex:734 #, elixir-autogen, elixir-format msgid "Rebuild Embedding Index" msgstr "" @@ -2112,6 +2120,7 @@ msgid "Refresh Translation" msgstr "" #: lib/bds/desktop/menu_bar.ex:252 +#: lib/bds/tui.ex:737 #, elixir-autogen, elixir-format msgid "Regenerate Calendar" msgstr "" @@ -2122,6 +2131,7 @@ msgid "Regenerate Missing Thumbnails" msgstr "" #: lib/bds/desktop/menu_bar.ex:249 +#: lib/bds/tui.ex:731 #, elixir-autogen, elixir-format msgid "Reindex Text" msgstr "" @@ -2307,7 +2317,7 @@ msgstr "" #: lib/bds/desktop/shell_live/script_editor.ex:216 #: lib/bds/desktop/shell_live/script_editor.ex:219 #: lib/bds/desktop/shell_live/script_editor.ex:234 -#: lib/bds/tui.ex:491 +#: lib/bds/tui.ex:602 #: lib/bds/ui/registry.ex:38 #: lib/bds/ui/sidebar.ex:63 #: lib/bds/ui/sidebar.ex:115 @@ -2555,7 +2565,7 @@ msgstr "" #: lib/bds/desktop/shell_live/tags_editor.ex:222 #: lib/bds/desktop/shell_live/tags_editor.ex:253 #: lib/bds/desktop/shell_live/tags_editor_html/tags_editor.html.heex:11 -#: lib/bds/tui.ex:492 +#: lib/bds/tui.ex:603 #: lib/bds/ui/registry.ex:54 #: lib/bds/ui/registry.ex:103 #: lib/bds/ui/sidebar.ex:289 @@ -2567,6 +2577,7 @@ msgstr "" #: lib/bds/desktop/shell_live.ex:786 #: lib/bds/desktop/shell_live/panel_renderer.ex:54 +#: lib/bds/tui.ex:312 #, elixir-autogen, elixir-format msgid "Tasks" msgstr "" @@ -2611,7 +2622,7 @@ msgstr "" #: lib/bds/desktop/shell_live/template_editor.ex:171 #: lib/bds/desktop/shell_live/template_editor.ex:176 #: lib/bds/desktop/shell_live/template_editor.ex:191 -#: lib/bds/tui.ex:490 +#: lib/bds/tui.ex:601 #: lib/bds/ui/registry.ex:46 #: lib/bds/ui/sidebar.ex:71 #: lib/bds/ui/sidebar.ex:122 @@ -2834,6 +2845,7 @@ msgid "Updated URLs" msgstr "" #: lib/bds/desktop/menu_bar.ex:259 +#: lib/bds/tui.ex:749 #, elixir-autogen, elixir-format msgid "Upload Site" msgstr "" @@ -2861,11 +2873,13 @@ msgid "Validate" msgstr "" #: lib/bds/desktop/menu_bar.ex:258 +#: lib/bds/tui.ex:727 #, elixir-autogen, elixir-format msgid "Validate Site" msgstr "" #: lib/bds/desktop/menu_bar.ex:253 +#: lib/bds/tui.ex:740 #, elixir-autogen, elixir-format msgid "Validate Translations" msgstr "" @@ -3530,6 +3544,7 @@ msgid "Suggested tags" msgstr "" #: lib/bds/desktop/menu_bar.ex:257 +#: lib/bds/tui.ex:728 #, elixir-autogen, elixir-format msgid "Force Render Site" msgstr "" @@ -3626,87 +3641,82 @@ msgstr "" msgid "The endpoint returned no models. You can still type a model name manually." msgstr "" -#: lib/bds/tui.ex:576 +#: lib/bds/tui.ex:687 #, elixir-autogen, elixir-format msgid "AI is unavailable in airplane mode without a local endpoint." msgstr "" -#: lib/bds/tui.ex:622 +#: lib/bds/tui.ex:811 #, elixir-autogen, elixir-format msgid "Could not load this file." msgstr "" -#: lib/bds/tui.ex:123 +#: lib/bds/tui.ex:138 #, elixir-autogen, elixir-format msgid "Editing this item is not available in the terminal UI yet." msgstr "" -#: lib/bds/tui.ex:227 +#: lib/bds/tui.ex:288 #, elixir-autogen, elixir-format msgid "No suggestions returned." msgstr "" -#: lib/bds/tui.ex:619 +#: lib/bds/tui.ex:808 #, elixir-autogen, elixir-format msgid "Only images can be previewed." msgstr "" -#: lib/bds/tui.ex:499 +#: lib/bds/tui.ex:610 #, elixir-autogen, elixir-format msgid "Post not found." msgstr "" -#: lib/bds/tui.ex:303 +#: lib/bds/tui.ex:379 #, elixir-autogen, elixir-format msgid "Press enter to preview %{name}." msgstr "" -#: lib/bds/tui.ex:546 +#: lib/bds/tui.ex:657 #, elixir-autogen, elixir-format msgid "Published." msgstr "" -#: lib/bds/tui.ex:562 +#: lib/bds/tui.ex:673 #, elixir-autogen, elixir-format msgid "Save before switching languages." msgstr "" -#: lib/bds/tui.ex:547 +#: lib/bds/tui.ex:658 #, elixir-autogen, elixir-format msgid "Saved." msgstr "" -#: lib/bds/tui.ex:306 +#: lib/bds/tui.ex:382 #, elixir-autogen, elixir-format msgid "Select an entry and press enter to open it." msgstr "" -#: lib/bds/tui.ex:224 +#: lib/bds/tui.ex:285 #, elixir-autogen, elixir-format msgid "Suggestions applied." msgstr "" -#: lib/bds/tui.ex:318 +#: lib/bds/tui.ex:394 #, elixir-autogen, elixir-format msgid "Title (ctrl+t to edit)" msgstr "" -#: lib/bds/tui.ex:317 +#: lib/bds/tui.ex:393 #, elixir-autogen, elixir-format msgid "Title (editing — enter to confirm)" msgstr "" -#: lib/bds/tui.ex:365 +#: lib/bds/tui.ex:441 #, elixir-autogen, elixir-format msgid "Working…" msgstr "" -#: lib/bds/tui.ex:394 -#, elixir-autogen, elixir-format -msgid "enter open · n new post · 1-5 views · r refresh · ctrl+q quit" -msgstr "" - -#: lib/bds/tui.ex:386 +#: lib/bds/tui.ex:462 #, elixir-autogen, elixir-format msgid "esc to close" msgstr "" @@ -3743,12 +3753,37 @@ msgstr "" msgid "Use the form user@host or user@host:port." msgstr "" -#: lib/bds/tui.ex:337 +#: lib/bds/tui.ex:413 #, elixir-autogen, elixir-format msgid "Preview (ctrl+e to edit)" msgstr "" -#: lib/bds/tui.ex:401 +#: lib/bds/tui.ex:512 #, elixir-autogen, elixir-format msgid "ctrl+s save · ctrl+p publish · ctrl+e preview · ctrl+t title · ctrl+l language · ctrl+g AI · esc back" msgstr "" + +#: lib/bds/tui.ex:312 +#, elixir-autogen, elixir-format +msgid "All tasks finished." +msgstr "" + +#: lib/bds/tui.ex:488 +#, elixir-autogen, elixir-format +msgid "Commands — esc to close" +msgstr "" + +#: lib/bds/tui.ex:159 +#, elixir-autogen, elixir-format +msgid "Unknown command." +msgstr "" + +#: lib/bds/tui.ex:478 +#, elixir-autogen, elixir-format +msgid "[report/apply in GUI]" +msgstr "" + +#: lib/bds/tui.ex:505 +#, elixir-autogen, elixir-format +msgid "enter open · n new post · 1-5 views · : commands · ? help · r refresh · ctrl+q quit" +msgstr "" diff --git a/specs/tui.allium b/specs/tui.allium index 3604726..d7c4561 100644 --- a/specs/tui.allium +++ b/specs/tui.allium @@ -62,6 +62,19 @@ rule AiQuickAction { ensures: AiSuggestionsRequestedOrRefused() } +rule CommandPrompt { + when: TuiKeyPressed(code: ":" | "?") + -- Vi-style prompt: ":" opens a filterable list of the parameterless + -- Blog-menu shell commands (metadata diff, validate site, force + -- render, rebuilds, reindex, translations, duplicates, upload, + -- browser preview URL) and runs the selection through the same + -- BDS.Desktop.ShellCommands backend as the GUI menu; "?" (or ":?") + -- shows the same list as help. Commands whose report/apply follow-up + -- UI exists only in the GUI are marked so the user knows. Queued + -- tasks report progress in the status line until all tasks finish. + ensures: CommandListShownOrExecuted() +} + rule MultiClientSync { when: TuiEventReceived(entity, entity_id, action) -- Domain events refresh the sidebar; a post deleted elsewhere closes diff --git a/test/bds/tui_test.exs b/test/bds/tui_test.exs index fb9d608..28acfaf 100644 --- a/test/bds/tui_test.exs +++ b/test/bds/tui_test.exs @@ -164,6 +164,98 @@ defmodule BDS.TUITest do assert {:stop, _state} = BDS.TUI.handle_event(key("q", ["ctrl"]), mount!()) end + describe "command prompt" do + defp mount_with_executor! do + parent = self() + + mount!( + command_executor: fn action -> + send(parent, {:executed, action}) + {:ok, %{kind: "output", title: "T", message: "done"}} + end + ) + end + + test "':' opens the prompt and lists commands" do + state = mount_with_executor!() |> press(":") + + assert state.command != nil + text = screen_text(state) + assert text =~ "metadata_diff" + assert text =~ "validate_site" + end + + test "'?' opens the command help list with GUI markers" do + state = mount_with_executor!() |> press("?") + + assert state.command.help? + text = screen_text(state) + assert text =~ "metadata_diff" + # Commands whose report/apply UI lives in the GUI are marked. + assert text =~ "GUI" + + state = press(state, "esc") + assert state.command == nil + end + + test "typing filters and enter runs the selected command" do + state = + mount_with_executor!() + |> press(":") + |> press("m") + |> press("e") + |> press("t") + |> press("a") + |> press("enter") + + assert_receive {:executed, "metadata_diff"} + assert state.command == nil + assert state.status =~ "done" + end + + test "up/down move the selection" do + state = mount_with_executor!() |> press(":") |> press("down") |> press("enter") + + assert_receive {:executed, action} + assert is_binary(action) + end + + test "no match reports an unknown command" do + state = + mount_with_executor!() + |> press(":") + |> press("z") + |> press("z") + |> press("enter") + + refute_receive {:executed, _action}, 50 + assert state.command == nil + assert state.status != nil + end + + test "a queued task starts status polling and finishes with a toast" do + parent = self() + + state = + mount!( + command_executor: fn action -> + send(parent, {:executed, action}) + {:ok, %{kind: "task_queued", title: "Rebuild", message: "queued"}} + end + ) + |> press(":") + |> press("enter") + + assert_receive {:executed, _action} + assert state.task_polling + + # No tasks are actually running in this test, so the first poll ends it. + {:noreply, state} = BDS.TUI.handle_info(:poll_tasks, state) + refute state.task_polling + assert state.status != nil + end + end + test "local tui mode stops the VM when the app exits" do parent = self() state = mount!(stop_vm_on_exit: true, stop_fun: fn -> send(parent, :vm_stopped) end)