Table-specific introspection for resources using MishkaGervaz.Resource.
Usage
# Get full table config
config = MishkaGervaz.Resource.Info.Table.config(MyResource)
# Get columns
columns = MishkaGervaz.Resource.Info.Table.columns(MyResource)
# Get filters
filters = MishkaGervaz.Resource.Info.Table.filters(MyResource)
Summary
Functions
Get the appropriate action for the current user type.
Get all preloads needed (always + detected + master/tenant specific).
Get the appropriate archive action for the current user type.
Check if archive is enabled for a resource.
Get the built-in state-transition rules map, or nil if none are configured.
Get all bulk actions for a resource.
Get a specific column by name.
Get the column order for a resource.
Get all columns for a resource.
Get the full compiled table configuration for a resource.
Get the data_loader configuration.
Get detected preloads from column sources.
Get the events configuration from the resource.
Check if a specific feature is enabled for a resource.
Get enabled features for a resource.
Get a specific filter by name.
Get a specific filter group by name.
Get all filter groups for a resource.
Get the filter mode for a resource.
Get all filters for a resource.
Get the table footer configuration. Returns nil when no footer is declared.
Get a single hook entry by key.
Get the table header configuration. Returns nil when no header is declared.
Get all hooks as a map.
Get the table layout configuration (chrome). Returns nil when no layout
block is declared.
Get the max page size for a resource.
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.
Unique form identifier.
Unique form identifier.
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
Number of grid columns (1-4).
Number of grid columns (1-4).
Form layout mode.
Form layout mode.
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.
Features to enable for this form.
Features to enable for this form.
mishka_gervaz.form.presentation DSL options
Template module for form layout.
Template module for form layout.
Error message CSS classes.
Error message CSS classes.
Template-specific theming options.
Template-specific theming options.
Default field CSS classes.
Default field CSS classes.
Form element CSS classes.
Form element CSS classes.
Default label CSS classes.
Default label CSS classes.
mishka_gervaz.form.presentation.theme DSL options
UI adapter module for rendering components.
UI adapter module for rendering components.
Options for UI adapter configuration.
Options for UI adapter configuration.
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.
Assigns key for current user.
Assigns key for current user.
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.
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
Enable bulk actions.
Enable bulk actions.
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.
Unique table identifier.
Unique table identifier.
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
Features to enable for this table.
Features to enable for this table.
Filter display mode: :inline (default), :sidebar, :modal, or :drawer.
Filter display mode: :inline (default), :sidebar, :modal, or :drawer.
mishka_gervaz.table.presentation DSL options
Columns to hide on mobile.
Columns to hide on mobile.
Columns to hide on tablet.
Columns to hide on tablet.
Layout mode on mobile.
Layout mode on mobile.
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
Border CSS classes.
Border CSS classes.
Template-specific theming options.
Template-specific theming options.
Header row CSS classes.
Header row CSS classes.
mishka_gervaz.table.presentation.theme DSL options
Data row CSS classes.
Data row CSS classes.
UI adapter module for rendering components.
UI adapter module for rendering components.
Options for UI adapter configuration.
Options for UI adapter configuration.
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
Auto-collapse after N actions.
Auto-collapse after N actions.
Actions in dropdown menu.
Actions in dropdown menu.
Actions shown as buttons.
Actions shown as buttons.
mishka_gervaz.table.row_actions.actions_layout DSL options
Which side of row.
Which side of row.
Stick on horizontal scroll.
Stick on horizontal scroll.
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.
Assigns key for current user.
Assigns key for current user.
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
Always preload these relationships.
Always preload these relationships.
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.
URL sync mode
URL sync mode
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 a specific notice by name.
Get all notices declared in the table layout.
Get notices targeting the given position. Position can be an atom or a
{:before_column, name} / {:after_column, name} tuple.
Get the page size for a resource.
Get the page size options for a resource. Returns nil when no options are configured (no dropdown shown).
Get the full pagination configuration for a resource. Returns nil when pagination is disabled or not configured.
Check if pagination is enabled for a resource.
Get the pagination type for a resource.
Get the pagination UI configuration for a resource.
Get preload aliases for master/tenant context.
Get the refresh configuration.
Get the route for a resource.
Get a specific row action by name.
Get all row actions for a resource.
Get the state configuration.
Get the stream name for a resource.
Get the URL sync configuration.
Functions
Get the appropriate action for the current user type.
For non-multi-tenant resources, returns the same (tenant) action for both master and tenant users, since there's no need for differentiation.
Get all preloads needed (always + detected + master/tenant specific).
Preload items can be atoms or {source, alias} tuples. This function
extracts just the source atoms for the actual preload query.
Get the appropriate archive action for the current user type.
Returns the archive action for :read, :get, :restore, or :destroy.
Returns nil if archive is not configured for the resource.
Check if archive is enabled for a resource.
Get the built-in state-transition rules map, or nil if none are configured.
Get all bulk actions for a resource.
Get a specific column by name.
Get the column order for a resource.
Get all columns for a resource.
Get the full compiled table configuration for a resource.
Returns the pre-built configuration map merged with domain defaults.
Get the data_loader configuration.
Returns a map with any configured data_loader module overrides.
Keys can include: :module, :query, :filter_parser, :pagination, :tenant, :hooks
Get detected preloads from column sources.
Get the events configuration from the resource.
Returns a map with optional keys for sub-builder overrides:
:sanitization- Custom sanitization handler module:record- Custom record handler module:selection- Custom selection handler module:bulk_action- Custom bulk action handler module:hooks- Custom hook runner module:module- Complete events module override
Returns an empty map if no events configuration is set.
@spec feature_enabled?(module(), MishkaGervaz.Table.Behaviours.Template.feature()) :: boolean()
Check if a specific feature is enabled for a resource.
Examples
feature_enabled?(MyResource, :sort) #=> true
feature_enabled?(MyResource, :export) #=> false
@spec features(module()) :: [MishkaGervaz.Table.Behaviours.Template.feature()]
Get enabled features for a resource.
Returns a normalized list of enabled features (never :all).
How Features Work
- DSL default is
:all- uses template'sfeatures()as the source of truth :all→ calls template'sfeatures()callback to get supported features[:sort, :filter]→ uses the explicit list directly
Each template defines which features it supports via its features() callback.
Setting :all means "use all features this template supports".
Examples
# DSL: features [:filter, :paginate]
features(MyResource) #=> [:filter, :paginate]
# DSL: features :all (or not set, since :all is default)
features(MyResource) #=> [:sort, :filter, :select, ...] (from template)
Get a specific filter by name.
Get a specific filter group by name.
Get all filter groups for a resource.
Get the filter mode for a resource.
Get all filters for a resource.
Get a single hook entry by key.
The key may be a global atom (e.g. :on_load) or a per-action tuple
(e.g. {:before_row_action, :unarchive}).
Get the table header configuration. Returns nil when no header is declared.
Get all hooks as a map.
Returns globals (:on_load, :before_delete, …), per-action observer hooks
keyed as {:before_row_action, :unarchive}, and the :__builtins__ map of
state-transition flags.
Get the table layout configuration (chrome). Returns nil when no layout
block is declared.
@spec max_page_size(module()) :: pos_integer() | nil
Get the max page size for a resource.
mishka_gervaz.form DSL entities
mishka_gervaz.form.fields DSL entities
@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.
@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.
@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 entities
@spec mishka_gervaz_form_hooks_after_save(dsl_or_extended :: module() | map()) :: {:ok, (any(), any() -> any())} | :error
fn result, state -> state - After successful save.
@spec mishka_gervaz_form_hooks_after_save!(dsl_or_extended :: module() | map()) :: (any(), any() -> any()) | no_return()
fn result, state -> state - After successful save.
@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.
@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.
@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.
@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.
@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).
@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).
@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).
@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).
@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.
@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.
@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.
@spec mishka_gervaz_form_hooks_on_cancel(dsl_or_extended :: module() | map()) :: {:ok, (any() -> any())} | :error
fn state -> state - When form is cancelled.
@spec mishka_gervaz_form_hooks_on_cancel!(dsl_or_extended :: module() | map()) :: (any() -> any()) | no_return()
fn state -> state - When form is cancelled.
@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.
@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.
@spec mishka_gervaz_form_hooks_on_error(dsl_or_extended :: module() | map()) :: {:ok, (any(), any() -> any())} | :error
fn form, state -> state - On save error.
@spec mishka_gervaz_form_hooks_on_error!(dsl_or_extended :: module() | map()) :: (any(), any() -> any()) | no_return()
fn form, state -> state - On save error.
@spec mishka_gervaz_form_hooks_on_init(dsl_or_extended :: module() | map()) :: {:ok, (any(), any() -> any())} | :error
fn form, state -> form - After form initialization.
@spec mishka_gervaz_form_hooks_on_init!(dsl_or_extended :: module() | map()) :: (any(), any() -> any()) | no_return()
fn form, state -> form - After form initialization.
@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.
@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.
@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.
@spec mishka_gervaz_form_hooks_transform_errors(dsl_or_extended :: module() | map()) :: {:ok, (any(), any() -> any())} | :error
fn changeset, errors -> errors - Transform error messages.
@spec mishka_gervaz_form_hooks_transform_errors!(dsl_or_extended :: module() | map()) :: (any(), any() -> any()) | no_return()
fn changeset, errors -> errors - Transform error messages.
@spec mishka_gervaz_form_hooks_transform_params(dsl_or_extended :: module() | map()) :: {:ok, (any() -> any())} | :error
fn params -> params - Transform params before action.
@spec mishka_gervaz_form_hooks_transform_params!(dsl_or_extended :: module() | map()) :: (any() -> any()) | no_return()
fn params -> params - Transform params before action.
@spec mishka_gervaz_form_identity_name(dsl_or_extended :: module() | map()) :: {:ok, atom()} | :error
Unique form identifier.
@spec mishka_gervaz_form_identity_name!(dsl_or_extended :: module() | map()) :: atom() | no_return()
Unique form identifier.
@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.
@spec mishka_gervaz_form_identity_route(dsl_or_extended :: module() | map()) :: {:ok, String.t()} | :error
Base route for redirects after save.
@spec mishka_gervaz_form_identity_route!(dsl_or_extended :: module() | map()) :: String.t() | no_return()
Base route for redirects after save.
@spec mishka_gervaz_form_identity_stream_name(dsl_or_extended :: module() | map()) :: {:ok, atom()} | :error
Phoenix stream name. Auto-generated if not set.
@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 entities
@spec mishka_gervaz_form_layout_columns(dsl_or_extended :: module() | map()) :: {:ok, 4 | 3 | 2 | 1} | :error
Number of grid columns (1-4).
@spec mishka_gervaz_form_layout_columns!(dsl_or_extended :: module() | map()) :: (4 | 3 | 2 | 1) | no_return()
Number of grid columns (1-4).
@spec mishka_gervaz_form_layout_mode(dsl_or_extended :: module() | map()) :: {:ok, :tabs | :wizard | :standard} | :error
Form layout mode.
@spec mishka_gervaz_form_layout_mode!(dsl_or_extended :: module() | map()) :: (:tabs | :wizard | :standard) | no_return()
Form layout mode.
@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.
@spec mishka_gervaz_form_layout_persistence(dsl_or_extended :: module() | map()) :: {:ok, :client_token | :ets | :none} | :error
Where to persist step data between navigations.
@spec mishka_gervaz_form_layout_persistence!(dsl_or_extended :: module() | map()) :: (:client_token | :ets | :none) | no_return()
Where to persist step data between navigations.
@spec mishka_gervaz_form_layout_responsive(dsl_or_extended :: module() | map()) :: {:ok, boolean()} | :error
Enable responsive layout adjustments.
@spec mishka_gervaz_form_layout_responsive!(dsl_or_extended :: module() | map()) :: boolean() | no_return()
Enable responsive layout adjustments.
@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.
@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.
@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.
@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.
@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.
@spec mishka_gervaz_form_presentation_template(dsl_or_extended :: module() | map()) :: {:ok, atom()} | :error
Template module for form layout.
@spec mishka_gervaz_form_presentation_template!(dsl_or_extended :: module() | map()) :: atom() | no_return()
Template module for form layout.
@spec mishka_gervaz_form_presentation_theme_error_class( dsl_or_extended :: module() | map() ) :: {:ok, String.t()} | :error
Error message CSS classes.
@spec mishka_gervaz_form_presentation_theme_error_class!( dsl_or_extended :: module() | map() ) :: String.t() | no_return()
Error message CSS classes.
@spec mishka_gervaz_form_presentation_theme_extra(dsl_or_extended :: module() | map()) :: {:ok, map()} | :error
Template-specific theming options.
@spec mishka_gervaz_form_presentation_theme_extra!( dsl_or_extended :: module() | map() ) :: map() | no_return()
Template-specific theming options.
@spec mishka_gervaz_form_presentation_theme_field_class( dsl_or_extended :: module() | map() ) :: {:ok, String.t()} | :error
Default field CSS classes.
@spec mishka_gervaz_form_presentation_theme_field_class!( dsl_or_extended :: module() | map() ) :: String.t() | no_return()
Default field CSS classes.
@spec mishka_gervaz_form_presentation_theme_form_class( dsl_or_extended :: module() | map() ) :: {:ok, String.t()} | :error
Form element CSS classes.
@spec mishka_gervaz_form_presentation_theme_form_class!( dsl_or_extended :: module() | map() ) :: String.t() | no_return()
Form element CSS classes.
@spec mishka_gervaz_form_presentation_theme_label_class( dsl_or_extended :: module() | map() ) :: {:ok, String.t()} | :error
Default label CSS classes.
@spec mishka_gervaz_form_presentation_theme_label_class!( dsl_or_extended :: module() | map() ) :: String.t() | no_return()
Default label CSS classes.
@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.
@spec mishka_gervaz_form_presentation_ui_adapter(dsl_or_extended :: module() | map()) :: {:ok, atom()} | :error
UI adapter module for rendering components.
@spec mishka_gervaz_form_presentation_ui_adapter!(dsl_or_extended :: module() | map()) :: atom() | no_return()
UI adapter module for rendering components.
@spec mishka_gervaz_form_presentation_ui_adapter_opts( dsl_or_extended :: module() | map() ) :: {:ok, keyword()} | :error
Options for UI adapter configuration.
@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 entities
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@spec mishka_gervaz_form_source_actor_key(dsl_or_extended :: module() | map()) :: {:ok, atom()} | :error
Assigns key for current user.
@spec mishka_gervaz_form_source_actor_key!(dsl_or_extended :: module() | map()) :: atom() | no_return()
Assigns key for current user.
@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
@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
@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.
@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:categoryrelationship{:category, :cat}orcategory: :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@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:categoryrelationship{:category, :cat}orcategory: :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@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
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.
@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.
Override the entire state module. When set, all other options are ignored.
The module must use MishkaGervaz.Form.Web.State.
@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.
@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.
@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.
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
@spec mishka_gervaz_table_bulk_actions_enabled(dsl_or_extended :: module() | map()) :: {:ok, boolean()} | :error
Enable bulk actions.
@spec mishka_gervaz_table_bulk_actions_enabled!(dsl_or_extended :: module() | map()) :: boolean() | no_return()
Enable bulk actions.
@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 entities
@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.
@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.
@spec mishka_gervaz_table_columns_default_sort(dsl_or_extended :: module() | map()) :: {:ok, any()} | :error
Default sort. Atom, tuple, or list of tuples.
@spec mishka_gervaz_table_columns_default_sort!(dsl_or_extended :: module() | map()) :: any() | no_return()
Default sort. Atom, tuple, or list of tuples.
@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 entities
mishka_gervaz.table.filters DSL entities
mishka_gervaz.table.hooks DSL entities
@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).
@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).
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@spec mishka_gervaz_table_identity_name(dsl_or_extended :: module() | map()) :: {:ok, atom()} | :error
Unique table identifier.
@spec mishka_gervaz_table_identity_name!(dsl_or_extended :: module() | map()) :: atom() | no_return()
Unique table identifier.
@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.
@spec mishka_gervaz_table_identity_route(dsl_or_extended :: module() | map()) :: {:ok, String.t()} | :error
Base route for links (used in row actions).
@spec mishka_gervaz_table_identity_route!(dsl_or_extended :: module() | map()) :: String.t() | no_return()
Base route for links (used in row actions).
@spec mishka_gervaz_table_identity_stream_name(dsl_or_extended :: module() | map()) :: {:ok, atom()} | :error
Phoenix stream name. Auto-generated if not set.
@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 entities
@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 []
@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 []
@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.
@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.
@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.
@spec mishka_gervaz_table_presentation_responsive_hide_on_mobile( dsl_or_extended :: module() | map() ) :: {:ok, [atom()]} | :error
Columns to hide on mobile.
@spec mishka_gervaz_table_presentation_responsive_hide_on_mobile!( dsl_or_extended :: module() | map() ) :: [atom()] | no_return()
Columns to hide on mobile.
@spec mishka_gervaz_table_presentation_responsive_hide_on_tablet( dsl_or_extended :: module() | map() ) :: {:ok, [atom()]} | :error
Columns to hide on tablet.
@spec mishka_gervaz_table_presentation_responsive_hide_on_tablet!( dsl_or_extended :: module() | map() ) :: [atom()] | no_return()
Columns to hide on tablet.
@spec mishka_gervaz_table_presentation_responsive_mobile_layout( dsl_or_extended :: module() | map() ) :: {:ok, :stacked | :cards} | :error
Layout mode on mobile.
@spec mishka_gervaz_table_presentation_responsive_mobile_layout!( dsl_or_extended :: module() | map() ) :: (:stacked | :cards) | no_return()
Layout mode on mobile.
@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.
@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]
@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]
@spec mishka_gervaz_table_presentation_template(dsl_or_extended :: module() | map()) :: {:ok, atom() | module()} | :error
Default template module for layout structure. Built-in templates:
MishkaGervaz.Table.Templates.Table- Traditional rows/columns (default)MishkaGervaz.Table.Templates.MediaGallery- Image/file gallery
@spec mishka_gervaz_table_presentation_template!(dsl_or_extended :: module() | map()) :: (atom() | module()) | no_return()
Default template module for layout structure. Built-in templates:
MishkaGervaz.Table.Templates.Table- Traditional rows/columns (default)MishkaGervaz.Table.Templates.MediaGallery- Image/file gallery
@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]
@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]
@spec mishka_gervaz_table_presentation_theme_border_class( dsl_or_extended :: module() | map() ) :: {:ok, String.t()} | :error
Border CSS classes.
@spec mishka_gervaz_table_presentation_theme_border_class!( dsl_or_extended :: module() | map() ) :: String.t() | no_return()
Border CSS classes.
@spec mishka_gervaz_table_presentation_theme_extra( dsl_or_extended :: module() | map() ) :: {:ok, map()} | :error
Template-specific theming options.
@spec mishka_gervaz_table_presentation_theme_extra!( dsl_or_extended :: module() | map() ) :: map() | no_return()
Template-specific theming options.
@spec mishka_gervaz_table_presentation_theme_header_class( dsl_or_extended :: module() | map() ) :: {:ok, String.t()} | :error
Header row CSS classes.
@spec mishka_gervaz_table_presentation_theme_header_class!( dsl_or_extended :: module() | map() ) :: String.t() | no_return()
Header row CSS classes.
@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.
@spec mishka_gervaz_table_presentation_theme_row_class( dsl_or_extended :: module() | map() ) :: {:ok, String.t()} | :error
Data row CSS classes.
@spec mishka_gervaz_table_presentation_theme_row_class!( dsl_or_extended :: module() | map() ) :: String.t() | no_return()
Data row CSS classes.
@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:
MishkaGervaz.UIAdapters.Tailwind- Plain Tailwind CSS (default)
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)
endOptions for use:
:fallback- Fallback module (default: Tailwind):components- Module to auto-generate overrides from
@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:
MishkaGervaz.UIAdapters.Tailwind- Plain Tailwind CSS (default)
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)
endOptions for use:
:fallback- Fallback module (default: Tailwind):components- Module to auto-generate overrides from
@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 withMishkaGervaz.UIAdapters.Dynamic, generates a dynamic adapter at compile time that uses your components with Tailwind as fallback.:fallback- Fallback adapter module. Defaults toMishkaGervaz.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/1This 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
@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 withMishkaGervaz.UIAdapters.Dynamic, generates a dynamic adapter at compile time that uses your components with Tailwind as fallback.:fallback- Fallback adapter module. Defaults toMishkaGervaz.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/1This 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
@spec mishka_gervaz_table_refresh_enabled(dsl_or_extended :: module() | map()) :: {:ok, boolean()} | :error
Enable auto-refresh for this resource. Overrides domain default.
@spec mishka_gervaz_table_refresh_enabled!(dsl_or_extended :: module() | map()) :: boolean() | no_return()
Enable auto-refresh for this resource. Overrides domain default.
@spec mishka_gervaz_table_refresh_interval(dsl_or_extended :: module() | map()) :: {:ok, pos_integer()} | :error
Refresh interval in milliseconds. Overrides domain default.
@spec mishka_gervaz_table_refresh_interval!(dsl_or_extended :: module() | map()) :: pos_integer() | no_return()
Refresh interval in milliseconds. Overrides domain default.
@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.
@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.
@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.
@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.
@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.
@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.
@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 entities
mishka_gervaz.table.row_actions DSL entities
@spec mishka_gervaz_table_row_actions_actions_layout_auto_collapse_after( dsl_or_extended :: module() | map() ) :: {:ok, integer()} | :error
Auto-collapse after N actions.
@spec mishka_gervaz_table_row_actions_actions_layout_auto_collapse_after!( dsl_or_extended :: module() | map() ) :: integer() | no_return()
Auto-collapse after N actions.
@spec mishka_gervaz_table_row_actions_actions_layout_dropdown( dsl_or_extended :: module() | map() ) :: {:ok, [atom()]} | :error
Actions in dropdown menu.
@spec mishka_gervaz_table_row_actions_actions_layout_dropdown!( dsl_or_extended :: module() | map() ) :: [atom()] | no_return()
Actions in dropdown menu.
@spec mishka_gervaz_table_row_actions_actions_layout_inline( dsl_or_extended :: module() | map() ) :: {:ok, [atom()]} | :error
Actions shown as buttons.
@spec mishka_gervaz_table_row_actions_actions_layout_inline!( dsl_or_extended :: module() | map() ) :: [atom()] | no_return()
Actions shown as buttons.
@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.
@spec mishka_gervaz_table_row_actions_actions_layout_position( dsl_or_extended :: module() | map() ) :: {:ok, :end | :start} | :error
Which side of row.
@spec mishka_gervaz_table_row_actions_actions_layout_position!( dsl_or_extended :: module() | map() ) :: (:end | :start) | no_return()
Which side of row.
@spec mishka_gervaz_table_row_actions_actions_layout_sticky( dsl_or_extended :: module() | map() ) :: {:ok, boolean()} | :error
Stick on horizontal scroll.
@spec mishka_gervaz_table_row_actions_actions_layout_sticky!( dsl_or_extended :: module() | map() ) :: boolean() | no_return()
Stick on horizontal scroll.
@spec mishka_gervaz_table_row_class_apply(dsl_or_extended :: module() | map()) :: {:ok, (any() -> any())} | :error
Function fn record -> [class | nil].
@spec mishka_gervaz_table_row_class_apply!(dsl_or_extended :: module() | map()) :: (any() -> any()) | no_return()
Function fn record -> [class | nil].
@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.
@spec mishka_gervaz_table_row_class_possible(dsl_or_extended :: module() | map()) :: {:ok, [String.t()]} | :error
Possible classes for Tailwind JIT extraction.
@spec mishka_gervaz_table_row_class_possible!(dsl_or_extended :: module() | map()) :: [String.t()] | no_return()
Possible classes for Tailwind JIT extraction.
@spec mishka_gervaz_table_row_event(dsl_or_extended :: module() | map()) :: {:ok, String.t()} | :error
Event name triggered on row click.
@spec mishka_gervaz_table_row_event!(dsl_or_extended :: module() | map()) :: String.t() | no_return()
Event name triggered on row click.
@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.
@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.
@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.
@spec mishka_gervaz_table_row_selectable(dsl_or_extended :: module() | map()) :: {:ok, boolean()} | :error
Enable row selection checkboxes.
@spec mishka_gervaz_table_row_selectable!(dsl_or_extended :: module() | map()) :: boolean() | no_return()
Enable row selection checkboxes.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@spec mishka_gervaz_table_source_actor_key(dsl_or_extended :: module() | map()) :: {:ok, atom()} | :error
Assigns key for current user.
@spec mishka_gervaz_table_source_actor_key!(dsl_or_extended :: module() | map()) :: atom() | no_return()
Assigns key for current user.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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}.
@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}.
@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.
@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.
@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.
@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.
@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.
@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.
@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
@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
@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.
@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:siterelationship{:site, :site_info}orsite: :site_info- preload:site, alias as:site_info
@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:siterelationship{:site, :site_info}orsite: :site_info- preload:site, alias as:site_info
@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:layoutrelationship{:layout, :page_layout}orlayout: :page_layout- preload:layout, alias as:page_layout
@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:layoutrelationship{:layout, :page_layout}orlayout: :page_layout- preload:layout, alias as:page_layout
@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.
@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_layoutrelationship{:tenant_layout, :layout}ortenant_layout: :layout- preload:tenant_layout, alias as:layout
This allows master/tenant to expose different relationships under the same alias key.
@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_layoutrelationship{:tenant_layout, :layout}ortenant_layout: :layout- preload:tenant_layout, alias as:layout
This allows master/tenant to expose different relationships under the same alias key.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@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.
@spec mishka_gervaz_table_url_sync_enabled(dsl_or_extended :: module() | map()) :: {:ok, boolean()} | :error
Enable URL state synchronization. Overrides domain default.
@spec mishka_gervaz_table_url_sync_enabled!(dsl_or_extended :: module() | map()) :: boolean() | no_return()
Enable URL state synchronization. Overrides domain default.
@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.
@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.
@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
@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
@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.
@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.
@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.
@spec mishka_gervaz_table_url_sync_prefix(dsl_or_extended :: module() | map()) :: {:ok, String.t()} | :error
Prefix for URL params. Overrides domain default.
@spec mishka_gervaz_table_url_sync_prefix!(dsl_or_extended :: module() | map()) :: String.t() | no_return()
Prefix for URL params. Overrides domain default.
@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.
@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.
Get a specific notice by name.
Get all notices declared in the table layout.
Get notices targeting the given position. Position can be an atom or a
{:before_column, name} / {:after_column, name} tuple.
@spec page_size(module()) :: pos_integer() | nil
Get the page size for a resource.
@spec page_size_options(module()) :: [pos_integer()] | nil
Get the page size options for a resource. Returns nil when no options are configured (no dropdown shown).
Get the full pagination configuration for a resource. Returns nil when pagination is disabled or not configured.
Check if pagination is enabled for a resource.
@spec pagination_type(module()) :: :numbered | :infinite | :load_more | nil
Get the pagination type for a resource.
Get the pagination UI configuration for a resource.
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 [layout: :layout], tenant [tenant_layout: :layout]
preload_aliases(MyResource, true) # => %{} (no aliasing for master)
preload_aliases(MyResource, false) # => %{layout: :tenant_layout}
Get the refresh configuration.
Get the route for a resource.
Get a specific row action by name.
Get all row actions for a resource.
Get the state configuration.
Returns a map with any configured state module overrides.
Keys can include: :module, :column, :filter, :action, :presentation, :url_sync, :access
Get the stream name for a resource.
Get the URL sync configuration.