whistle.data-checker
Version:
data checker for testing
157 lines (143 loc) • 4.57 kB
JSX
import React, {useEffect, useState} from 'react';
import {Tooltip, Button, Table, Tabs, Empty} from 'antd';
import { RightOutlined, DownOutlined } from '@ant-design/icons';
import {ClearIcon, RecordIcon} from '../Icon';
let timer = null;
export default function List() {
const [isRecording, setIsRecording] = useState(true);
const [list, setList] = useState([]);
const [columns, setColumns] = useState([]);
const handleToggleRecord = () => {
setIsRecording(!isRecording);
};
const getTableList = () => {
if (!isRecording) {
return;
}
const len = list.length;
const lastItem = list[len - 1];
const reqId = lastItem ? lastItem.reqId : '';
fetch(`cgi-bin/list?lastId=${reqId || ''}`)
.then(res => res.json())
.then((data) => {
// TODO: 过滤由用户定义规则来实现 http://wproxy.org/whistle/webui/filter.html
const filterData = data.length && data.filter(item => Boolean(item));
// console.log(filterData, '有效数据====>');
if (!filterData) {
return;
}
const newestOne = filterData && filterData[filterData.length - 1];
if (newestOne) {
const headers = Object.keys(newestOne).map((item) => {
return {
title: item,
dataIndex: item,
key: item,
ellipsis: { showTitle: false },
render: (address) => (
<Tooltip placement="topLeft" title={address}>
{address}
</Tooltip>
),
};
});
setColumns(headers);
}
setList([...filterData]);
});
};
const clearList = () => {
// 刷新
fetch('cgi-bin/clear');
};
const handleClear = () => {
setList([]);
clearList();
clearInterval(timer);
timer = setInterval(() => {
getTableList();
}, 1000);
};
useEffect(() => {
clearList();
timer = setInterval(() => {
getTableList();
}, 1000);
// TODO: 页面退出缓存columns,貌似没生效
return () => {
localStorage.setItem('WHISTLE_COLUMNS', JSON.stringify(columns));
};
}, []);
// 初始化columns
useEffect(() => {
const cacheColumns = localStorage.getItem('WHISTLE_COLUMNS');
if (cacheColumns) {
setColumns(JSON.parse(cacheColumns));
}
}, []);
const filterRow = (_, index) => {
const lastItem = list[list.length - 1];
const sameTime = list[index].eventTime === lastItem.eventTime;
// pageId & blockId & dataId都一样
const repeatReport = list[index].pageId === lastItem.pageId
&& list[index].blockId === lastItem.blockId
&& list[index].dataId === lastItem.dataId;
// 校验
const isError = false;
// 同一批数据【绿色】展示
if (sameTime) {
return 'newTow';
}
// 重复上报数据【黄色】展示
if (sameTime && repeatReport) {
return 'repeatTow';
}
// 校验不通过【红色】展示
if (isError) {
return 'errorTow';
}
};
return (
<div>
<Button disabled icon={isRecording ? <RecordIcon style={{color: 'rgb(255, 102, 102)'}}/> :
<RecordIcon style={{color: 'rgb(204, 204, 204)'}}/>} onClick={handleToggleRecord}>Record</Button>
<Button icon={<ClearIcon/>} onClick={handleClear}>Clear</Button>
{list.length
? (
<Table
columns={columns}
rowClassName={filterRow}
pagination={false}
rowKey="reqId"
scroll={{
y: '90vh',
}}
expandable={{
expandedRowRender: record => (
<Tabs>
<Tabs.TabPane tab="Fields" key="item-1">
{
columns.map(item => (
<p>{item && item.title}: {record[item && item.dataIndex]}</p>
))
}
</Tabs.TabPane>
<Tabs.TabPane tab="Raw" key="item-2">
{JSON.stringify(record)}
</Tabs.TabPane>
</Tabs>
),
rowExpandable: () => true,
expandIcon: ({ expanded, onExpand, record }) => (expanded ? (
<DownOutlined onClick={e => onExpand(record, e)} />
) : (
<RightOutlined onClick={e => onExpand(record, e)} />
)),
}}
dataSource={list}
/>
)
: <Empty/>}
</div>
);
}