tachybase_todo/packages/plugins/workflow/src/client/WorkflowProvider.tsx
Junyi 52329df140
feat: (plugin-workflow) dynamic expression (#1560)
* feat(plugin-formula): add dynamic expression field

* feat(plugin-workflow): add dynamic expression for calculation

* refactor(client): allow select part of paths in variable component

* fix(client): fix types

* feat(plugin-formula): add dynamic expression config

* feat(plugin-workflow): add dynamic calculation

* refactor(plugin-formula): move expression field type to workflow plugin

* fix(plugin-workflow): fix types

* fix(plugin-workflow): fix register field in client

* fix(plugin-workflow): fix expression result value default

* fix(plugin-workflow): fix dynamic expression field error when switch collection

* fix(plugin-workflow): test component value change

* test(plugin-workflow): test component linkages

* refactor(plugin-workflow): change to expression collection template

* fix(client): fix hooks of Variable.TextArea

* fix(client): fix to import evaluators in client

* fix(evaluators): move renderReference method to plugin

* fix(plugin-workflow): fix missed component

* fix(plugin-workflow): fix dynamic expression test case

* refactor(client): change popover to double click to choose entire object

* refactor(plugin-workflow): make variable options and filter more sensible

* fix(plugin-workflow): fix form effect

* fix(plugin-workflow): fix variable filtering in collection trigger

* fix(plugin-workflow): fix types

---------

Co-authored-by: chenos <chenlinxh@gmail.com>
2023-04-07 19:52:31 -07:00

117 lines
3.6 KiB
TypeScript

import React, { useContext } from 'react';
import { Card } from 'antd';
import { CollectionManagerContext, PluginManagerContext, RouteSwitchContext, SchemaComponent, SchemaComponentOptions, SettingsCenterProvider, registerField, useCollectionDataSource } from '@nocobase/client';
import { WorkflowPage } from './WorkflowPage';
import { ExecutionPage } from './ExecutionPage';
import { triggers } from './triggers';
import { instructions } from './nodes';
import { lang } from './locale';
import { workflowSchema } from './schemas/workflows';
import { WorkflowLink } from './WorkflowLink';
import { ExecutionResourceProvider } from './ExecutionResourceProvider';
import { ExecutionLink } from './ExecutionLink';
import OpenDrawer from './components/OpenDrawer';
import { WorkflowTodo } from './nodes/manual/WorkflowTodo';
import { WorkflowTodoBlockInitializer } from './nodes/manual/WorkflowTodoBlockInitializer';
import { DynamicExpression } from './components/DynamicExpression';
import expressionField from './interfaces/expression';
// registerField(expressionField.group, 'expression', expressionField);
export const WorkflowContext = React.createContext({});
export function useWorkflowContext() {
return useContext(WorkflowContext);
}
function WorkflowPane() {
return (
<Card bordered={false}>
<SchemaComponent
schema={workflowSchema}
components={{
WorkflowLink,
ExecutionResourceProvider,
ExecutionLink,
OpenDrawer
}}
/>
</Card>
);
};
export const WorkflowProvider = (props) => {
const pmCtx = useContext(PluginManagerContext);
const cmCtx = useContext(CollectionManagerContext);
const { routes, components, ...others } = useContext(RouteSwitchContext);
routes[1].routes.unshift(
{
type: 'route',
path: '/admin/settings/workflow/workflows/:id',
component: 'WorkflowPage',
},
{
type: 'route',
path: '/admin/settings/workflow/executions/:id',
component: 'ExecutionPage',
},
);
return (
<SettingsCenterProvider
settings={{
workflow: {
icon: 'PartitionOutlined',
// title: `{{t("Workflow", { ns: "${NAMESPACE}" })}}`,
title: lang('Workflow'),
tabs: {
workflows: {
isBookmark: true,
title: lang('Workflow'),
component: WorkflowPane,
},
},
},
}}
>
<PluginManagerContext.Provider
value={{
components: {
...pmCtx?.components,
// WorkflowShortcut,
},
}}
>
<RouteSwitchContext.Provider value={{ components: { ...components, WorkflowPage, ExecutionPage }, ...others, routes }}>
<SchemaComponentOptions
components={{
WorkflowTodo,
WorkflowTodoBlockInitializer,
DynamicExpression
}}
scope={{
useCollectionDataSource
}}
>
<CollectionManagerContext.Provider
value={{
...cmCtx,
interfaces: {
...cmCtx.interfaces,
expression: expressionField
}
}}
>
<WorkflowContext.Provider value={{ triggers, instructions }}>
{props.children}
</WorkflowContext.Provider>
</CollectionManagerContext.Provider>
</SchemaComponentOptions>
</RouteSwitchContext.Provider>
</PluginManagerContext.Provider>
</SettingsCenterProvider>
);
};