/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import React, { useMemo, useState } from "react"; import { ColumnMetadata } from "../models"; import { useTableMetadata } from "../hooks"; import MarkdownRender from "./MarkdownRender"; import TickFormatter from "../services/TickFormatter"; import UtilsService from "../services/UtilsService"; import Table from "./Table"; import ShareButton from "./ShareButton"; type Props = { id: string; title: string; summary: string; data?: Array; summaryBelow: boolean; columnsMetadata: ColumnMetadata[]; sortByColumn?: string; sortByDesc?: boolean; significantDigitLabels: boolean; displayWithPages: boolean; showMobilePreview?: boolean; }; const TableWidget = ({ id, data, summaryBelow, summary, title, columnsMetadata, sortByDesc, sortByColumn, significantDigitLabels, displayWithPages, }: Props) => { const { largestTickByColumn } = useTableMetadata(data); const [filteredJson, setFilteredJson] = useState([]); useMemo(() => { let headers = data && data.length > 0 ? Object.keys(data[0]) : []; headers = headers.filter((h) => { const metadata = columnsMetadata ? columnsMetadata.find((c) => c.columnName === h) : undefined; return !metadata || !metadata.hidden; }); const newFilteredJson = new Array(); for (const row of data || new Array()) { const filteredRow = headers.reduce((obj: any, key: any) => { obj[key] = row[key]; return obj; }, {}); if (Object.keys(filteredRow).length > 0) { newFilteredJson.push(filteredRow); } } setFilteredJson(newFilteredJson); }, [data, columnsMetadata]); const rows = useMemo(() => filteredJson || [], [filteredJson]); const columns = useMemo(() => { const keys = filteredJson.length ? Object.keys(filteredJson[0] as Array) : []; return keys.map((header) => { return { Header: header, id: header, accessor: header, minWidth: 150, Cell: (props: any) => { const row = props.row.original; // Check if there is metadata for this column let columnMetadata; if (columnsMetadata) { columnMetadata = columnsMetadata.find((cm) => cm.columnName === header); } return !UtilsService.isCellEmpty(row[header]) ? TickFormatter.format( row[header], largestTickByColumn[header], significantDigitLabels, "", "", columnMetadata, ) : "-"; }, }; }); }, [largestTickByColumn, significantDigitLabels, columnsMetadata, filteredJson]); if (!filteredJson || filteredJson.length === 0) { return null; } return (
{title && (

{title}

)} {!summaryBelow && ( )} {summaryBelow && ( )} ); }; export default TableWidget;