diff --git a/models/process/src/actions.ts b/models/process/src/actions.ts index 4fa5a49ec1..edf1d91533 100644 --- a/models/process/src/actions.ts +++ b/models/process/src/actions.ts @@ -48,18 +48,6 @@ export function defineMethods (builder: Builder): void { process.method.CreateToDo ) - builder.createDoc( - process.class.Trigger, - core.space.Model, - { - label: process.string.OnExecutionStart, - icon: process.icon.Process, - init: true, - requiredParams: [] - }, - process.trigger.OnExecutionStart - ) - builder.createDoc( process.class.Method, core.space.Model, diff --git a/models/process/src/index.ts b/models/process/src/index.ts index 0775f51ee6..61a2f5b4c2 100644 --- a/models/process/src/index.ts +++ b/models/process/src/index.ts @@ -16,6 +16,7 @@ import core, { AccountRole, type Class, DOMAIN_MODEL, + DOMAIN_TRANSIENT, type Doc, type Domain, type Rank, @@ -48,6 +49,7 @@ import { type CheckFunc, type ContextId, type CreatedContext, + type ProcessCustomEvent, type Execution, type ExecutionContext, type ExecutionError, @@ -65,16 +67,17 @@ import { type Transition, type Trigger, type UpdateCriteriaComponent, - processId + processId, + type EventButton } from '@hcengineering/process' import time from '@hcengineering/time' import { type AnyComponent } from '@hcengineering/ui' import { type AttributeCategory } from '@hcengineering/view' import { defineMethods } from './actions' -import { defineTriggers } from './triggers' import { defineFunctions } from './functions' -import process from './plugin' import { definePermissions } from './permission' +import process from './plugin' +import { defineTriggers } from './triggers' const DOMAIN_PROCESS = 'process' as Domain const DOMAIN_PROCESS_LOG = 'process-log' as Domain @@ -234,6 +237,30 @@ export class TState extends TDoc implements State { rank!: Rank } +@Model(process.class.ProcessCustomEvent, core.class.Doc, DOMAIN_TRANSIENT) +export class TProcessCustomEvent extends TDoc implements ProcessCustomEvent { + eventType!: string + + @Prop(TypeRef(process.class.Execution), process.string.Execution) + execution!: Ref + + @Prop(TypeRef(card.class.Card), card.string.Card) + card!: Ref +} + +@Model(process.class.EventButton, core.class.Doc, DOMAIN_PROCESS) +export class TEventButton extends TDoc implements EventButton { + title!: string + + eventType!: string + + @Prop(TypeRef(process.class.Execution), process.string.Execution) + execution!: Ref + + @Prop(TypeRef(card.class.Card), card.string.Card) + card!: Ref +} + @Model(process.class.ProcessFunction, core.class.Doc, DOMAIN_MODEL) export class TProcessFunction extends TDoc implements ProcessFunction { of!: Ref>> @@ -269,7 +296,9 @@ export function createModel (builder: Builder): void { TTransition, TTrigger, TExecutionLog, - TUpdateCriteriaComponent + TUpdateCriteriaComponent, + TProcessCustomEvent, + TEventButton ) builder.createDoc( diff --git a/models/process/src/triggers.ts b/models/process/src/triggers.ts index 3a703b2654..600dd2b84b 100644 --- a/models/process/src/triggers.ts +++ b/models/process/src/triggers.ts @@ -32,6 +32,18 @@ export function defineTriggers (builder: Builder): void { process.trigger.OnToDoClose ) + builder.createDoc( + process.class.Trigger, + core.space.Model, + { + label: process.string.OnExecutionStart, + icon: process.icon.Process, + init: true, + requiredParams: [] + }, + process.trigger.OnExecutionStart + ) + builder.createDoc( process.class.Trigger, core.space.Model, @@ -80,6 +92,24 @@ export function defineTriggers (builder: Builder): void { process.trigger.WhenFieldChanges ) + // builder.createDoc( + // process.class.Trigger, + // core.space.Model, + // { + // label: process.string.OnEvent, + // icon: process.icon.OnEvent, + // editor: process.component.OnEventEditor, + // presenter: process.component.OnEventPresenter, + // requiredParams: [ + // 'eventType' + // ], + // checkFunction: process.triggerCheck.OnEventCheck, + // init: false, + // auto: false + // }, + // process.trigger.OnEvent + // ) + builder.createDoc( process.class.Trigger, core.space.Model, diff --git a/models/server-process/src/index.ts b/models/server-process/src/index.ts index 4fb6e8eb54..1ff1fa256f 100644 --- a/models/server-process/src/index.ts +++ b/models/server-process/src/index.ts @@ -61,14 +61,25 @@ export function createModel (builder: Builder): void { }) builder.mixin(process.trigger.OnCardUpdate, process.class.Trigger, serverProcess.mixin.TriggerImpl, { + preventRollback: true, serverCheckFunc: serverProcess.func.MatchCardCheck }) builder.mixin(process.trigger.WhenFieldChanges, process.class.Trigger, serverProcess.mixin.TriggerImpl, { + preventRollback: true, serverCheckFunc: serverProcess.func.FieldChangedCheck }) + builder.mixin(process.trigger.OnExecutionStart, process.class.Trigger, serverProcess.mixin.TriggerImpl, { + preventRollback: true + }) + + // builder.mixin(process.trigger.OnEvent, process.class.Trigger, serverProcess.mixin.TriggerImpl, { + // serverCheckFunc: serverProcess.func.EventCheck + // }) + builder.mixin(process.trigger.OnTime, process.class.Trigger, serverProcess.mixin.TriggerImpl, { + preventRollback: true, serverCheckFunc: serverProcess.func.CheckTime }) @@ -290,6 +301,22 @@ export function createModel (builder: Builder): void { isAsync: true }) + builder.createDoc(serverCore.class.Trigger, core.space.Model, { + trigger: serverProcess.trigger.OnCustomEvent, + txMatch: { + _class: core.class.TxCreateDoc, + objectClass: process.class.ProcessCustomEvent + } + }) + + builder.createDoc(serverCore.class.Trigger, core.space.Model, { + trigger: serverProcess.trigger.OnExecutionRemove, + txMatch: { + _class: core.class.TxRemoveDoc, + objectClass: process.class.Execution + } + }) + builder.createDoc(serverCore.class.Trigger, core.space.Model, { trigger: serverProcess.trigger.OnProcessToDoClose, txMatch: { diff --git a/plugins/process-assets/src/index.ts b/plugins/process-assets/src/index.ts index c68b4f147c..e048f14ba7 100644 --- a/plugins/process-assets/src/index.ts +++ b/plugins/process-assets/src/index.ts @@ -27,5 +27,6 @@ loadMetadata(process.icon, { Start: `${icons}#start`, WhenCardMatches: `${icons}#card-matches`, WhenFieldChanges: `${icons}#field-change`, - Time: `${icons}#time` + Time: `${icons}#time`, + OnEvent: `${icons}#start` }) diff --git a/plugins/process-resources/src/components/ProcessesHeaderExtension.svelte b/plugins/process-resources/src/components/ProcessesHeaderExtension.svelte index c549313f38..8c0cf715f7 100644 --- a/plugins/process-resources/src/components/ProcessesHeaderExtension.svelte +++ b/plugins/process-resources/src/components/ProcessesHeaderExtension.svelte @@ -17,7 +17,7 @@ import { getCurrentEmployee } from '@hcengineering/contact' import { getEmbeddedLabel } from '@hcengineering/platform' import { createQuery, getClient } from '@hcengineering/presentation' - import { Execution, ExecutionStatus, ProcessToDo } from '@hcengineering/process' + import { EventButton, Execution, ExecutionStatus, ProcessToDo } from '@hcengineering/process' import { Button } from '@hcengineering/ui' import process from '../plugin' @@ -25,6 +25,18 @@ let docs: Execution[] = [] let todos: ProcessToDo[] = [] + let actions: EventButton[] = [] + + const buttonsQuery = createQuery() + $: buttonsQuery.query( + process.class.EventButton, + { + card: card._id + }, + (res) => { + actions = res + } + ) const executionQuery = createQuery() $: executionQuery.query( @@ -60,8 +72,41 @@ doneOn: new Date().getTime() }) } + + async function performAction (action: EventButton) { + await client.createDoc(process.class.ProcessCustomEvent, action.space, { + execution: action.execution, + eventType: action.eventType, + card: card._id + }) + } + + async function performRollback (execution: Execution) { + await client.createDoc(process.class.ProcessCustomEvent, execution.space, { + execution: execution._id, + eventType: 'rollback', + card: card._id + }) + } + + function getExecutionLabel (execution: Execution): string { + const pr = client.getModel().findObject(execution.process) + if (pr !== undefined) { + return `${pr.name}: ` + } + return '' + } + + $: rollbacks = docs.filter((d) => d.rollback.length > 0) {#each todos as todo (todo._id)}