defmodule Moon.Components.LineChartCard do
@moduledoc false
use Moon.StatefulComponent
alias Moon.Assets.Icons.IconRefresh
alias Moon.Components.LineChart
alias Moon.Components.Select
prop(title, :string, required: true)
prop(select_options, :list, default: [])
prop(filters, :list, default: [])
prop(values, :list, default: [])
prop(time_format, :string, default: "%d/%m")
def render(assigns) do
~F"""
{#if length(@filters) > 0}
{/if}
"""
end
def handle_event("toggle_filter", %{"name" => filter_data_key}, socket) do
filters =
Enum.map(socket.assigns.filters, fn item ->
if item.data_key == filter_data_key do
%{item | is_active: !item.is_active}
else
item
end
end)
socket =
if filters |> only_active() |> Enum.empty?() do
socket
else
socket
|> assign(filters: filters)
|> push_event("vega_lite:line-chart:redraw", %{
"data" => filter_values(socket.assigns.values, filters)
})
end
{:noreply, socket}
end
defp filter_values(values, filters) do
active_filters = active_filters_keys(filters)
Enum.filter(values, fn item ->
item.category in active_filters
end)
end
defp active_filters_keys(filters) do
filters
|> only_active()
|> Enum.map(& &1.data_key)
end
defp only_active(filters), do: Enum.filter(filters, & &1.is_active)
end