# `MishkaCmsMigration.Targets.Helpers.Widgets`
[🔗](https://github.com/mishka-group/mishka_cms_migration/blob/v0.0.1/lib/mishka_cms_migration/targets/__helpers/widgets.ex#L5)

The widgets of a page builder an item was laid out with that the CMS has no equivalent for, such
as an Elementor form, slider or map, for the targets that write the content
(`MishkaCmsMigration.Targets.CmsPage`, `MishkaCmsMigration.Targets.BlogPost`). The source names
them in the item's `"unsupported_widgets"`, and puts what the builder drew for each in its place
in the content, its fallback HTML (`MishkaCmsMigration.Sources.WordPress.Elementor`).

Such an item is never written on its own: it waits for an admin's decision
(`MishkaCmsMigration.MigrationItem`'s Decide…) on `"unsupported_widgets"`, its reason naming the
widgets after `": "` (`"unsupported_widgets: form, slides"`), in the dry run (the target's
`waiting/2`, `waiting/2` here) and in `prepare/3` for any write (`call/2`). Import with the
fallback HTML for those parts (`"import"`) writes it with that HTML, and the report names them
(`"fallback_html: <names>"`, `note/2`), and those the builder drew nothing for, which have no
fallback (`"no_fallback: <names>"`); Leave the page out leaves the item out, as Leave out does.

# `call`

```elixir
@spec call(MishkaCmsMigration.Source.Item.t(), MishkaCmsMigration.Target.context()) ::
  :ok | {:undecided, String.t()}
```

`:ok` for `item` to be written: it has no such widgets, or an admin decided to import it with
their fallback HTML; else `{:undecided, conflict}`.

# `conflict`

```elixir
@spec conflict(MishkaCmsMigration.Source.Item.t()) :: String.t() | nil
```

The conflict `item` waits on: `"unsupported_widgets: <names>"` for an item laid out with widgets
the CMS has no equivalent for, else `nil`.

# `note`

```elixir
@spec note(MishkaCmsMigration.Source.Item.t(), MishkaCmsMigration.Target.context()) ::
  String.t() | nil
```

What the report says of `item`'s widgets once it is written: `"fallback_html: <names>"` for those
written with what the builder drew for them, and `"no_fallback: <names>"` for those it drew
nothing for (the source's `"no_fallback_widgets"`), joined by `"; "`, else `nil`.

# `waiting`

```elixir
@spec waiting(MishkaCmsMigration.Source.Item.t(), MishkaCmsMigration.Target.context()) ::
  MishkaCmsMigration.Target.found() | nil
```

What the target's `waiting/2` says of `item`: `{:undecided, conflict}` until an admin decides to
import it with the fallback HTML, then `nil`, to be written, as for an item with no such widgets.

---

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