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:
parent
eccfac5666
commit
6c149aadfc
@ -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",
|
||||
|
@ -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>
|
||||
|
@ -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: '触发器',
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user