Fix filter score/weight being converted to string
This commit is contained in:
parent
6c9247873f
commit
daa0c51db5
|
@ -0,0 +1,39 @@
|
|||
defmodule Frenzy.JSONSchema do
|
||||
@enforce_keys [:value, :schema]
|
||||
defstruct [:value, :schema]
|
||||
|
||||
@type t() :: %__MODULE__{
|
||||
value: map(),
|
||||
schema: schema()
|
||||
}
|
||||
|
||||
@type schema() ::
|
||||
:string
|
||||
| :boolean
|
||||
| :integer
|
||||
| {:list, schema()}
|
||||
| %{required(String.t()) => schema()}
|
||||
|
||||
@spec coerce(schema :: schema(), value :: map() | list() | String.t()) :: map()
|
||||
|
||||
def coerce(:string, value) when is_binary(value), do: value
|
||||
|
||||
def coerce(:boolean, "true"), do: true
|
||||
def coerce(:boolean, _), do: false
|
||||
|
||||
def coerce(:integer, value) when is_binary(value) do
|
||||
{res, _} = Integer.parse(value)
|
||||
res
|
||||
end
|
||||
|
||||
def coerce({:list, list_type}, list_value) when is_list(list_value) do
|
||||
Enum.map(list_value, &coerce(list_type, &1))
|
||||
end
|
||||
|
||||
def coerce(schema, map_value) when is_map(schema) and is_map(map_value) do
|
||||
Enum.reduce(schema, %{}, fn {key, value_schema}, acc ->
|
||||
value = Map.fetch!(map_value, key)
|
||||
Map.put(acc, key, coerce(value_schema, value))
|
||||
end)
|
||||
end
|
||||
end
|
|
@ -1,5 +1,6 @@
|
|||
defmodule FrenzyWeb.ConfigureStage.FilterStageLive do
|
||||
use FrenzyWeb, :live_component
|
||||
alias Frenzy.JSONSchema
|
||||
|
||||
@impl true
|
||||
def update(assigns, socket) do
|
||||
|
@ -12,7 +13,7 @@ defmodule FrenzyWeb.ConfigureStage.FilterStageLive do
|
|||
new_opts =
|
||||
socket.assigns.opts
|
||||
|> Map.put("mode", mode)
|
||||
|> Map.put("score", score)
|
||||
|> Map.put("score", JSONSchema.coerce(:integer, score))
|
||||
|
||||
new_stage = Frenzy.Keypath.set(socket.assigns.stage, socket.assigns.keypath, new_opts)
|
||||
|
||||
|
@ -63,7 +64,7 @@ defmodule FrenzyWeb.ConfigureStage.FilterStageLive do
|
|||
|> Map.put("mode", mode)
|
||||
|> Map.put("param", param)
|
||||
|> Map.put("property", property)
|
||||
|> Map.put("weight", weight)
|
||||
|> Map.put("weight", JSONSchema.coerce(:integer, weight))
|
||||
|
||||
new_stage =
|
||||
Frenzy.Keypath.set(
|
||||
|
|
Loading…
Reference in New Issue