defmodule Phoenix.LiveEditableComponent do
@moduledoc """
Support for LiveEditable Component Event Handlers
defmodule MyEditableHandler do
use Phoenix.LiveEditable.Component
# --- DO NOT DEFINE LIFECYCLE CALLBACKS!!! (mount, update, render)
# --- DO NOT DEFINE VIEW HELPERS!!!
# --- on_mount (OPTIONAL) ---
def on_mount(assigns) do
# override the default assigns ...
{:ok, new_assigns}
end
# --- event handlers ---
def handle_event("focus", %{"id" => id}, socket) do
new_socket = assign(socket, :focusid, id)
{:noreply, new_socket}
end
end
"""
# ----- view helpers -----
def ple_time_now do
DateTime.utc_now() |> Calendar.strftime("%H:%M:%S")
end
def ple_linkstyle do
"cursor: pointer; border-bottom: 1px dashed blue;"
end
# ----- USING macro -----
defmacro __using__(_opts) do
quote do
use Phoenix.LiveComponent
alias Phoenix.LiveEditableComponent, as: Helper
# ----- USING lifecycle callbacks -----
def mount(socket) do
{:ok, socket}
end
def update(assigns, socket) do
newassigns = assigns
|> atomify_keys
|> Map.put(:socketid, socket.id)
|> merge_cache()
|> Map.to_list()
{:ok, assign(socket, newassigns)}
end
def render(assigns) do
module = interface_module(assigns)
assigns |> module.render()
end
# ----- USING event handlers -----
def handle_event("ple-blur", data, socket) do
{:noreply, assign(socket, :ple_mode, "anchor")}
end
def handle_event("ple-focus", data, socket) do
{:noreply, assign(socket, :ple_mode, "focus")}
end
def handle_event("ple-default-save", data, socket) do
{:noreply, assign(socket, ple_data: data["data"], ple_mode: "anchor")}
end
# ----- USING view helpers -----
import Phoenix.LiveEditable.ViewCache
defp atomify_keys(map) do
map
|> Enum.reduce(%{}, fn({k, v}, acc) -> Map.put(acc, atomify(k), v) end)
end
defp atomify(key) when is_binary(key) do
key
|> String.replace("ple-", "ple_")
|> String.to_atom()
end
defp atomify(key) when is_atom(key) do
key
|> Atom.to_string()
|> atomify()
end
defp atomify(key) do
key
end
defp merge_cache(assigns) do
assigns[:socketid]
|> vc_get()
|> Map.merge(assigns)
end
defp interface_module(assigns) do
assigns
|> Map.get(:socketid)
|> vc_get(:ple_interface)
end
end
end
end