This is an automated email from the ASF dual-hosted git repository. dockerzhang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/inlong.git
The following commit(s) were added to refs/heads/master by this push: new b57d63197d [INLONG-10839][Dashboard] Data preview style structure modification (#10840) b57d63197d is described below commit b57d63197d1735461517578a6397ff4abe72ead4 Author: kamianlaida <165994047+wohainilao...@users.noreply.github.com> AuthorDate: Wed Aug 21 18:15:34 2024 +0800 [INLONG-10839][Dashboard] Data preview style structure modification (#10840) --- inlong-dashboard/src/ui/locales/cn.json | 3 + inlong-dashboard/src/ui/locales/en.json | 3 + .../pages/GroupDetail/DataStream/PreviewModal.tsx | 132 ++++++++++++++++----- 3 files changed, 110 insertions(+), 28 deletions(-) diff --git a/inlong-dashboard/src/ui/locales/cn.json b/inlong-dashboard/src/ui/locales/cn.json index 2c00ea1dc0..379a5a83e1 100644 --- a/inlong-dashboard/src/ui/locales/cn.json +++ b/inlong-dashboard/src/ui/locales/cn.json @@ -703,6 +703,9 @@ "pages.GroupDetail.Delay.AverageTitle": "平均传输时延 (ms)", "pages.GroupDetail.Delay.RealTimeTitle": "传输时延 (ms)", "pages.GroupDetail.Stream.Preview": "数据预览", + "pages.GroupDetail.Stream.Original": "原文", + "pages.GroupDetail.Stream.ShowOriginal": "显示原文", + "pages.GroupDetail.Stream.Closed": "关闭", "pages.GroupDetail.Stream.Dt": "数据时间 (dt)", "pages.GroupDetail.Stream.Content": "数据内容", "pages.GroupDetail.Stream.Number": "数据条数", diff --git a/inlong-dashboard/src/ui/locales/en.json b/inlong-dashboard/src/ui/locales/en.json index 7546f2e399..bc1106fdd6 100644 --- a/inlong-dashboard/src/ui/locales/en.json +++ b/inlong-dashboard/src/ui/locales/en.json @@ -703,6 +703,9 @@ "pages.GroupDetail.Delay.AverageTitle": "Average transmission delay (ms)", "pages.GroupDetail.Delay.RealTimeTitle": "Transmission delay (ms)", "pages.GroupDetail.Stream.Preview": "Data preview", + "pages.GroupDetail.Stream.Original": "Original", + "pages.GroupDetail.Stream.ShowOriginal": "Show Original", + "pages.GroupDetail.Stream.Closed": "Close", "pages.GroupDetail.Stream.Dt": "Data time(dt)", "pages.GroupDetail.Stream.Content": "Data content", "pages.GroupDetail.Stream.Number": "Records number", diff --git a/inlong-dashboard/src/ui/pages/GroupDetail/DataStream/PreviewModal.tsx b/inlong-dashboard/src/ui/pages/GroupDetail/DataStream/PreviewModal.tsx index 7481992245..a608dbcb7e 100644 --- a/inlong-dashboard/src/ui/pages/GroupDetail/DataStream/PreviewModal.tsx +++ b/inlong-dashboard/src/ui/pages/GroupDetail/DataStream/PreviewModal.tsx @@ -18,12 +18,12 @@ */ import React, { useState } from 'react'; -import { Modal, Table, Radio, RadioChangeEvent } from 'antd'; +import { Modal, Table, Radio, RadioChangeEvent, Button, Card } from 'antd'; import { ModalProps } from 'antd/es/modal'; import { useRequest, useUpdateEffect } from '@/ui/hooks'; import i18n from '@/i18n'; import { ColumnsType } from 'antd/es/table'; -import { timestampFormat } from '@/core/utils'; +import dayjs from 'dayjs'; export interface Props extends ModalProps { inlongGroupId: string; @@ -33,29 +33,18 @@ export interface Props extends ModalProps { const Comp: React.FC<Props> = ({ inlongGroupId, inlongStreamId, ...modalProps }) => { const [position, setPosition] = useState(1); + + const [originalModal, setOriginalModal] = useState({ + open: false, + record: {}, + }); interface DataType { id: React.Key; - dt: string; - body: string; } - const detailColumns: ColumnsType<DataType> = [ - { - title: 'ID', - dataIndex: 'id', - }, - { - title: i18n.t('pages.GroupDetail.Stream.Dt'), - dataIndex: 'dt', - render: text => text && timestampFormat(text), - }, - { - title: i18n.t('pages.GroupDetail.Stream.Content'), - dataIndex: 'body', - ellipsis: true, - render: text => <a>{text}</a>, - }, - ]; + const onShowOriginModal = record => { + setOriginalModal({ open: true, record: record }); + }; const { data: previewData, run: getPreviewData } = useRequest( { @@ -72,10 +61,80 @@ const Comp: React.FC<Props> = ({ inlongGroupId, inlongStreamId, ...modalProps }) }, ); + const getColumn = () => { + let exitsId = false; + const result = previewData?.[0]?.fieldList?.reduce((acc, cur) => { + if (cur['fieldName'] === 'id') { + exitsId = true; + } + const width = + (cur['fieldName'].length > cur['fieldValue'].length + ? cur['fieldName'].length + : cur['fieldValue'].length) * 10; + acc.push({ + title: cur['fieldName'], + key: cur['fieldName'], + dataIndex: cur['fieldName'], + width: width >= 100 ? width : 100, + }); + return acc; + }, []); + if (result) { + if (exitsId) { + return result; + } + return [{ title: 'id', key: 'id', dataIndex: 'id', width: 100 }].concat([...result]); + } + return; + }; + + const detailColumns: ColumnsType<DataType> = [ + { + title: i18n.t('pages.GroupDetail.Stream.Dt'), + key: 'dt', + width: 200, + dataIndex: 'dt', + }, + ].concat( + (getColumn() ? getColumn() : []).concat([ + { + title: 'operation', + key: 'operation', + fixed: 'right', + width: 100, + render: (text, record: any) => ( + <> + <Button + type="link" + onClick={() => { + onShowOriginModal(record); + }} + > + {i18n.t('pages.GroupDetail.Stream.ShowOriginal')} + </Button> + </> + ), + }, + ]), + ); + const convertListToMap = () => { + const result = []; + for (let i = 0; i < previewData?.length; i++) { + const temp = previewData?.[i]?.fieldList.reduce((acc, item) => { + acc[item.fieldName] = item.fieldValue; + return acc; + }, {}); + temp['id'] = temp['id'] ? temp['id'] : i; + temp['headers'] = previewData?.[i]?.headers; + temp['body'] = previewData?.[i]?.body; + temp['dt'] = dayjs(previewData?.[i]?.dt).format('YYYY-MM-DD HH:mm:ss'); + result.push(temp); + } + return result; + }; const onChange = ({ target: { value } }: RadioChangeEvent) => { setPosition(value); }; - useUpdateEffect(() => { if (modalProps.open) { if (inlongStreamId) { @@ -102,14 +161,31 @@ const Comp: React.FC<Props> = ({ inlongGroupId, inlongStreamId, ...modalProps }) </div> <Table columns={detailColumns} - dataSource={previewData} + dataSource={convertListToMap()} + scroll={{ x: 950 }} rowKey={'id'} - expandable={{ - expandedRowRender: record => <p style={{ margin: 0 }}>{record.body}</p>, - rowExpandable: record => record.id !== 'Not Expandable', - expandRowByClick: true, - }} ></Table> + + <Modal + width={800} + open={originalModal.open} + title={i18n.t('pages.GroupDetail.Stream.Original')} + onCancel={() => setOriginalModal(prev => ({ ...prev, open: false }))} + footer={[ + <Button key="back" onClick={() => setOriginalModal(prev => ({ ...prev, open: false }))}> + {i18n.t('pages.GroupDetail.Stream.Closed')} + </Button>, + ]} + > + <div> + <Card title="headers" bordered={false} style={{ width: 700 }}> + <p style={{ margin: 0 }}>{JSON.stringify(originalModal?.record['headers'])}</p> + </Card> + <Card title="body" bordered={false} style={{ width: 700, marginTop: 10 }}> + <p style={{ margin: 0 }}>{originalModal?.record['body']}</p> + </Card> + </div> + </Modal> </Modal> ); };