defmodule MoonWeb.Pages.Components.TablePage do @moduledoc false use MoonWeb, :live_view alias Moon.Components.Button alias Moon.Components.Drawer alias Moon.Components.Table alias Moon.Components.Table.Column alias Moon.Components.Renderers.Datetime alias MoonWeb.Components.ExampleAndCode alias MoonWeb.Components.Page alias MoonWeb.Components.ComponentPageDescription alias MoonWeb.Components.PropsTable alias MoonWeb.Components.Facing.DeprecationWarning data(breadcrumbs, :any, default: [ %{ to: "#", name: "Components v1" }, %{ to: "/components/table", name: "Table" } ] ) data(props_info_array, :list, default: []) @spec render(any) :: Phoenix.LiveView.Rendered.t() def render(assigns) do ~F""" <:example> {model.id} {model.name}
{#if @selected} <:title> Selected {@selected} <:footer> {/if} <:code>{table_01_code()}
""" end def handle_params(_params, uri, socket) do {:noreply, assign(socket, uri: uri)} end def mount(_params, _session, socket) do now = DateTime.utc_now() all_models = Enum.map(1..100, fn x -> %{id: x, name: "Name #{x}", created_at: DateTime.add(now, -3600 + x)} end) socket = assign(socket, all_models: all_models, sort_key: "name", sort_dir: "ASC", limit: 10, offset: 0, selected: nil ) |> refresh_models() {:ok, socket} end def handle_event("handle_row_click", %{"selected" => selected}, socket) do {:noreply, assign(socket, selected: String.to_integer(selected))} end def handle_event( "handle_sorting_click", %{"sort-dir" => sort_dir, "sort-key" => sort_key}, socket ) do socket = assign(socket, sort_dir: sort_dir, sort_key: sort_key) socket = refresh_models(socket) {:noreply, socket} end def handle_event("handle_paging_click", %{"offset" => offset}, socket) do offset = String.to_integer(offset) socket = assign(socket, offset: offset) socket = refresh_models(socket) {:noreply, socket} end def handle_event("set_close", _, socket) do {:noreply, assign(socket, selected: nil)} end def refresh_models(socket) do %{ limit: limit, offset: offset, all_models: all_models, sort_key: sort_key, sort_dir: sort_dir } = socket.assigns models = all_models |> Enum.sort_by(fn x -> x[String.to_existing_atom(sort_key)] end, fn x, y -> case sort_dir do "ASC" -> x < y "DESC" -> x > y end end) |> Enum.slice(offset..(offset + limit - 1)) assign(socket, models: models) end def table_01_code do """ {model.id} {model.name}
{#if @selected} <:title> Selected {@selected} <:footer> {/if} """ end end