# `Masu.Action`
[🔗](https://github.com/hattoriai/masu/blob/v0.1.0/lib/masu/action.ex#L1)

An item of a grid's menus of your own: in a column's header menu
(`:header_action`), or in the menu of a cell (`:cell_action`), which a
right click opens, or the context-menu key or Shift+F10 on the active
cell.

    <.data_grid id="orders" source={Order} repo={Repo} cell_menu>
      <:col field={:customer} />
      <:col field={:total} type={:decimal} />

      <:header_action label="Explain" on_action={&explain/1} />
      <:cell_action label="Open the customer" event="open_customer" columns={["customer"]} />
      <:cell_action label="Copy a link" js={JS.dispatch("app:copy-link")} />
      <:header_action :let={action} label="Column stats" types={[:integer, :decimal]}>
        <.stats column={action.column} />
      </:header_action>
    </.data_grid>

An item does one or more of:

  * `on_action` - a function of the item's context, called in the
    LiveView's process (as `on_select` is);
  * `event` - a name: the LiveView gets `{Masu.Action, name, context}`
    in its `handle_info/2`, to change its own assigns (open a modal,
    navigate);
  * `js` - a `Phoenix.LiveView.JS` command, run in the browser on the
    grid's element; the element gets a `masu:action` event first, whose
    `detail` is the context as the browser has it;
  * content - a panel of your own, which the server renders with the
    context (`:let`) under the header or the cell, until the person
    closes it (Escape, or a click away).

The context is a map:

  * `grid` - the id of the grid;
  * `column` - the key of the column;
  * for a cell: `id`, the row's id, `row`, the row as the source reads
    it, and `value`, the cell's value; read on the server, not taken
    from the browser;
  * for a cell in a selected range: `range`, `%{ids: ids, columns:
    keys}`, the rows (up to 10,000) and the columns of the range; the
    ids are the browser's, which an item checks as it checks any
    params.

In the browser, the context has the column's key, the row's id, and
the value as the browser shows it.

`columns` (keys) and `types` limit the columns an item is for, and
`show`, a function of the `Masu.Column`, too; `:if` leaves an item out
altogether (`:if={@admin?}`). The server runs only the items that the
grid offers for the column.

# `kind`

```elixir
@type kind() :: :header | :cell
```

# `t`

```elixir
@type t() :: %Masu.Action{
  columns: [String.t()] | nil,
  event: String.t() | nil,
  index: non_neg_integer(),
  js: String.t() | nil,
  kind: kind(),
  label: String.t(),
  on_action: (map() -&gt; term()) | nil,
  show: (Masu.Column.t() -&gt; boolean()) | nil,
  slot: map() | nil,
  types: [Masu.Column.type()] | nil
}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
