PhoenixKitWeb.Dashboard.TabsInitializer (phoenix_kit v1.7.38)

Copy Markdown View Source

LiveView on_mount hook for initializing dashboard tabs with context-aware badge values.

This hook should run AFTER ContextProvider to ensure context data is available. It automatically initializes dashboard tabs and loads badge values for context-aware badges, eliminating the need for custom on_mount hooks in most applications.

Usage

Add to your live_session after authentication and context hooks:

live_session :dashboard,
  on_mount: [
    {PhoenixKitWeb.Users.Auth, :phoenix_kit_ensure_authenticated_scope},
    {PhoenixKitWeb.Dashboard.ContextProvider, :default},
    {PhoenixKitWeb.Dashboard.TabsInitializer, :default}
  ] do
  live "/dashboard", DashboardLive.Index
end

Mount Options

  • :default - Initialize tabs with presence tracking and badge subscriptions
  • :minimal - Initialize tabs without presence tracking (lower overhead)
  • :badges_only - Only initialize badge values, no presence tracking

Assigns Set

This hook sets the following assigns:

  • @dashboard_tabs - List of Tab structs with badge values loaded
  • @tab_viewer_counts - Map of tab_id => viewer count (unless :minimal or :badges_only)
  • @collapsed_dashboard_groups - MapSet of collapsed group IDs
  • @context_badge_values - Map of tab_id => badge value for context-aware badges

How It Works

  1. Normalizes current_contexts_map for legacy single-selector configurations (builds %{:default => current_context} if current_contexts_map is not set)
  2. Calls LiveTabs.init_dashboard_tabs/2 which:
    • Loads tabs from the Registry
    • Subscribes to tab update PubSub topics
    • Subscribes to badge update topics (with context placeholder resolution)
    • Loads initial values for context-aware badges via their loaders
    • Merges context values into tab badges

Legacy Single-Selector Compatibility

For apps using the legacy :dashboard_context_selector configuration, this hook automatically builds current_contexts_map from current_context:

# Legacy config sets these:
@current_context = %{id: 1, name: "My Farm"}
@context_selector_config = %{key: :farm, ...}

# This hook normalizes to:
@current_contexts_map = %{farm: %{id: 1, name: "My Farm"}}

This allows context-aware badges with context_key: :farm to work correctly.

Manual Alternative

If you need custom initialization logic, skip this hook and use PhoenixKitWeb.Components.Dashboard.LiveTabs.init_dashboard_tabs/2 in your mount:

def mount(_params, _session, socket) do
  socket = init_dashboard_tabs(socket)
  {:ok, socket}
end

Example with Context-Aware Badges

# config.exs
config :phoenix_kit, :user_dashboard_tabs, [
  %{
    id: :alerts,
    label: "Alerts",
    path: "/dashboard/alerts",
    badge: %{
      type: :count,
      context_key: :farm,  # Must match selector key
      loader: {MyApp.Alerts, :count_for_farm},
      color: :error
    }
  }
]

# router.ex
live_session :dashboard,
  on_mount: [
    {PhoenixKitWeb.Users.Auth, :phoenix_kit_ensure_authenticated_scope},
    {PhoenixKitWeb.Dashboard.ContextProvider, :default},
    {PhoenixKitWeb.Dashboard.TabsInitializer, :default}
  ] do
  live "/dashboard", DashboardLive.Index
end

# The badge will automatically show the correct count for the selected farm

Summary

Functions

On mount hook that initializes dashboard tabs with badge values.

Functions

on_mount(atom, params, session, socket)

On mount hook that initializes dashboard tabs with badge values.

Options

  • :default - Full initialization with presence tracking
  • :minimal - Skip presence tracking for lower overhead
  • :badges_only - Only initialize badge values