import { DownOutlined, EllipsisOutlined, RightOutlined } from '@ant-design/icons'; import { ActionContextProvider, ResourceActionProvider, SchemaComponent, cx, useDocumentTitle, useResourceActionContext, useResourceContext, } from '@nocobase/client'; import { str2moment } from '@nocobase/utils/client'; import { App, Breadcrumb, Button, Dropdown, Switch, message } from 'antd'; import React, { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Link, useNavigate } from 'react-router-dom'; import { CanvasContent } from './CanvasContent'; import { ExecutionLink } from './ExecutionLink'; import { FlowContext, useFlowContext } from './FlowContext'; import { lang } from './locale'; import { executionSchema } from './schemas/executions'; import useStyles from './style'; import { linkNodes } from './utils'; function ExecutionResourceProvider({ request, filter = {}, ...others }) { const { workflow } = useFlowContext(); const props = { ...others, request: { ...request, params: { ...request?.params, filter: { ...request?.params?.filter, key: workflow.key, }, }, }, }; return ; } export function WorkflowCanvas() { const navigate = useNavigate(); const { t } = useTranslation(); const { data, refresh, loading } = useResourceActionContext(); const { resource } = useResourceContext(); const { setTitle } = useDocumentTitle(); const [visible, setVisible] = useState(false); const { styles } = useStyles(); const { modal } = App.useApp(); useEffect(() => { const { title } = data?.data ?? {}; setTitle?.(`${lang('Workflow')}${title ? `: ${title}` : ''}`); }, [data?.data]); if (!data?.data) { return
{loading ? lang('Loading') : lang('Load failed')}
; } const { nodes = [], revisions = [], ...workflow } = data?.data ?? {}; linkNodes(nodes); const entry = nodes.find((item) => !item.upstream); function onSwitchVersion({ key }) { if (key != workflow.id) { navigate(`/admin/settings/workflow/workflows/${key}`); } } async function onToggle(value) { await resource.update({ filterByTk: workflow.id, values: { enabled: value, }, }); refresh(); } async function onRevision() { const { data: { data: revision }, } = await resource.revision({ filterByTk: workflow.id, filter: { key: workflow.key, }, }); message.success(t('Operation succeeded')); navigate(`/admin/settings/workflow/workflows/${revision.id}`); } async function onDelete() { const content = workflow.current ? lang('Delete a main version will cause all other revisions to be deleted too.') : ''; modal.confirm({ title: t('Are you sure you want to delete it?'), content, async onOk() { await resource.destroy({ filterByTk: workflow.id, }); message.success(t('Operation succeeded')); navigate( workflow.current ? '/admin/settings/workflow/workflows' : `/admin/settings/workflow/workflows/${revisions.find((item) => item.current)?.id}`, ); }, }); } async function onMenuCommand({ key }) { switch (key) { case 'history': setVisible(true); return; case 'revision': return onRevision(); case 'delete': return onDelete(); default: break; } } const revisionable = workflow.executed && !revisions.find((item) => !item.executed && new Date(item.createdAt) > new Date(workflow.createdAt)); return (
{lang('Workflow')} }, { title: {workflow.title} }, ]} />
); }