diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/node.ApprovalInstruction.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/Approval.node.tsx similarity index 95% rename from packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/node.ApprovalInstruction.tsx rename to packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/Approval.node.tsx index e7001c0d7..c7d3f2dae 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/node.ApprovalInstruction.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/Approval.node.tsx @@ -13,9 +13,9 @@ import { AssigneesSelect } from './approval-config/VC.AssigneesSelect'; import { ContentTooltip } from './approval-config/VC.ContentTooltip'; import { NegotiationConfig } from './approval-config/VC.NegotiationConfig'; import { SchemaConfigButtonApprover } from './approval-config/VC.SchemaConfigButtonApprover'; +import { ApprovalInstructionNode } from './ApprovalNode.component'; import { ApproverInterfaceComponent } from './approver-interface/ApproverInterface.schema'; import { isApprovalReturnFunc } from './utils'; -import { ApprovalInstructionNode } from './VC.ApprovalInstructionNode'; // 工作流节点 nodes - 人工处理->审批 export class ApprovalInstruction extends Instruction { @@ -42,13 +42,6 @@ export class ApprovalInstruction extends Instruction { ]; // 审批节点表单设置 fieldset = { - collection: { - type: 'string', - title: '{{t("Collection")}}', - 'x-decorator': 'FormItem', - 'x-component': 'DataSourceCollectionCascader', - // 'x-disabled': '{{ useWorkflowAnyExecuted() }}', - }, branchMode: { type: 'boolean', title: `{{t("Pass mode", { ns: "${NAMESPACE}" })}}`, diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/VC.ApprovalInstructionNode.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/ApprovalNode.component.tsx similarity index 100% rename from packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/VC.ApprovalInstructionNode.tsx rename to packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/ApprovalNode.component.tsx diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/Pd.ContextApproverConfig.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/ApproverConfig.context.tsx similarity index 100% rename from packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/Pd.ContextApproverConfig.tsx rename to packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/ApproverConfig.context.tsx diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approval-config/VC.SchemaConfigButtonApprover.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approval-config/VC.SchemaConfigButtonApprover.tsx index a584324e4..996fcd459 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approval-config/VC.SchemaConfigButtonApprover.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approval-config/VC.SchemaConfigButtonApprover.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { useActionContext } from '@tachybase/client'; import { ConfigButtonView } from '../../trigger/ConfigButton.view'; -import { ContextApproverConfig } from '../Pd.ContextApproverConfig'; +import { ContextApproverConfig } from '../ApproverConfig.context'; // 审批人操作界面->进入配置按钮 export const SchemaConfigButtonApprover = (props) => { diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/Iz.ApproverAddBlock.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/ApproverAddBlock.initializer.tsx similarity index 77% rename from packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/Iz.ApproverAddBlock.tsx rename to packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/ApproverAddBlock.initializer.tsx index 8ebf31306..c3fd1d566 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/Iz.ApproverAddBlock.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/ApproverAddBlock.initializer.tsx @@ -1,11 +1,11 @@ -import { gridRowColWrap, SchemaInitializer, usePlugin } from '@tachybase/client'; +import { gridRowColWrap, SchemaInitializer, useDataSourceManager, usePlugin } from '@tachybase/client'; import { useFlowContext } from '../../../../../FlowContext'; import { useAvailableUpstreams, useNodeContext } from '../../../../../nodes'; import { PluginWorkflow } from '../../../../../Plugin'; import { useTrigger } from '../../../../../triggers'; import { NAMESPACE } from '../../../locale'; -import { EditableForm } from './EditableForm.schema'; +import { approvalFormOptions, ApprovalFormType } from '../forms/Approval.options'; import { ApproverAddBlockComponent } from './VC.ApproverAddBlock'; import { ApproverAddBlockKit } from './VC.ApproverAddBlockKit'; @@ -33,19 +33,6 @@ export const ApproverAddBlockInitializer = new SchemaInitializer({ }, ], }, - { - name: 'forms', - type: 'itemGroup', - title: '{{t("Form")}}', - children: [ - { - name: 'form', - type: 'item', - title: `{{t("Apply form", { ns: "${NAMESPACE}" })}}`, - Component: EditableForm, - }, - ], - }, { type: 'itemGroup', name: 'dataBlocks', @@ -79,6 +66,22 @@ export const ApproverAddBlockInitializer = new SchemaInitializer({ ].filter(Boolean); }, }, + { + type: 'itemGroup', + name: 'form', + title: '{{t("Form")}}', + useChildren() { + const dm = useDataSourceManager(); + const allCollections = dm.getAllCollections(); + const values = Array.from(approvalFormOptions.getValues()); + return values.map((item: ApprovalFormType) => { + // NOTE: 这里通过赋别名,避免 eslint 检查 hooks 语法,无法提交 + // eslint-disable-next-line react-hooks/rules-of-hooks + const { useInitializer: getInitializer } = item.config; + return getInitializer({ allCollections }); + }); + }, + }, { name: 'others', type: 'itemGroup', diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/ApproverBlock.view.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/ApproverBlock.view.tsx index cfe151c8f..aa835f190 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/ApproverBlock.view.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/ApproverBlock.view.tsx @@ -8,7 +8,7 @@ import { Spin } from 'antd'; import { DetailsBlockProvider, SimpleDesigner } from '../../../../../components'; import { FormBlockProvider } from '../../../common/Pd.FormBlock'; import { flatSchemaArray } from '../../../constants'; -import { ContextApproverConfig } from '../Pd.ContextApproverConfig'; +import { ContextApproverConfig } from '../ApproverConfig.context'; import { ActionBarProvider } from './Pd.ActionBarProvider'; import { ApprovalActionProvider } from './Pd.ApprovalActionProvider'; import { ContextApproverBlock } from './Pd.SchemaConfigButtonContext'; diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/EditableForm.schema.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/EditableForm.schema.tsx deleted file mode 100644 index 9fc52f527..000000000 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/EditableForm.schema.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react'; -import { - createEditFormBlockUISchema, - createFormBlockSchema, - parseCollectionName, - SchemaInitializerItem, - useRecordCollectionDataSourceItems, - useSchemaInitializer, - useSchemaInitializerItem, - useSchemaTemplateManager, -} from '@tachybase/client'; -import { useForm } from '@tachybase/schema'; - -import { APPROVAL_STATUS, flatSchemaArray } from '../../../constants'; - -export const EditableForm = () => { - const { insert } = useSchemaInitializer(); - const { getTemplateSchemaByMode } = useSchemaTemplateManager(); - const { values } = useForm(); - const [dataSource, collectionName] = parseCollectionName(values.collection); - - const itemConfig = useSchemaInitializerItem(); - const items = useRecordCollectionDataSourceItems('FormItem'); - - const onClick = async ({ item }) => { - const template = item.template ? await getTemplateSchemaByMode(item) : null; - const formSchema = createEditFormBlockUISchema({ - dataSource: dataSource, - collectionName: collectionName, - templateSchema: template, - }); - const [key] = Object.keys(formSchema.properties); - const [targetSchema] = flatSchemaArray( - formSchema.properties[key], - (property) => property['x-component'] === 'ActionBar', - ); - - targetSchema['x-decorator'] = 'ActionBarProvider'; - targetSchema['x-component-props'].style = { marginTop: '1.5em', flexWrap: 'wrap' }; - - insert(formSchema); - }; - - return ; -}; diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/Pd.ApprovalActionProvider.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/Pd.ApprovalActionProvider.tsx index dcf362b53..378a8634d 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/Pd.ApprovalActionProvider.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/approver-interface/Pd.ApprovalActionProvider.tsx @@ -1,3 +1,4 @@ export const ApprovalActionProvider = (props) => { + console.log('%c Line:2 🍰 props', 'font-size:18px;color:#4fff4B;background:#7f2b82', props); return props.children; }; diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/AddActionButton.setting.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/AddActionButton.setting.tsx new file mode 100644 index 000000000..078db4f1b --- /dev/null +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/AddActionButton.setting.tsx @@ -0,0 +1,102 @@ +import React from 'react'; +import { CompatibleSchemaInitializer, InitializerWithSwitch, useSchemaInitializerItem } from '@tachybase/client'; + +import { JOB_STATUS } from '../../../../../constants'; +import { APPROVAL_ACTION_STATUS } from '../../../constants'; +import { NAMESPACE } from '../../../locale'; + +/** + * @deprecated + */ +// NOTE: 似乎没用, 但删除又报错, 先保留着 +const addActionButton_deprecated = new CompatibleSchemaInitializer({ + name: 'ApprovalAddActionButton', + title: '{{t("Configure actions")}}', + items: [ + { + name: 'jobStatusResolved', + title: `{{t("Continue the process", { ns: "${NAMESPACE}" })}}`, + Component: ActionInitializer, + action: JOB_STATUS.RESOLVED, + actionProps: { + type: 'primary', + }, + }, + { + name: 'jobStatusRejected', + title: `{{t("Terminate the process", { ns: "${NAMESPACE}" })}}`, + Component: ActionInitializer, + action: JOB_STATUS.REJECTED, + actionProps: { + danger: true, + }, + }, + { + name: 'jobStatusPending', + title: `{{t("Save temporarily", { ns: "${NAMESPACE}" })}}`, + Component: ActionInitializer, + action: JOB_STATUS.PENDING, + }, + ], +}); + +export const ApprovalAddActionButton = new CompatibleSchemaInitializer( + { + name: 'ApprovalAddActionButton', + title: '{{t("Configure actions")}}', + items: [ + { + name: 'approvalStatusResolved', + title: `{{t("Continue the process", { ns: "${NAMESPACE}" })}}`, + Component: ActionInitializer, + statusApproval: APPROVAL_ACTION_STATUS.APPROVED, + actionProps: { + type: 'primary', + }, + }, + { + name: 'approvalStatusRejected', + title: `{{t("Terminate the process", { ns: "${NAMESPACE}" })}}`, + Component: ActionInitializer, + statusApproval: APPROVAL_ACTION_STATUS.REJECTED, + actionProps: { + danger: true, + }, + }, + { + name: 'approvalStatusPending', + title: `{{t("Save temporarily", { ns: "${NAMESPACE}" })}}`, + Component: ActionInitializer, + statusApproval: APPROVAL_ACTION_STATUS.PENDING, + }, + ], + }, + addActionButton_deprecated, +); + +function ActionInitializer() { + const itemConfig = useSchemaInitializerItem(); + const { statusApproval, actionProps, ...others } = itemConfig; + return ( + useSubmit({source: "updateRecord"}) }}`, + }, + 'x-designer': 'Action.Designer', + 'x-action': `${statusApproval}`, + }} + type="x-action" + /> + ); +} diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/Approval.options.ts b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/Approval.options.ts new file mode 100644 index 000000000..715a8f99e --- /dev/null +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/Approval.options.ts @@ -0,0 +1,45 @@ +import { SchemaInitializerItemType } from '@tachybase/client'; +import { Registry } from '@tachybase/utils/client'; + +import { JOB_STATUS } from '../../../../../constants'; +import updateFormConfig from './update'; + +type ValueOf = T[keyof T]; + +export type FormType = { + type: 'create' | 'update' | 'custom'; + title: string; + actions: ValueOf[]; + collection: + | string + | { + name: string; + fields: any[]; + [key: string]: any; + }; +}; + +export type ApprovalFormType = { + title: string; + config: { + useInitializer: ({ allCollections }?: { allCollections: any[] }) => SchemaInitializerItemType; + initializers?: { + [key: string]: React.FC; + }; + components?: { + [key: string]: React.FC; + }; + parseFormOptions(root: ISchema): { [key: string]: FormType }; + }; + block: { + scope?: { + [key: string]: () => any; + }; + components?: { + [key: string]: React.FC; + }; + }; +}; + +export const approvalFormOptions = new Registry(); +approvalFormOptions.register('updateForm', updateFormConfig as ApprovalFormType); diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/FormBlock.factory.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/FormBlock.factory.tsx new file mode 100644 index 000000000..0a9b6b020 --- /dev/null +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/FormBlock.factory.tsx @@ -0,0 +1,67 @@ +import React from 'react'; +import { + CollectionProvider_deprecated, + createFormBlockSchema, + Plugin, + SchemaInitializerItem, + SchemaInitializerItemType, + useRecordCollectionDataSourceItems, + useSchemaInitializer, + useSchemaInitializerItem, + useSchemaTemplateManager, +} from '@tachybase/client'; + +import { traverseSchema } from '../../../../../utils'; +import { ApprovalAddActionButton } from './AddActionButton.setting'; + +export class KitApprovalAddActionButton extends Plugin { + async load() { + this.app.schemaInitializerManager.add(ApprovalAddActionButton); + } +} + +function InternalFormBlockInitializer({ schema, ...others }) { + const { insert } = useSchemaInitializer(); + const { getTemplateSchemaByMode } = useSchemaTemplateManager(); + const items = useRecordCollectionDataSourceItems('FormItem') as SchemaInitializerItemType[]; + const onClick = async (item) => { + const template = item.template ? await getTemplateSchemaByMode(item) : null; + const result = createFormBlockSchema({ + actionInitializers: 'ApprovalAddActionButton', + ...schema, + template, + }); + delete result['x-acl-action-props']; + delete result['x-acl-action']; + const [formKey] = Object.keys(result.properties); + //获取actionBar的schemakey + const actionKey = + Object.entries(result.properties[formKey].properties).find(([key, f]) => f['x-component'] === 'ActionBar')?.[0] || + 'actions'; + result.properties[formKey].properties[actionKey]['x-decorator'] = 'ActionBarProvider'; + result.properties[formKey].properties[actionKey]['x-component-props'].style = { + marginTop: '1.5em', + flexWrap: 'wrap', + }; + traverseSchema(result, (node) => { + if (node['x-uid']) { + delete node['x-uid']; + } + }); + insert(result); + }; + + return ; +} + +export const FormBlockFactory = () => { + const itemConfig = useSchemaInitializerItem(); + return ( + + + + ); +}; diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/update.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/update.tsx new file mode 100644 index 000000000..b88ac7c29 --- /dev/null +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/forms/update.tsx @@ -0,0 +1,109 @@ +import { useMemo, useState } from 'react'; +import { useMenuSearch } from '@tachybase/client'; + +import _ from 'lodash'; + +import { FilterDynamicComponent } from '../../../../../components'; +import { NAMESPACE } from '../../../locale'; +import { FormBlockFactory } from './FormBlock.factory'; + +const updateFormConfig = { + title: `{{t("Update record form", { ns: "${NAMESPACE}" })}}`, + config: { + initializers: {}, + components: { + FilterDynamicComponent, + }, + useInitializer: ({ allCollections }) => { + const childItems = useMemo(() => { + const results = allCollections.map(({ key, displayName, collections }) => ({ + key, + name: key, + label: displayName, + type: 'subMenu', + children: collections.map(({ name, title, tableName }) => ({ + name: _.camelCase(`updateRecordForm-child-${name}`), + type: 'item', + title: title || tableName, + schema: { + collection: name, + dataSource: key, + formType: 'update', + }, + Component: FormBlockFactory, + })), + })); + return results; + }, [allCollections]); + const [openMenuKeys, setOpenMenuKeys] = useState([]); + const searchedChildren = useMenuSearch({ data: childItems, openKeys: openMenuKeys }); + return { + name: 'updateRecordForm', + key: 'updateRecordForm', + type: 'subMenu', + title: `{{t("Update record form", { ns: "${NAMESPACE}" })}}`, + componentProps: { + onOpenChange(keys) { + setOpenMenuKeys(keys); + }, + }, + children: searchedChildren, + }; + }, + parseFormOptions: (root) => { + const forms = {}; + const formBlocks: any[] = findSchema( + root, + (item) => item['x-decorator'] === 'FormBlockProvider' && item['x-decorator-props'].formType === 'update', + ); + + formBlocks.forEach((formBlock) => { + const [formKey] = Object.keys(formBlock.properties); + const formSchema = formBlock.properties[formKey]; + //获取actionBar的schemakey + const actionKey = + Object.entries(formSchema.properties).find(([key, f]) => f['x-component'] === 'ActionBar')?.[0] || 'actions'; + forms[formKey] = { + ...formBlock['x-decorator-props'], + type: 'update', + title: formBlock['x-component-props']?.title || formKey, + actions: findSchema(formSchema.properties[actionKey], (item) => item['x-component'] === 'Action').map( + (item) => ({ + status: item['x-decorator-props'].value, + values: item['x-action-settings']?.assignedValues?.values, + key: item.name, + }), + ), + }; + }); + return forms; + }, + }, + block: { + scope: {}, + components: {}, + }, +}; + +// utils +function findSchema(schema, filter, onlyLeaf = false) { + const result = []; + + if (!schema) { + return result; + } + + if (filter(schema) && (!onlyLeaf || !schema.properties)) { + result.push(schema); + return result; + } + + if (schema.properties) { + Object.keys(schema.properties).forEach((key) => { + result.push(...findSchema(schema.properties[key], filter)); + }); + } + return result; +} + +export default updateFormConfig; diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/plugin.ts b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/plugin.ts index 07eb4c56e..cba308129 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/plugin.ts +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/instruction/plugin.ts @@ -1,11 +1,16 @@ import { Plugin } from '@tachybase/client'; import { PluginWorkflow } from '../../../../Plugin'; +import { ApprovalInstruction } from './Approval.node'; +import { ApproverAddBlockInitializer } from './approver-interface/ApproverAddBlock.initializer'; import { ApproverActionConfigInitializer } from './approver-interface/Iz.ApproverActionConfig'; -import { ApproverAddBlockInitializer } from './approver-interface/Iz.ApproverAddBlock'; -import { ApprovalInstruction } from './node.ApprovalInstruction'; +import { KitApprovalAddActionButton } from './forms/FormBlock.factory'; export class KitApprovalInstruction extends Plugin { + async afterAdd(): Promise { + this.pm.add(KitApprovalAddActionButton); + } + async load() { const pluginWorkflow = this.app.pm.get(PluginWorkflow); pluginWorkflow.registerInstruction('approval', ApprovalInstruction); diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/trigger/launcher-interface/LauncherInterface.schema.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/trigger/launcher-interface/LauncherInterface.schema.tsx index d41f7dc7d..82e2b7e5d 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/trigger/launcher-interface/LauncherInterface.schema.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/configuration/trigger/launcher-interface/LauncherInterface.schema.tsx @@ -5,37 +5,7 @@ import { useForm } from '@tachybase/schema'; import { NAMESPACE } from '../../../locale'; import { SchemaAddBlock } from './SchemaAddBlock.component'; -// 发起人操作界面 -const getSchemaLauncherInterface = ({ values, dataSource, name }) => ({ - name: values.collection, - type: 'void', - properties: { - drawer: { - type: 'void', - title: `{{t("Initiator's interface", { ns: "${NAMESPACE}" })}}`, - 'x-component': 'Action.Drawer', - 'x-component-props': { - className: css` - .ant-drawer-body { - background: const(--tb-box-bg); - } - `, - }, - properties: { - applyForm: { - type: 'string', - 'x-decorator': 'CollectionProvider_deprecated', - 'x-decorator-props': { - dataSource, - name, - }, - 'x-component': 'SchemaAddBlock', - }, - }, - }, - }, -}); // 触发器-发起人的操作界面 - +// 触发器-发起人的操作界面 export const LauncherInterface = () => { const { values } = useForm(); const [dataSource, name] = parseCollectionName(values.collection); @@ -50,3 +20,36 @@ export const LauncherInterface = () => { /> ); }; + +// 发起人操作界面 +function getSchemaLauncherInterface({ values, dataSource, name }) { + return { + name: values.collection, + type: 'void', + properties: { + drawer: { + type: 'void', + title: `{{t("Initiator's interface", { ns: "${NAMESPACE}" })}}`, + 'x-component': 'Action.Drawer', + 'x-component-props': { + className: css` + .ant-drawer-body { + background: const(--tb-box-bg); + } + `, + }, + properties: { + applyForm: { + type: 'string', + 'x-decorator': 'CollectionProvider_deprecated', + 'x-decorator-props': { + dataSource, + name, + }, + 'x-component': 'SchemaAddBlock', + }, + }, + }, + }, + }; +} diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/constants.ts b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/constants.ts index 5047428a7..523ac9c98 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/constants.ts +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/constants.ts @@ -1,7 +1,7 @@ import { JOB_STATUS } from '../../constants'; import { lang, NAMESPACE } from './locale'; -// 审批状态 +// 审批发起的状态 export const APPROVAL_STATUS = { DRAFT: 0, RETURNED: 1, @@ -11,6 +11,7 @@ export const APPROVAL_STATUS = { REJECTED: -1, }; +// 审批执行的状态 export const APPROVAL_ACTION_STATUS = { ASSIGNED: null, PENDING: 0, diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/launch/hooks/useDestroyAction.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/launch/hooks/useDestroyAction.tsx index 3794f871f..de9cacdd0 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/launch/hooks/useDestroyAction.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/launch/hooks/useDestroyAction.tsx @@ -16,8 +16,6 @@ export function useDestroyAction() { return { async run() { try { - console.log('%c Line:16 🍓 run', 'font-size:18px;color:#6ec1c2;background:#93c0a4'); - _.set(field, ['data', 'loading'], true); await apiClient.resource('approvals').destroy({ diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/launch/hooks/useWithdrawAction.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/launch/hooks/useWithdrawAction.tsx index 326024a6b..6c606d6b7 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/launch/hooks/useWithdrawAction.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/launch/hooks/useWithdrawAction.tsx @@ -27,7 +27,6 @@ export function useWithdrawAction() { field.data.loading = false; refreshTable(); } catch (v) { - console.log('%c Line:33 🌽 v', 'font-size:18px;color:#33a5ff;background:#fca650', v); if (field.data) { field.data.loading = false; } diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/todos/Pd.ApprovalAction.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/todos/Pd.ApprovalAction.tsx index c392e86e9..1335797d6 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/todos/Pd.ApprovalAction.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/todos/Pd.ApprovalAction.tsx @@ -2,16 +2,12 @@ import React, { createContext, useContext } from 'react'; import { useContextApprovalExecutions } from './Pd.ApprovalExecutions'; -export interface ApprovalAction { +interface ApprovalAction { status: number | null; } const ContextApprovalAction = createContext>({}); -export function useContextApprovalAction() { - return useContext(ContextApprovalAction); -} - export function ApprovalActionProvider({ children, ...props }) { const { status } = useContextApprovalExecutions(); @@ -21,3 +17,8 @@ export function ApprovalActionProvider({ children, ...props }) { return null; } + +export function useContextApprovalAction() { + const context = useContext(ContextApprovalAction); + return context; +} diff --git a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/todos/hooks/useSubmit.tsx b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/todos/hooks/useSubmit.tsx index 0955ebe16..ad6a05f36 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/todos/hooks/useSubmit.tsx +++ b/packages/plugins/@tachybase/plugin-workflow/src/client/features/approval/usage/approval-block/todos/hooks/useSubmit.tsx @@ -1,18 +1,20 @@ -import { useAPIClient } from '@tachybase/client'; +import { useAPIClient, useCollection } from '@tachybase/client'; import { useField, useForm } from '@tachybase/schema'; import { useHandleRefresh } from '../../common/useHandleRefresh'; import { useContextApprovalAction } from '../Pd.ApprovalAction'; import { useContextApprovalExecutions } from '../Pd.ApprovalExecutions'; -export function useSubmit() { +export function useSubmit(props: any = {}) { const { refreshTable } = useHandleRefresh(); - const field = useField(); const api = useAPIClient(); const form = useForm(); + const collection = useCollection(); const approvalExecutions = useContextApprovalExecutions(); const { status } = useContextApprovalAction(); + const { source } = props; + const needUpdateRecord = source === 'updateRecord'; return { run: async () => { @@ -20,14 +22,27 @@ export function useSubmit() { if (form.values.status) { return; } - await form.submit(); field.data = field.data ?? {}; field.data.loading = true; + if (needUpdateRecord) { + const collectionName = collection.name; + const targetId = form.values.id; + + await api.resource(collectionName).update({ + filterByTk: targetId, + values: form.values, + }); + } + await api.resource('approvalRecords').submit({ filterByTk: approvalExecutions.id, - values: { ...form.values, status }, + values: { + status, + needUpdateRecord, + data: form.values, + }, }); field.data.loading = false; diff --git a/packages/plugins/@tachybase/plugin-workflow/src/server/features/approval/actions.ts b/packages/plugins/@tachybase/plugin-workflow/src/server/features/approval/actions.ts index 5cb5c9cf4..1aa9e75c3 100644 --- a/packages/plugins/@tachybase/plugin-workflow/src/server/features/approval/actions.ts +++ b/packages/plugins/@tachybase/plugin-workflow/src/server/features/approval/actions.ts @@ -234,6 +234,7 @@ const approvalRecords = { async submit(context, next) { const repository = utils.getRepositoryFromParams(context); const { filterByTk, values } = context.action.params; + const { data, status, needUpdateRecord } = values || {}; const { currentUser } = context.state; if (!currentUser) { return context.throw(401); @@ -254,13 +255,13 @@ const approvalRecords = { approvalRecord.execution.status || approvalRecord.job.status || approvalRecord.status !== APPROVAL_ACTION_STATUS.PENDING || - !(approvalRecord.node.config.actions ?? []).includes(values.status) + (!needUpdateRecord && !(approvalRecord.node.config.actions ?? []).includes(status)) ) { return context.throw(400); } await approvalRecord.update({ - status: values.status, - comment: values.comment, + status: status, + comment: data.comment, snapshot: approvalRecord.approval.data, summary: approvalRecord.approval.summary, collectionName: approvalRecord.approval.collectionName,