LiveFilter.EventRouter (LiveFilter v0.1.0)

View Source

Optional 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_event_name(field, action, opts \\ [])

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_event_value(params, opts \\ [])

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}

filter_change_handler(opts)

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_filter_event(event_name, opts \\ [])

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_event(event_name, params, opts)

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
)