import * as React from 'react'; import { SearchAndFilterContainer } from 'container/search-filter'; import { pagination } from 'constants/table'; import { admin } from 'store/admin'; import { Table, Popconfirm, notification } from 'component/antd'; import { IEnumsMap, ITaskStatusDetails, ISubtasksStatus, ITrigger, IXFormWrapper } from 'types/base-type'; import { tableFilter } from 'lib/utils'; import { triggerClusterTask } from 'lib/api'; import { wrapper } from 'store'; import { observer } from 'mobx-react'; import Url from 'lib/url-parser'; import './index.less'; let taskStatus = [] as IEnumsMap[]; let task = {} as ITaskStatusDetails; let subTaskStatusList = [] as ISubtasksStatus[]; let statusNum: number; @observer export class TaskStatusDetails extends SearchAndFilterContainer { public taskId: number; public timer = null as any; public state = { searchKey: '', filterGroupVisible: false, filterStatusVisible: false, }; private xFormWrapper: IXFormWrapper; constructor(props: any) { super(props); const url = Url(); this.taskId = Number(url.search.taskId); } public renderDataMigrationTasks(subTaskStatusList: ISubtasksStatus[]) { const groupId = Object.assign({ title: '分组ID', dataIndex: 'groupId', key: 'groupId', width: '20%', filters: tableFilter<any>(subTaskStatusList, 'groupId'), onFilter: (value: number, record: ISubtasksStatus) => record.groupId === value, }, this.renderColumnsFilter('filterGroupVisible')); const status = Object.assign({ title: '状态', dataIndex: 'status', key: 'status', width: '20%', filters: taskStatus.map(ele => ({ text: ele.message, value: ele.code + '' })), onFilter: (value: number, record: ISubtasksStatus) => record.status === +value, render: (t: number) => { let messgae: string; taskStatus.map(ele => { if (ele.code === t) { messgae = ele.message; } }); return( <span className={t === 102 ? 'fail' : t === 101 ? 'succee' : ''}>{messgae}</span> ); }, }, this.renderColumnsFilter('filterStatusVisible')); const columns = [{ title: '主机名', dataIndex: 'hostname', key: 'hostname', width: '20%', sorter: (a: ISubtasksStatus, b: ISubtasksStatus) => a.hostname.charCodeAt(0) - b.hostname.charCodeAt(0), }, { title: '机器角色', dataIndex: 'kafkaRoles', key: 'kafkaRoles', width: '20%', }, groupId, status, { title: '操作', width: '20%', render: (value: any, record: ISubtasksStatus) => { return ( <> <span className="btn-position"> <Popconfirm title={`确定忽略?`} onConfirm={() => this.bindClick(record, 'ignore')} cancelText="取消" okText="确认" > <a>忽略</a> </Popconfirm> </span> <a onClick={() => this.handleViewLog(record)}>查看日志</a> </> ); }, }, ]; return ( <> <Table columns={columns} dataSource={subTaskStatusList} pagination={pagination} rowKey="hostname" /> </> ); } public handleViewLog = async (record: ISubtasksStatus) => { await admin.getClusterTaskLog(this.taskId, record.hostname); this.xFormWrapper = { type: 'drawer', visible: true, width: 600, title: '查看日志', customRenderElement: this.showLog(), nofooter: true, noform: true, onSubmit: (value: any) => { // TODO: }, }; await wrapper.open(this.xFormWrapper); } public showLog() { return ( <> <div className="config-info"> {admin.clusterTaskLog ? admin.clusterTaskLog : '暂无数据'} </div> </> ); } public bindClick(record: ISubtasksStatus, type: string) { const params = { taskId: this.taskId, action: type, hostname: record.hostname, } as ITrigger; triggerClusterTask(params).then(data => { admin.getSubtasksStatus(this.taskId); notification.success({ message: `${type === 'cancel' ? '取消' : '忽略'}成功!` }); }); } public iTimer = () => { this.timer = setInterval(() => { admin.getSubtasksStatus(this.taskId); }, 3 * 1 * 1000); } public componentDidMount() { setTimeout(this.iTimer, 0); admin.getConfigsTaskStatus(); } public componentWillUnmount() { clearInterval(this.timer); } public getData<T extends ISubtasksStatus>(origin: T[]) { let data: T[] = origin; let { searchKey } = this.state; searchKey = (searchKey + '').trim().toLowerCase(); data = searchKey ? origin.filter((item: ISubtasksStatus) => (item.hostname !== undefined && item.hostname !== null) && item.hostname.toLowerCase().includes(searchKey as string), ) : origin ; return data; } public render() { let message = ''; if (admin.taskStatusDetails) { task = admin.taskStatusDetails; subTaskStatusList = admin.taskStatusDetails.subTaskStatusList; statusNum = admin.taskStatusDetails.status; this.props.handleVal(statusNum); } taskStatus = admin.configsTaskStatus ? admin.configsTaskStatus : [] as IEnumsMap[]; taskStatus.forEach(ele => { if (ele.code === task.status) { message = ele.message; } }); return( <> <div className="k-row" > <ul className="k-tab task-status"> <li> 状态:<span className="complete">{message}</span> | 总数:<span className="complete">{task.sumCount}</span> | 成功:<span className="success">{task.successCount}</span> | 失败:<span className="fail">{task.failedCount}</span> | 执行中:<span className="executing">{task.runningCount}</span> | 待执行:<span className="pending">{task.waitingCount}</span> </li> {this.renderSearch('', '请输入主机名')} </ul> {this.renderDataMigrationTasks(this.getData(subTaskStatusList))} </div> </> ); } }