You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
484 lines
14 KiB
484 lines
14 KiB
/* |
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
|
* contributor license agreements. See the NOTICE file distributed with |
|
* this work for additional information regarding copyright ownership. |
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
|
* (the "License"); you may not use this file except in compliance with |
|
* the License. You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
import _ from 'lodash' |
|
import { h, ref, reactive } from 'vue' |
|
import { useI18n } from 'vue-i18n' |
|
import { useRouter } from 'vue-router' |
|
import { useAsyncState } from '@vueuse/core' |
|
import { useTextCopy } from '../components/dag/use-text-copy' |
|
import { |
|
batchCopyByCodes, |
|
batchDeleteByCodes, |
|
batchExportByCodes, |
|
deleteByCode, |
|
queryListPaging, |
|
release |
|
} from '@/service/modules/process-definition' |
|
import { offline, online } from '@/service/modules/schedules' |
|
import TableAction from './components/table-action' |
|
import styles from './index.module.scss' |
|
import { NTag, NSpace, NIcon, NButton, NEllipsis, NTooltip } from 'naive-ui' |
|
import { CopyOutlined, UnorderedListOutlined } from '@vicons/antd' |
|
import ButtonLink from '@/components/button-link' |
|
import { |
|
COLUMN_WIDTH_CONFIG, |
|
calculateTableWidth, |
|
DefaultTableWidth |
|
} from '@/common/column-width-config' |
|
import type { IDefinitionParam } from './types' |
|
import type { Router } from 'vue-router' |
|
import type { TableColumns, RowKey } from 'naive-ui/es/data-table/src/interface' |
|
|
|
export function useTable() { |
|
const { t } = useI18n() |
|
const router: Router = useRouter() |
|
const { copy } = useTextCopy() |
|
const variables = reactive({ |
|
columns: [], |
|
tableWidth: DefaultTableWidth, |
|
checkedRowKeys: [] as Array<RowKey>, |
|
row: {}, |
|
tableData: [], |
|
projectCode: ref(Number(router.currentRoute.value.params.projectCode)), |
|
page: ref(1), |
|
pageSize: ref(10), |
|
searchVal: ref(), |
|
totalPage: ref(1), |
|
timingType: ref('create'), |
|
timingState: ref('OFFLINE'), |
|
showRef: ref(false), |
|
startShowRef: ref(false), |
|
timingShowRef: ref(false), |
|
versionShowRef: ref(false), |
|
copyShowRef: ref(false), |
|
loadingRef: ref(false), |
|
setTimingDialogShowRef: ref(false) |
|
}) |
|
|
|
const createColumns = (variables: any) => { |
|
variables.columns = [ |
|
{ |
|
type: 'selection', |
|
className: 'btn-selected', |
|
...COLUMN_WIDTH_CONFIG['selection'] |
|
}, |
|
{ |
|
title: '#', |
|
key: 'id', |
|
...COLUMN_WIDTH_CONFIG['index'], |
|
render: (row, index) => index + 1 |
|
}, |
|
{ |
|
title: t('project.workflow.workflow_name'), |
|
key: 'name', |
|
className: 'workflow-name', |
|
...COLUMN_WIDTH_CONFIG['name'], |
|
titleColSpan: 3, |
|
resizable: true, |
|
width: 300, |
|
minWidth: 300, |
|
maxWidth: 600, |
|
render: (row) => |
|
h( |
|
NSpace, |
|
{ |
|
justify: 'space-between', |
|
wrap: false, |
|
class: styles['workflow-name'] |
|
}, |
|
{ |
|
default: () => |
|
h( |
|
ButtonLink, |
|
{ |
|
onClick: () => { |
|
const routeUrl = router.resolve({ |
|
name: 'workflow-definition-detail', |
|
params: { code: row.code } |
|
}) |
|
window.open(routeUrl.href, '_blank') |
|
} |
|
}, |
|
{ |
|
default: () => |
|
h( |
|
NEllipsis, |
|
{ |
|
style: 'max-width: 580px;line-height: 1.5' |
|
}, |
|
() => row.name |
|
) |
|
} |
|
) |
|
} |
|
) |
|
}, |
|
{ |
|
title: 'Copy', |
|
key: 'copy', |
|
...COLUMN_WIDTH_CONFIG['copy'], |
|
render: (row) => |
|
h(NTooltip, null, { |
|
trigger: () => |
|
h( |
|
NButton, |
|
{ |
|
quaternary: true, |
|
circle: true, |
|
type: 'info', |
|
size: 'tiny', |
|
onClick: () => void copy(row.name) |
|
}, |
|
{ icon: () => h(NIcon, { size: 16 }, () => h(CopyOutlined)) } |
|
), |
|
default: () => t('project.workflow.copy_workflow_name') |
|
}) |
|
}, |
|
{ |
|
title: 'Instances', |
|
key: 'instances', |
|
...COLUMN_WIDTH_CONFIG['instances'], |
|
render: (row) => |
|
h(NTooltip, null, { |
|
trigger: () => |
|
h( |
|
NButton, |
|
{ |
|
quaternary: true, |
|
circle: true, |
|
type: 'info', |
|
size: 'tiny', |
|
onClick: () => { |
|
void router.push({ |
|
name: 'workflow-instance-list', |
|
query: { processDefineCode: row.code } |
|
}) |
|
} |
|
}, |
|
{ |
|
icon: () => |
|
h(NIcon, { size: 18 }, () => h(UnorderedListOutlined)) |
|
} |
|
), |
|
default: () => t('project.workflow.visit_workflow_instances') |
|
}) |
|
}, |
|
{ |
|
title: t('project.workflow.status'), |
|
key: 'releaseState', |
|
...COLUMN_WIDTH_CONFIG['state'], |
|
render: (row) => |
|
row.releaseState === 'ONLINE' |
|
? h( |
|
NTag, |
|
{ type: 'success', size: 'small' }, |
|
{ |
|
default: () => t('project.workflow.up_line') |
|
} |
|
) |
|
: h( |
|
NTag, |
|
{ type: 'warning', size: 'small' }, |
|
{ |
|
default: () => t('project.workflow.down_line') |
|
} |
|
) |
|
}, |
|
{ |
|
title: t('project.workflow.schedule_publish_status'), |
|
key: 'scheduleReleaseState', |
|
...COLUMN_WIDTH_CONFIG['state'], |
|
render: (row) => { |
|
if (row.scheduleReleaseState === 'ONLINE') { |
|
return h( |
|
NTag, |
|
{ type: 'success', size: 'small' }, |
|
{ |
|
default: () => t('project.workflow.up_line') |
|
} |
|
) |
|
} else if (row.scheduleReleaseState === 'OFFLINE') { |
|
return h( |
|
NTag, |
|
{ type: 'warning', size: 'small' }, |
|
{ |
|
default: () => t('project.workflow.down_line') |
|
} |
|
) |
|
} else { |
|
return '-' |
|
} |
|
} |
|
}, |
|
{ |
|
title: t('project.workflow.create_time'), |
|
key: 'createTime', |
|
...COLUMN_WIDTH_CONFIG['time'] |
|
}, |
|
{ |
|
title: t('project.workflow.update_time'), |
|
key: 'updateTime', |
|
...COLUMN_WIDTH_CONFIG['time'] |
|
}, |
|
{ |
|
title: t('project.workflow.description'), |
|
key: 'description', |
|
...COLUMN_WIDTH_CONFIG['note'] |
|
}, |
|
{ |
|
title: t('project.workflow.create_user'), |
|
key: 'userName', |
|
...COLUMN_WIDTH_CONFIG['userName'] |
|
}, |
|
{ |
|
title: t('project.workflow.modify_user'), |
|
key: 'modifyBy', |
|
...COLUMN_WIDTH_CONFIG['userName'] |
|
}, |
|
{ |
|
title: t('project.workflow.operation'), |
|
key: 'operation', |
|
...COLUMN_WIDTH_CONFIG['operation'](10), |
|
render: (row) => |
|
h(TableAction, { |
|
row, |
|
onEditWorkflow: () => editWorkflow(row), |
|
onStartWorkflow: () => startWorkflow(row), |
|
onTimingWorkflow: () => timingWorkflow(row), |
|
onVersionWorkflow: () => versionWorkflow(row), |
|
onDeleteWorkflow: () => deleteWorkflow(row), |
|
onReleaseWorkflow: () => releaseWorkflow(row), |
|
onReleaseScheduler: () => releaseScheduler(row), |
|
onCopyWorkflow: () => copyWorkflow(row), |
|
onExportWorkflow: () => exportWorkflow(row), |
|
onGotoWorkflowTree: () => gotoWorkflowTree(row) |
|
}) |
|
} |
|
] as TableColumns<any> |
|
if (variables.tableWidth) { |
|
variables.tableWidth = calculateTableWidth(variables.columns) |
|
} |
|
} |
|
|
|
const editWorkflow = (row: any) => { |
|
variables.row = row |
|
router.push({ |
|
name: 'workflow-definition-detail', |
|
params: { code: row.code } |
|
}) |
|
} |
|
|
|
const startWorkflow = (row: any) => { |
|
variables.startShowRef = true |
|
variables.row = row |
|
} |
|
|
|
const timingWorkflow = (row: any) => { |
|
variables.timingShowRef = true |
|
if (row?.schedule) { |
|
variables.row = row.schedule |
|
variables.timingType = 'update' |
|
variables.timingState = row.scheduleReleaseState |
|
} else { |
|
variables.row = row |
|
} |
|
} |
|
|
|
const versionWorkflow = (row: any) => { |
|
variables.versionShowRef = true |
|
variables.row = row |
|
} |
|
|
|
const deleteWorkflow = (row: any) => { |
|
deleteByCode(variables.projectCode, row.code).then(() => { |
|
window.$message.success(t('project.workflow.success')) |
|
getTableData({ |
|
pageSize: variables.pageSize, |
|
pageNo: variables.page, |
|
searchVal: variables.searchVal |
|
}) |
|
}) |
|
} |
|
|
|
const batchDeleteWorkflow = () => { |
|
const data = { |
|
codes: _.join(variables.checkedRowKeys, ',') |
|
} |
|
|
|
batchDeleteByCodes(data, variables.projectCode).then(() => { |
|
window.$message.success(t('project.workflow.success')) |
|
|
|
if ( |
|
variables.tableData.length === variables.checkedRowKeys.length && |
|
variables.page > 1 |
|
) { |
|
variables.page -= 1 |
|
} |
|
|
|
variables.checkedRowKeys = [] |
|
getTableData({ |
|
pageSize: variables.pageSize, |
|
pageNo: variables.page, |
|
searchVal: variables.searchVal |
|
}) |
|
}) |
|
} |
|
|
|
const batchExportWorkflow = () => { |
|
const fileName = 'workflow_' + new Date().getTime() |
|
const data = { |
|
codes: _.join(variables.checkedRowKeys, ',') |
|
} |
|
|
|
batchExportByCodes(data, variables.projectCode).then((res: any) => { |
|
downloadBlob(res, fileName) |
|
window.$message.success(t('project.workflow.success')) |
|
variables.checkedRowKeys = [] |
|
}) |
|
} |
|
|
|
const batchCopyWorkflow = () => {} |
|
|
|
const releaseWorkflow = (row: any) => { |
|
const data = { |
|
name: row.name, |
|
releaseState: (row.releaseState === 'ONLINE' ? 'OFFLINE' : 'ONLINE') as |
|
| 'OFFLINE' |
|
| 'ONLINE' |
|
} |
|
|
|
release(data, variables.projectCode, row.code).then(() => { |
|
if (data.releaseState === 'ONLINE') { |
|
variables.setTimingDialogShowRef = true |
|
variables.row = row |
|
if (row?.schedule) { |
|
variables.row = row.schedule |
|
variables.timingType = 'update' |
|
variables.timingState = row.scheduleReleaseState |
|
} |
|
} else { |
|
window.$message.success(t('project.workflow.success')) |
|
} |
|
getTableData({ |
|
pageSize: variables.pageSize, |
|
pageNo: variables.page, |
|
searchVal: variables.searchVal |
|
}) |
|
}) |
|
} |
|
|
|
const releaseScheduler = (row: any) => { |
|
if (row.schedule) { |
|
let handle = online |
|
if (row.schedule.releaseState === 'ONLINE') { |
|
handle = offline |
|
} |
|
handle(variables.projectCode, row.schedule.id).then(() => { |
|
window.$message.success(t('project.workflow.success')) |
|
getTableData({ |
|
pageSize: variables.pageSize, |
|
pageNo: variables.page, |
|
searchVal: variables.searchVal |
|
}) |
|
}) |
|
} |
|
} |
|
|
|
const copyWorkflow = (row: any) => { |
|
const data = { |
|
codes: String(row.code), |
|
targetProjectCode: variables.projectCode |
|
} |
|
batchCopyByCodes(data, variables.projectCode).then(() => { |
|
window.$message.success(t('project.workflow.success')) |
|
getTableData({ |
|
pageSize: variables.pageSize, |
|
pageNo: variables.page, |
|
searchVal: variables.searchVal |
|
}) |
|
}) |
|
} |
|
|
|
const downloadBlob = (data: any, fileNameS = 'json') => { |
|
if (!data) { |
|
return |
|
} |
|
const blob = new Blob([data]) |
|
const fileName = `${fileNameS}.json` |
|
if ('download' in document.createElement('a')) { |
|
// Not IE |
|
const url = window.URL.createObjectURL(blob) |
|
const link = document.createElement('a') |
|
link.style.display = 'none' |
|
link.href = url |
|
link.setAttribute('download', fileName) |
|
document.body.appendChild(link) |
|
link.click() |
|
document.body.removeChild(link) // remove element after downloading is complete. |
|
window.URL.revokeObjectURL(url) // release blob object |
|
} else { |
|
// IE 10+ |
|
if (window.navigator.msSaveBlob) { |
|
window.navigator.msSaveBlob(blob, fileName) |
|
} |
|
} |
|
} |
|
|
|
const exportWorkflow = (row: any) => { |
|
const fileName = 'workflow_' + new Date().getTime() |
|
|
|
const data = { |
|
codes: String(row.code) |
|
} |
|
batchExportByCodes(data, variables.projectCode).then((res: any) => { |
|
downloadBlob(res, fileName) |
|
}) |
|
} |
|
|
|
const gotoWorkflowTree = (row: any) => { |
|
router.push({ |
|
name: 'workflow-definition-tree', |
|
params: { projectCode: variables.projectCode, definitionCode: row.code } |
|
}) |
|
} |
|
|
|
const getTableData = (params: IDefinitionParam) => { |
|
if (variables.loadingRef) return |
|
variables.loadingRef = true |
|
const { state } = useAsyncState( |
|
queryListPaging({ ...params }, variables.projectCode).then((res: any) => { |
|
variables.totalPage = res.totalPage |
|
variables.tableData = res.totalList.map((item: any) => { |
|
return { ...item } |
|
}) |
|
variables.loadingRef = false |
|
}), |
|
{ total: 0, table: [] } |
|
) |
|
return state |
|
} |
|
|
|
return { |
|
variables, |
|
createColumns, |
|
getTableData, |
|
batchDeleteWorkflow, |
|
batchExportWorkflow, |
|
batchCopyWorkflow |
|
} |
|
}
|
|
|