Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error: React Table: Export Blob is mandatory #90

Open
karthik282 opened this issue Mar 10, 2022 · 1 comment
Open

Error: React Table: Export Blob is mandatory #90

karthik282 opened this issue Mar 10, 2022 · 1 comment

Comments

@karthik282
Copy link

karthik282 commented Mar 10, 2022

Hi @gargroh

I am facing issue while integration export pdf csv xlsx .When i click button App is getting crashed.
Error: React Table: Export Blob is mandatory

Details as follows

"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-export-excel": "^0.5.3",
"react-table": "^7.7.0",
"react-table-plugins": "^1.3.2",
"jspdf": "^2.5.1",
"jspdf-autotable": "^3.5.23",
"papaparse": "^5.3.1",

`/* eslint-disable react/button-has-type /
/
eslint-disable react/prop-types /
/
eslint-disable react/jsx-props-no-spreading /
/
eslint-disable no-nested-ternary */

import React, { useMemo } from 'react';
import DeleteIcon from '@mui/icons-material/Delete';
import EditIcon from '@mui/icons-material/Edit';
import IconButton from '@mui/material/IconButton';
import Tooltip from '@mui/material/Tooltip';
import {
useTable,
useGlobalFilter,
useFilters,
useRowSelect,
usePagination,
useSortBy,
} from 'react-table';
import { useExportData } from "react-table-plugins";
import Papa from "papaparse";
import XLSX from "xlsx";
import JsPDF from "jspdf";
import "jspdf-autotable";
import { AiFillCaretUp, AiFillCaretDown } from 'react-icons/ai';
import './Table.css';

function TableController(props) {
const { tableColumn, tableData, hiddenColumns = [] } = props;

const columns = useMemo(() => tableColumn, [tableColumn]);
const data = useMemo(() => tableData, [tableData]);

const {
getTableProps,
getTableBodyProps,
headerGroups,
page,
nextPage,
previousPage,
canPreviousPage,
canNextPage,
pageOptions,
state,
gotoPage,
pageCount,
setPageSize,
prepareRow,
exportData
} = useTable(
{
columns,
data,
getExportFileBlob,
autoRestPage: false,
initialState: { pageIndex: 0, hiddenColumns },
sortBy: [
{
id: '',
desc: true,
},
],
},
useFilters,
useGlobalFilter,
useSortBy,
usePagination,
useExportData,
useRowSelect,
(hooks) => {
hooks.visibleColumns.push((columnHeader) => [
...columnHeader,
{
id: 'icons',
Cell: ({ row }) => (



<Tooltip
title='Edit'
onClick={() => props.onModifiyRecord(row)}
className='edit-icon'
data-testid='EditIcon'
>

<EditIcon sx={{ fontSize: 20 }} />




<Tooltip
title='Delete'
onClick={() => props.onDeleteRecord(row)}
className='delete-icon'
data-testid='DeleteIcon'
>

<DeleteIcon sx={{ fontSize: 25 }} />




),
},
]);

Error

}

);

const { pageIndex, pageSize } = state;

const paginationInput = (e) => {
const nextpage = e.target.value ? Number(e.target.value) - 1 : 0;
gotoPage(nextpage);
};

const paginationSetPage = (e) => {
setPageSize(Number(e.target.value));
};

const pageZero = () => {
gotoPage(0);
};

const pagePrevious = () => {
previousPage();
};

const pageNext = () => {
nextPage();
};

const pageGoto = () => {
gotoPage(pageCount - 1);
};

const getExportFileBlob = ({ column, tabledata, fileType, fileName }) => {

if (fileType === "csv") {
  // CSV example
  const headerNames = column
    .filter((c) => c.Header !== "Action")
    .map((col) => col.exportValue);
  const csvString = Papa.unparse({ fields: headerNames, tabledata });
  return new Blob([csvString], { type: "text/csv" });
} if (fileType === "xlsx") {
  // XLSX example
  const header = column
    .filter((c) => c.Header !== "Action")
    .map((c) => c.exportValue);
  const compatibleData = tabledata.map((row) => {
    const obj = {};
    header.forEach((col, index) => {
      obj[col] = row[index];
    });
    return obj;
  });

  const wb = XLSX.utils.book_new();
  const ws1 = XLSX.utils.json_to_sheet(compatibleData, {
    header
  });
  XLSX.utils.book_append_sheet(wb, ws1, "React Table Data");
  XLSX.writeFile(wb, `${fileName}.xlsx`);

  // Returning false as downloading of file is already taken care of
  return false;
}
// PDF example
if (fileType === "pdf") {
  const headerNames = column
    .filter((c) => c.Header !== "Action")
    .map((col) => col.exportValue);
  const doc = new JsPDF();
  doc.autoTable({
    head: [headerNames],
    body: tabledata,
    styles: {
      minCellHeight: 9,
      halign: "left",
      valign: "center",
      fontSize: 11
    }
  });
  doc.save(`${fileName}.pdf`);

  return false;
}

// Other formats goes here
return false;

}

return (



{/* <button
className="btn btnexport mr-1"
onClick={() => {
exportData("csv", true);
}}
>
Export as CSV
{" "}
<button
className="btn btnexport mr-1"
onClick={() => {
exportData("xlsx", true);
}}
>
Export as xlsx
{" "} */}
<button
className="btn btnexport mr-1"
onClick={() => {
exportData("pdf", true);
}}
>

Export as PDF



<table {...getTableProps()} className='table-striped'>

{headerGroups.map((headerGroup) => (
<tr {...headerGroup.getHeaderGroupProps()}>
{headerGroup.headers.map((column) => (
<th {...column.getHeaderProps(column.getSortByToggleProps())}>
{column.render('Header')}

{column.isSorted ? (
column.isSortedDesc ? (

) : (

)
) : (
''
)}


{column.canFilter ? column.render('Filter') : null}


))}

))}

<tbody {...getTableBodyProps()}>
{page.map((row) => {
prepareRow(row);
return (
<tr {...row.getRowProps()}>
{row.cells.map((cell) => (
<td {...cell.getCellProps()}>{cell.render('Cell')}
))}

);
})}






Page{' '}

{pageIndex + 1} of {pageOptions.length}
{' '}


| Go to:{' '}
<input
defaultValue={pageIndex + 1}
onChange={paginationInput}
style={{ width: '50px' }}
/>
{' '}


{[10, 20, 30, 40, 50].map((pageSizeNumber) => ( Show {pageSizeNumber} ))}



{'<<'}
{' '}

{'<'}
{' '}

{'>'}
{' '}

{'>>'}
{' '}



);
}

export default TableController;
`

@gargroh
Copy link
Owner

gargroh commented Mar 21, 2022

@karthik282 codesandbox of the issue will be helpful in addressing this..

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants