MishkaGervaz.Table.Web.DataLoader (MishkaGervaz v0.0.2)

Copy Markdown View Source

Handles async data loading with streams for MishkaGervaz tables.

This module manages:

  • Initial data loading
  • Pagination (load more)
  • Filtering and sorting
  • Stream management
  • Async result handling
  • The total after realtime changes (refresh_total/1)
  • Whether a realtime row belongs in the view (in_view?/2)

Sub-builders

DataLoader is composed of sub-builders that can be overridden:

  • QueryBuilder - Builds queries with filters and sorting
  • FilterParser - Parses raw filter values
  • PaginationHandler - Handles page loading and calculations
  • TenantResolver - Resolves tenant and actions
  • HookRunner - Executes lifecycle hooks

User Override

Override the entire data_loader module:

defmodule MyApp.Table.DataLoader do
  use MishkaGervaz.Table.Web.DataLoader

  def load_async(socket, state, opts) do
    # Custom loading logic
    super(socket, state, opts)
  end
end

Override specific sub-builders:

defmodule MyApp.Table.DataLoader do
  use MishkaGervaz.Table.Web.DataLoader,
    query: MyApp.Table.DataLoader.QueryBuilder,
    pagination: MyApp.Table.DataLoader.PaginationHandler
end

Or override via DSL:

mishka_gervaz do
  table do
    data_loader do
      query MyApp.Table.DataLoader.QueryBuilder
      pagination MyApp.Table.DataLoader.PaginationHandler
    end
  end
end

Override entire data_loader module via DSL (positional argument):

mishka_gervaz do
  table do
    data_loader MyApp.Table.CustomDataLoader
  end
end

See MishkaGervaz.Table.Web.DataLoader.Helpers, MishkaGervaz.Table.Web.DataLoader.QueryBuilder, MishkaGervaz.Table.Web.DataLoader.FilterParser, MishkaGervaz.Table.Web.DataLoader.PaginationHandler, MishkaGervaz.Table.Web.DataLoader.TenantResolver, MishkaGervaz.Table.Web.DataLoader.HookRunner, MishkaGervaz.Table.Web.DataLoader.RelationLoader, MishkaGervaz.Table.Web.State, MishkaGervaz.Table.Web.UrlSync, MishkaGervaz.Table.Web.AutoState.

Summary

Functions

See MishkaGervaz.Table.Web.DataLoader.Default.apply_archive_status/3.

See MishkaGervaz.Table.Web.DataLoader.Default.apply_filters/3.

See MishkaGervaz.Table.Web.DataLoader.Default.apply_sort/3.

See MishkaGervaz.Table.Web.DataLoader.Default.handle_async/3.

See MishkaGervaz.Table.Web.DataLoader.Default.in_view?/2.

See MishkaGervaz.Table.Web.DataLoader.Default.load_async/3.

See MishkaGervaz.Table.Web.DataLoader.Default.load_more/2.

See MishkaGervaz.Table.Web.DataLoader.Default.load_total/1.

See MishkaGervaz.Table.Web.DataLoader.Default.maybe_load/2.

See MishkaGervaz.Table.Web.DataLoader.Default.refresh_total/1.

See MishkaGervaz.Table.Web.DataLoader.Default.reload/2.

See MishkaGervaz.Table.Web.DataLoader.Default.set_sort/4.

Functions

apply_archive_status(socket, state, status)

@spec apply_archive_status(
  Phoenix.LiveView.Socket.t(),
  MishkaGervaz.Table.Web.State.t(),
  :active | :archived
) :: Phoenix.LiveView.Socket.t()

See MishkaGervaz.Table.Web.DataLoader.Default.apply_archive_status/3.

apply_filters(socket, state, new_filters)

See MishkaGervaz.Table.Web.DataLoader.Default.apply_filters/3.

apply_sort(socket, state, field)

See MishkaGervaz.Table.Web.DataLoader.Default.apply_sort/3.

handle_async(name, result, socket)

@spec handle_async(atom(), {:ok, any()} | {:exit, any()}, Phoenix.LiveView.Socket.t()) ::
  Phoenix.LiveView.Socket.t()

See MishkaGervaz.Table.Web.DataLoader.Default.handle_async/3.

in_view?(state, id)

@spec in_view?(MishkaGervaz.Table.Web.State.t(), term()) :: boolean()

See MishkaGervaz.Table.Web.DataLoader.Default.in_view?/2.

load_async(socket, state, opts \\ [])

See MishkaGervaz.Table.Web.DataLoader.Default.load_async/3.

load_more(socket, state)

See MishkaGervaz.Table.Web.DataLoader.Default.load_more/2.

load_total(state)

@spec load_total(MishkaGervaz.Table.Web.State.t()) ::
  {:ok, %{total_count: non_neg_integer(), total_pages: pos_integer() | nil}}
  | :skip

See MishkaGervaz.Table.Web.DataLoader.Default.load_total/1.

maybe_load(socket, state)

See MishkaGervaz.Table.Web.DataLoader.Default.maybe_load/2.

refresh_total(socket)

See MishkaGervaz.Table.Web.DataLoader.Default.refresh_total/1.

reload(socket, state)

See MishkaGervaz.Table.Web.DataLoader.Default.reload/2.

set_sort(socket, state, column, order)

See MishkaGervaz.Table.Web.DataLoader.Default.set_sort/4.