LiveFilter.EventRouter (LiveFilter v0.1.0)
View SourceOptional event routing helper for dynamic filter events.
This module helps parse and route events with dynamic names like "filter_status_changed" or "quick_filter_project_selected". It's completely optional - you can handle events however you prefer.
Philosophy
This is a toolkit for common patterns, not a required way of handling events. Use it if it helps, ignore it if it doesn't fit your needs.
Examples
# In your LiveView
def handle_event(event, params, socket) do
case LiveFilter.EventRouter.parse_filter_event(event) do
{:ok, :status, :changed} ->
# Handle status filter change
{:ok, :date_range, :cleared} ->
# Handle date range clear
{:error, :no_match} ->
# Not a filter event, handle normally
end
end
# Or use the router function
def handle_event(event, params, socket) do
LiveFilter.EventRouter.route_event(event, params,
handlers: %{
status_changed: &handle_status_change/3,
date_range_selected: &handle_date_selection/3
},
fallback: &handle_other_event/3
)
end
Summary
Functions
Build a dynamic event name from components.
Extract value from event parameters based on common patterns.
Common event handler builder for filter changes.
Parse a dynamic event name into components.
Route events to appropriate handlers.
Functions
Build a dynamic event name from components.
The inverse of parse_filter_event/2.
Examples
build_event_name(:status, :changed)
#=> "filter_status_changed"
build_event_name(:due_date, :selected, prefix: "quick_")
#=> "quick_due_date_selected"
Extract value from event parameters based on common patterns.
Options
:type
- Expected value type (:single, :multi, :toggle, :range):key
- Parameter key to look for
Examples
# Toggle event: %{"toggle" => "active"}
extract_event_value(%{"toggle" => "active"}, type: :toggle)
#=> {:toggle, "active"}
# Select event: %{"select" => "urgent"}
extract_event_value(%{"select" => "urgent"}, type: :single)
#=> {:select, "urgent"}
# Clear event: %{"clear" => true}
extract_event_value(%{"clear" => true})
#=> {:clear, true}
Common event handler builder for filter changes.
Returns a function that can be used as an event handler.
Examples
def handle_event(event, params, socket) do
handler = LiveFilter.EventRouter.filter_change_handler(
field: :status,
type: :multi_select,
apply_fn: &apply_filters/1
)
handler.(params, socket)
end
Parse a dynamic event name into components.
Options
:prefix
- Event prefix (default: "filter_"):separator
- Word separator (default: "_"):actions
- Recognized action suffixes (default: common actions):fields
- Whitelist of valid fields (default: any)
Examples
# Default pattern: "filter_<field>_<action>"
parse_filter_event("filter_status_changed")
#=> {:ok, :status, :changed}
parse_filter_event("filter_due_date_cleared")
#=> {:ok, :due_date, :cleared}
# Custom pattern: "quick_<field>_<action>"
parse_filter_event("quick_project_selected", prefix: "quick_")
#=> {:ok, :project, :selected}
# Unknown event
parse_filter_event("something_else")
#=> {:error, :no_match}
Route events to appropriate handlers.
This is a higher-level helper that combines parsing with handler dispatch.
Options
:handlers
- Map of "field_action" => handler function:fallback
- Function to call for non-matching events:parse_opts
- Options to pass to parse_filter_event/2
Examples
LiveFilter.EventRouter.route_event("filter_status_changed", params,
handlers: %{
"status_changed" => fn params, socket ->
# Handle status change
{:noreply, socket}
end,
"date_range_selected" => fn params, socket ->
# Handle date selection
{:noreply, socket}
end
},
fallback: fn event, params, socket ->
# Handle other events
{:noreply, socket}
end
)