Purpose: Handles dynamic assignment operations by modifying DOM elements based on parameter configurations, useful for updating UI elements dynamically.

Features

  • Dynamic element attribute modification
  • Element reference resolution (from other elements)
  • Support for innerHTML, value, textContent, and custom attributes
  • Nested parameter handling
  • Event prevention options

Actions

  • assign: Execute assignment operations

Usage Examples

Basic Attribute Assignment

<div id="status-display">Pending</div>
<div id="color-indicator" class="bg-gray-200"></div>

<%= select_tag :status,
    options_for_select([
      ['Pending', 'pending'],
      ['Approved', 'approved'],
      ['Rejected', 'rejected']
    ]),
    data: {
      controller: "fx-assigner",
      action: "change->fx-assigner#assign",
      "fx-assigner-change-param": {
        "#status-display": {
          textContent: "Processing..."
        },
        "#color-indicator": {
          class: "bg-yellow-200"
        }
      }.to_json
    } %>

Element Reference Assignment

<div id="source-text">Hello World</div>
<input id="target-input" type="text">
<div id="display-area">Empty</div>

<%= button_tag "Copy Content",
    data: {
      controller: "fx-assigner",
      action: "click->fx-assigner#assign",
      "fx-assigner-change-param": {
        "#target-input": {
          value: {
            element: "#source-text",
            attribute: "textContent"
          }
        },
        "#display-area": {
          innerHTML: {
            element: "#source-text",
            attribute: "innerHTML"
          }
        }
      }.to_json
    } %>

Complex Form Integration

<%= form_with model: @product do |f| %>
  <%= f.select :category_id, options_from_collection_for_select(@categories, :id, :name),
      data: {
        controller: "fx-assigner",
        action: "change->fx-assigner#assign",
        "fx-assigner-prevent-default-param": "true",
        "fx-assigner-change-param": {
          "#category-description": {
            textContent: {
              element: "option:checked",
              attribute: "data-description"
            }
          },
          "#category-settings": {
            class: "block"
          }
        }.to_json
      } %>

  <div id="category-description" class="text-sm text-gray-600 mt-2"></div>
  <div id="category-settings" class="hidden mt-4">
    <!-- Category-specific settings -->
  </div>
<% end %>