Untitled
unknown
plain_text
a year ago
6.3 kB
5
Indexable
explain the below code: import { AppContext, useAppState, withPage } from '@d-lift/core'; import { Page } from '@d-lift/uxcomponents'; import { DataTable, Header, Button, Group, Section, Para, Grid, Row, Column, } from '@d-lift/uxcomponents'; import React, { Suspense, useEffect } from 'react'; const SummarizeResponse = ({ summarizeResponse, responseData }) => { const [rfiSummarizeResponse, setRfiSummarizeResponse] = useAppState('RFISummarizeResponse', []); const [csvData, setCsvData] = useAppState(''); const generateTableProps = (responseData) => { let colDataKeys = ['st', ...responseData.map((q, index) => `q${index + 1}`)].join(','); let colDefaultHeaders = ['ST', ...responseData.map((item) => item.question)].join(','); return { colDataKeys, colDefaultHeaders }; }; let { colDataKeys, colDefaultHeaders } = generateTableProps(responseData); const formatTableData = (responseData) => { let stateAnswerMaps = {}; responseData.forEach((item) => { if (item.answers && Array.isArray(item.answers)) { item.answers.forEach((answer) => { const state = answer.state; if (!stateAnswerMaps[state]) { stateAnswerMaps[state] = { st: state, }; responseData.forEach((question, index) => { stateAnswerMaps[state][`q${index + 1}`] = 'N/A'; }); } const questionIndex = responseData.findIndex((q) => q.id === answer.quesnId); if (questionIndex !== -1) { let questionKey = `q${questionIndex + 1}`; if (!stateAnswerMaps[state][questionKey].includes(answer.answer)) { stateAnswerMaps[state][questionKey] = stateAnswerMaps[state][questionKey] === 'N/A' ? answer.answer : `${stateAnswerMaps[state][questionKey]}, ${answer.answer}`; } } }); } }); return Object.values(stateAnswerMaps); }; useEffect(() => { if (responseData && Array.isArray(responseData)) { const summaryData = formatTableData(responseData); setRfiSummarizeResponse(summaryData); } else { setRfiSummarizeResponse([]); } }, [responseData]); let dataTable = useAppState('RFISummarizeResponse'); let headers = ['ST', ...responseData.map((item) => item.question)]; useEffect(() => { if ( dataTable && Array.isArray(dataTable) && dataTable.every((row) => typeof row === 'object' && row !== null) ) { let csvContent = prepareCSVData(dataTable, headers); setCsvData(csvContent); } else { console.log('Waiting for dataTable to be populated or corrected...'); } }, [dataTable, headers]); const prepareCSVData = (dataTable, headers) => { if (!Array.isArray(dataTable)) { console.error('Invalid data: expected an array', dataTable); return ''; } let csvContent = 'data:text/csv;charset=utf-8,'; if (headers && headers.length > 0) { csvContent += headers.join(',') + '\n'; } dataTable[0].forEach((row) => { if (typeof row === 'object' && row !== null) { let rowContent = Object.values(row).join(','); csvContent += rowContent + '\n'; } else { console.error('Unexpected row type:', row); } }); return csvContent; }; const downloadCSV = (csvContent) => { const encodedUri = encodeURI(csvContent); const link = document.createElement('a'); link.setAttribute('href', encodedUri); link.setAttribute('download', 'datatable_export.csv'); document.body.appendChild(link); link.click(); document.body.removeChild(link); }; const exportCSV = () => { if (!dataTable || !Array.isArray(dataTable) || dataTable[0] === undefined) { console.error('Data is not ready for export.'); return; } let csvContent = prepareCSVData(dataTable, headers); if (csvContent) { downloadCSV(csvContent); } else { console.error('Failed to prepare CSV data'); } }; return ( <> <Section showIf={summarizeResponse}> <Grid> <Row className="mt-5 mb-2"> <Column className="col-md-9"> <Header className="pt-3 ux-rfi-font-header" size="4" labelKey="responses_header" /> </Column> <Column className="col-md-3 d-flex justify-content-end"> <Button id="downloadCSV" className="ux-rfi-green-button " labelKey="download_btn" click={exportCSV} /> </Column> </Row> </Grid> <div className="ux-rfi-black-border-round"> <DataTable col-data-keys={colDataKeys} col-default-headers={colDefaultHeaders} datacollection="RFISummarizeResponse" className="dt-container" emptymsg-key="Empty_message" keyfield="id" hover="false" striped={false} responsive={true} /> </div> </Section> </> ); }; export default SummarizeResponse;
Editor is loading...
Leave a Comment