From 64f0ff05f9f188a74fc6be3865c31d62ebff3f67 Mon Sep 17 00:00:00 2001 From: Rajat Dabade Date: Wed, 1 Nov 2023 17:53:31 +0530 Subject: [PATCH] [Feat]: Download as CSV and Execl and Search option for key-operation table (#3848) * refactor: done with the download option for key-operation * refactor: added search option for key operation metrics * refactor: done with the download option for key-operation * refactor: added search option for key operation metrics * refactor: updated downloadable data * refactor: updated downloadable data for metrics key operation * refactor: updated the data * refactor: map with the correct value for export * refactor: updated downloabable data for metrics * refactor: updated the data for metrics * refactor: added safety check --------- Co-authored-by: Ankit Nayan --- .../container/Download/Download.styles.scss | 4 + frontend/src/container/Download/Download.tsx | 77 +++++++++++++++++ .../src/container/Download/Download.types.ts | 10 +++ frontend/src/container/LogControls/index.tsx | 70 ++-------------- .../Tabs/Overview/TopOperation.tsx | 8 +- .../Tabs/Overview/TopOperationMetrics.tsx | 2 + .../TopOperationsTable.styles.scss | 9 ++ .../MetricsApplication/TopOperationsTable.tsx | 83 ++++++++++++++----- .../container/MetricsApplication/constant.ts | 7 ++ .../src/container/MetricsApplication/utils.ts | 16 ++++ .../QueryTable/QueryTable.intefaces.ts | 2 + .../QueryTable/QueryTable.styles.scss | 9 ++ .../src/container/QueryTable/QueryTable.tsx | 39 +++++++-- frontend/src/container/QueryTable/utils.ts | 14 ++++ 14 files changed, 252 insertions(+), 98 deletions(-) create mode 100644 frontend/src/container/Download/Download.styles.scss create mode 100644 frontend/src/container/Download/Download.tsx create mode 100644 frontend/src/container/Download/Download.types.ts create mode 100644 frontend/src/container/MetricsApplication/TopOperationsTable.styles.scss create mode 100644 frontend/src/container/QueryTable/QueryTable.styles.scss create mode 100644 frontend/src/container/QueryTable/utils.ts diff --git a/frontend/src/container/Download/Download.styles.scss b/frontend/src/container/Download/Download.styles.scss new file mode 100644 index 0000000000..9352530517 --- /dev/null +++ b/frontend/src/container/Download/Download.styles.scss @@ -0,0 +1,4 @@ +.download-button { + display: flex; + align-items: center; +} \ No newline at end of file diff --git a/frontend/src/container/Download/Download.tsx b/frontend/src/container/Download/Download.tsx new file mode 100644 index 0000000000..666b015095 --- /dev/null +++ b/frontend/src/container/Download/Download.tsx @@ -0,0 +1,77 @@ +import './Download.styles.scss'; + +import { CloudDownloadOutlined } from '@ant-design/icons'; +import { Button, Dropdown, MenuProps } from 'antd'; +import { Excel } from 'antd-table-saveas-excel'; +import { unparse } from 'papaparse'; + +import { DownloadProps } from './Download.types'; + +function Download({ data, isLoading, fileName }: DownloadProps): JSX.Element { + const downloadExcelFile = (): void => { + const headers = Object.keys(Object.assign({}, ...data)).map((item) => { + const updatedTitle = item + .split('_') + .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) + .join(' '); + return { + title: updatedTitle, + dataIndex: item, + }; + }); + const excel = new Excel(); + excel + .addSheet(fileName) + .addColumns(headers) + .addDataSource(data, { + str2Percent: true, + }) + .saveAs(`${fileName}.xlsx`); + }; + + const downloadCsvFile = (): void => { + const csv = unparse(data); + const csvBlob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); + const csvUrl = URL.createObjectURL(csvBlob); + const downloadLink = document.createElement('a'); + downloadLink.href = csvUrl; + downloadLink.download = `${fileName}.csv`; + downloadLink.click(); + downloadLink.remove(); + }; + + const menu: MenuProps = { + items: [ + { + key: 'download-as-excel', + label: 'Excel', + onClick: downloadExcelFile, + }, + { + key: 'download-as-csv', + label: 'CSV', + onClick: downloadCsvFile, + }, + ], + }; + + return ( + + + + ); +} + +Download.defaultProps = { + isLoading: undefined, +}; + +export default Download; diff --git a/frontend/src/container/Download/Download.types.ts b/frontend/src/container/Download/Download.types.ts new file mode 100644 index 0000000000..0757ed62fd --- /dev/null +++ b/frontend/src/container/Download/Download.types.ts @@ -0,0 +1,10 @@ +export type DownloadOptions = { + isDownloadEnabled: boolean; + fileName: string; +}; + +export type DownloadProps = { + data: Record[]; + isLoading?: boolean; + fileName: string; +}; diff --git a/frontend/src/container/LogControls/index.tsx b/frontend/src/container/LogControls/index.tsx index 01fe12e808..eda7f89c33 100644 --- a/frontend/src/container/LogControls/index.tsx +++ b/frontend/src/container/LogControls/index.tsx @@ -1,15 +1,14 @@ -import { CloudDownloadOutlined, FastBackwardOutlined } from '@ant-design/icons'; -import { Button, Divider, Dropdown, MenuProps } from 'antd'; -import { Excel } from 'antd-table-saveas-excel'; +import { FastBackwardOutlined } from '@ant-design/icons'; +import { Button, Divider } from 'antd'; import Controls from 'container/Controls'; +import Download from 'container/Download/Download'; import { getGlobalTime } from 'container/LogsSearchFilter/utils'; import { getMinMax } from 'container/TopNav/AutoRefresh/config'; import dayjs from 'dayjs'; import { Pagination } from 'hooks/queryPagination'; import { FlatLogData } from 'lib/logs/flatLogData'; import { OrderPreferenceItems } from 'pages/Logs/config'; -import { unparse } from 'papaparse'; -import { memo, useCallback, useMemo } from 'react'; +import { memo, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { Dispatch } from 'redux'; import { AppState } from 'store/reducers'; @@ -23,7 +22,7 @@ import { import { GlobalReducer } from 'types/reducer/globalTime'; import { ILogsReducer } from 'types/reducer/logs'; -import { Container, DownloadLogButton } from './styles'; +import { Container } from './styles'; function LogControls(): JSX.Element | null { const { @@ -97,58 +96,6 @@ function LogControls(): JSX.Element | null { [logs], ); - const downloadExcelFile = useCallback((): void => { - const headers = Object.keys(Object.assign({}, ...flattenLogData)).map( - (item) => { - const updatedTitle = item - .split('_') - .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) - .join(' '); - return { - title: updatedTitle, - dataIndex: item, - }; - }, - ); - const excel = new Excel(); - excel - .addSheet('log_data') - .addColumns(headers) - .addDataSource(flattenLogData, { - str2Percent: true, - }) - .saveAs('log_data.xlsx'); - }, [flattenLogData]); - - const downloadCsvFile = useCallback((): void => { - const csv = unparse(flattenLogData); - const csvBlob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); - const csvUrl = URL.createObjectURL(csvBlob); - const downloadLink = document.createElement('a'); - downloadLink.href = csvUrl; - downloadLink.download = 'log_data.csv'; - downloadLink.click(); - downloadLink.remove(); - }, [flattenLogData]); - - const menu: MenuProps = useMemo( - () => ({ - items: [ - { - key: 'download-as-excel', - label: 'Excel', - onClick: downloadExcelFile, - }, - { - key: 'download-as-csv', - label: 'CSV', - onClick: downloadCsvFile, - }, - ], - }), - [downloadCsvFile, downloadExcelFile], - ); - const isLoading = isLogsLoading || isLoadingAggregate; if (liveTail !== 'STOPPED') { @@ -157,12 +104,7 @@ function LogControls(): JSX.Element | null { return ( - - - - Download - - +