lantern

Data table

The admin table: Flop-driven sort/pagination, built-in debounced search and filter selects, tabs with filter presets, a collapsible stat overview, bulk selection, and a cards view — with the entire table state living in the URL. Everything below is live against an in-memory dataset.

Revenue (all)
$12031.57
Orders
25
Pending
19
Refunded
19
Order Buyer ↓ Channel Status Total
#4806 Radia Hopper eBay pending $65.44
#4814 Radia Hopper Direct refunded $285.17
#4822 Radia Hopper Shopify shipped $162.45
#4830 Radia Hopper eBay pending $182.46
#4838 Radia Hopper Direct refunded $317.11
#4846 Radia Hopper Shopify shipped $316.33
#4854 Radia Hopper eBay pending $202.03
#4807 Ken Knuth Shopify shipped $64.18
#4815 Ken Knuth eBay pending $49.27
#4823 Ken Knuth Direct refunded $9.49
#4831 Ken Knuth Shopify shipped $386.22
#4839 Ken Knuth eBay pending $156.04
#4847 Ken Knuth Direct refunded $6.37
#4855 Ken Knuth Shopify shipped $88.57
#4802 Grace Perlman Direct refunded $321.68
#4810 Grace Perlman Shopify shipped $240.13
#4818 Grace Perlman eBay pending $89.93
#4826 Grace Perlman Direct refunded $51.27
#4834 Grace Perlman Shopify shipped $223.78
#4842 Grace Perlman eBay pending $178.68
#4850 Grace Perlman Direct refunded $71.79
#4803 Edsger Turing eBay pending $61.03
#4811 Edsger Turing Direct refunded $217.58
#4819 Edsger Turing Shopify shipped $287.34
#4827 Edsger Turing eBay pending $70.10
<.data_table id="orders" rows={@orders} meta={@meta} path={~p"/orders"}
  selected_ids={@selected} search_field={:q}>
  <:stat label="Revenue (30d)" value={@revenue} />
  <:tab label="Pending" count={@counts.pending}
        filters={[%{field: "status", value: "pending"}]} />
  <:filter field={:channel} options={@channels} />
  <:col :let={o} label="Order" field={:reference} sortable>{o.reference}</:col>
  <:bulk_action label="Archive" icon="inbox" event="bulk-archive" />
  <:row_action :let={o}>…</:row_action>
  <:card :let={o}>…</:card>
</.data_table>