Ash extension for MishkaGervaz admin UI DSL.
Add this extension to your Ash resources to enable declarative admin table
and form configuration. The top-level mishka_gervaz block contains two
sibling sections — table (admin list view) and form (create/edit form) —
which may be used independently or together on a single resource.
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
endTable sections
The following sections live within mishka_gervaz -> table:
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 mishka_gervaz -> form:
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
Use MishkaGervaz.Resource.Info.Table and MishkaGervaz.Resource.Info.Form
to introspect the configuration at runtime:
# Table — full compiled config / columns / filters
config = MishkaGervaz.Resource.Info.Table.config(MyResource)
columns = MishkaGervaz.Resource.Info.Table.columns(MyResource)
filters = MishkaGervaz.Resource.Info.Table.filters(MyResource)
# Form — full compiled config / fields / groups / events / state / data_loader
config = MishkaGervaz.Resource.Info.Form.config(MyResource)
fields = MishkaGervaz.Resource.Info.Form.fields(MyResource)
groups = MishkaGervaz.Resource.Info.Form.groups(MyResource)
events = MishkaGervaz.Resource.Info.Form.events(MyResource)
state = MishkaGervaz.Resource.Info.Form.state(MyResource)
data_loader = MishkaGervaz.Resource.Info.Form.data_loader(MyResource)