diff --git a/packages/core/client/src/schema-component/antd/action/Action.Designer.tsx b/packages/core/client/src/schema-component/antd/action/Action.Designer.tsx index 8128dc1b2..0c53726f7 100644 --- a/packages/core/client/src/schema-component/antd/action/Action.Designer.tsx +++ b/packages/core/client/src/schema-component/antd/action/Action.Designer.tsx @@ -1,5 +1,5 @@ import { ArrayTable } from '@formily/antd-v5'; -import { onFieldValueChange, onFieldInputValueChange } from '@formily/core'; +import { onFieldValueChange, onFieldInputValueChange, onFieldInit } from '@formily/core'; import { connect, ISchema, mapProps, useField, useFieldSchema, useForm, useFormEffects } from '@formily/react'; import { isValid, uid } from '@formily/shared'; import { Alert, Tree as AntdTree, ModalProps } from 'antd'; @@ -17,6 +17,7 @@ import { useSyncFromForm } from '../../../schema-settings/DataTemplates/utils'; import { DefaultValueProvider } from '../../../schema-settings/hooks/useIsAllowToSetDefaultValue'; import { useLinkageAction } from './hooks'; import { requestSettingsSchema } from './utils'; +import { usePlugin } from '../../../application/hooks'; const Tree = connect( AntdTree, @@ -713,7 +714,7 @@ function RemoveButton( ); } -function FormWorkflowSelect(props) { +function WorkflowSelect({ types, ...props }) { const index = ArrayTable.useIndex(); const { setValuesIn } = useForm(); const baseCollection = useCollection(); @@ -745,7 +746,7 @@ function FormWorkflowSelect(props) { action: 'list', params: { filter: { - type: 'form', + type: types, enabled: true, 'config.collection': workflowCollection, }, @@ -760,6 +761,8 @@ function WorkflowConfig() { const { t } = useTranslation(); const fieldSchema = useFieldSchema(); const { name: collection } = useCollection(); + const workflowPlugin = usePlugin('workflow') as any; + const workflowTypes = workflowPlugin.getTriggersOptions().filter((item) => item.options.actionTriggerable); const description = { submit: t('Workflow will be triggered after submitting succeeded.', { ns: 'workflow' }), 'customize:save': t('Workflow will be triggered after saving succeeded.', { ns: 'workflow' }), @@ -777,7 +780,7 @@ function WorkflowConfig() { components={{ Alert, ArrayTable, - FormWorkflowSelect, + WorkflowSelect, }} schema={ { @@ -838,13 +841,14 @@ function WorkflowConfig() { workflowKey: { type: 'number', 'x-decorator': 'FormItem', - 'x-component': 'FormWorkflowSelect', + 'x-component': 'WorkflowSelect', 'x-component-props': { placeholder: t('Select workflow', { ns: 'workflow' }), fieldNames: { label: 'title', value: 'key', }, + types: workflowTypes.map((item) => item.value), }, required: true, }, @@ -859,7 +863,6 @@ function WorkflowConfig() { properties: { remove: { type: 'void', - 'x-decorator': 'FormItem', 'x-component': 'ArrayTable.Remove', }, }, diff --git a/packages/plugins/@nocobase/plugin-workflow/src/client/index.tsx b/packages/plugins/@nocobase/plugin-workflow/src/client/index.tsx index e2ee32909..7db5655b5 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/client/index.tsx +++ b/packages/plugins/@nocobase/plugin-workflow/src/client/index.tsx @@ -11,11 +11,17 @@ import { ExecutionPage } from './ExecutionPage'; import { WorkflowPage } from './WorkflowPage'; import { WorkflowProvider } from './WorkflowProvider'; import { DynamicExpression } from './components/DynamicExpression'; +import { triggers, useTrigger, getTriggersOptions } from './triggers'; +import { instructions } from './nodes'; import { WorkflowTodo } from './nodes/manual/WorkflowTodo'; import { WorkflowTodoBlockInitializer } from './nodes/manual/WorkflowTodoBlockInitializer'; import { useTriggerWorkflowsActionProps } from './triggers/form'; export class WorkflowPlugin extends Plugin { + triggers = triggers; + getTriggersOptions = getTriggersOptions; + instructions = instructions; + async load() { this.addRoutes(); this.addScopes(); diff --git a/packages/plugins/@nocobase/plugin-workflow/src/client/triggers/form.tsx b/packages/plugins/@nocobase/plugin-workflow/src/client/triggers/form.tsx index 6ad4217ca..34140482b 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/client/triggers/form.tsx +++ b/packages/plugins/@nocobase/plugin-workflow/src/client/triggers/form.tsx @@ -101,6 +101,7 @@ export default { }; }, initializers: {}, + actionTriggerable: true, }; function getFormValues({ diff --git a/packages/plugins/@nocobase/plugin-workflow/src/client/triggers/index.tsx b/packages/plugins/@nocobase/plugin-workflow/src/client/triggers/index.tsx index 5c5c1778c..d344d44e7 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/client/triggers/index.tsx +++ b/packages/plugins/@nocobase/plugin-workflow/src/client/triggers/index.tsx @@ -61,6 +61,7 @@ export interface Trigger { components?: { [key: string]: any }; useInitializers?(config): SchemaInitializerItemOptions | null; initializers?: any; + actionTriggerable?: boolean; } export const triggers = new Registry(); @@ -311,9 +312,10 @@ export function useTrigger() { } export function getTriggersOptions() { - return Array.from(triggers.getEntities()).map(([value, { title }]) => ({ + return Array.from(triggers.getEntities()).map(([value, { title, ...options }]) => ({ value, label: title, color: 'gold', + options, })); } diff --git a/packages/plugins/@nocobase/plugin-workflow/src/server/actions/workflows.ts b/packages/plugins/@nocobase/plugin-workflow/src/server/actions/workflows.ts index 6ef774577..a67a237d1 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/server/actions/workflows.ts +++ b/packages/plugins/@nocobase/plugin-workflow/src/server/actions/workflows.ts @@ -196,3 +196,7 @@ export async function sync(context: Context, next) { await next(); } + +export async function trigger(context: Context, next) { + return next(); +} diff --git a/packages/plugins/@nocobase/plugin-workflow/src/server/index.ts b/packages/plugins/@nocobase/plugin-workflow/src/server/index.ts index b91320a24..ad40bebf9 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/server/index.ts +++ b/packages/plugins/@nocobase/plugin-workflow/src/server/index.ts @@ -1,3 +1,4 @@ +export * from './utils'; export * from './constants'; export type * from './instructions'; export { Trigger } from './triggers'; diff --git a/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/form.ts b/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/form.ts index ea9dbcd06..e2c2cfc40 100644 --- a/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/form.ts +++ b/packages/plugins/@nocobase/plugin-workflow/src/server/triggers/form.ts @@ -12,12 +12,9 @@ export default class FormTrigger extends Trigger { super(plugin); plugin.app.resourcer.use(this.middleware); - plugin.app.actions({ - ['workflows:trigger']: this.triggerAction, - }); } - triggerAction = async (context, next) => { + async triggerAction(context, next) { const { triggerWorkflows } = context.action.params; if (!triggerWorkflows) { @@ -28,21 +25,26 @@ export default class FormTrigger extends Trigger { await next(); this.trigger(context); - }; + } middleware = async (context, next) => { - await next(); - const { resourceName, actionName, params: { triggerWorkflows }, } = context.action; + + if (resourceName === 'workflows' && actionName === 'trigger') { + return this.triggerAction(context, next); + } + + await next(); + if (!triggerWorkflows) { return; } - if ((resourceName === 'workflows' && actionName === 'trigger') || !['create', 'update'].includes(actionName)) { + if (!['create', 'update'].includes(actionName)) { return; }