feat(plugin-workflow): add delete button in workflow canvas page (#1844)

* feat(plugin-workflow): add delete button in workflow canvas page

* fix(plugin-workflow): fix redirect url after deleted

* fix(plugin-workflow): fix antd version
This commit is contained in:
Junyi 2023-05-11 21:48:10 +07:00 committed by GitHub
parent eccfac5666
commit 6c149aadfc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 57 additions and 50 deletions

View File

@ -14,7 +14,7 @@
"@nocobase/resourcer": "0.9.3-alpha.1",
"@nocobase/server": "0.9.3-alpha.1",
"@nocobase/utils": "0.9.3-alpha.1",
"antd": "4.22.8",
"antd": "^4.24.8",
"axios": "^0.27.2",
"classnames": "^2.3.1",
"cron-parser": "4.4.0",

View File

@ -1,6 +1,6 @@
import React, { useEffect, useState } from 'react';
import { Link, useHistory } from 'react-router-dom';
import { Dropdown, Menu, Button, Tag, Switch, message, Breadcrumb } from 'antd';
import { Dropdown, Button, Tag, Switch, message, Breadcrumb, Modal } from 'antd';
import { DownOutlined, RightOutlined, EllipsisOutlined } from '@ant-design/icons';
import { cx } from '@emotion/css';
import classnames from 'classnames';
@ -95,6 +95,24 @@ export function WorkflowCanvas() {
history.push(`${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'));
history.push(workflow.current ? '..' : `${revisions.find((item) => item.current)?.id}`);
},
});
}
async function onMenuCommand({ key }) {
switch (key) {
case 'history':
@ -102,6 +120,8 @@ export function WorkflowCanvas() {
return;
case 'revision':
return onRevision();
case 'delete':
return onDelete();
default:
break;
}
@ -134,31 +154,29 @@ export function WorkflowCanvas() {
<div className="workflow-versions">
<Dropdown
trigger={['click']}
overlay={
<Menu
onClick={onSwitchVersion}
defaultSelectedKeys={[`${workflow.id}`]}
className={cx(workflowVersionDropdownClass)}
items={revisions
.sort((a, b) => b.id - a.id)
.map((item, index) => ({
key: `${item.id}`,
icon: item.current ? <RightOutlined /> : null,
label: (
<span
className={classnames({
executed: item.executed,
unexecuted: !item.executed,
enabled: item.enabled,
})}
>
<strong>{`#${item.id}`}</strong>
<time>{new Date(item.createdAt).toLocaleString()}</time>
</span>
),
}))}
/>
}
menu={{
onClick: onSwitchVersion,
defaultSelectedKeys: [`${workflow.id}`],
className: cx(workflowVersionDropdownClass),
items: revisions
.sort((a, b) => b.id - a.id)
.map((item, index) => ({
key: `${item.id}`,
icon: item.current ? <RightOutlined /> : null,
label: (
<span
className={classnames({
executed: item.executed,
unexecuted: !item.executed,
enabled: item.enabled,
})}
>
<strong>{`#${item.id}`}</strong>
<time>{new Date(item.createdAt).toLocaleString()}</time>
</span>
),
})),
}}
>
<Button type="text">
<label>{lang('Version')}</label>
@ -174,15 +192,14 @@ export function WorkflowCanvas() {
unCheckedChildren={lang('Off')}
/>
<Dropdown
overlay={
<Menu
items={[
{ key: 'history', label: lang('Execution history'), disabled: !workflow.allExecuted },
{ key: 'revision', label: lang('Copy to new version'), disabled: !revisionable },
]}
onClick={onMenuCommand}
/>
}
menu={{
items: [
{ key: 'history', label: lang('Execution history'), disabled: !workflow.allExecuted },
{ key: 'revision', label: lang('Copy to new version'), disabled: !revisionable },
{ key: 'delete', label: t('Delete') },
],
onClick: onMenuCommand,
}}
>
<Button type="text" icon={<EllipsisOutlined />} />
</Dropdown>

View File

@ -9,6 +9,7 @@ export default {
Version: '版本',
'Copy to new version': '复制到新版本',
Duplicate: '复制',
'Delete a main version will cause all other revisions to be deleted too.': '删除主版本将导致其他版本一并被删除。',
Loading: '加载中',
'Load failed': '加载失败',
Trigger: '触发器',

View File

@ -253,26 +253,14 @@ export default class WorkflowPlugin extends Plugin {
const executed = await workflow.countExecutions({ transaction });
// NOTE: not to trigger afterUpdate hook here
await workflow.update({ executed }, { transaction, hooks: false });
await workflow.increment('executed', { transaction });
const allExecuted = await (<typeof ExecutionModel>execution.constructor).count({
await (<typeof WorkflowModel>workflow.constructor).increment('allExecuted', {
where: {
key: workflow.key,
},
transaction,
});
await (<typeof WorkflowModel>workflow.constructor).update(
{
allExecuted,
},
{
where: {
key: workflow.key,
},
individualHooks: true,
transaction,
},
);
execution.workflow = workflow;

View File

@ -74,6 +74,7 @@ export default function () {
sourceKey: 'key',
// NOTE: no constraints needed here because tricky self-referencing
constraints: false,
onDelete: 'NO ACTION',
},
],
// NOTE: use unique index for avoiding deadlock in mysql when setCurrent