# `MishkaGervaz.Table.Web.DataLoader`
[🔗](https://github.com/mishka-group/mishka_gervaz/blob/v0.0.1-alpha.3/lib/mishka_gervaz/table/web/data_loader.ex#L1)

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

## 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`.

# `apply_archive_status`

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

# `apply_filters`

```elixir
@spec apply_filters(
  Phoenix.LiveView.Socket.t(),
  MishkaGervaz.Table.Web.State.t(),
  map()
) ::
  Phoenix.LiveView.Socket.t()
```

# `apply_sort`

```elixir
@spec apply_sort(
  Phoenix.LiveView.Socket.t(),
  MishkaGervaz.Table.Web.State.t(),
  atom()
) ::
  Phoenix.LiveView.Socket.t()
```

# `handle_async`

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

# `load_async`

```elixir
@spec load_async(
  Phoenix.LiveView.Socket.t(),
  MishkaGervaz.Table.Web.State.t(),
  keyword()
) ::
  Phoenix.LiveView.Socket.t()
```

# `load_more`

```elixir
@spec load_more(Phoenix.LiveView.Socket.t(), MishkaGervaz.Table.Web.State.t()) ::
  Phoenix.LiveView.Socket.t()
```

# `maybe_load`

```elixir
@spec maybe_load(Phoenix.LiveView.Socket.t(), MishkaGervaz.Table.Web.State.t()) ::
  Phoenix.LiveView.Socket.t()
```

# `reload`

```elixir
@spec reload(Phoenix.LiveView.Socket.t(), MishkaGervaz.Table.Web.State.t()) ::
  Phoenix.LiveView.Socket.t()
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
