这是基于vue-vben-admin 模板适用于abp Vnext的前端管理项目
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.
 
 
 
 
 
 

274 lines
8.3 KiB

<template>
<div class="content">
<BasicTable @register="registerTable">
<template #toolbar>
<a-button
v-if="hasPermission('TaskManagement.BackgroundJobs.Start')"
:disabled="!isMultiSelected"
@click="handleStart"
>{{ L('BackgroundJobs:Start') }}</a-button
>
<a-button
v-if="hasPermission('TaskManagement.BackgroundJobs.Stop')"
type="primary"
danger
:disabled="!isMultiSelected"
@click="handleStop"
>{{ L('BackgroundJobs:Stop') }}</a-button
>
<a-button
v-if="hasPermission('TaskManagement.BackgroundJobs.Create')"
type="primary"
@click="handleAddNew"
>{{ L('BackgroundJobs:AddNew') }}</a-button
>
<a-button
v-if="hasPermission('TaskManagement.BackgroundJobs.Delete')"
type="primary"
danger
:disabled="!isMultiSelected"
@click="handleDeleteMany"
>{{ L('Delete') }}</a-button
>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'isEnabled'">
<Switch :checked="record.isEnabled" readonly />
</template>
<template v-else-if="column.key === 'name'">
<a href="javascript:(0);" @click="handleDetail(record)">{{ record.name }}</a>
</template>
<template v-else-if="column.key === 'status'">
<Tooltip v-if="record.isAbandoned" color="orange" :title="L('Description:IsAbandoned')">
<Tag :color="JobStatusColor[record.status]">{{ JobStatusMap[record.status] }}</Tag>
</Tooltip>
<Tag v-else :color="JobStatusColor[record.status]">{{ JobStatusMap[record.status] }}</Tag>
</template>
<template v-else-if="column.key === 'jobType'">
<Tag color="blue">{{ JobTypeMap[record.jobType] }}</Tag>
</template>
<template v-else-if="column.key === 'priority'">
<Tag :color="JobPriorityColor[record.priority]">{{ JobPriorityMap[record.priority] }}</Tag>
</template>
<template v-if="column.key === 'action'">
<TableAction
:stop-button-propagation="true"
:actions="[
{
auth: 'TaskManagement.BackgroundJobs.Update',
label: L('Edit'),
icon: 'ant-design:edit-outlined',
onClick: handleEdit.bind(null, record),
},
{
auth: 'TaskManagement.BackgroundJobs.Delete',
color: 'error',
label: L('Delete'),
icon: 'ant-design:delete-outlined',
onClick: handleDelete.bind(null, record),
},
]"
:dropDownActions="[
{
auth: 'TaskManagement.BackgroundJobs.Pause',
label: L('BackgroundJobs:Pause'),
ifShow: [JobStatus.Queuing, JobStatus.Running, JobStatus.FailedRetry].includes(record.status),
onClick: handlePause.bind(null, record),
},
{
auth: 'TaskManagement.BackgroundJobs.Resume',
label: L('BackgroundJobs:Resume'),
ifShow: [JobStatus.Paused, JobStatus.Stopped].includes(record.status),
onClick: handleResume.bind(null, record),
},
{
auth: 'TaskManagement.BackgroundJobs.Trigger',
label: L('BackgroundJobs:Trigger'),
ifShow: [JobStatus.Queuing, JobStatus.Running, JobStatus.Completed, JobStatus.FailedRetry].includes(
record.status,
),
onClick: handleTrigger.bind(null, record),
},
{
auth: 'TaskManagement.BackgroundJobs.Create',
label: L('BackgroundJobs:Copy'),
onClick: handleCopy.bind(null, record),
},
]"
/>
</template>
</template>
</BasicTable>
<JobModal @change="reloadTable" @register="registerModal" />
</div>
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue';
import { Switch, Tag, Tooltip } from 'ant-design-vue';
import { useLocalization } from '/@/hooks/abp/useLocalization';
import { usePermission } from '/@/hooks/web/usePermission';
import { useMessage } from '/@/hooks/web/useMessage';
import { useGo } from '/@/hooks/web/usePage';
import { useModal } from '/@/components/Modal';
import { BasicTable, TableAction, useTable } from '/@/components/Table';
import { formatPagedRequest } from '/@/utils/http/abp/helper';
import {
getList,
pause,
resume,
trigger,
deleteById,
bulkStop,
bulkStart,
bulkDelete,
getAvailableFields,
advancedSearch,
} from '/@/api/task-management/backgroundJobInfo';
import { JobStatus } from '/@/api/task-management/model/backgroundJobInfoModel';
import { getDataColumns } from '../datas/TableData';
import { getSearchFormSchemas } from '../datas/ModalData';
import {
JobStatusMap,
JobStatusColor,
JobTypeMap,
JobPriorityMap,
JobPriorityColor,
} from '../datas/typing';
import JobModal from './JobModal.vue';
const go = useGo();
const { createConfirm, createMessage } = useMessage();
const { L } = useLocalization(['TaskManagement', 'AbpUi']);
const { hasPermission } = usePermission();
const [registerModal, { openModal }] = useModal();
const [registerTable, { reload, getSelectRowKeys, clearSelectedRowKeys }] = useTable({
rowKey: 'id',
title: L('BackgroundJobs'),
columns: getDataColumns(),
api: getList,
beforeFetch: formatPagedRequest,
pagination: true,
striped: false,
useSearchForm: true,
showTableSetting: true,
bordered: true,
showIndexColumn: false,
canResize: false,
immediate: true,
clickToRowSelect: false,
formConfig: getSearchFormSchemas(),
advancedSearchConfig: {
useAdvancedSearch: true,
defineFieldApi: getAvailableFields,
fetchApi: advancedSearch,
},
rowSelection: {
type: 'checkbox',
onChange: handleSelectChange,
},
actionColumn: {
width: 220,
title: L('Actions'),
dataIndex: 'action',
},
});
const selectedRowKeys = ref<string[]>([]);
const isMultiSelected = computed(() => {
return selectedRowKeys.value.length > 0;
});
function handleSelectChange(keys) {
selectedRowKeys.value = keys;
}
function handleAddNew() {
openModal(true, { id: null });
}
function handleEdit(record) {
openModal(true, record);
}
function handleDetail(record) {
go(`/task-management/background-jobs/${record.id}`);
}
function handlePause(record) {
pause(record.id).then(() => {
createMessage.success(L('Successful'));
reloadTable();
});
}
function handleResume(record) {
resume(record.id).then(() => {
createMessage.success(L('Successful'));
reloadTable();
});
}
function handleTrigger(record) {
trigger(record.id).then(() => {
createMessage.success(L('Successful'));
reloadTable();
});
}
function handleStart() {
const selectKeys = getSelectRowKeys();
bulkStart(selectKeys).then(() => {
createMessage.success(L('Successful'));
reloadTable();
});
}
function handleStop() {
const selectKeys = getSelectRowKeys();
bulkStop(selectKeys).then(() => {
createMessage.success(L('Successful'));
reloadTable();
});
}
function handleDeleteMany() {
const selectKeys = getSelectRowKeys();
if (selectKeys.length <= 0) {
return;
}
createConfirm({
iconType: 'warning',
title: L('AreYouSure'),
content: L('MultipleSelectJobsWillBeDeletedMessage'),
okCancel: true,
onOk: () => {
return bulkDelete(selectKeys).then(() => {
reloadTable();
});
},
});
}
function handleDelete(record) {
createConfirm({
iconType: 'warning',
title: L('AreYouSure'),
content: L('MultipleSelectJobsWillBeDeletedMessage'),
okCancel: true,
onOk: () => {
return deleteById(record.id).then(() => {
reloadTable();
});
},
});
}
function handleCopy(record) {
openModal(true, { id: record.id, copy: true });
}
function reloadTable() {
clearSelectedRowKeys();
reload();
}
</script>