frenzy/lib/frenzy_web/live/configure_stage/filter_stage_live.ex

80 lines
2.3 KiB
Elixir

defmodule FrenzyWeb.ConfigureStage.FilterStageLive do
use FrenzyWeb, :live_component
alias Frenzy.JSONSchema
@impl true
def update(assigns, socket) do
assigns = Map.put(assigns, :opts, Frenzy.Keypath.get(assigns.stage, assigns.keypath))
{:ok, assign(socket, assigns)}
end
@impl true
def handle_event("update_filter", %{"mode" => mode, "score" => score}, socket) do
new_opts =
socket.assigns.opts
|> Map.put("mode", mode)
|> Map.put("score", JSONSchema.coerce(:integer, score))
new_stage = Frenzy.Keypath.set(socket.assigns.stage, socket.assigns.keypath, new_opts)
send(self(), {:update_stage, socket.assigns.index, new_stage})
{:noreply, socket}
end
@impl true
def handle_event("add_rule", _params, socket) do
new_rules =
socket.assigns.opts["rules"] ++
[%{"mode" => "text", "param" => "", "property" => "title", "weight" => 1}]
new_opts = Map.put(socket.assigns.opts, "rules", new_rules)
new_stage = Frenzy.Keypath.set(socket.assigns.stage, socket.assigns.keypath, new_opts)
send(self(), {:update_stage, socket.assigns.index, new_stage})
{:noreply, socket}
end
@impl true
def handle_event("delete_rule", %{"index" => index}, socket) do
index = String.to_integer(index)
new_rules = List.delete_at(socket.assigns.opts["rules"], index)
new_opts = Map.put(socket.assigns.opts, "rules", new_rules)
new_stage = Frenzy.Keypath.set(socket.assigns.stage, socket.assigns.keypath, new_opts)
send(self(), {:update_stage, socket.assigns.index, new_stage})
{:noreply, socket}
end
@impl true
def handle_event(
"update_rule",
%{
"index" => index,
"mode" => mode,
"param" => param,
"property" => property,
"weight" => weight
},
socket
) do
index = String.to_integer(index)
new_rule =
Enum.at(socket.assigns.opts["rules"], index)
|> Map.put("mode", mode)
|> Map.put("param", param)
|> Map.put("property", property)
|> Map.put("weight", JSONSchema.coerce(:integer, weight))
new_stage =
Frenzy.Keypath.set(
socket.assigns.stage,
socket.assigns.keypath ++ ["rules", index],
new_rule
)
send(self(), {:update_stage, socket.assigns.index, new_stage})
{:noreply, socket}
end
end