/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import React, { useCallback, useMemo, MouseEvent } from "react"; import { ColumnDataType, CurrencyDataType, NumberDataType } from "../models"; import TickFormatter from "../services/TickFormatter"; import UtilsService from "../services/UtilsService"; import Button from "./Button"; import Dropdown from "./Dropdown"; import Table from "./Table"; import { useTranslation } from "react-i18next"; import { useWindowSize } from "../hooks"; interface Props { hiddenColumns: Set; setHiddenColumns: Function; backStep: (event: MouseEvent) => void; advanceStep: (event: MouseEvent) => void; onCancel: (event: MouseEvent) => void; data: Array; dataTypes: Map; setDataTypes: Function; numberTypes: Map; setNumberTypes: Function; currencyTypes: Map; setCurrencyTypes: Function; sortByColumn?: string; sortByDesc?: boolean; setSortByColumn?: Function; setSortByDesc?: Function; reset?: Function; widgetType: string; } function CheckData(props: Props) { const { t } = useTranslation(); const windowSize = useWindowSize(); const isMobile = windowSize.width <= 600; const handleHideFromVisualizationChange = useCallback( (event: React.FormEvent) => { const target = event.target as HTMLInputElement; const newHiddenColumns = new Set(props.hiddenColumns); if (target.checked) { newHiddenColumns.delete(target.name); } else { newHiddenColumns.add(target.name); } props.setHiddenColumns(newHiddenColumns); }, [props.hiddenColumns], ); const handleDataTypeChange = useCallback( (event: React.FormEvent) => { const target = event.target as HTMLInputElement; const newDataTypes = new Map(props.dataTypes); if (target.value === ColumnDataType.Text) { newDataTypes.set(target.id, ColumnDataType.Text); } else if (target.value === ColumnDataType.Number) { newDataTypes.set(target.id, ColumnDataType.Number); } else if (target.value === ColumnDataType.Date) { newDataTypes.set(target.id, ColumnDataType.Date); } else { newDataTypes.delete(target.id); } props.setDataTypes(newDataTypes); }, [props.dataTypes], ); const handleNumberTypeChange = useCallback( (event: React.FormEvent) => { const target = event.target as HTMLInputElement; const newNumberTypes = new Map(props.numberTypes); if (target.value === NumberDataType.Percentage) { newNumberTypes.set(target.id, NumberDataType.Percentage); } else if (target.value === NumberDataType.Currency) { newNumberTypes.set(target.id, NumberDataType.Currency); } else if (target.value === NumberDataType["With thousands separators"]) { newNumberTypes.set(target.id, NumberDataType["With thousands separators"]); } else { newNumberTypes.delete(target.id); } props.setNumberTypes(newNumberTypes); }, [props.numberTypes], ); const handleCurrencyTypeChange = useCallback( (event: React.FormEvent) => { const target = event.target as HTMLInputElement; const newCurrencyTypes = new Map(props.currencyTypes); if (target.value === CurrencyDataType["Dollar $"]) { newCurrencyTypes.set(target.id, CurrencyDataType["Dollar $"]); } else if (target.value === CurrencyDataType["Euro €"]) { newCurrencyTypes.set(target.id, CurrencyDataType["Euro €"]); } else if (target.value === CurrencyDataType["Pound £"]) { newCurrencyTypes.set(target.id, CurrencyDataType["Pound £"]); } else { newCurrencyTypes.delete(target.id); } props.setCurrencyTypes(newCurrencyTypes); }, [props.currencyTypes], ); const handleCell = (properties: any, header: any) => { const row = properties.row.original; const cellHeader = !UtilsService.isCellEmpty(row[header]) ? row[header].toLocaleString() : "-"; if (!props.dataTypes.has(header)) { return cellHeader; } if (props.dataTypes.get(header) === ColumnDataType.Number) { return typeof row[header] === "number" ? ( TickFormatter.format(row[header], 0, false, "", "", { columnName: header, hidden: props.hiddenColumns.has(header), dataType: ColumnDataType.Number, numberType: props.numberTypes.get(header), currencyType: props.currencyTypes.get(header), }) ) : (
{`! ${cellHeader}`}
); } if (props.dataTypes.get(header) === ColumnDataType.Date) { return !isNaN(Date.parse(row[header])) ? ( row[header].toLocaleString() ) : (
{`! ${cellHeader}`}
); } if (props.dataTypes.get(header) === ColumnDataType.Text) { return cellHeader; } return cellHeader; }; const checkDataTableRows = useMemo(() => props.data || [], [props.data]); const dataColumns = props.data.length ? Object.keys(props.data[0]) : []; const checkDataTableColumns = useMemo( () => dataColumns.map((header, i) => { return { Header: () => ( ), id: `checkbox${header}`, columns: [ { Header: header, id: header, accessor: header, minWidth: 150, Cell: (properties: any) => { return handleCell(properties, header); }, }, ], }; }), [props.data, props.dataTypes, props.numberTypes, props.currencyTypes], ); return ( <>
{t("CheckDataDescription", { widgetType: props.widgetType })}
{t("IncludeInVisualization")}

{t("FormatColumns")}
{(props.data.length ? Object.keys(props.data[0]) : []).map((header: string) => { return (
{t("CheckDataHeader", { header })}
{props.dataTypes.get(header) === ColumnDataType.Number && (
)} {props.dataTypes.get(header) === ColumnDataType.Number && props.numberTypes.get(header) === NumberDataType.Currency && (
)}

); })}

); } export default CheckData;