defmodule Moon.Components.Table do @moduledoc false use Moon.StatelessComponent alias Moon.Components.Table.Paging alias Moon.Icon # import Moon.Helpers.MergeClass @doc "Params from LiveView mount(params, session, socket) that must be passed on" prop(limit, :integer, default: 10) prop(offset, :integer, default: 0) prop(selected, :string) prop(sort_key, :any) prop(sort_dir, :any, default: "ASC") @doc "The list of items to be rendered" prop(items, :generator, required: true) prop(row_click, :event) prop(paging_click, :event) prop(sorting_click, :event) prop(paging_info, :any) prop(class, :css_class) prop(row_class, :css_class) prop(id, :string) prop(even_row_class, :css_class, default: "bg-goku") prop(has_no_cell_borders, :boolean, default: false) @doc "The list of columns defining the Grid" slot(cols, generator_prop: :items) def render(assigns) do ~F"""
{#if @paging_info} {/if}
{#for col <- @cols} {/for} {#for {item, row_index} <- Enum.with_index(@items)} {#for {col, col_index} <- Enum.with_index(@cols)} {/for} {/for}
{col.label} {#if col.sortable && "#{@sort_key}" == "#{col.name}"} {/if}
<#slot {col} generator_value={item} />
""" end defp toggle_sort_dir(sort_dir) do sort_dir = "#{sort_dir}" if sort_dir == "ASC" do "DESC" else "ASC" end end defp inter_cell_border() do "after:content-[\"\"] after:absolute after:w-px after:bg-beerus " <> "after:h-2/5 after:bottom-[30%] after:right-0 after:translate-x-[-50%] relative" end end