80 lines
2.3 KiB
Elixir
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" => "contains_string", "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
|