Skip to content

Instantly share code, notes, and snippets.

@antonkuzmin
Last active June 30, 2020 08:36
Show Gist options
  • Select an option

  • Save antonkuzmin/1509729f221cb4473650c7bb6592b10e to your computer and use it in GitHub Desktop.

Select an option

Save antonkuzmin/1509729f221cb4473650c7bb6592b10e to your computer and use it in GitHub Desktop.
Generated by XState Viz: https://xstate.js.org/viz
// Available variables:
// - Machine
// - interpret
// - assign
// - send
// - sendParent
// - spawn
// - raise
// - actions
// - XState (all XState exports)
const user = {
roles: [
'smi-admin',
],
};
const hasRole = (role) => (ctx, e) =>
user.roles.includes(role);
const flighcostMachine = Machine({
id: 'flighcost',
initial: 'создано',
context: {
doc: false,
afd_id: null,
afd_status: null,
excess: null, // сумма / пож
},
states: {
'создано': {
on: {
'удалить': 'удалено',
'взять в работу': 'в работе',
}
},
'удалено': {
type: 'final'
},
'аннулировано': {
type: 'final',
},
'завершено': {
type: 'final',
on: {
'вернуть в работу': {
target: 'в работе',
cond: 'isAdmin',
},
},
},
'в работе': {
on: {
'аннулировать': 'аннулировано',
'акцептовать все':'акцептовано',
'акцептовать частично':'частично акцептовано',
'редактировать': 'в работе',
}
},
'акцептовано': {
on: {
'аннулировать': 'аннулировано',
'вернуть в работу': 'в работе',
'вложить перв.док.': {
target: 'акцептовано',
actions: assign({
doc: (ctx,e) => true,
}),
},
'отправить в АФД': {
target: 'отправлено в АФД',
cond: 'hasDoc',
actions: assign({
afd_id: () => 1,
afd_status: () => 'done',
}),
}
}
},
'частично акцептовано': {
on: {
'аннулировать': 'аннулировано',
'редактировать': 'частично акцептовано',
'вернуть в работу': 'в работе',
'вложить перв.док. (без подписи)': {
target: 'частично акцептовано',
actions: assign({doc: () => true}),
},
'на согласование': {
target: 'согласование АФД',
cond: 'hasDoc', // hasExcess
actions: assign({
afd_id: () => 1,
afd_status: (ctx,e) => 'to_approve',
}),
},
},
},
'отправлено в АФД': {
on: {
'завершить': 'завершено',
'аннулировать': {
target: 'аннулировано',
actions: assign({
afd_status: (ctx,e) => 'cancelled',
}),
},
}
},
'согласование АФД': {
on: {
'аннулировать': {
target: 'аннулировано',
actions: assign({
afd_status: (ctx,e) => 'cancelled',
}),
},
'[авто] согласовано': {
target: 'согласовано АФД',
actions: assign({
afd_status: (ctx,e) => 'approved',
}),
},
}
},
'согласовано АФД': {
on: {
'завершить': 'завершено',
'аннулировать': {
target: 'аннулировано',
actions: assign({
afd_status: (ctx,e) => 'cancelled',
}),
},
}
}
}
},
{
guards: {
hasDoc: (ctx, e) => ctx.doc,
hasExcess: (ctx, e) => ctx.excess !== null,
isAdmin: hasRole('smi-admin'),
}
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment