UNPKG

whistle.data-checker

Version:
157 lines (143 loc) 4.57 kB
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> ); }