/* eslint-disable @typescript-eslint/no-explicit-any */ import React from 'react'; import JSONToTableUtils, { JSONObjectType, JSONObjectKeys } from './utils'; import './style.css'; export interface IJsonToTableProps { id?: string; json: any; // Consider specifying a more detailed type depending on your JSON structure styles?: React.CSSProperties; } export const JsonToTable: React.FC = ({ json, id, styles }) => { const getCellValue = (content: any): string => { return content === true || content === false ? content.toString() : content; }; const renderCell = ({ content, colspan = 1, isHeader = false, }: { content: any; colspan?: number; isHeader?: boolean; key?: any; }): JSX.Element => { const valueDisplay = isHeader ? ( {getCellValue(content)} ) : ( getCellValue(content) ); return ( {valueDisplay} ); }; const renderHeader = (labels: string[]): JSX.Element => { return ( {labels.map((v, index) => renderCell({ content: v, key: `header-${index}` }))} ); }; const renderValues = (values: any[]): JSX.Element => { return ( {values.map((k, index) => renderCell({ content: k, key: `value-${index}` }))} ); }; const renderRowValues = (anArray: any[], labels: string[]): JSX.Element[] => { return anArray.map((item, idx) => { return ( {labels.map((k, index) => { const isValuePrimitive = JSONToTableUtils.getObjectType(item[k]) === JSONObjectType.Primitive; return isValuePrimitive ? renderCell({ content: item[k], key: `item-${idx}-${index}` }) : renderObject(item[k], k, idx); })} ); }); }; const parseArray = (anArray: any[]): JSX.Element[] => { const phrase: JSX.Element[] = []; const labels: JSONObjectKeys = JSONToTableUtils.getUniqueObjectKeys(anArray); if (JSONToTableUtils.checkLabelTypes(labels.labels) !== 'number') { phrase.push(renderHeader(labels.labels)); phrase.push(...renderRowValues(anArray, labels.labels)); } else { phrase.push(renderValues(anArray)); } return phrase; }; const renderRows = (obj: any): any => { return Object.keys(obj).map((k, idx) => { const value = obj[k]; const isValuePrimitive = JSONToTableUtils.getObjectType(value) === JSONObjectType.Primitive; return isValuePrimitive ? ( {k} {value} ) : ( renderObject(value, k, idx) ); }); }; const renderRowHeader = (label: string): JSX.Element => { return (
{label}
); }; const renderObject = ( obj: any, header: string | undefined, idx: number, ): JSX.Element | JSX.Element[] => { const phrase: any = []; if (header) { phrase.push(renderRowHeader(header)); } const objType: JSONObjectType = JSONToTableUtils.getObjectType(obj); let tmp: JSX.Element | JSX.Element[]; switch (objType) { case JSONObjectType.ObjectWithNonNumericKeys: tmp = header ? ( {renderRows(obj)}
) : ( renderRows(obj) ); break; case JSONObjectType.Array: tmp = header ? ( {parseArray(obj)}
) : ( parseArray(obj) ); break; default: tmp = <>; // Handle other cases or default to an empty fragment } phrase.push(tmp); return header ? ( {renderCell({ content: phrase, colspan: 2 })} ) : ( phrase ); }; return (
{renderObject(json, undefined, 0)}
); };