mirror of https://github.com/Squidex/squidex.git
1 changed files with 130 additions and 0 deletions
@ -0,0 +1,130 @@ |
|||
/* |
|||
* Squidex Headless CMS |
|||
* |
|||
* @license |
|||
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved. |
|||
*/ |
|||
|
|||
import { Model, ResourceLinks } from '@app/shared'; |
|||
|
|||
export class WorkflowDto extends Model<WorkflowDto> { |
|||
public readonly _links: ResourceLinks; |
|||
|
|||
constructor(links: ResourceLinks, |
|||
public readonly name: string, |
|||
public readonly steps: WorkflowStepDto[] |
|||
) { |
|||
super(); |
|||
|
|||
this._links = links; |
|||
} |
|||
|
|||
public addStep(name: string, color: string) { |
|||
let found = this.steps.find(x => x.name === name); |
|||
|
|||
if (found) { |
|||
return this; |
|||
} |
|||
|
|||
const steps = [...this.steps, new WorkflowStepDto(name, color, [])]; |
|||
|
|||
return this.with({ steps }); |
|||
} |
|||
|
|||
public changeStepColor(name: string, color: string) { |
|||
return this.updateStep(name, x => x.changeColor(color)); |
|||
} |
|||
|
|||
public changeStepName(name: string, newName: string) { |
|||
return this.updateStep(name, x => x.changeName(newName)); |
|||
} |
|||
|
|||
public removeStep(name: string) { |
|||
const steps = this.steps.filter(x => x.name !== name).map(x => x.removeTransition(name)); |
|||
|
|||
return this.with({ steps }); |
|||
} |
|||
|
|||
private updateStep(name: string, updater: (step: WorkflowStepDto) => WorkflowStepDto) { |
|||
let found = this.steps.find(x => x.name === name); |
|||
|
|||
if (!found) { |
|||
return this; |
|||
} |
|||
|
|||
const newStep = updater(found); |
|||
|
|||
const steps = this.steps.map(x => x.name === name ? newStep : x.replaceTransition(newStep)); |
|||
|
|||
return this.with({ steps }); |
|||
} |
|||
} |
|||
|
|||
export class WorkflowStepDto extends Model<WorkflowStepDto> { |
|||
constructor( |
|||
public readonly name: string, |
|||
public readonly color: string, |
|||
public readonly transitions: WorkflowTransitionDto[] |
|||
) { |
|||
super(); |
|||
} |
|||
|
|||
public changeName(name: string) { |
|||
return this.with({ name }); |
|||
} |
|||
|
|||
public changeColor(color: string) { |
|||
return this.with({ color }); |
|||
} |
|||
|
|||
public addTransition(step: WorkflowStepDto) { |
|||
let found = this.transitions.find(x => x.step.name === step.name); |
|||
|
|||
if (found) { |
|||
return this; |
|||
} |
|||
|
|||
const transitions = [...this.transitions, new WorkflowTransitionDto(step) ]; |
|||
|
|||
return this.with({ transitions }); |
|||
} |
|||
|
|||
public replaceTransition(step: WorkflowStepDto) { |
|||
const transitions = this.transitions.map(x => x.step.name === step.name ? new WorkflowTransitionDto(step, x.expression) : x); |
|||
|
|||
return this.with({ transitions }); |
|||
} |
|||
|
|||
public removeTransition(name: string) { |
|||
const transitions = this.transitions.filter(x => x.step.name !== name); |
|||
|
|||
return this.with({ transitions }); |
|||
} |
|||
|
|||
private updateStep(name: string, updater: (step: WorkflowStepDto) => WorkflowStepDto) { |
|||
let found = this.steps.find(x => x.name === name); |
|||
|
|||
if (!found) { |
|||
return this; |
|||
} |
|||
|
|||
const newStep = updater(found); |
|||
|
|||
const steps = this.steps.map(x => x.name === name ? newStep : x.replaceTransition(newStep)); |
|||
|
|||
return this.with({ steps }); |
|||
} |
|||
} |
|||
|
|||
export class WorkflowTransitionDto extends Model<WorkflowTransitionDto> { |
|||
constructor( |
|||
public readonly step: WorkflowStepDto, |
|||
public readonly expression?: string |
|||
) { |
|||
super(); |
|||
} |
|||
|
|||
public updateExpression(expression?: string) { |
|||
return this.with({ expression }); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue