open-nomad/ui/app/machines/evaluations.js
Jai 7690fda6ba
Epic: Evaluation Detail Sidebar (#12370)
* chore: prettify gutter-menu

* chore:  add portal packages

* styling:  add styles sidebar and portal behavior

* ui:  sidebar component

* ui:  create and implement statechart for evals

* ui:  actor-relationship service and provider component

* ui:  d3 hierarchy computation

* chore:  add render-modifiers and curved arrows

* ui:  create evaluation actor div

* fix related evaluations schema

* ui:  register/deregister evaluation divs

* ui:  handle resize behavior

* bug:  infinite re-render cycle

* fix:  conditional logic to prevent infinite render of flex resizing

* ui: related evaluations schema and request param

* ui: fix testing for evaluations

* refact: make related-evals a proper has-many

* chore: don't pauseTest

* temp:  debug d3 hierarchy

* ui:  move derived state logic into backing component class for detail

* ui:  deprecated related evaluations logic in statechart

* ui:  update evaluation models

* ui:  update logic to paint svg in non-viewable scroll region

* ui:  update styling

* ui:  testing for eval detail view

* ui:  delete detail from template directory

* ui:  break detail component down

* ui:  static data for /evaluation/:id endpoint

* ui:  fix styling of d3 viz

* ui:  add query parameter adapter for evals

* ui:  last minute design requests

* wip:  address browser updating detail view behavior

* refact: handle query-state change in statechart

* conditional class looking for currentEval equality (#12411)

* F UI/evaluation detail sidebar rel evals (#12415)

* ui:  remove busy id alias from statechart

* ui: edit related evaluations viz error message

* ui:  bug fixes on related evaluations view (#12423)

* ui:  remove busy id alias from statechart

* ui: edit related evaluations viz error message

* ui:  update error state

* ui:  related evaluation outline styling

* Related evaluation stylefile and non-link if it matches the active sidebar (#12428)

* Adds tabbable and keyboard pressable evaluation table rows (#12433)

* ui:  fix failing eval list tests (#12437)

* ui:  move styling into classes (#12438)

* fix test failures (#12444)

* ui:  move styling into classes

* ui:  eslint disable

* ui:  allocations have evaluations as async relationships

* ui:  fix evaluation refresh button (#12447)

* ui:  move styling into classes

* ui:  eslint disable

* ui:  allocations have evaluations as async relationships

* ui:  refresh bug

* ui:  final touches on sidebar (#12462)

* chore: turn off template linting rules

Temporarily turning off template linting because we dont have a set CSS convention and the release needs to go out ASAP.

* doc:  deprecate out of date comments and vars

* ui:  edit mirage server fetch logic

* ui:  style sidebar relative

* Modification to mocked related evals and manually set 100% height on svg (#12460)

* F UI/evaluation detail sidebar final touches (#12463)

* chore: turn off template linting rules

Temporarily turning off template linting because we dont have a set CSS convention and the release needs to go out ASAP.

* doc:  deprecate out of date comments and vars

* ui:  edit mirage server fetch logic

* ui:  style sidebar relative

* ui:  account for new related eval added to chain

Co-authored-by: Michael Klein <michael@firstiwaslike.com>
Co-authored-by: Phil Renaud <phil@riotindustries.com>
2022-04-05 14:34:37 -04:00

125 lines
3.2 KiB
JavaScript

import { assign, createMachine, send } from 'xstate';
// Docs on using statecharts: https://xstate.js.org/docs/packages/xstate-fsm/#api
export default createMachine(
{
id: 'evaluations_ui',
context: { evaluation: null },
type: 'parallel',
states: {
table: {
initial: 'unknown',
on: {
NEXT: {
actions: ['requestNextPage', send('MODAL_CLOSE')],
},
PREV: {
actions: ['requestPrevPage', send('MODAL_CLOSE')],
},
CHANGE_PAGES_SIZE: {
actions: ['changePageSize', send('MODAL_CLOSE')],
},
MODEL_UPDATED: '#unknown',
},
states: {
unknown: {
id: 'unknown',
always: [{ target: 'data', cond: 'hasData' }, { target: 'empty' }],
},
data: {},
empty: {},
},
},
sidebar: {
initial: 'unknown',
states: {
unknown: {
always: [
{ target: 'open', cond: 'sidebarIsOpen' },
{ target: 'close' },
],
},
open: {
initial: 'busy',
exit: ['removeCurrentEvaluationQueryParameter'],
states: {
busy: {
invoke: {
src: 'loadEvaluation',
onDone: 'success',
onError: 'error',
},
},
success: {
entry: assign({
evaluation: (context, event) => {
return event.data;
},
}),
on: {
LOAD_EVALUATION: {
target: 'busy',
actions: ['updateEvaluationQueryParameter'],
},
},
},
error: {
entry: assign({ error: (_ctx, event) => event.data }),
on: {
RETRY: 'busy',
},
},
},
on: {
MODAL_CLOSE: 'close',
CHANGE_EVAL: [{ target: 'close', cond: 'hasNoCurrentEval' }],
},
},
close: {
on: {
LOAD_EVALUATION: {
target: 'open',
actions: ['updateEvaluationQueryParameter'],
},
CHANGE_EVAL: [
{
target: 'open',
cond: 'hasCurrentEval',
},
],
},
},
},
},
},
},
{
services: {
// Overridden in the controller
async loadEvaluations() {},
async loadEvaluation() {},
},
guards: {
sidebarIsOpen() {
return false;
},
hasData() {
return true;
},
hasNoCurrentEval(_ctx, { evaluation }) {
return !evaluation;
},
hasCurrentEval(_ctx, { evaluation }) {
return evaluation;
},
notBusy(_ctx, _event, meta) {
return !meta.state.matches({ sidebar: { open: 'busy' } });
},
},
actions: {
updateEvaluationQueryParameter() {},
removeCurrentEvaluationQueryParameter() {},
},
}
);