MishkaGervaz is a Spark-based DSL library that provides declarative admin table and form configuration for Ash Framework resources.
Usage
Add the extension to your Ash resource. The top-level mishka_gervaz block
contains two sibling sections: table (admin list view) and form (create/edit form).
Table example
defmodule MyApp.CMS.Component do
use Ash.Resource,
domain: MyApp.CMS,
extensions: [MishkaGervaz.Resource]
mishka_gervaz do
table do
identity do
route "/admin/components"
end
columns do
column :name, sortable: true
column :status
end
row_actions do
action :edit, type: :link
action :delete, type: :destroy
end
end
end
# ... rest of Ash resource
endForm example
mishka_gervaz do
form do
identity do
name :component_form
route "/admin/components"
end
source do
actor_key :current_user
master_check fn user -> user.role == :admin end
actions do
create {:master_create, :create}
update {:master_update, :update}
read {:master_get, :read}
end
end
fields do
field :name, :text, required: true
field :status, :select
end
end
endDesign Principles
- Separation of Concerns:
source= data/behavior,ui= presentation,render= custom output - Smart Type Inference: Single
sourcekey detects intent from value shape - Everything Optional: Sensible defaults everywhere, minimal required config
- Template Agnostic:
ui.extramap for template-specific options - Multi-tenant First: Built-in master/tenant user handling
- Overridable Pillars: Every state builder, event handler, and data loader can be
swapped via DSL (
state do field MyMod end,events do submit MyMod end, etc.)
Table sections
The following sections live within the table block:
identity- Naming and routing. SeeMishkaGervaz.Table.Dsl.Identitysource- Data fetching, action mapping, preloading. SeeMishkaGervaz.Table.Dsl.Sourcerealtime- PubSub configuration. SeeMishkaGervaz.Table.Entities.Realtimecolumns- Define table columns. SeeMishkaGervaz.Table.Dsl.Columnsfilters- Filter input configuration. SeeMishkaGervaz.Table.Dsl.Filtersfilter_groups- Group filters in the UI. SeeMishkaGervaz.Table.Dsl.FilterGroupsrow_actions- Per-row action buttons. SeeMishkaGervaz.Table.Dsl.RowActionsrow- Row styling and behavior. SeeMishkaGervaz.Table.Dsl.Rowbulk_actions- Actions on multiple selected rows. SeeMishkaGervaz.Table.Dsl.BulkActionslayout- Layout mode and template switcher. SeeMishkaGervaz.Table.Dsl.Layoutpagination- Pagination configuration. SeeMishkaGervaz.Table.Entities.Paginationempty_state- Empty state configuration. SeeMishkaGervaz.Table.Entities.EmptyStateerror_state- Error state configuration. SeeMishkaGervaz.Table.Entities.ErrorStatepresentation- UI adapter and theming. SeeMishkaGervaz.Table.Dsl.Presentationrefresh- Auto-refresh configuration. SeeMishkaGervaz.Table.Dsl.Refreshurl_sync- URL state synchronization. SeeMishkaGervaz.Table.Dsl.UrlSynchooks- Lifecycle callbacks. SeeMishkaGervaz.Table.Dsl.Hooksstate- State-module overrides (column,filter,action,presentation,url_sync,access,module). SeeMishkaGervaz.Table.Dsl.Statedata_loader- Data-loader sub-builder overrides (query,filter_parser,pagination,tenant,relation,hooks,module). SeeMishkaGervaz.Table.Entities.DataLoaderevents- Event-handler sub-builder overrides (sanitization,record,selection,bulk_action,relation_filter,hooks,module). SeeMishkaGervaz.Table.Entities.Events
Form sections
The following sections live within the form block:
identity- Naming and routing. SeeMishkaGervaz.Form.Dsl.Identitysource- Data fetching, action mapping, preloading. SeeMishkaGervaz.Form.Dsl.Sourcefields- Define form fields. SeeMishkaGervaz.Form.Dsl.Fieldsgroups- Define field groups. SeeMishkaGervaz.Form.Dsl.Groupslayout- Layout mode (:standard/:wizard/:tabs) and step definitions. SeeMishkaGervaz.Form.Dsl.Layoutuploads- File upload configuration. SeeMishkaGervaz.Form.Dsl.Uploadspresentation- UI adapter and theming. SeeMishkaGervaz.Form.Dsl.Presentationhooks- Lifecycle callbacks. SeeMishkaGervaz.Form.Dsl.Hooksstate- State-module overrides (field,group,step,presentation,access,module). SeeMishkaGervaz.Form.Dsl.Statesubmit- Submit / update / cancel button labels. SeeMishkaGervaz.Form.Entities.Submitdata_loader- Data-loader sub-builder overrides (record,tenant,relation,hooks,module). SeeMishkaGervaz.Form.Entities.DataLoaderevents- Event-handler sub-builder overrides (sanitization,validation,submit,step,upload,relation,hooks,module). SeeMishkaGervaz.Form.Entities.Events
Introspection
MishkaGervaz.Resource.Info.Table— table introspection (columns, filters, events, state, data_loader, …)MishkaGervaz.Resource.Info.Form— form introspection (fields, groups, events, state, data_loader, …)