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