open-consul/ui-v2/app/components/state-chart
John Cowen 287e4f591f
ui: Change some components to use willDestroyElement vs willDestroy (#8313)
* ui: Change <DataSource /> to use willDestroyElement vs willDestroy

* Change 3 more components to use willDestroyElement vs willDestroy
2020-07-17 09:49:58 +01:00
..
action ui: Adds `<StateChart />` component for wiring together Ember+XState (#7742) 2020-05-12 17:14:38 +00:00
guard ui: Change some components to use willDestroyElement vs willDestroy (#8313) 2020-07-17 09:49:58 +01:00
README.mdx
index.hbs
index.js

README.mdx

## StateChart

```handlebars
<StateChart
  @chart={{xstateStateChartObject}}
  as |State Guard Action dispatch state|>
</StateChart>
```

`<StateChart />` is a renderless component that eases rendering of different states
from within templates using XState State Machine and Statechart objects.

### Arguments

| Argument/Attribute | Type | Default | Description |
| --- | --- | --- | --- |
| `chart` | `object` |  | An xstate statechart/state machine object |
| `initial` | `String` | The initial value of the state chart itself | The initial state of the machine/chart (defaults to whatever is defined on the object itself) |

The component currently yields 3 conextual components:

- `<State />`: Used for rendering matching certain states ([also see State Component](../state/README.mdx))
- `<Action @name="" @exec={{action ""}} />`: Used to wire together ember actions to xstate actions.
- `<Guard @name="" @cond={{action ""}} />`: Used to wire together ember actions or props to xstate guards.

and 2 further objects:

- `dispatch`: An action to dispatch an xstate event
- `state`: The state object itself for usage in the `state-matches` helper

### Example

```handlebars
<StateChart
  @chart={{xstateStateChartObject}}
  as |State Guard Action dispatch state|>
    <Guard @name="nameOfGuard" @cond={{action "testGuardCondition"}} />
    <Action @name="nameOfAction" @exec={{action "executeAction"}} />
    <State @matches="idle">
      Currently Idle
    </State>
    <State @matches="loading">
      Currently Loading
    </State>
    <State @matches={{array 'loading' 'idle'}}>
      Idle and loading
      <button disabled={{state-matches state "loading"}} onclick={{action dispatch "START"}}>Load</button>
    </State>
</StateChart>
```

### See

- [Component Source Code](./index.js)
- [Template Source Code](./index.hbs)

---