Current section

Files

Jump to
mavu_snippets_ui lib live edit_snippet_group_component.ex
Raw

lib/live/edit_snippet_group_component.ex

defmodule MavuSnippetsUi.Live.EditSnippetGroupComponent do
@moduledoc false
use MavuSnippetsUiWeb, :live_component
alias MavuContent.Clist
import MavuUtils
def snippet_groups_module(assigns),
do: assigns[:context][:snippets_ui_conf][:snippet_groups_module]
# def update(%{msg: :ignore}, socket) do
# "ignore" |> IO.inspect(label: "mwuits-debug 2021-06-20_22:19 ❖ ")
# {:ok, socket}
# end
@impl true
def update(%{mavu_snippets_ui_msg: msg}, socket) when not is_nil(msg) do
msg |> IO.inspect(label: "mwuits-debug 2021-06-20_22:19 ❖ ")
msg |> IO.inspect(label: "mwuits-debug 2021-06-20_13:23 received pass-down msg")
res = handle_root_msg(msg, socket)
send(self(), {:mavu_snippets_ui_msg, nil})
res
end
def update(assigns, socket) do
# add properties to context:
assigns =
update_in(assigns.context, fn context ->
context
|> Map.merge(%{
moving_element: socket.assigns[:context][:moving_element],
menuing_element: socket.assigns[:context][:menuing_element],
multiselect_path: socket.assigns[:context][:multiselect_path],
clipboard: get_clipboard(socket),
active_langs: get_active_langs_from_params(context[:params], context[:snippets_conf])
})
end)
sg_id =
case assigns.rec_id do
"/" <> path ->
MavuSnippets.SnippetGroups.get_snippet_group(path, assigns.context[:snippets_conf])[
:id
]
rec_id ->
MavuUtils.to_int(rec_id)
end
socket =
socket
|> assign(assigns)
|> assign(
return_path: get_return_path(assigns.context, assigns.base_path),
snippet_group:
snippet_groups_module(assigns).get_snippet_group(
sg_id,
assigns[:context][:snippets_ui_conf]
)
)
socket =
socket
|> assign(contentlist: socket.assigns.snippet_group.content)
{:ok, socket}
end
def get_return_path(%{params: %{"return_to" => return_path}}, _base_path) do
return_path
end
def get_return_path(context, base_path) when is_map(context) and is_function(base_path) do
base_path.(%{"rec" => "0"})
end
def get_active_langs_from_params(%{"langs" => langs_str} = _params, snippets_conf) do
available_langs = MavuSnippets.available_langs(snippets_conf)
langs_str
|> String.split("-")
|> Enum.filter(fn lang -> Enum.member?(available_langs, lang) end)
|> case do
[] -> get_active_langs_from_params(nil, snippets_conf)
list -> list
end
end
def get_active_langs_from_params(_params, snippets_conf) do
[MavuSnippets.default_lang(snippets_conf)]
end
def lang_is_active(lang, context) when is_binary(lang) and is_map(context) do
Map.get(context, :active_langs, [])
|> Enum.member?(lang)
end
def get_clipboard(_socket) do
username = "manfred123"
MavuSnippetsUi.ClipboardStorage.create("snippet_group_edit:clipboard:#{username}")
end
def close_menu(%{assigns: %{context: %{menuing_element: element}}} = socket)
when not is_nil(element) do
socket |> assign(:context, put_in(socket.assigns.context, [:menuing_element], nil))
end
def close_menu(socket), do: socket
def close_multiselect(%{assigns: %{context: %{multiselect_path: element}}} = socket)
when not is_nil(element) do
socket |> assign(:context, put_in(socket.assigns.context, [:multiselect_path], nil))
end
def close_multiselect(socket), do: socket
@impl true
def handle_event("toggle_language_in_params", %{"lang" => toggled_lang}, socket) do
new_langs =
if Enum.member?(socket.assigns.context.active_langs, toggled_lang) do
socket.assigns.context.active_langs |> List.delete(toggled_lang)
else
MavuSnippets.available_langs(socket.assigns.context[:snippets_conf])
|> Enum.filter(fn lang ->
Enum.member?(socket.assigns.context.active_langs, lang) or lang == toggled_lang
end)
end
new_params = Map.put(socket.assigns.context[:params], "langs", Enum.join(new_langs, "-"))
{:noreply, socket |> push_patch(to: socket.assigns.base_path.(new_params))}
end
def handle_root_msg({:copy_multiple_ce, %{uids: uids, path: path} = msg}, socket) do
msg |> log("info copy_ce received #{__MODULE__}", :info)
clipboard = get_clipboard(socket)
Clist.copy(socket.assigns.contentlist, path, uids, clipboard)
clipboard_content = clipboard.(:get, nil) || []
{:ok,
socket
# |> close_multiselect()
|> put_flash(:info, "#{clipboard_content |> length()} elements copied to the clipboard")}
end
def handle_root_msg({:cut_multiple_ce, %{uids: uids, path: path} = msg}, socket) do
msg |> log("info cut_ce received #{__MODULE__}", :info)
Clist.cut(socket.assigns.contentlist, path, uids, get_clipboard(socket))
{:ok,
socket
# |> close_multiselect()
|> put_flash(:info, "#{length(uids)} elements cutted to the clipboard")}
end
def handle_root_msg({:delete_multiple_ce, %{uids: uids, path: path} = msg}, socket) do
msg |> log("info delete_ce received #{__MODULE__}", :info)
contentlist = Clist.remove(socket.assigns.contentlist, path, uids)
snippet_groups_module(socket.assigns).update_snippet_group(
socket.assigns.snippet_group,
%{
content: contentlist
},
socket.socket.assigns[:context][:snippets_ui_conf]
)
{:ok,
socket
# |> close_multiselect()
|> assign(:contentlist, contentlist)
|> put_flash(:info, "#{length(uids)} elements deleted")}
end
def handle_root_msg({:copy_ce, %{uid: uid, path: path} = msg}, socket) do
msg |> log("info copy_ce received #{__MODULE__}", :info)
Clist.copy(socket.assigns.contentlist, path, [uid], get_clipboard(socket))
{:ok,
socket
|> close_menu()
|> put_flash(:info, "1 element copied to the clipboard")}
end
def handle_root_msg({:paste_ce, %{path: path} = msg}, socket) do
msg |> log("info paste_ce received #{__MODULE__}", :info)
contentlist =
Clist.paste(
socket.assigns.contentlist,
path,
msg[:uid],
msg[:position],
get_clipboard(socket)
)
snippet_groups_module(socket.assigns).update_snippet_group(
socket.assigns.snippet_group,
%{
content: contentlist
},
socket.assigns[:context][:snippets_ui_conf]
)
{:ok,
socket
|> close_menu()
|> assign(:contentlist, contentlist)}
end
def handle_root_msg({:add_ce, %{path: path, items: items} = msg}, socket) do
msg |> log("info add_ce received #{__MODULE__}", :info)
contentlist =
Clist.add(
socket.assigns.contentlist,
path,
msg[:uid],
msg[:position],
items
)
new_uid =
case items do
[item | _] -> item["uid"]
_ -> nil
end
snippet_groups_module(socket.assigns).update_snippet_group(
socket.assigns.snippet_group,
%{
content: contentlist
},
socket.assigns[:context][:snippets_ui_conf]
)
{:ok,
socket
|> close_menu()
|> assign(:contentlist, contentlist)
|> push_patch(
# to: Routes.sheet_modify_path(socket, :edit, socket.assigns.snippet_group, path, new_uid)
to:
socket.assigns.base_path.(%{
action: :edit,
rec_id: socket.assigns.snippet_group.id,
path: path,
uid: new_uid
})
)}
end
def handle_root_msg({:delete_ce, %{uid: uid, path: path} = msg}, socket) do
msg |> log("info delete_ce received #{__MODULE__}", :info)
contentlist = Clist.remove(socket.assigns.contentlist, path, uid)
snippet_groups_module(socket.assigns).update_snippet_group(
socket.assigns.snippet_group,
%{
content: contentlist
},
socket.assigns[:context][:snippets_ui_conf]
)
{:ok,
socket
|> assign(:contentlist, contentlist)}
end
def handle_root_msg({:duplicate_ce, %{uid: uid, path: path} = msg}, socket) do
msg |> log("info duplicate_ce received #{__MODULE__}", :info)
contentlist = Clist.duplicate(socket.assigns.contentlist, path, uid)
snippet_groups_module(socket.assigns).update_snippet_group(
socket.assigns.snippet_group,
%{
content: contentlist
},
socket.assigns[:context][:snippets_ui_conf]
)
{:ok,
socket
|> assign(:contentlist, contentlist)}
end
def handle_root_msg({:move_ce, %{uid: uid, direction: direction, path: path} = msg}, socket) do
socket.assigns.context[:moving_element]
|> IO.inspect(label: "mwuits-debug 2021-06-20_13:10 MOVINGA")
msg |> log("info move_ce #{direction} received #{__MODULE__}", :info)
contentlist = Clist.move(socket.assigns.contentlist, path, uid, direction)
snippet_groups_module(socket.assigns).update_snippet_group(
socket.assigns.snippet_group,
%{
content: contentlist
},
socket.assigns[:context][:snippets_ui_conf]
)
{
:ok,
socket
|> assign(:contentlist, contentlist)
# |> close_menu()
}
end
def handle_root_msg({:show_move_ui, %{uid: uid, path: path} = msg}, socket) do
msg |> log("info show_move_ui #{uid} #{path} received #{__MODULE__}", :info)
case socket.assigns.context.moving_element do
{^path, ^uid} ->
# close if already open
handle_root_msg({:hide_move_ui, msg}, socket)
_ ->
{:ok,
socket
|> assign(
:context,
put_in(socket.assigns.context, [:moving_element], {path, uid})
)}
end
end
def handle_root_msg({:hide_move_ui, msg}, socket) do
msg |> log("info hide_move_ui received #{__MODULE__}", :info)
{:ok,
socket
|> assign(:context, put_in(socket.assigns.context, [:moving_element], nil))}
end
def handle_root_msg({:show_menu, %{uid: uid, path: path} = msg}, socket) do
msg |> log("info show_move_ui #{uid} #{path} received #{__MODULE__}", :info)
case socket.assigns.context.menuing_element do
{^path, ^uid} ->
# close if already open
handle_root_msg({:hide_menu, msg}, socket)
_ ->
{:ok,
socket
|> assign(
:context,
put_in(socket.assigns.context, [:menuing_element], {path, uid})
)}
end
end
def handle_root_msg({:hide_menu, msg}, socket) do
msg |> log("info hide_menu received #{__MODULE__}", :info)
{:ok,
socket
|> assign(:context, put_in(socket.assigns.context, [:menuing_element], nil))}
end
def handle_root_msg({:show_multiselect_ui, %{path: path} = msg}, socket) do
msg |> log("info show_multiselect_ui #{path} received #{__MODULE__}", :info)
socket =
socket
|> close_menu()
case socket.assigns.context.multiselect_path do
^path ->
# close if already open
handle_root_msg({:hide_multiselect_ui, msg}, socket)
_ ->
{:ok,
socket
|> assign(
:context,
put_in(socket.assigns.context, [:multiselect_path], path)
)}
end
end
def handle_root_msg({:hide_multiselect_ui, msg}, socket) do
msg |> log("info hide_multiselect_ui received #{__MODULE__}", :info)
{:ok,
socket
|> assign(:context, put_in(socket.assigns.context, [:multiselect_path], nil))}
end
def handle_root_msg(
{:update_ce, %{uid: uid, path: path, data: data} = msg, next_action},
socket
) do
{msg, next_action}
|> log("info update_ce #{path}.#{uid} received #{__MODULE__}", :info)
contentlist = Clist.replace(socket.assigns.contentlist, path, uid, data)
snippet_groups_module(socket.assigns).update_snippet_group(
socket.assigns.snippet_group,
%{
content: contentlist
},
socket.assigns[:context][:snippets_ui_conf]
)
socket =
case next_action do
:close ->
# next_url = Routes.sheet_modify_path(socket, :modify, socket.assigns.snippet_group)
next_url =
socket.assigns.base_path.(%{action: :modify, rec: socket.assigns.snippet_group.id})
send(self(), {:mavu_snippets_ui_msg, {:push_patch, [to: next_url]}})
socket
_ ->
socket
end
# |> put_flash(:info, "content-element updated successfully")
{:ok,
socket
|> assign(:contentlist, contentlist)}
end
end