Add selecting next/previous tunit and highlight it

This commit is contained in:
Thelonius Kort
2023-03-05 20:56:19 +01:00
parent 4e6c516cb6
commit e20f8e33ee
5 changed files with 81 additions and 9 deletions

View File

@ -15,6 +15,14 @@
@apply hover:bg-gray-700; @apply hover:bg-gray-700;
} }
.article .tunit[current="yes"] {
@apply bg-amber-300 text-stone-700 hover:bg-amber-200 hover:text-red-900;
}
.dark .article .tunit[current="yes"] {
@apply bg-amber-500/70 text-white hover:bg-amber-500/70 hover:text-red-900;
}
.article a.hide-link { .article a.hide-link {
display: none; display: none;
} }

View File

@ -23,11 +23,14 @@ import {LiveSocket} from "phoenix_live_view"
import topbar from "../vendor/topbar" import topbar from "../vendor/topbar"
import {DarkModeHook} from './dark-mode-widget' import {DarkModeHook} from './dark-mode-widget'
import {TranslationFormHook} from "./translation-form"
let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content") let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
let liveSocket = new LiveSocket("/live", Socket, { let liveSocket = new LiveSocket("/live", Socket, {
params: {_csrf_token: csrfToken}, params: {_csrf_token: csrfToken},
hooks: {dark_mode_widget: DarkModeHook}, hooks: {translation_form: TranslationFormHook,
// tunit_editor: TunitEditorHook,
dark_mode_widget: DarkModeHook},
}) })
// Show progress bar on live navigation and form submits // Show progress bar on live navigation and form submits

View File

@ -0,0 +1,38 @@
let TranslationFormHook = {
mounted() {
this.el.addEventListener("keyup", this.keyupHandler.bind(this))
this.title_input = this.el.querySelector("#translation-form_title")
this.tunit_editor = this.el.querySelector("#tunit-editor-content")
},
keyupHandler(e) {
var preaction = () => { }
var postaction = () => { }
var payload = {}
if (e.altKey){
if (e.key == "ArrowDown"){
preaction = () => { this.title_input.focus() }
postaction = () => { this.tunit_editor.focus() }
var handler = "select_next_tunit"
} else if (e.key == "ArrowUp"){
preaction = () => { this.title_input.focus() }
postaction = () => { this.tunit_editor.focus() }
var handler = "select_previous_tunit"
} else if (e.key == "u") {
var handler = "tunit_status"
payload = {status: "untranslated"}
} else if (e.key == "p") {
var handler = "tunit_status"
payload = {status: "passable"}
} else if (e.key == "o") {
var handler = "tunit_status"
payload = {status: "done"}
}
preaction.call()
this.pushEventTo(this.el, handler, payload, postaction)
}
// console.info(["keyupHandler", e, this])
},
}
export {TranslationFormHook}

View File

@ -14,7 +14,7 @@ defmodule OutlookWeb.TunitEditorComponent do
<%= @current_tunit.content |> raw %> <%= @current_tunit.content |> raw %>
</div> --%> </div> --%>
<form phx-change="update_current_tunit" phx-target={@target}> <form phx-change="update_current_tunit" phx-target={@target}>
<textarea name="content" class="h-48 rounded border-slate-500 resize-none bg-transparent w-full" <textarea id="tunit-editor-content" name="content" class="h-48 rounded border-slate-500 resize-none bg-transparent w-full"
disabled={!@current_tunit.status}><%= @current_tunit.content %></textarea> disabled={!@current_tunit.status}><%= @current_tunit.content %></textarea>
</form> </form>
<.status_selector target={@target} disabled={!@current_tunit.status} tunit={@current_tunit} /> <.status_selector target={@target} disabled={!@current_tunit.status} tunit={@current_tunit} />

View File

@ -8,7 +8,7 @@ defmodule OutlookWeb.TranslationLive.FormComponent do
def render(assigns) do def render(assigns) do
~H""" ~H"""
<div class="flex gap-8 max-h-fit"> <div class="flex gap-8 max-h-fit">
<div class="basis-1/2 overflow-auto"> <div class="basis-1/2 overflow-auto" id="translation-form-container" target="@myself" phx-hook="translation_form">
<.header> <.header>
<%= @title %> <%= @title %>
<:subtitle>Use this form to manage translation records in your database.</:subtitle> <:subtitle>Use this form to manage translation records in your database.</:subtitle>
@ -63,6 +63,7 @@ defmodule OutlookWeb.TranslationLive.FormComponent do
socket socket
|> assign(assigns) |> assign(assigns)
|> assign(:current_tunit, %TranslationUnit{status: nil}) |> assign(:current_tunit, %TranslationUnit{status: nil})
|> assign(:tunit_ids, InternalTree.get_tunit_ids(translation.article.content))
|> assign(:changeset, changeset) |> assign(:changeset, changeset)
|> assign_article_tree(translation) |> assign_article_tree(translation)
|> assign(:deepl_progress, nil)} |> assign(:deepl_progress, nil)}
@ -118,11 +119,33 @@ defmodule OutlookWeb.TranslationLive.FormComponent do
{:noreply, socket |> assign(:current_tunit, tunit)} {:noreply, socket |> assign(:current_tunit, tunit)}
end end
def handle_event("select_current_tunit", %{"nid" => nid}, socket) do def handle_event("select_tunit_by_nid", %{"nid" => nid}, socket) do
{:noreply, {:noreply, change_tunit(socket, nid)}
end
def handle_event("select_next_tunit", _, socket) do
{:noreply, select_next_tunit(socket, &Kernel.+/2)}
end
def handle_event("select_previous_tunit", _, socket) do
{:noreply, select_next_tunit(socket, &Kernel.-/2)}
end
defp select_next_tunit(socket, direction) do
tunit_ids = socket.assigns.tunit_ids
current_tunit_nid = socket.assigns.current_tunit.status && socket.assigns.current_tunit.nid || List.last(tunit_ids)
index_current = Enum.find_index(tunit_ids, fn nid -> nid == current_tunit_nid end)
index_next = direction.(index_current, 1) |> Integer.mod(length(tunit_ids))
next_nid = Enum.at(tunit_ids, index_next)
change_tunit(socket, next_nid)
end
defp change_tunit(socket, nid) do
fun = fn n -> n.nid == nid && "yes" || "no" end
socket socket
|> assign(:article_tree, InternalTree.garnish(socket.assigns.article_tree, %{tunits: %{current: fun}}))
|> update_translation_with_current_tunit(socket.assigns.current_tunit.status) |> update_translation_with_current_tunit(socket.assigns.current_tunit.status)
|> assign(:current_tunit, socket.assigns.translation_content[nid])} |> assign(:current_tunit, socket.assigns.translation_content[nid])
end end
@doc "updating on browser events" @doc "updating on browser events"
@ -146,7 +169,7 @@ defmodule OutlookWeb.TranslationLive.FormComponent do
:article_tree, :article_tree,
InternalTree.add_phx_click_event(translation.article.content, InternalTree.add_phx_click_event(translation.article.content,
nodes: :tunits, nodes: :tunits,
click: "select_current_tunit", click: "select_tunit_by_nid",
target: socket.assigns.myself) target: socket.assigns.myself)
|> InternalTree.garnish(%{tunits: %{class: "tunit"}})) |> InternalTree.garnish(%{tunits: %{class: "tunit"}}))
end end