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

Handles paginated loading of relation filter options.

Provides support for different loading modes:
- `:static` - Load all options at once
- `:load_more` - Initial page with load more capability
- `:search` - Search with pagination (single select)
- `:search_multi` - Search with pagination (multi select)

## Usage

    # Load initial options
    {:ok, result} = RelationLoader.load_options(filter, state, page: 1)

    # Search options
    {:ok, result} = RelationLoader.search_options(filter, state, "search term", page: 1)

## Override

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

      def load_options(filter, state, opts) do
        # Custom loading logic
        super(filter, state, opts)
      end
    end

See `MishkaGervaz.Table.Web.DataLoader`,
`MishkaGervaz.Table.Web.DataLoader.Helpers`,
`MishkaGervaz.Table.Types.Filter.Relation`,
and the sibling sub-builders `QueryBuilder`, `FilterParser`,
`PaginationHandler`, `TenantResolver`, `HookRunner`.

# `filter`

```elixir
@type filter() :: map()
```

# `load_result`

```elixir
@type load_result() :: %{
  options: [{String.t(), any()}],
  page: pos_integer(),
  has_more?: boolean(),
  total_count: pos_integer() | nil
}
```

# `state`

```elixir
@type state() :: map()
```

# `load_more_options`

```elixir
@callback load_more_options(filter(), state(), keyword()) ::
  {:ok, load_result()} | {:error, term()}
```

# `load_options`

```elixir
@callback load_options(filter(), state(), keyword()) ::
  {:ok, load_result()} | {:error, term()}
```

# `load_with_selected`

```elixir
@callback load_with_selected(filter(), state(), list(), keyword()) ::
  {:ok, load_result()} | {:error, term()}
```

# `resolve_selected`

```elixir
@callback resolve_selected(filter(), state(), list()) ::
  {:ok, [{String.t(), any()}]} | {:error, term()}
```

# `search_options`

```elixir
@callback search_options(filter(), state(), String.t(), keyword()) ::
  {:ok, load_result()} | {:error, term()}
```

---

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