MishkaGervaz.Resource.Info.Form (MishkaGervaz v0.0.1-alpha.3)

Copy Markdown View Source

Form-specific introspection for resources using MishkaGervaz.Resource.

Usage

# Get full form config
config = MishkaGervaz.Resource.Info.Form.config(MyResource)

# Get fields
fields = MishkaGervaz.Resource.Info.Form.fields(MyResource)

# Get groups
groups = MishkaGervaz.Resource.Info.Form.groups(MyResource)

# Get uploads
uploads = MishkaGervaz.Resource.Info.Form.uploads(MyResource)

Summary

Functions

Get the appropriate action for the current user type and action mode.

Get all preloads needed (always + detected + master/tenant specific).

Get the form identity name as a string, suitable for LiveComponent id. Returns nil if no form identity is configured.

Get the full compiled form configuration for a resource.

Get the data_loader configuration.

Get detected preloads from field sources.

Get the events configuration.

Get a specific field by name.

Get the field order for a resource form.

Get all fields for a resource form.

Get the form footer configuration. Returns nil when no footer is declared.

Get all groups for a resource form.

Get the form header configuration. Returns nil when no header is declared.

Get all hooks as a map.

Get a JS hook function by name from the form config.

Get the layout configuration for a resource form.

mishka_gervaz.form DSL entities

mishka_gervaz.form.fields DSL entities

Field display order. Fields not in list appear at end.

Field display order. Fields not in list appear at end.

mishka_gervaz.form.fields DSL options

mishka_gervaz.form.groups DSL entities

fn result, state -> state - After successful save.

fn result, state -> state - After successful save.

fn params, state -> params | {:halt, state} - Before save. Return {:halt, state} to cancel.

fn params, state -> params | {:halt, state} - Before save. Return {:halt, state} to cancel.

fn record_id -> %JS{} - JS commands after successful save. Receives saved record ID.

fn record_id -> %JS{} - JS commands after successful save. Receives saved record ID.

fn record_id -> %JS{} - JS commands when form is cancelled. Receives record ID or nil (create).

fn record_id -> %JS{} - JS commands when form is cancelled. Receives record ID or nil (create).

fn record_id -> %JS{} - JS commands on save error. Receives record ID or nil (create).

fn record_id -> %JS{} - JS commands on save error. Receives record ID or nil (create).

fn -> %JS{} - JS commands for phx-mounted on form container.

fn -> %JS{} - JS commands for phx-mounted on form container.

mishka_gervaz.form.hooks.js DSL options

fn state -> state - When form is cancelled.

fn state -> state - When form is cancelled.

fn field, value, state -> state | {:halt, state} - On individual field change.

fn field, value, state -> state | {:halt, state} - On individual field change.

fn form, state -> state - On save error.

fn form, state -> state - On save error.

fn form, state -> form - After form initialization.

fn form, state -> form - After form initialization.

fn params, state -> params - On form validate event.

fn params, state -> params - On form validate event.

mishka_gervaz.form.hooks DSL options

fn changeset, errors -> errors - Transform error messages.

fn changeset, errors -> errors - Transform error messages.

fn params -> params - Transform params before action.

fn params -> params - Transform params before action.

mishka_gervaz.form.identity DSL options

Base route for redirects after save.

Base route for redirects after save.

Phoenix stream name. Auto-generated if not set.

Phoenix stream name. Auto-generated if not set.

mishka_gervaz.form.layout DSL entities

Step navigation strategy. :sequential enforces order, :free allows jumping.

Step navigation strategy. :sequential enforces order, :free allows jumping.

mishka_gervaz.form.layout DSL options

Where to persist step data between navigations.

Where to persist step data between navigations.

Enable responsive layout adjustments.

Enable responsive layout adjustments.

Default debounce milliseconds for all fields. Overridden per-field via ui do debounce end.

Default debounce milliseconds for all fields. Overridden per-field via ui do debounce end.

mishka_gervaz.form.presentation DSL options

mishka_gervaz.form.presentation.theme DSL options

UI adapter module for rendering components.

UI adapter module for rendering components.

mishka_gervaz.form.source DSL entities

Create action. Atom (used for both master and tenant) or tuple {master_action, tenant_action}. Required either here or on the domain — compile fails otherwise.

Create action. Atom (used for both master and tenant) or tuple {master_action, tenant_action}. Required either here or on the domain — compile fails otherwise.

mishka_gervaz.form.source.actions DSL options

Read/get action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

Read/get action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

Update action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

Update action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

Function returning true for master users. fn user -> boolean

Function returning true for master users. fn user -> boolean

mishka_gervaz.form.source DSL options

Always preload these relationships.

Additional preloads for master users.

Additional preloads for master users.

mishka_gervaz.form.source.preload DSL options

Additional preloads for tenant users.

Additional preloads for tenant users.

Restrict all form modes to master users. Boolean or fn state -> boolean end.

Restrict all form modes to master users. Boolean or fn state -> boolean end.

Access module. Must use MishkaGervaz.Form.Web.State.Access. Handles access control for form actions.

Access module. Must use MishkaGervaz.Form.Web.State.Access. Handles access control for form actions.

Field builder module. Must use MishkaGervaz.Form.Web.State.FieldBuilder. Builds field configs from DSL and resource configuration.

Field builder module. Must use MishkaGervaz.Form.Web.State.FieldBuilder. Builds field configs from DSL and resource configuration.

Group builder module. Must use MishkaGervaz.Form.Web.State.GroupBuilder. Builds group layout from DSL configuration.

Group builder module. Must use MishkaGervaz.Form.Web.State.GroupBuilder. Builds group layout from DSL configuration.

Override the entire state module. When set, all other options are ignored. The module must use MishkaGervaz.Form.Web.State.

Override the entire state module. When set, all other options are ignored. The module must use MishkaGervaz.Form.Web.State.

mishka_gervaz.form.state DSL options

Presentation module. Must use MishkaGervaz.Form.Web.State.Presentation. Resolves UI adapter, templates, and presentation options.

Presentation module. Must use MishkaGervaz.Form.Web.State.Presentation. Resolves UI adapter, templates, and presentation options.

Step builder module. Must use MishkaGervaz.Form.Web.State.StepBuilder. Builds wizard/tab steps from DSL configuration.

Step builder module. Must use MishkaGervaz.Form.Web.State.StepBuilder. Builds wizard/tab steps from DSL configuration.

mishka_gervaz.form.uploads DSL entities

mishka_gervaz.table DSL entities

mishka_gervaz.table.bulk_actions DSL entities

mishka_gervaz.table.bulk_actions DSL options

mishka_gervaz.table.columns DSL entities

Column display order. Columns not in list appear at end.

Column display order. Columns not in list appear at end.

Default sort. Atom, tuple, or list of tuples.

Default sort. Atom, tuple, or list of tuples.

mishka_gervaz.table.columns DSL options

mishka_gervaz.table.filter_groups DSL entities

mishka_gervaz.table.filters DSL entities

mishka_gervaz.table.hooks DSL entities

fn record, state -> any - After delete (side effects only).

fn record, state -> any - After delete (side effects only).

fn record, state -> {:ok, state} | {:halt, {:error, msg}} - Before delete.

fn record, state -> {:ok, state} | {:halt, {:error, msg}} - Before delete.

Clear selected_ids / excluded_ids / select_all? after a successful bulk action.

Clear selected_ids / excluded_ids / select_all? after a successful bulk action.

fn event_name, params, socket -> {:ok, socket} | {:halt, socket} - Custom event handler.

fn event_name, params, socket -> {:ok, socket} | {:halt, socket} - Custom event handler.

fn record_id, socket -> socket | {:cont, socket} | {:halt, socket} - Row expanded. Return {:halt, socket} to cancel.

fn record_id, socket -> socket | {:cont, socket} | {:halt, socket} - Row expanded. Return {:halt, socket} to cancel.

fn filter_values, socket -> socket | {:cont, socket} | {:halt, socket} - Filter changed.

fn filter_values, socket -> socket | {:cont, socket} | {:halt, socket} - Filter changed.

fn query, state -> {:cont, query} | query - Before data loaded. Modify query.

fn query, state -> {:cont, query} | query - Before data loaded. Modify query.

fn notification, socket -> socket | {:cont, socket} | {:halt, socket} - PubSub received. Return {:halt, socket} to skip update.

fn notification, socket -> socket | {:cont, socket} | {:halt, socket} - PubSub received. Return {:halt, socket} to skip update.

fn selected_ids, socket -> socket | {:cont, socket} | {:halt, socket} - Selection changed.

fn selected_ids, socket -> socket | {:cont, socket} | {:halt, socket} - Selection changed.

fn {field, direction}, socket -> socket | {:cont, socket} | {:halt, socket} - Sort changed.

fn {field, direction}, socket -> socket | {:cont, socket} | {:halt, socket} - Sort changed.

mishka_gervaz.table.hooks DSL options

Redirect path (string or fn state -> path end) when total_count == 0 after a load.

Redirect path (string or fn state -> path end) when total_count == 0 after a load.

Reload page 1 if the current page becomes empty after an action.

Reload page 1 if the current page becomes empty after an action.

Switch to active mode after a successful unarchive/permanent_destroy if the archive list is now empty.

Switch to active mode after a successful unarchive/permanent_destroy if the archive list is now empty.

Symmetric: switch to archive mode after a successful destroy if the active list is now empty.

Symmetric: switch to archive mode after a successful destroy if the active list is now empty.

mishka_gervaz.table.identity DSL options

Base route for links (used in row actions).

Base route for links (used in row actions).

Phoenix stream name. Auto-generated if not set.

Phoenix stream name. Auto-generated if not set.

mishka_gervaz.table.layout DSL entities

Filter display mode: :inline (default), :sidebar, :modal, or :drawer.

Filter display mode: :inline (default), :sidebar, :modal, or :drawer.

mishka_gervaz.table.presentation DSL options

mishka_gervaz.table.presentation.responsive DSL options

List of template modules users can switch between at runtime. If empty, template switching is disabled. Example: [MishkaGervaz.Table.Templates.Table, MishkaGervaz.Table.Templates.MediaGallery]

List of template modules users can switch between at runtime. If empty, template switching is disabled. Example: [MishkaGervaz.Table.Templates.Table, MishkaGervaz.Table.Templates.MediaGallery]

Default template module for layout structure. Built-in templates

Default template module for layout structure. Built-in templates

Options passed to the template. Common options vary by template

Options passed to the template. Common options vary by template

mishka_gervaz.table.presentation.theme DSL options

UI adapter module for rendering components.

UI adapter module for rendering components.

Enable auto-refresh for this resource. Overrides domain default.

Enable auto-refresh for this resource. Overrides domain default.

Refresh interval in milliseconds. Overrides domain default.

Refresh interval in milliseconds. Overrides domain default.

mishka_gervaz.table.refresh DSL options

Pause auto-refresh when browser tab loses focus. Overrides domain default.

Pause auto-refresh when browser tab loses focus. Overrides domain default.

Pause auto-refresh when user is interacting. Overrides domain default.

Pause auto-refresh when user is interacting. Overrides domain default.

Show visual indicator when auto-refresh is active. Overrides domain default.

Show visual indicator when auto-refresh is active. Overrides domain default.

mishka_gervaz.table.row DSL entities

mishka_gervaz.table.row_actions DSL entities

mishka_gervaz.table.row_actions.actions_layout DSL options

Function fn record -> [class | nil].

Function fn record -> [class | nil].

mishka_gervaz.table.row.class DSL options

Possible classes for Tailwind JIT extraction.

Possible classes for Tailwind JIT extraction.

Event name triggered on row click.

Event name triggered on row click.

mishka_gervaz.table.row DSL options

Payload for row click. Map or fn record -> map.

Payload for row click. Map or fn record -> map.

Enable row selection checkboxes.

Enable row selection checkboxes.

Destroy action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

Destroy action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

Get action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

Get action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

mishka_gervaz.table.source.actions DSL options

Read action. Atom (used for both master and tenant) or tuple {master_action, tenant_action}. Required either here or on the domain — compile fails otherwise.

Read action. Atom (used for both master and tenant) or tuple {master_action, tenant_action}. Required either here or on the domain — compile fails otherwise.

Permanent destroy action. Can be single atom or tuple.

Permanent destroy action. Can be single atom or tuple.

Enable archive support. Set false to disable without removing the block.

Enable archive support. Set false to disable without removing the block.

Get archived action. Can be single atom or tuple.

Get archived action. Can be single atom or tuple.

mishka_gervaz.table.source.archive DSL options

Read archived action. Can be single atom or tuple {master_action, tenant_action}.

Read archived action. Can be single atom or tuple {master_action, tenant_action}.

Restore action. Can be single atom or tuple.

Restore action. Can be single atom or tuple.

Restrict archive UI to master users only. When true, tenant users cannot see archive toggle.

Restrict archive UI to master users only. When true, tenant users cannot see archive toggle.

Control archive toggle visibility. Boolean or fn state -> boolean for dynamic control.

Control archive toggle visibility. Boolean or fn state -> boolean for dynamic control.

Function returning true for master users. fn user -> boolean

Function returning true for master users. fn user -> boolean

mishka_gervaz.table.source DSL options

Additional preloads for master users.

Additional preloads for master users.

mishka_gervaz.table.source.preload DSL options

Additional preloads for tenant users.

Additional preloads for tenant users.

Access module. Must use MishkaGervaz.Table.Web.State.Access. Handles access control for records and actions.

Access module. Must use MishkaGervaz.Table.Web.State.Access. Handles access control for records and actions.

Action builder module. Must use MishkaGervaz.Table.Web.State.ActionBuilder. Builds row actions and bulk actions from configuration.

Action builder module. Must use MishkaGervaz.Table.Web.State.ActionBuilder. Builds row actions and bulk actions from configuration.

Column builder module. Must use MishkaGervaz.Table.Web.State.ColumnBuilder. Builds columns from DSL and resource configuration.

Column builder module. Must use MishkaGervaz.Table.Web.State.ColumnBuilder. Builds columns from DSL and resource configuration.

Filter builder module. Must use MishkaGervaz.Table.Web.State.FilterBuilder. Builds filters from DSL and resource configuration.

Filter builder module. Must use MishkaGervaz.Table.Web.State.FilterBuilder. Builds filters from DSL and resource configuration.

Override the entire state module. When set, all other options are ignored. The module must use MishkaGervaz.Table.Web.State.

Override the entire state module. When set, all other options are ignored. The module must use MishkaGervaz.Table.Web.State.

mishka_gervaz.table.state DSL options

Presentation module. Must use MishkaGervaz.Table.Web.State.Presentation. Resolves UI adapter, templates, and presentation options.

Presentation module. Must use MishkaGervaz.Table.Web.State.Presentation. Resolves UI adapter, templates, and presentation options.

URL sync module. Must use MishkaGervaz.Table.Web.State.UrlSync. Handles URL state synchronization.

URL sync module. Must use MishkaGervaz.Table.Web.State.UrlSync. Handles URL state synchronization.

Enable URL state synchronization. Overrides domain default.

Enable URL state synchronization. Overrides domain default.

Maximum length for filter values. Values exceeding this are ignored. Default: 500.

Maximum length for filter values. Values exceeding this are ignored. Default: 500.

mishka_gervaz.table.url_sync DSL options

Which state to sync to URL params. Overrides domain default.

Which state to sync to URL params. Overrides domain default.

Prefix for URL params. Overrides domain default.

Prefix for URL params. Overrides domain default.

Params to preserve in URL across re-encoding. :all keeps all unknown params, or provide a list of specific param names. Preserved params are NOT stored in table state. max_filter_length applies to values.

Params to preserve in URL across re-encoding. :all keeps all unknown params, or provide a list of specific param names. Preserved params are NOT stored in table state. max_filter_length applies to values.

Get the navigation strategy for a resource form.

Get a specific notice by name.

Get all notices declared in the form layout.

Get notices targeting the given position. Position can be an atom or a {:before_group, name} / {:after_group, name} tuple.

Get the persistence strategy for a resource form.

Get preload aliases for master/tenant context.

Get the route for a resource form.

Get the state configuration.

Get a specific step by name.

Get the group maps for a given step name.

Get all steps for a resource form.

Get the stream name for a resource form.

Get the submit configuration for a resource form.

Get all uploads for a resource form.

Functions

action_for(resource, action_type, master_user?)

@spec action_for(module(), :create | :update | :read, boolean()) :: atom()

Get the appropriate action for the current user type and action mode.

For non-multi-tenant resources, returns the same (tenant) action for both master and tenant users.

all_preloads(resource, master_user?)

@spec all_preloads(module(), boolean()) :: [atom()]

Get all preloads needed (always + detected + master/tenant specific).

component_id(resource)

@spec component_id(module()) :: String.t() | nil

Get the form identity name as a string, suitable for LiveComponent id. Returns nil if no form identity is configured.

config(resource)

@spec config(module()) :: map() | nil

Get the full compiled form configuration for a resource.

Returns the pre-built configuration map merged with domain defaults.

data_loader(resource)

@spec data_loader(module()) :: map()

Get the data_loader configuration.

Returns a map with optional keys for sub-builder overrides: :module, :record, :tenant, :relation, :hooks. Returns an empty map if no data_loader configuration is set.

detected_preloads(resource)

@spec detected_preloads(module()) :: [atom()]

Get detected preloads from field sources.

events(resource)

@spec events(module()) :: map()

Get the events configuration.

Returns a map with optional keys for sub-handler overrides: :module, :sanitization, :validation, :submit, :step, :upload, :relation, :hooks. Returns an empty map if no events configuration is set.

field(resource, field_name)

@spec field(module(), atom()) :: map() | nil

Get a specific field by name.

field_order(resource)

@spec field_order(module()) :: [atom()]

Get the field order for a resource form.

fields(resource)

@spec fields(module()) :: [map()]

Get all fields for a resource form.

footer(resource)

@spec footer(module()) :: map() | nil

Get the form footer configuration. Returns nil when no footer is declared.

groups(resource)

@spec groups(module()) :: [map()]

Get all groups for a resource form.

header(resource)

@spec header(module()) :: map() | nil

Get the form header configuration. Returns nil when no header is declared.

hooks(resource)

@spec hooks(module()) :: map()

Get all hooks as a map.

js_hook(resource, hook_name)

@spec js_hook(module(), atom()) :: (... -> Phoenix.LiveView.JS.t()) | nil

Get a JS hook function by name from the form config.

Returns the function or nil.

layout(resource)

@spec layout(module()) :: map() | nil

Get the layout configuration for a resource form.

mishka_gervaz_form(dsl_or_extended)

@spec mishka_gervaz_form(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.form DSL entities

mishka_gervaz_form_fields(dsl_or_extended)

@spec mishka_gervaz_form_fields(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.form.fields DSL entities

mishka_gervaz_form_fields_field_order(dsl_or_extended)

@spec mishka_gervaz_form_fields_field_order(dsl_or_extended :: module() | map()) ::
  {:ok, [atom()]} | :error

Field display order. Fields not in list appear at end.

mishka_gervaz_form_fields_field_order!(dsl_or_extended)

@spec mishka_gervaz_form_fields_field_order!(dsl_or_extended :: module() | map()) ::
  [atom()] | no_return()

Field display order. Fields not in list appear at end.

mishka_gervaz_form_fields_options(dsl_or_extended)

@spec mishka_gervaz_form_fields_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.form.fields DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_groups(dsl_or_extended)

@spec mishka_gervaz_form_groups(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.form.groups DSL entities

mishka_gervaz_form_hooks_after_save(dsl_or_extended)

@spec mishka_gervaz_form_hooks_after_save(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn result, state -> state - After successful save.

mishka_gervaz_form_hooks_after_save!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_after_save!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn result, state -> state - After successful save.

mishka_gervaz_form_hooks_before_save(dsl_or_extended)

@spec mishka_gervaz_form_hooks_before_save(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn params, state -> params | {:halt, state} - Before save. Return {:halt, state} to cancel.

mishka_gervaz_form_hooks_before_save!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_before_save!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn params, state -> params | {:halt, state} - Before save. Return {:halt, state} to cancel.

mishka_gervaz_form_hooks_js_after_save(dsl_or_extended)

@spec mishka_gervaz_form_hooks_js_after_save(dsl_or_extended :: module() | map()) ::
  {:ok, (any() -> any())} | :error

fn record_id -> %JS{} - JS commands after successful save. Receives saved record ID.

mishka_gervaz_form_hooks_js_after_save!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_js_after_save!(dsl_or_extended :: module() | map()) ::
  (any() -> any()) | no_return()

fn record_id -> %JS{} - JS commands after successful save. Receives saved record ID.

mishka_gervaz_form_hooks_js_on_cancel(dsl_or_extended)

@spec mishka_gervaz_form_hooks_js_on_cancel(dsl_or_extended :: module() | map()) ::
  {:ok, (any() -> any())} | :error

fn record_id -> %JS{} - JS commands when form is cancelled. Receives record ID or nil (create).

mishka_gervaz_form_hooks_js_on_cancel!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_js_on_cancel!(dsl_or_extended :: module() | map()) ::
  (any() -> any()) | no_return()

fn record_id -> %JS{} - JS commands when form is cancelled. Receives record ID or nil (create).

mishka_gervaz_form_hooks_js_on_error(dsl_or_extended)

@spec mishka_gervaz_form_hooks_js_on_error(dsl_or_extended :: module() | map()) ::
  {:ok, (any() -> any())} | :error

fn record_id -> %JS{} - JS commands on save error. Receives record ID or nil (create).

mishka_gervaz_form_hooks_js_on_error!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_js_on_error!(dsl_or_extended :: module() | map()) ::
  (any() -> any()) | no_return()

fn record_id -> %JS{} - JS commands on save error. Receives record ID or nil (create).

mishka_gervaz_form_hooks_js_on_init(dsl_or_extended)

@spec mishka_gervaz_form_hooks_js_on_init(dsl_or_extended :: module() | map()) ::
  {:ok, (-> any())} | :error

fn -> %JS{} - JS commands for phx-mounted on form container.

mishka_gervaz_form_hooks_js_on_init!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_js_on_init!(dsl_or_extended :: module() | map()) ::
  (-> any()) | no_return()

fn -> %JS{} - JS commands for phx-mounted on form container.

mishka_gervaz_form_hooks_js_options(dsl_or_extended)

@spec mishka_gervaz_form_hooks_js_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.form.hooks.js DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_hooks_on_cancel(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_cancel(dsl_or_extended :: module() | map()) ::
  {:ok, (any() -> any())} | :error

fn state -> state - When form is cancelled.

mishka_gervaz_form_hooks_on_cancel!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_cancel!(dsl_or_extended :: module() | map()) ::
  (any() -> any()) | no_return()

fn state -> state - When form is cancelled.

mishka_gervaz_form_hooks_on_change(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_change(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any(), any() -> any())} | :error

fn field, value, state -> state | {:halt, state} - On individual field change.

mishka_gervaz_form_hooks_on_change!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_change!(dsl_or_extended :: module() | map()) ::
  (any(), any(), any() -> any()) | no_return()

fn field, value, state -> state | {:halt, state} - On individual field change.

mishka_gervaz_form_hooks_on_error(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_error(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn form, state -> state - On save error.

mishka_gervaz_form_hooks_on_error!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_error!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn form, state -> state - On save error.

mishka_gervaz_form_hooks_on_init(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_init(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn form, state -> form - After form initialization.

mishka_gervaz_form_hooks_on_init!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_init!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn form, state -> form - After form initialization.

mishka_gervaz_form_hooks_on_validate(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_validate(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn params, state -> params - On form validate event.

mishka_gervaz_form_hooks_on_validate!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_on_validate!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn params, state -> params - On form validate event.

mishka_gervaz_form_hooks_options(dsl_or_extended)

@spec mishka_gervaz_form_hooks_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.form.hooks DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_hooks_transform_errors(dsl_or_extended)

@spec mishka_gervaz_form_hooks_transform_errors(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn changeset, errors -> errors - Transform error messages.

mishka_gervaz_form_hooks_transform_errors!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_transform_errors!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn changeset, errors -> errors - Transform error messages.

mishka_gervaz_form_hooks_transform_params(dsl_or_extended)

@spec mishka_gervaz_form_hooks_transform_params(dsl_or_extended :: module() | map()) ::
  {:ok, (any() -> any())} | :error

fn params -> params - Transform params before action.

mishka_gervaz_form_hooks_transform_params!(dsl_or_extended)

@spec mishka_gervaz_form_hooks_transform_params!(dsl_or_extended :: module() | map()) ::
  (any() -> any()) | no_return()

fn params -> params - Transform params before action.

mishka_gervaz_form_identity_name(dsl_or_extended)

@spec mishka_gervaz_form_identity_name(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Unique form identifier.

mishka_gervaz_form_identity_name!(dsl_or_extended)

@spec mishka_gervaz_form_identity_name!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Unique form identifier.

mishka_gervaz_form_identity_options(dsl_or_extended)

@spec mishka_gervaz_form_identity_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.form.identity DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_identity_route(dsl_or_extended)

@spec mishka_gervaz_form_identity_route(dsl_or_extended :: module() | map()) ::
  {:ok, String.t()} | :error

Base route for redirects after save.

mishka_gervaz_form_identity_route!(dsl_or_extended)

@spec mishka_gervaz_form_identity_route!(dsl_or_extended :: module() | map()) ::
  String.t() | no_return()

Base route for redirects after save.

mishka_gervaz_form_identity_stream_name(dsl_or_extended)

@spec mishka_gervaz_form_identity_stream_name(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Phoenix stream name. Auto-generated if not set.

mishka_gervaz_form_identity_stream_name!(dsl_or_extended)

@spec mishka_gervaz_form_identity_stream_name!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Phoenix stream name. Auto-generated if not set.

mishka_gervaz_form_layout(dsl_or_extended)

@spec mishka_gervaz_form_layout(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.form.layout DSL entities

mishka_gervaz_form_layout_columns(dsl_or_extended)

@spec mishka_gervaz_form_layout_columns(dsl_or_extended :: module() | map()) ::
  {:ok, 4 | 3 | 2 | 1} | :error

Number of grid columns (1-4).

mishka_gervaz_form_layout_columns!(dsl_or_extended)

@spec mishka_gervaz_form_layout_columns!(dsl_or_extended :: module() | map()) ::
  (4 | 3 | 2 | 1) | no_return()

Number of grid columns (1-4).

mishka_gervaz_form_layout_mode(dsl_or_extended)

@spec mishka_gervaz_form_layout_mode(dsl_or_extended :: module() | map()) ::
  {:ok, :tabs | :wizard | :standard} | :error

Form layout mode.

mishka_gervaz_form_layout_mode!(dsl_or_extended)

@spec mishka_gervaz_form_layout_mode!(dsl_or_extended :: module() | map()) ::
  (:tabs | :wizard | :standard) | no_return()

Form layout mode.

mishka_gervaz_form_layout_navigation(dsl_or_extended)

@spec mishka_gervaz_form_layout_navigation(dsl_or_extended :: module() | map()) ::
  {:ok, :free | :sequential} | :error

Step navigation strategy. :sequential enforces order, :free allows jumping.

mishka_gervaz_form_layout_navigation!(dsl_or_extended)

@spec mishka_gervaz_form_layout_navigation!(dsl_or_extended :: module() | map()) ::
  (:free | :sequential) | no_return()

Step navigation strategy. :sequential enforces order, :free allows jumping.

mishka_gervaz_form_layout_options(dsl_or_extended)

@spec mishka_gervaz_form_layout_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.form.layout DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_layout_persistence(dsl_or_extended)

@spec mishka_gervaz_form_layout_persistence(dsl_or_extended :: module() | map()) ::
  {:ok, :client_token | :ets | :none} | :error

Where to persist step data between navigations.

mishka_gervaz_form_layout_persistence!(dsl_or_extended)

@spec mishka_gervaz_form_layout_persistence!(dsl_or_extended :: module() | map()) ::
  (:client_token | :ets | :none) | no_return()

Where to persist step data between navigations.

mishka_gervaz_form_layout_responsive(dsl_or_extended)

@spec mishka_gervaz_form_layout_responsive(dsl_or_extended :: module() | map()) ::
  {:ok, boolean()} | :error

Enable responsive layout adjustments.

mishka_gervaz_form_layout_responsive!(dsl_or_extended)

@spec mishka_gervaz_form_layout_responsive!(dsl_or_extended :: module() | map()) ::
  boolean() | no_return()

Enable responsive layout adjustments.

mishka_gervaz_form_presentation_debounce(dsl_or_extended)

@spec mishka_gervaz_form_presentation_debounce(dsl_or_extended :: module() | map()) ::
  {:ok, integer()} | :error

Default debounce milliseconds for all fields. Overridden per-field via ui do debounce end.

mishka_gervaz_form_presentation_debounce!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_debounce!(dsl_or_extended :: module() | map()) ::
  integer() | no_return()

Default debounce milliseconds for all fields. Overridden per-field via ui do debounce end.

mishka_gervaz_form_presentation_features(dsl_or_extended)

@spec mishka_gervaz_form_presentation_features(dsl_or_extended :: module() | map()) ::
  {:ok,
   :all
   | [:inline_errors | :autosave | :wizard | :groups | :uploads | :validation]}
  | :error

Features to enable for this form.

mishka_gervaz_form_presentation_features!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_features!(dsl_or_extended :: module() | map()) ::
  (:all
   | [:inline_errors | :autosave | :wizard | :groups | :uploads | :validation])
  | no_return()

Features to enable for this form.

mishka_gervaz_form_presentation_options(dsl_or_extended)

@spec mishka_gervaz_form_presentation_options(dsl_or_extended :: module() | map()) ::
  %{
    required(atom()) => any()
  }

mishka_gervaz.form.presentation DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_presentation_template(dsl_or_extended)

@spec mishka_gervaz_form_presentation_template(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Template module for form layout.

mishka_gervaz_form_presentation_template!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_template!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Template module for form layout.

mishka_gervaz_form_presentation_theme_error_class(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_error_class(
  dsl_or_extended :: module() | map()
) ::
  {:ok, String.t()} | :error

Error message CSS classes.

mishka_gervaz_form_presentation_theme_error_class!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_error_class!(
  dsl_or_extended :: module() | map()
) ::
  String.t() | no_return()

Error message CSS classes.

mishka_gervaz_form_presentation_theme_extra(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_extra(dsl_or_extended :: module() | map()) ::
  {:ok, map()} | :error

Template-specific theming options.

mishka_gervaz_form_presentation_theme_extra!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_extra!(
  dsl_or_extended :: module() | map()
) ::
  map() | no_return()

Template-specific theming options.

mishka_gervaz_form_presentation_theme_field_class(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_field_class(
  dsl_or_extended :: module() | map()
) ::
  {:ok, String.t()} | :error

Default field CSS classes.

mishka_gervaz_form_presentation_theme_field_class!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_field_class!(
  dsl_or_extended :: module() | map()
) ::
  String.t() | no_return()

Default field CSS classes.

mishka_gervaz_form_presentation_theme_form_class(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_form_class(
  dsl_or_extended :: module() | map()
) ::
  {:ok, String.t()} | :error

Form element CSS classes.

mishka_gervaz_form_presentation_theme_form_class!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_form_class!(
  dsl_or_extended :: module() | map()
) ::
  String.t() | no_return()

Form element CSS classes.

mishka_gervaz_form_presentation_theme_label_class(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_label_class(
  dsl_or_extended :: module() | map()
) ::
  {:ok, String.t()} | :error

Default label CSS classes.

mishka_gervaz_form_presentation_theme_label_class!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_label_class!(
  dsl_or_extended :: module() | map()
) ::
  String.t() | no_return()

Default label CSS classes.

mishka_gervaz_form_presentation_theme_options(dsl_or_extended)

@spec mishka_gervaz_form_presentation_theme_options(
  dsl_or_extended :: module() | map()
) :: %{
  required(atom()) => any()
}

mishka_gervaz.form.presentation.theme DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_presentation_ui_adapter(dsl_or_extended)

@spec mishka_gervaz_form_presentation_ui_adapter(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

UI adapter module for rendering components.

mishka_gervaz_form_presentation_ui_adapter!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_ui_adapter!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

UI adapter module for rendering components.

mishka_gervaz_form_presentation_ui_adapter_opts(dsl_or_extended)

@spec mishka_gervaz_form_presentation_ui_adapter_opts(
  dsl_or_extended :: module() | map()
) ::
  {:ok, keyword()} | :error

Options for UI adapter configuration.

mishka_gervaz_form_presentation_ui_adapter_opts!(dsl_or_extended)

@spec mishka_gervaz_form_presentation_ui_adapter_opts!(
  dsl_or_extended :: module() | map()
) ::
  keyword() | no_return()

Options for UI adapter configuration.

mishka_gervaz_form_source(dsl_or_extended)

@spec mishka_gervaz_form_source(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.form.source DSL entities

mishka_gervaz_form_source_actions_create(dsl_or_extended)

@spec mishka_gervaz_form_source_actions_create(dsl_or_extended :: module() | map()) ::
  {:ok, atom() | {atom(), atom()}} | :error

Create action. Atom (used for both master and tenant) or tuple {master_action, tenant_action}. Required either here or on the domain — compile fails otherwise.

mishka_gervaz_form_source_actions_create!(dsl_or_extended)

@spec mishka_gervaz_form_source_actions_create!(dsl_or_extended :: module() | map()) ::
  (atom() | {atom(), atom()}) | no_return()

Create action. Atom (used for both master and tenant) or tuple {master_action, tenant_action}. Required either here or on the domain — compile fails otherwise.

mishka_gervaz_form_source_actions_options(dsl_or_extended)

@spec mishka_gervaz_form_source_actions_options(dsl_or_extended :: module() | map()) ::
  %{
    required(atom()) => any()
  }

mishka_gervaz.form.source.actions DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_source_actions_read(dsl_or_extended)

@spec mishka_gervaz_form_source_actions_read(dsl_or_extended :: module() | map()) ::
  {:ok, atom() | {atom(), atom()}} | :error

Read/get action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

mishka_gervaz_form_source_actions_read!(dsl_or_extended)

@spec mishka_gervaz_form_source_actions_read!(dsl_or_extended :: module() | map()) ::
  (atom() | {atom(), atom()}) | no_return()

Read/get action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

mishka_gervaz_form_source_actions_update(dsl_or_extended)

@spec mishka_gervaz_form_source_actions_update(dsl_or_extended :: module() | map()) ::
  {:ok, atom() | {atom(), atom()}} | :error

Update action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

mishka_gervaz_form_source_actions_update!(dsl_or_extended)

@spec mishka_gervaz_form_source_actions_update!(dsl_or_extended :: module() | map()) ::
  (atom() | {atom(), atom()}) | no_return()

Update action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

mishka_gervaz_form_source_actor_key(dsl_or_extended)

@spec mishka_gervaz_form_source_actor_key(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Assigns key for current user.

mishka_gervaz_form_source_actor_key!(dsl_or_extended)

@spec mishka_gervaz_form_source_actor_key!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Assigns key for current user.

mishka_gervaz_form_source_master_check(dsl_or_extended)

@spec mishka_gervaz_form_source_master_check(dsl_or_extended :: module() | map()) ::
  {:ok, (any() -> any())} | :error

Function returning true for master users. fn user -> boolean

mishka_gervaz_form_source_master_check!(dsl_or_extended)

@spec mishka_gervaz_form_source_master_check!(dsl_or_extended :: module() | map()) ::
  (any() -> any()) | no_return()

Function returning true for master users. fn user -> boolean

mishka_gervaz_form_source_options(dsl_or_extended)

@spec mishka_gervaz_form_source_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.form.source DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_source_preload_always(dsl_or_extended)

@spec mishka_gervaz_form_source_preload_always(dsl_or_extended :: module() | map()) ::
  {:ok, [atom() | {atom(), atom()}]} | :error

Always preload these relationships.

Supports atoms or {source, alias} tuples:

  • :category - preload :category relationship
  • {:category, :cat} or category: :cat - preload :category, alias as :cat

Pagination Warning

The relationship's read action must NOT have pagination required?: true. Preloads do not pass pagination params, so required pagination will cause LimitRequired errors at runtime. Use required?: false on the action:

read :my_action do
  pagination offset?: true, required?: false, default_limit: 20
end

mishka_gervaz_form_source_preload_always!(dsl_or_extended)

@spec mishka_gervaz_form_source_preload_always!(dsl_or_extended :: module() | map()) ::
  [atom() | {atom(), atom()}] | no_return()

Always preload these relationships.

Supports atoms or {source, alias} tuples:

  • :category - preload :category relationship
  • {:category, :cat} or category: :cat - preload :category, alias as :cat

Pagination Warning

The relationship's read action must NOT have pagination required?: true. Preloads do not pass pagination params, so required pagination will cause LimitRequired errors at runtime. Use required?: false on the action:

read :my_action do
  pagination offset?: true, required?: false, default_limit: 20
end

mishka_gervaz_form_source_preload_master(dsl_or_extended)

@spec mishka_gervaz_form_source_preload_master(dsl_or_extended :: module() | map()) ::
  {:ok, [atom() | {atom(), atom()}]} | :error

Additional preloads for master users.

Supports atoms or {source, alias} tuples. See always for pagination requirements.

mishka_gervaz_form_source_preload_master!(dsl_or_extended)

@spec mishka_gervaz_form_source_preload_master!(dsl_or_extended :: module() | map()) ::
  [atom() | {atom(), atom()}] | no_return()

Additional preloads for master users.

Supports atoms or {source, alias} tuples. See always for pagination requirements.

mishka_gervaz_form_source_preload_options(dsl_or_extended)

@spec mishka_gervaz_form_source_preload_options(dsl_or_extended :: module() | map()) ::
  %{
    required(atom()) => any()
  }

mishka_gervaz.form.source.preload DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_source_preload_tenant(dsl_or_extended)

@spec mishka_gervaz_form_source_preload_tenant(dsl_or_extended :: module() | map()) ::
  {:ok, [atom() | {atom(), atom()}]} | :error

Additional preloads for tenant users.

Supports atoms or {source, alias} tuples. See always for pagination requirements.

mishka_gervaz_form_source_preload_tenant!(dsl_or_extended)

@spec mishka_gervaz_form_source_preload_tenant!(dsl_or_extended :: module() | map()) ::
  [atom() | {atom(), atom()}] | no_return()

Additional preloads for tenant users.

Supports atoms or {source, alias} tuples. See always for pagination requirements.

mishka_gervaz_form_source_restricted(dsl_or_extended)

@spec mishka_gervaz_form_source_restricted(dsl_or_extended :: module() | map()) ::
  {:ok, boolean() | (any() -> any())} | :error

Restrict all form modes to master users. Boolean or fn state -> boolean end.

mishka_gervaz_form_source_restricted!(dsl_or_extended)

@spec mishka_gervaz_form_source_restricted!(dsl_or_extended :: module() | map()) ::
  (boolean() | (any() -> any())) | no_return()

Restrict all form modes to master users. Boolean or fn state -> boolean end.

mishka_gervaz_form_state_access(dsl_or_extended)

@spec mishka_gervaz_form_state_access(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Access module. Must use MishkaGervaz.Form.Web.State.Access. Handles access control for form actions.

mishka_gervaz_form_state_access!(dsl_or_extended)

@spec mishka_gervaz_form_state_access!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Access module. Must use MishkaGervaz.Form.Web.State.Access. Handles access control for form actions.

mishka_gervaz_form_state_field(dsl_or_extended)

@spec mishka_gervaz_form_state_field(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Field builder module. Must use MishkaGervaz.Form.Web.State.FieldBuilder. Builds field configs from DSL and resource configuration.

mishka_gervaz_form_state_field!(dsl_or_extended)

@spec mishka_gervaz_form_state_field!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Field builder module. Must use MishkaGervaz.Form.Web.State.FieldBuilder. Builds field configs from DSL and resource configuration.

mishka_gervaz_form_state_group(dsl_or_extended)

@spec mishka_gervaz_form_state_group(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Group builder module. Must use MishkaGervaz.Form.Web.State.GroupBuilder. Builds group layout from DSL configuration.

mishka_gervaz_form_state_group!(dsl_or_extended)

@spec mishka_gervaz_form_state_group!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Group builder module. Must use MishkaGervaz.Form.Web.State.GroupBuilder. Builds group layout from DSL configuration.

mishka_gervaz_form_state_module(dsl_or_extended)

@spec mishka_gervaz_form_state_module(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Override the entire state module. When set, all other options are ignored. The module must use MishkaGervaz.Form.Web.State.

mishka_gervaz_form_state_module!(dsl_or_extended)

@spec mishka_gervaz_form_state_module!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Override the entire state module. When set, all other options are ignored. The module must use MishkaGervaz.Form.Web.State.

mishka_gervaz_form_state_options(dsl_or_extended)

@spec mishka_gervaz_form_state_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.form.state DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_form_state_presentation(dsl_or_extended)

@spec mishka_gervaz_form_state_presentation(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Presentation module. Must use MishkaGervaz.Form.Web.State.Presentation. Resolves UI adapter, templates, and presentation options.

mishka_gervaz_form_state_presentation!(dsl_or_extended)

@spec mishka_gervaz_form_state_presentation!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Presentation module. Must use MishkaGervaz.Form.Web.State.Presentation. Resolves UI adapter, templates, and presentation options.

mishka_gervaz_form_state_step(dsl_or_extended)

@spec mishka_gervaz_form_state_step(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Step builder module. Must use MishkaGervaz.Form.Web.State.StepBuilder. Builds wizard/tab steps from DSL configuration.

mishka_gervaz_form_state_step!(dsl_or_extended)

@spec mishka_gervaz_form_state_step!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Step builder module. Must use MishkaGervaz.Form.Web.State.StepBuilder. Builds wizard/tab steps from DSL configuration.

mishka_gervaz_form_uploads(dsl_or_extended)

@spec mishka_gervaz_form_uploads(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.form.uploads DSL entities

mishka_gervaz_table(dsl_or_extended)

@spec mishka_gervaz_table(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.table DSL entities

mishka_gervaz_table_bulk_actions(dsl_or_extended)

@spec mishka_gervaz_table_bulk_actions(dsl_or_extended :: module() | map()) :: [
  struct()
]

mishka_gervaz.table.bulk_actions DSL entities

mishka_gervaz_table_bulk_actions_enabled(dsl_or_extended)

@spec mishka_gervaz_table_bulk_actions_enabled(dsl_or_extended :: module() | map()) ::
  {:ok, boolean()} | :error

Enable bulk actions.

mishka_gervaz_table_bulk_actions_enabled!(dsl_or_extended)

@spec mishka_gervaz_table_bulk_actions_enabled!(dsl_or_extended :: module() | map()) ::
  boolean() | no_return()

Enable bulk actions.

mishka_gervaz_table_bulk_actions_options(dsl_or_extended)

@spec mishka_gervaz_table_bulk_actions_options(dsl_or_extended :: module() | map()) ::
  %{
    required(atom()) => any()
  }

mishka_gervaz.table.bulk_actions DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_columns(dsl_or_extended)

@spec mishka_gervaz_table_columns(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.table.columns DSL entities

mishka_gervaz_table_columns_column_order(dsl_or_extended)

@spec mishka_gervaz_table_columns_column_order(dsl_or_extended :: module() | map()) ::
  {:ok, [atom()]} | :error

Column display order. Columns not in list appear at end.

mishka_gervaz_table_columns_column_order!(dsl_or_extended)

@spec mishka_gervaz_table_columns_column_order!(dsl_or_extended :: module() | map()) ::
  [atom()] | no_return()

Column display order. Columns not in list appear at end.

mishka_gervaz_table_columns_default_sort(dsl_or_extended)

@spec mishka_gervaz_table_columns_default_sort(dsl_or_extended :: module() | map()) ::
  {:ok, any()} | :error

Default sort. Atom, tuple, or list of tuples.

mishka_gervaz_table_columns_default_sort!(dsl_or_extended)

@spec mishka_gervaz_table_columns_default_sort!(dsl_or_extended :: module() | map()) ::
  any() | no_return()

Default sort. Atom, tuple, or list of tuples.

mishka_gervaz_table_columns_options(dsl_or_extended)

@spec mishka_gervaz_table_columns_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.columns DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_filter_groups(dsl_or_extended)

@spec mishka_gervaz_table_filter_groups(dsl_or_extended :: module() | map()) :: [
  struct()
]

mishka_gervaz.table.filter_groups DSL entities

mishka_gervaz_table_filters(dsl_or_extended)

@spec mishka_gervaz_table_filters(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.table.filters DSL entities

mishka_gervaz_table_hooks(dsl_or_extended)

@spec mishka_gervaz_table_hooks(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.table.hooks DSL entities

mishka_gervaz_table_hooks_after_delete(dsl_or_extended)

@spec mishka_gervaz_table_hooks_after_delete(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn record, state -> any - After delete (side effects only).

mishka_gervaz_table_hooks_after_delete!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_after_delete!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn record, state -> any - After delete (side effects only).

mishka_gervaz_table_hooks_before_delete(dsl_or_extended)

@spec mishka_gervaz_table_hooks_before_delete(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn record, state -> {:ok, state} | {:halt, {:error, msg}} - Before delete.

mishka_gervaz_table_hooks_before_delete!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_before_delete!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn record, state -> {:ok, state} | {:halt, {:error, msg}} - Before delete.

mishka_gervaz_table_hooks_clear_selection_after_bulk(dsl_or_extended)

@spec mishka_gervaz_table_hooks_clear_selection_after_bulk(
  dsl_or_extended :: module() | map()
) ::
  {:ok, boolean()} | :error

Clear selected_ids / excluded_ids / select_all? after a successful bulk action.

mishka_gervaz_table_hooks_clear_selection_after_bulk!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_clear_selection_after_bulk!(
  dsl_or_extended :: module() | map()
) ::
  boolean() | no_return()

Clear selected_ids / excluded_ids / select_all? after a successful bulk action.

mishka_gervaz_table_hooks_on_event(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_event(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any(), any() -> any())} | :error

fn event_name, params, socket -> {:ok, socket} | {:halt, socket} - Custom event handler.

mishka_gervaz_table_hooks_on_event!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_event!(dsl_or_extended :: module() | map()) ::
  (any(), any(), any() -> any()) | no_return()

fn event_name, params, socket -> {:ok, socket} | {:halt, socket} - Custom event handler.

mishka_gervaz_table_hooks_on_expand(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_expand(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn record_id, socket -> socket | {:cont, socket} | {:halt, socket} - Row expanded. Return {:halt, socket} to cancel.

mishka_gervaz_table_hooks_on_expand!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_expand!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn record_id, socket -> socket | {:cont, socket} | {:halt, socket} - Row expanded. Return {:halt, socket} to cancel.

mishka_gervaz_table_hooks_on_filter(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_filter(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn filter_values, socket -> socket | {:cont, socket} | {:halt, socket} - Filter changed.

mishka_gervaz_table_hooks_on_filter!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_filter!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn filter_values, socket -> socket | {:cont, socket} | {:halt, socket} - Filter changed.

mishka_gervaz_table_hooks_on_load(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_load(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn query, state -> {:cont, query} | query - Before data loaded. Modify query.

mishka_gervaz_table_hooks_on_load!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_load!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn query, state -> {:cont, query} | query - Before data loaded. Modify query.

mishka_gervaz_table_hooks_on_realtime(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_realtime(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn notification, socket -> socket | {:cont, socket} | {:halt, socket} - PubSub received. Return {:halt, socket} to skip update.

mishka_gervaz_table_hooks_on_realtime!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_realtime!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn notification, socket -> socket | {:cont, socket} | {:halt, socket} - PubSub received. Return {:halt, socket} to skip update.

mishka_gervaz_table_hooks_on_select(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_select(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn selected_ids, socket -> socket | {:cont, socket} | {:halt, socket} - Selection changed.

mishka_gervaz_table_hooks_on_select!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_select!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn selected_ids, socket -> socket | {:cont, socket} | {:halt, socket} - Selection changed.

mishka_gervaz_table_hooks_on_sort(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_sort(dsl_or_extended :: module() | map()) ::
  {:ok, (any(), any() -> any())} | :error

fn {field, direction}, socket -> socket | {:cont, socket} | {:halt, socket} - Sort changed.

mishka_gervaz_table_hooks_on_sort!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_on_sort!(dsl_or_extended :: module() | map()) ::
  (any(), any() -> any()) | no_return()

fn {field, direction}, socket -> socket | {:cont, socket} | {:halt, socket} - Sort changed.

mishka_gervaz_table_hooks_options(dsl_or_extended)

@spec mishka_gervaz_table_hooks_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.hooks DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_hooks_redirect_on_empty(dsl_or_extended)

@spec mishka_gervaz_table_hooks_redirect_on_empty(dsl_or_extended :: module() | map()) ::
  {:ok, String.t() | (any() -> any())} | :error

Redirect path (string or fn state -> path end) when total_count == 0 after a load.

mishka_gervaz_table_hooks_redirect_on_empty!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_redirect_on_empty!(
  dsl_or_extended :: module() | map()
) ::
  (String.t() | (any() -> any())) | no_return()

Redirect path (string or fn state -> path end) when total_count == 0 after a load.

mishka_gervaz_table_hooks_reset_page_on_empty_current_page(dsl_or_extended)

@spec mishka_gervaz_table_hooks_reset_page_on_empty_current_page(
  dsl_or_extended :: module() | map()
) ::
  {:ok, boolean()} | :error

Reload page 1 if the current page becomes empty after an action.

mishka_gervaz_table_hooks_reset_page_on_empty_current_page!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_reset_page_on_empty_current_page!(
  dsl_or_extended :: module() | map()
) ::
  boolean() | no_return()

Reload page 1 if the current page becomes empty after an action.

mishka_gervaz_table_hooks_switch_to_active_on_empty_archive(dsl_or_extended)

@spec mishka_gervaz_table_hooks_switch_to_active_on_empty_archive(
  dsl_or_extended :: module() | map()
) ::
  {:ok, boolean()} | :error

Switch to active mode after a successful unarchive/permanent_destroy if the archive list is now empty.

mishka_gervaz_table_hooks_switch_to_active_on_empty_archive!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_switch_to_active_on_empty_archive!(
  dsl_or_extended :: module() | map()
) ::
  boolean() | no_return()

Switch to active mode after a successful unarchive/permanent_destroy if the archive list is now empty.

mishka_gervaz_table_hooks_switch_to_archive_on_empty_active(dsl_or_extended)

@spec mishka_gervaz_table_hooks_switch_to_archive_on_empty_active(
  dsl_or_extended :: module() | map()
) ::
  {:ok, boolean()} | :error

Symmetric: switch to archive mode after a successful destroy if the active list is now empty.

mishka_gervaz_table_hooks_switch_to_archive_on_empty_active!(dsl_or_extended)

@spec mishka_gervaz_table_hooks_switch_to_archive_on_empty_active!(
  dsl_or_extended :: module() | map()
) ::
  boolean() | no_return()

Symmetric: switch to archive mode after a successful destroy if the active list is now empty.

mishka_gervaz_table_identity_name(dsl_or_extended)

@spec mishka_gervaz_table_identity_name(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Unique table identifier.

mishka_gervaz_table_identity_name!(dsl_or_extended)

@spec mishka_gervaz_table_identity_name!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Unique table identifier.

mishka_gervaz_table_identity_options(dsl_or_extended)

@spec mishka_gervaz_table_identity_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.identity DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_identity_route(dsl_or_extended)

@spec mishka_gervaz_table_identity_route(dsl_or_extended :: module() | map()) ::
  {:ok, String.t()} | :error

Base route for links (used in row actions).

mishka_gervaz_table_identity_route!(dsl_or_extended)

@spec mishka_gervaz_table_identity_route!(dsl_or_extended :: module() | map()) ::
  String.t() | no_return()

Base route for links (used in row actions).

mishka_gervaz_table_identity_stream_name(dsl_or_extended)

@spec mishka_gervaz_table_identity_stream_name(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Phoenix stream name. Auto-generated if not set.

mishka_gervaz_table_identity_stream_name!(dsl_or_extended)

@spec mishka_gervaz_table_identity_stream_name!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Phoenix stream name. Auto-generated if not set.

mishka_gervaz_table_layout(dsl_or_extended)

@spec mishka_gervaz_table_layout(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.table.layout DSL entities

mishka_gervaz_table_presentation_features(dsl_or_extended)

@spec mishka_gervaz_table_presentation_features(dsl_or_extended :: module() | map()) ::
  {:ok,
   :all
   | [
       :inline_edit
       | :reorder
       | :expand
       | :export
       | :paginate
       | :bulk_actions
       | :select
       | :filter
       | :sort
     ]}
  | :error

Features to enable for this table.

Can be :all (default - uses template's features) or a list of specific features.

Available features:

  • :sort - Column sorting
  • :filter - Filtering
  • :select - Row/item selection
  • :bulk_actions - Bulk actions on selected items
  • :paginate - Pagination
  • :export - Export to CSV/Excel
  • :expand - Expandable rows/cards
  • :reorder - Drag and drop reordering
  • :inline_edit - Inline editing

Examples

# Use all template features (default)
features :all

# Only specific features
features [:filter, :paginate]

# Disable all features
features []

mishka_gervaz_table_presentation_features!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_features!(dsl_or_extended :: module() | map()) ::
  (:all
   | [
       :inline_edit
       | :reorder
       | :expand
       | :export
       | :paginate
       | :bulk_actions
       | :select
       | :filter
       | :sort
     ])
  | no_return()

Features to enable for this table.

Can be :all (default - uses template's features) or a list of specific features.

Available features:

  • :sort - Column sorting
  • :filter - Filtering
  • :select - Row/item selection
  • :bulk_actions - Bulk actions on selected items
  • :paginate - Pagination
  • :export - Export to CSV/Excel
  • :expand - Expandable rows/cards
  • :reorder - Drag and drop reordering
  • :inline_edit - Inline editing

Examples

# Use all template features (default)
features :all

# Only specific features
features [:filter, :paginate]

# Disable all features
features []

mishka_gervaz_table_presentation_filter_mode(dsl_or_extended)

@spec mishka_gervaz_table_presentation_filter_mode(
  dsl_or_extended :: module() | map()
) ::
  {:ok, :drawer | :modal | :sidebar | :inline} | :error

Filter display mode: :inline (default), :sidebar, :modal, or :drawer.

mishka_gervaz_table_presentation_filter_mode!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_filter_mode!(
  dsl_or_extended :: module() | map()
) ::
  (:drawer | :modal | :sidebar | :inline) | no_return()

Filter display mode: :inline (default), :sidebar, :modal, or :drawer.

mishka_gervaz_table_presentation_options(dsl_or_extended)

@spec mishka_gervaz_table_presentation_options(dsl_or_extended :: module() | map()) ::
  %{
    required(atom()) => any()
  }

mishka_gervaz.table.presentation DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_presentation_responsive_hide_on_mobile(dsl_or_extended)

@spec mishka_gervaz_table_presentation_responsive_hide_on_mobile(
  dsl_or_extended :: module() | map()
) ::
  {:ok, [atom()]} | :error

Columns to hide on mobile.

mishka_gervaz_table_presentation_responsive_hide_on_mobile!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_responsive_hide_on_mobile!(
  dsl_or_extended :: module() | map()
) ::
  [atom()] | no_return()

Columns to hide on mobile.

mishka_gervaz_table_presentation_responsive_hide_on_tablet(dsl_or_extended)

@spec mishka_gervaz_table_presentation_responsive_hide_on_tablet(
  dsl_or_extended :: module() | map()
) ::
  {:ok, [atom()]} | :error

Columns to hide on tablet.

mishka_gervaz_table_presentation_responsive_hide_on_tablet!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_responsive_hide_on_tablet!(
  dsl_or_extended :: module() | map()
) ::
  [atom()] | no_return()

Columns to hide on tablet.

mishka_gervaz_table_presentation_responsive_mobile_layout(dsl_or_extended)

@spec mishka_gervaz_table_presentation_responsive_mobile_layout(
  dsl_or_extended :: module() | map()
) ::
  {:ok, :stacked | :cards} | :error

Layout mode on mobile.

mishka_gervaz_table_presentation_responsive_mobile_layout!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_responsive_mobile_layout!(
  dsl_or_extended :: module() | map()
) ::
  (:stacked | :cards) | no_return()

Layout mode on mobile.

mishka_gervaz_table_presentation_responsive_options(dsl_or_extended)

@spec mishka_gervaz_table_presentation_responsive_options(
  dsl_or_extended :: module() | map()
) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.presentation.responsive DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_presentation_switchable_templates(dsl_or_extended)

@spec mishka_gervaz_table_presentation_switchable_templates(
  dsl_or_extended :: module() | map()
) ::
  {:ok, [atom() | module()]} | :error

List of template modules users can switch between at runtime. If empty, template switching is disabled. Example: [MishkaGervaz.Table.Templates.Table, MishkaGervaz.Table.Templates.MediaGallery]

mishka_gervaz_table_presentation_switchable_templates!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_switchable_templates!(
  dsl_or_extended :: module() | map()
) ::
  [atom() | module()] | no_return()

List of template modules users can switch between at runtime. If empty, template switching is disabled. Example: [MishkaGervaz.Table.Templates.Table, MishkaGervaz.Table.Templates.MediaGallery]

mishka_gervaz_table_presentation_template(dsl_or_extended)

@spec mishka_gervaz_table_presentation_template(dsl_or_extended :: module() | map()) ::
  {:ok, atom() | module()} | :error

Default template module for layout structure. Built-in templates:

mishka_gervaz_table_presentation_template!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_template!(dsl_or_extended :: module() | map()) ::
  (atom() | module()) | no_return()

Default template module for layout structure. Built-in templates:

mishka_gervaz_table_presentation_template_options(dsl_or_extended)

@spec mishka_gervaz_table_presentation_template_options(
  dsl_or_extended :: module() | map()
) ::
  {:ok, keyword()} | :error

Options passed to the template. Common options vary by template:

  • Table: [:striped, :bordered, :compact, :hoverable]
  • MediaGallery: [:thumbnail_size, :aspect_ratio, :columns]

mishka_gervaz_table_presentation_template_options!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_template_options!(
  dsl_or_extended :: module() | map()
) ::
  keyword() | no_return()

Options passed to the template. Common options vary by template:

  • Table: [:striped, :bordered, :compact, :hoverable]
  • MediaGallery: [:thumbnail_size, :aspect_ratio, :columns]

mishka_gervaz_table_presentation_theme_border_class(dsl_or_extended)

@spec mishka_gervaz_table_presentation_theme_border_class(
  dsl_or_extended :: module() | map()
) ::
  {:ok, String.t()} | :error

Border CSS classes.

mishka_gervaz_table_presentation_theme_border_class!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_theme_border_class!(
  dsl_or_extended :: module() | map()
) ::
  String.t() | no_return()

Border CSS classes.

mishka_gervaz_table_presentation_theme_extra(dsl_or_extended)

@spec mishka_gervaz_table_presentation_theme_extra(
  dsl_or_extended :: module() | map()
) ::
  {:ok, map()} | :error

Template-specific theming options.

mishka_gervaz_table_presentation_theme_extra!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_theme_extra!(
  dsl_or_extended :: module() | map()
) ::
  map() | no_return()

Template-specific theming options.

mishka_gervaz_table_presentation_theme_header_class(dsl_or_extended)

@spec mishka_gervaz_table_presentation_theme_header_class(
  dsl_or_extended :: module() | map()
) ::
  {:ok, String.t()} | :error

Header row CSS classes.

mishka_gervaz_table_presentation_theme_header_class!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_theme_header_class!(
  dsl_or_extended :: module() | map()
) ::
  String.t() | no_return()

Header row CSS classes.

mishka_gervaz_table_presentation_theme_options(dsl_or_extended)

@spec mishka_gervaz_table_presentation_theme_options(
  dsl_or_extended :: module() | map()
) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.presentation.theme DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_presentation_theme_row_class(dsl_or_extended)

@spec mishka_gervaz_table_presentation_theme_row_class(
  dsl_or_extended :: module() | map()
) ::
  {:ok, String.t()} | :error

Data row CSS classes.

mishka_gervaz_table_presentation_theme_row_class!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_theme_row_class!(
  dsl_or_extended :: module() | map()
) ::
  String.t() | no_return()

Data row CSS classes.

mishka_gervaz_table_presentation_ui_adapter(dsl_or_extended)

@spec mishka_gervaz_table_presentation_ui_adapter(dsl_or_extended :: module() | map()) ::
  {:ok, atom() | module()} | :error

UI adapter module for rendering components.

Built-in adapters:

Create custom adapter with use MishkaGervaz.Behaviours.UIAdapter:

defmodule MyAppWeb.UIAdapter do
  use MishkaGervaz.Behaviours.UIAdapter,
    components: MyAppWeb.Components  # Auto-override from your components

  # Or manually override specific functions:
  # def button(assigns), do: MyAppWeb.Components.Button.button(assigns)
end

Options for use:

  • :fallback - Fallback module (default: Tailwind)
  • :components - Module to auto-generate overrides from

mishka_gervaz_table_presentation_ui_adapter!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_ui_adapter!(
  dsl_or_extended :: module() | map()
) ::
  (atom() | module()) | no_return()

UI adapter module for rendering components.

Built-in adapters:

Create custom adapter with use MishkaGervaz.Behaviours.UIAdapter:

defmodule MyAppWeb.UIAdapter do
  use MishkaGervaz.Behaviours.UIAdapter,
    components: MyAppWeb.Components  # Auto-override from your components

  # Or manually override specific functions:
  # def button(assigns), do: MyAppWeb.Components.Button.button(assigns)
end

Options for use:

  • :fallback - Fallback module (default: Tailwind)
  • :components - Module to auto-generate overrides from

mishka_gervaz_table_presentation_ui_adapter_opts(dsl_or_extended)

@spec mishka_gervaz_table_presentation_ui_adapter_opts(
  dsl_or_extended :: module() | map()
) ::
  {:ok, keyword()} | :error

Options for UI adapter configuration.

Available Options

  • :component_module - Your components module (e.g., MyAppWeb.Components). When specified together with MishkaGervaz.UIAdapters.Dynamic, generates a dynamic adapter at compile time that uses your components with Tailwind as fallback.

  • :fallback - Fallback adapter module. Defaults to MishkaGervaz.UIAdapters.Tailwind.

  • :nested_components - If true, uses nested module pattern (e.g., Components.Button.button/1).

  • :module_prefix - Prefix for module names (e.g., "Mishka"Components.MishkaButton).

  • :component_prefix - Prefix for function names (e.g., "mc_"mc_button/1).

Examples

# Basic dynamic adapter usage
presentation do
  ui_adapter MishkaGervaz.UIAdapters.Dynamic
  ui_adapter_opts component_module: MyAppWeb.Components
end
# Calls: MyAppWeb.Components.Button.button/1

# With module prefix
presentation do
  ui_adapter MishkaGervaz.UIAdapters.Dynamic
  ui_adapter_opts component_module: MyAppWeb.Components, module_prefix: "Mishka"
end
# Calls: MyAppWeb.Components.MishkaButton.button/1

# With component prefix
presentation do
  ui_adapter MishkaGervaz.UIAdapters.Dynamic
  ui_adapter_opts component_module: MyAppWeb.Components, component_prefix: "mc_"
end
# Calls: MyAppWeb.Components.Button.mc_button/1

# With both prefixes
presentation do
  ui_adapter MishkaGervaz.UIAdapters.Dynamic
  ui_adapter_opts component_module: MyAppWeb.Components,
                  module_prefix: "Mishka",
                  component_prefix: "mc_"
end
# Calls: MyAppWeb.Components.MishkaButton.mc_button/1

This auto-generates an adapter module YourResource.GervazUIAdapter that:

  • Delegates to your declared components if they exist
  • Falls back to Tailwind for any missing components
  • All resolved at compile time with zero runtime overhead

mishka_gervaz_table_presentation_ui_adapter_opts!(dsl_or_extended)

@spec mishka_gervaz_table_presentation_ui_adapter_opts!(
  dsl_or_extended :: module() | map()
) ::
  keyword() | no_return()

Options for UI adapter configuration.

Available Options

  • :component_module - Your components module (e.g., MyAppWeb.Components). When specified together with MishkaGervaz.UIAdapters.Dynamic, generates a dynamic adapter at compile time that uses your components with Tailwind as fallback.

  • :fallback - Fallback adapter module. Defaults to MishkaGervaz.UIAdapters.Tailwind.

  • :nested_components - If true, uses nested module pattern (e.g., Components.Button.button/1).

  • :module_prefix - Prefix for module names (e.g., "Mishka"Components.MishkaButton).

  • :component_prefix - Prefix for function names (e.g., "mc_"mc_button/1).

Examples

# Basic dynamic adapter usage
presentation do
  ui_adapter MishkaGervaz.UIAdapters.Dynamic
  ui_adapter_opts component_module: MyAppWeb.Components
end
# Calls: MyAppWeb.Components.Button.button/1

# With module prefix
presentation do
  ui_adapter MishkaGervaz.UIAdapters.Dynamic
  ui_adapter_opts component_module: MyAppWeb.Components, module_prefix: "Mishka"
end
# Calls: MyAppWeb.Components.MishkaButton.button/1

# With component prefix
presentation do
  ui_adapter MishkaGervaz.UIAdapters.Dynamic
  ui_adapter_opts component_module: MyAppWeb.Components, component_prefix: "mc_"
end
# Calls: MyAppWeb.Components.Button.mc_button/1

# With both prefixes
presentation do
  ui_adapter MishkaGervaz.UIAdapters.Dynamic
  ui_adapter_opts component_module: MyAppWeb.Components,
                  module_prefix: "Mishka",
                  component_prefix: "mc_"
end
# Calls: MyAppWeb.Components.MishkaButton.mc_button/1

This auto-generates an adapter module YourResource.GervazUIAdapter that:

  • Delegates to your declared components if they exist
  • Falls back to Tailwind for any missing components
  • All resolved at compile time with zero runtime overhead

mishka_gervaz_table_refresh_enabled(dsl_or_extended)

@spec mishka_gervaz_table_refresh_enabled(dsl_or_extended :: module() | map()) ::
  {:ok, boolean()} | :error

Enable auto-refresh for this resource. Overrides domain default.

mishka_gervaz_table_refresh_enabled!(dsl_or_extended)

@spec mishka_gervaz_table_refresh_enabled!(dsl_or_extended :: module() | map()) ::
  boolean() | no_return()

Enable auto-refresh for this resource. Overrides domain default.

mishka_gervaz_table_refresh_interval(dsl_or_extended)

@spec mishka_gervaz_table_refresh_interval(dsl_or_extended :: module() | map()) ::
  {:ok, pos_integer()} | :error

Refresh interval in milliseconds. Overrides domain default.

mishka_gervaz_table_refresh_interval!(dsl_or_extended)

@spec mishka_gervaz_table_refresh_interval!(dsl_or_extended :: module() | map()) ::
  pos_integer() | no_return()

Refresh interval in milliseconds. Overrides domain default.

mishka_gervaz_table_refresh_options(dsl_or_extended)

@spec mishka_gervaz_table_refresh_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.refresh DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_refresh_pause_on_blur(dsl_or_extended)

@spec mishka_gervaz_table_refresh_pause_on_blur(dsl_or_extended :: module() | map()) ::
  {:ok, boolean()} | :error

Pause auto-refresh when browser tab loses focus. Overrides domain default.

mishka_gervaz_table_refresh_pause_on_blur!(dsl_or_extended)

@spec mishka_gervaz_table_refresh_pause_on_blur!(dsl_or_extended :: module() | map()) ::
  boolean() | no_return()

Pause auto-refresh when browser tab loses focus. Overrides domain default.

mishka_gervaz_table_refresh_pause_on_interaction(dsl_or_extended)

@spec mishka_gervaz_table_refresh_pause_on_interaction(
  dsl_or_extended :: module() | map()
) ::
  {:ok, boolean()} | :error

Pause auto-refresh when user is interacting. Overrides domain default.

mishka_gervaz_table_refresh_pause_on_interaction!(dsl_or_extended)

@spec mishka_gervaz_table_refresh_pause_on_interaction!(
  dsl_or_extended :: module() | map()
) ::
  boolean() | no_return()

Pause auto-refresh when user is interacting. Overrides domain default.

mishka_gervaz_table_refresh_show_indicator(dsl_or_extended)

@spec mishka_gervaz_table_refresh_show_indicator(dsl_or_extended :: module() | map()) ::
  {:ok, boolean()} | :error

Show visual indicator when auto-refresh is active. Overrides domain default.

mishka_gervaz_table_refresh_show_indicator!(dsl_or_extended)

@spec mishka_gervaz_table_refresh_show_indicator!(dsl_or_extended :: module() | map()) ::
  boolean() | no_return()

Show visual indicator when auto-refresh is active. Overrides domain default.

mishka_gervaz_table_row(dsl_or_extended)

@spec mishka_gervaz_table_row(dsl_or_extended :: module() | map()) :: [struct()]

mishka_gervaz.table.row DSL entities

mishka_gervaz_table_row_actions(dsl_or_extended)

@spec mishka_gervaz_table_row_actions(dsl_or_extended :: module() | map()) :: [
  struct()
]

mishka_gervaz.table.row_actions DSL entities

mishka_gervaz_table_row_actions_actions_layout_auto_collapse_after(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_auto_collapse_after(
  dsl_or_extended :: module() | map()
) :: {:ok, integer()} | :error

Auto-collapse after N actions.

mishka_gervaz_table_row_actions_actions_layout_auto_collapse_after!(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_auto_collapse_after!(
  dsl_or_extended :: module() | map()
) :: integer() | no_return()

Auto-collapse after N actions.

mishka_gervaz_table_row_actions_actions_layout_dropdown(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_dropdown(
  dsl_or_extended :: module() | map()
) ::
  {:ok, [atom()]} | :error

Actions in dropdown menu.

mishka_gervaz_table_row_actions_actions_layout_dropdown!(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_dropdown!(
  dsl_or_extended :: module() | map()
) ::
  [atom()] | no_return()

Actions in dropdown menu.

mishka_gervaz_table_row_actions_actions_layout_inline(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_inline(
  dsl_or_extended :: module() | map()
) ::
  {:ok, [atom()]} | :error

Actions shown as buttons.

mishka_gervaz_table_row_actions_actions_layout_inline!(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_inline!(
  dsl_or_extended :: module() | map()
) ::
  [atom()] | no_return()

Actions shown as buttons.

mishka_gervaz_table_row_actions_actions_layout_options(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_options(
  dsl_or_extended :: module() | map()
) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.row_actions.actions_layout DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_row_actions_actions_layout_position(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_position(
  dsl_or_extended :: module() | map()
) ::
  {:ok, :end | :start} | :error

Which side of row.

mishka_gervaz_table_row_actions_actions_layout_position!(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_position!(
  dsl_or_extended :: module() | map()
) ::
  (:end | :start) | no_return()

Which side of row.

mishka_gervaz_table_row_actions_actions_layout_sticky(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_sticky(
  dsl_or_extended :: module() | map()
) ::
  {:ok, boolean()} | :error

Stick on horizontal scroll.

mishka_gervaz_table_row_actions_actions_layout_sticky!(dsl_or_extended)

@spec mishka_gervaz_table_row_actions_actions_layout_sticky!(
  dsl_or_extended :: module() | map()
) ::
  boolean() | no_return()

Stick on horizontal scroll.

mishka_gervaz_table_row_class_apply(dsl_or_extended)

@spec mishka_gervaz_table_row_class_apply(dsl_or_extended :: module() | map()) ::
  {:ok, (any() -> any())} | :error

Function fn record -> [class | nil].

mishka_gervaz_table_row_class_apply!(dsl_or_extended)

@spec mishka_gervaz_table_row_class_apply!(dsl_or_extended :: module() | map()) ::
  (any() -> any()) | no_return()

Function fn record -> [class | nil].

mishka_gervaz_table_row_class_options(dsl_or_extended)

@spec mishka_gervaz_table_row_class_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.row.class DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_row_class_possible(dsl_or_extended)

@spec mishka_gervaz_table_row_class_possible(dsl_or_extended :: module() | map()) ::
  {:ok, [String.t()]} | :error

Possible classes for Tailwind JIT extraction.

mishka_gervaz_table_row_class_possible!(dsl_or_extended)

@spec mishka_gervaz_table_row_class_possible!(dsl_or_extended :: module() | map()) ::
  [String.t()] | no_return()

Possible classes for Tailwind JIT extraction.

mishka_gervaz_table_row_event(dsl_or_extended)

@spec mishka_gervaz_table_row_event(dsl_or_extended :: module() | map()) ::
  {:ok, String.t()} | :error

Event name triggered on row click.

mishka_gervaz_table_row_event!(dsl_or_extended)

@spec mishka_gervaz_table_row_event!(dsl_or_extended :: module() | map()) ::
  String.t() | no_return()

Event name triggered on row click.

mishka_gervaz_table_row_options(dsl_or_extended)

@spec mishka_gervaz_table_row_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.row DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_row_payload(dsl_or_extended)

@spec mishka_gervaz_table_row_payload(dsl_or_extended :: module() | map()) ::
  {:ok, (any() -> any()) | map()} | :error

Payload for row click. Map or fn record -> map.

mishka_gervaz_table_row_payload!(dsl_or_extended)

@spec mishka_gervaz_table_row_payload!(dsl_or_extended :: module() | map()) ::
  ((any() -> any()) | map()) | no_return()

Payload for row click. Map or fn record -> map.

mishka_gervaz_table_row_selectable(dsl_or_extended)

@spec mishka_gervaz_table_row_selectable(dsl_or_extended :: module() | map()) ::
  {:ok, boolean()} | :error

Enable row selection checkboxes.

mishka_gervaz_table_row_selectable!(dsl_or_extended)

@spec mishka_gervaz_table_row_selectable!(dsl_or_extended :: module() | map()) ::
  boolean() | no_return()

Enable row selection checkboxes.

mishka_gervaz_table_source_actions_destroy(dsl_or_extended)

@spec mishka_gervaz_table_source_actions_destroy(dsl_or_extended :: module() | map()) ::
  {:ok, atom() | {atom(), atom()}} | :error

Destroy action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

mishka_gervaz_table_source_actions_destroy!(dsl_or_extended)

@spec mishka_gervaz_table_source_actions_destroy!(dsl_or_extended :: module() | map()) ::
  (atom() | {atom(), atom()}) | no_return()

Destroy action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

mishka_gervaz_table_source_actions_get(dsl_or_extended)

@spec mishka_gervaz_table_source_actions_get(dsl_or_extended :: module() | map()) ::
  {:ok, atom() | {atom(), atom()}} | :error

Get action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

mishka_gervaz_table_source_actions_get!(dsl_or_extended)

@spec mishka_gervaz_table_source_actions_get!(dsl_or_extended :: module() | map()) ::
  (atom() | {atom(), atom()}) | no_return()

Get action. Atom or tuple {master_action, tenant_action}. Required either here or on the domain.

mishka_gervaz_table_source_actions_options(dsl_or_extended)

@spec mishka_gervaz_table_source_actions_options(dsl_or_extended :: module() | map()) ::
  %{
    required(atom()) => any()
  }

mishka_gervaz.table.source.actions DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_source_actions_read(dsl_or_extended)

@spec mishka_gervaz_table_source_actions_read(dsl_or_extended :: module() | map()) ::
  {:ok, atom() | {atom(), atom()}} | :error

Read action. Atom (used for both master and tenant) or tuple {master_action, tenant_action}. Required either here or on the domain — compile fails otherwise.

mishka_gervaz_table_source_actions_read!(dsl_or_extended)

@spec mishka_gervaz_table_source_actions_read!(dsl_or_extended :: module() | map()) ::
  (atom() | {atom(), atom()}) | no_return()

Read action. Atom (used for both master and tenant) or tuple {master_action, tenant_action}. Required either here or on the domain — compile fails otherwise.

mishka_gervaz_table_source_actor_key(dsl_or_extended)

@spec mishka_gervaz_table_source_actor_key(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Assigns key for current user.

mishka_gervaz_table_source_actor_key!(dsl_or_extended)

@spec mishka_gervaz_table_source_actor_key!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Assigns key for current user.

mishka_gervaz_table_source_archive_destroy_action(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_destroy_action(
  dsl_or_extended :: module() | map()
) ::
  {:ok, atom() | {atom(), atom()}} | :error

Permanent destroy action. Can be single atom or tuple.

mishka_gervaz_table_source_archive_destroy_action!(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_destroy_action!(
  dsl_or_extended :: module() | map()
) ::
  (atom() | {atom(), atom()}) | no_return()

Permanent destroy action. Can be single atom or tuple.

mishka_gervaz_table_source_archive_enabled(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_enabled(dsl_or_extended :: module() | map()) ::
  {:ok, boolean()} | :error

Enable archive support. Set false to disable without removing the block.

mishka_gervaz_table_source_archive_enabled!(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_enabled!(dsl_or_extended :: module() | map()) ::
  boolean() | no_return()

Enable archive support. Set false to disable without removing the block.

mishka_gervaz_table_source_archive_get_action(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_get_action(
  dsl_or_extended :: module() | map()
) ::
  {:ok, atom() | {atom(), atom()}} | :error

Get archived action. Can be single atom or tuple.

mishka_gervaz_table_source_archive_get_action!(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_get_action!(
  dsl_or_extended :: module() | map()
) ::
  (atom() | {atom(), atom()}) | no_return()

Get archived action. Can be single atom or tuple.

mishka_gervaz_table_source_archive_options(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_options(dsl_or_extended :: module() | map()) ::
  %{
    required(atom()) => any()
  }

mishka_gervaz.table.source.archive DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_source_archive_read_action(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_read_action(
  dsl_or_extended :: module() | map()
) ::
  {:ok, atom() | {atom(), atom()}} | :error

Read archived action. Can be single atom or tuple {master_action, tenant_action}.

mishka_gervaz_table_source_archive_read_action!(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_read_action!(
  dsl_or_extended :: module() | map()
) ::
  (atom() | {atom(), atom()}) | no_return()

Read archived action. Can be single atom or tuple {master_action, tenant_action}.

mishka_gervaz_table_source_archive_restore_action(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_restore_action(
  dsl_or_extended :: module() | map()
) ::
  {:ok, atom() | {atom(), atom()}} | :error

Restore action. Can be single atom or tuple.

mishka_gervaz_table_source_archive_restore_action!(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_restore_action!(
  dsl_or_extended :: module() | map()
) ::
  (atom() | {atom(), atom()}) | no_return()

Restore action. Can be single atom or tuple.

mishka_gervaz_table_source_archive_restricted(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_restricted(
  dsl_or_extended :: module() | map()
) ::
  {:ok, boolean()} | :error

Restrict archive UI to master users only. When true, tenant users cannot see archive toggle.

mishka_gervaz_table_source_archive_restricted!(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_restricted!(
  dsl_or_extended :: module() | map()
) ::
  boolean() | no_return()

Restrict archive UI to master users only. When true, tenant users cannot see archive toggle.

mishka_gervaz_table_source_archive_visible(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_visible(dsl_or_extended :: module() | map()) ::
  {:ok, boolean() | tuple()} | :error

Control archive toggle visibility. Boolean or fn state -> boolean for dynamic control.

mishka_gervaz_table_source_archive_visible!(dsl_or_extended)

@spec mishka_gervaz_table_source_archive_visible!(dsl_or_extended :: module() | map()) ::
  (boolean() | tuple()) | no_return()

Control archive toggle visibility. Boolean or fn state -> boolean for dynamic control.

mishka_gervaz_table_source_master_check(dsl_or_extended)

@spec mishka_gervaz_table_source_master_check(dsl_or_extended :: module() | map()) ::
  {:ok, (any() -> any())} | :error

Function returning true for master users. fn user -> boolean

mishka_gervaz_table_source_master_check!(dsl_or_extended)

@spec mishka_gervaz_table_source_master_check!(dsl_or_extended :: module() | map()) ::
  (any() -> any()) | no_return()

Function returning true for master users. fn user -> boolean

mishka_gervaz_table_source_options(dsl_or_extended)

@spec mishka_gervaz_table_source_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.source DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_source_preload_always(dsl_or_extended)

@spec mishka_gervaz_table_source_preload_always(dsl_or_extended :: module() | map()) ::
  {:ok, [atom() | {atom(), atom()}]} | :error

Always preload these relationships.

Supports atoms or {source, alias} tuples:

  • :site - preload :site relationship
  • {:site, :site_info} or site: :site_info - preload :site, alias as :site_info

mishka_gervaz_table_source_preload_always!(dsl_or_extended)

@spec mishka_gervaz_table_source_preload_always!(dsl_or_extended :: module() | map()) ::
  [atom() | {atom(), atom()}] | no_return()

Always preload these relationships.

Supports atoms or {source, alias} tuples:

  • :site - preload :site relationship
  • {:site, :site_info} or site: :site_info - preload :site, alias as :site_info

mishka_gervaz_table_source_preload_master(dsl_or_extended)

@spec mishka_gervaz_table_source_preload_master(dsl_or_extended :: module() | map()) ::
  {:ok, [atom() | {atom(), atom()}]} | :error

Additional preloads for master users.

Supports atoms or {source, alias} tuples:

  • :layout - preload :layout relationship
  • {:layout, :page_layout} or layout: :page_layout - preload :layout, alias as :page_layout

mishka_gervaz_table_source_preload_master!(dsl_or_extended)

@spec mishka_gervaz_table_source_preload_master!(dsl_or_extended :: module() | map()) ::
  [atom() | {atom(), atom()}] | no_return()

Additional preloads for master users.

Supports atoms or {source, alias} tuples:

  • :layout - preload :layout relationship
  • {:layout, :page_layout} or layout: :page_layout - preload :layout, alias as :page_layout

mishka_gervaz_table_source_preload_options(dsl_or_extended)

@spec mishka_gervaz_table_source_preload_options(dsl_or_extended :: module() | map()) ::
  %{
    required(atom()) => any()
  }

mishka_gervaz.table.source.preload DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_source_preload_tenant(dsl_or_extended)

@spec mishka_gervaz_table_source_preload_tenant(dsl_or_extended :: module() | map()) ::
  {:ok, [atom() | {atom(), atom()}]} | :error

Additional preloads for tenant users.

Supports atoms or {source, alias} tuples:

  • :tenant_layout - preload :tenant_layout relationship
  • {:tenant_layout, :layout} or tenant_layout: :layout - preload :tenant_layout, alias as :layout

This allows master/tenant to expose different relationships under the same alias key.

mishka_gervaz_table_source_preload_tenant!(dsl_or_extended)

@spec mishka_gervaz_table_source_preload_tenant!(dsl_or_extended :: module() | map()) ::
  [atom() | {atom(), atom()}] | no_return()

Additional preloads for tenant users.

Supports atoms or {source, alias} tuples:

  • :tenant_layout - preload :tenant_layout relationship
  • {:tenant_layout, :layout} or tenant_layout: :layout - preload :tenant_layout, alias as :layout

This allows master/tenant to expose different relationships under the same alias key.

mishka_gervaz_table_state_access(dsl_or_extended)

@spec mishka_gervaz_table_state_access(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Access module. Must use MishkaGervaz.Table.Web.State.Access. Handles access control for records and actions.

mishka_gervaz_table_state_access!(dsl_or_extended)

@spec mishka_gervaz_table_state_access!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Access module. Must use MishkaGervaz.Table.Web.State.Access. Handles access control for records and actions.

mishka_gervaz_table_state_action(dsl_or_extended)

@spec mishka_gervaz_table_state_action(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Action builder module. Must use MishkaGervaz.Table.Web.State.ActionBuilder. Builds row actions and bulk actions from configuration.

mishka_gervaz_table_state_action!(dsl_or_extended)

@spec mishka_gervaz_table_state_action!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Action builder module. Must use MishkaGervaz.Table.Web.State.ActionBuilder. Builds row actions and bulk actions from configuration.

mishka_gervaz_table_state_column(dsl_or_extended)

@spec mishka_gervaz_table_state_column(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Column builder module. Must use MishkaGervaz.Table.Web.State.ColumnBuilder. Builds columns from DSL and resource configuration.

mishka_gervaz_table_state_column!(dsl_or_extended)

@spec mishka_gervaz_table_state_column!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Column builder module. Must use MishkaGervaz.Table.Web.State.ColumnBuilder. Builds columns from DSL and resource configuration.

mishka_gervaz_table_state_filter(dsl_or_extended)

@spec mishka_gervaz_table_state_filter(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Filter builder module. Must use MishkaGervaz.Table.Web.State.FilterBuilder. Builds filters from DSL and resource configuration.

mishka_gervaz_table_state_filter!(dsl_or_extended)

@spec mishka_gervaz_table_state_filter!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Filter builder module. Must use MishkaGervaz.Table.Web.State.FilterBuilder. Builds filters from DSL and resource configuration.

mishka_gervaz_table_state_module(dsl_or_extended)

@spec mishka_gervaz_table_state_module(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Override the entire state module. When set, all other options are ignored. The module must use MishkaGervaz.Table.Web.State.

mishka_gervaz_table_state_module!(dsl_or_extended)

@spec mishka_gervaz_table_state_module!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Override the entire state module. When set, all other options are ignored. The module must use MishkaGervaz.Table.Web.State.

mishka_gervaz_table_state_options(dsl_or_extended)

@spec mishka_gervaz_table_state_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.state DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_state_presentation(dsl_or_extended)

@spec mishka_gervaz_table_state_presentation(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

Presentation module. Must use MishkaGervaz.Table.Web.State.Presentation. Resolves UI adapter, templates, and presentation options.

mishka_gervaz_table_state_presentation!(dsl_or_extended)

@spec mishka_gervaz_table_state_presentation!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

Presentation module. Must use MishkaGervaz.Table.Web.State.Presentation. Resolves UI adapter, templates, and presentation options.

mishka_gervaz_table_state_url_sync(dsl_or_extended)

@spec mishka_gervaz_table_state_url_sync(dsl_or_extended :: module() | map()) ::
  {:ok, atom()} | :error

URL sync module. Must use MishkaGervaz.Table.Web.State.UrlSync. Handles URL state synchronization.

mishka_gervaz_table_state_url_sync!(dsl_or_extended)

@spec mishka_gervaz_table_state_url_sync!(dsl_or_extended :: module() | map()) ::
  atom() | no_return()

URL sync module. Must use MishkaGervaz.Table.Web.State.UrlSync. Handles URL state synchronization.

mishka_gervaz_table_url_sync_enabled(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_enabled(dsl_or_extended :: module() | map()) ::
  {:ok, boolean()} | :error

Enable URL state synchronization. Overrides domain default.

mishka_gervaz_table_url_sync_enabled!(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_enabled!(dsl_or_extended :: module() | map()) ::
  boolean() | no_return()

Enable URL state synchronization. Overrides domain default.

mishka_gervaz_table_url_sync_max_filter_length(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_max_filter_length(
  dsl_or_extended :: module() | map()
) ::
  {:ok, pos_integer()} | :error

Maximum length for filter values. Values exceeding this are ignored. Default: 500.

mishka_gervaz_table_url_sync_max_filter_length!(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_max_filter_length!(
  dsl_or_extended :: module() | map()
) ::
  pos_integer() | no_return()

Maximum length for filter values. Values exceeding this are ignored. Default: 500.

mishka_gervaz_table_url_sync_mode(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_mode(dsl_or_extended :: module() | map()) ::
  {:ok, :bidirectional | :read_only} | :error

URL sync mode:

  • :read_only - Only read from URL on initial load (default)
  • :bidirectional - Sync URL when filters/sort/page change

mishka_gervaz_table_url_sync_mode!(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_mode!(dsl_or_extended :: module() | map()) ::
  (:bidirectional | :read_only) | no_return()

URL sync mode:

  • :read_only - Only read from URL on initial load (default)
  • :bidirectional - Sync URL when filters/sort/page change

mishka_gervaz_table_url_sync_options(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_options(dsl_or_extended :: module() | map()) :: %{
  required(atom()) => any()
}

mishka_gervaz.table.url_sync DSL options

Returns a map containing the and any configured or default values.

mishka_gervaz_table_url_sync_params(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_params(dsl_or_extended :: module() | map()) ::
  {:ok, [:template | :search | :page_size | :page | :sort | :filters]} | :error

Which state to sync to URL params. Overrides domain default.

mishka_gervaz_table_url_sync_params!(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_params!(dsl_or_extended :: module() | map()) ::
  [:template | :search | :page_size | :page | :sort | :filters] | no_return()

Which state to sync to URL params. Overrides domain default.

mishka_gervaz_table_url_sync_prefix(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_prefix(dsl_or_extended :: module() | map()) ::
  {:ok, String.t()} | :error

Prefix for URL params. Overrides domain default.

mishka_gervaz_table_url_sync_prefix!(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_prefix!(dsl_or_extended :: module() | map()) ::
  String.t() | no_return()

Prefix for URL params. Overrides domain default.

mishka_gervaz_table_url_sync_preserve_params(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_preserve_params(
  dsl_or_extended :: module() | map()
) ::
  {:ok, :all | [atom()]} | :error

Params to preserve in URL across re-encoding. :all keeps all unknown params, or provide a list of specific param names. Preserved params are NOT stored in table state. max_filter_length applies to values.

mishka_gervaz_table_url_sync_preserve_params!(dsl_or_extended)

@spec mishka_gervaz_table_url_sync_preserve_params!(
  dsl_or_extended :: module() | map()
) ::
  (:all | [atom()]) | no_return()

Params to preserve in URL across re-encoding. :all keeps all unknown params, or provide a list of specific param names. Preserved params are NOT stored in table state. max_filter_length applies to values.

notice(resource, notice_name)

@spec notice(module(), atom()) :: map() | nil

Get a specific notice by name.

notices(resource)

@spec notices(module()) :: [map()]

Get all notices declared in the form layout.

notices_at(resource, position)

@spec notices_at(module(), term()) :: [map()]

Get notices targeting the given position. Position can be an atom or a {:before_group, name} / {:after_group, name} tuple.

persistence(resource)

@spec persistence(module()) :: :none | :ets | :client_token

Get the persistence strategy for a resource form.

Returns :none, :ets, or :client_token.

preload_aliases(resource, master_user?)

@spec preload_aliases(module(), boolean()) :: %{required(atom()) => atom()}

Get preload aliases for master/tenant context.

Returns a map of %{alias_key => source_key} for resolving aliased preloads. Only includes entries where source != alias (actual aliases).

Example

# Given: master [master_tags: :tags], tenant [tenant_tags: :tags]
preload_aliases(MyResource, true)   # => %{tags: :master_tags}
preload_aliases(MyResource, false)  # => %{tags: :tenant_tags}

route(resource)

@spec route(module()) :: String.t() | nil

Get the route for a resource form.

state(resource)

@spec state(module()) :: map()

Get the state configuration.

Returns a map with any configured state module overrides. Keys can include: :module, :field, :group, :step, :presentation, :access. Empty map when no overrides are set.

step(resource, step_name)

@spec step(module(), atom()) :: map() | nil

Get a specific step by name.

step_groups(resource, step_name)

@spec step_groups(module(), atom()) :: [map()]

Get the group maps for a given step name.

Returns the intersection of the step's group references with the defined groups.

steps(resource)

@spec steps(module()) :: [map()]

Get all steps for a resource form.

stream_name(resource)

@spec stream_name(module()) :: atom() | nil

Get the stream name for a resource form.

submit(resource)

@spec submit(module()) :: map()

Get the submit configuration for a resource form.

uploads(resource)

@spec uploads(module()) :: [map()]

Get all uploads for a resource form.