import { useState, useEffect, useMemo, useCallback } from '@wordpress/element'; import { Button, Modal, SelectControl, ToggleControl } from '@wordpress/components'; import { __ } from '@wordpress/i18n'; import LCPDataGrid from './LCPDataGrid'; import LCPDataUploader from './LCPDataUploader'; const LCPDatasetBuilder = ({ chartData = [], onChange, attributes, setAttributes, chartType }) => { const [isOpen, setIsOpen] = useState(false); const [options, setOptions] = useState([]); // Function to update chartData attribute with parsed JSON data from CSV const handleJsonDataUpdate = (newData) => { console.log('Received new data from CSV:', newData); setAttributes({ chartData: newData }); }; useEffect(() => { if (chartData && chartData.length > 0) { const columns = Object.keys(chartData[0]).filter(key => key !== 'lcpId'); setOptions(columns.map(col => ({ label: col, value: col }))); } }, [chartData]); // Get available columns from chartData const getAvailableColumns = () => { if (!chartData.length) return []; // Get all unique keys from the data const columns = Array.from(new Set( chartData.flatMap(item => Object.keys(item)) )).filter(key => key !== 'lcpId'); // Exclude lcpId column return columns; }; // Get column options based on type filter const getColumnOptions = (columns, typeFilter = null) => { return columns .filter(col => { if (!typeFilter) return true; const columnType = attributes.columnTypes?.[col]; return columnType === typeFilter; }) .map(col => ({ label: col, value: col })); }; const handleDataChange = (newData) => { console.log('DatasetBuilder updating chartData:', newData); onChange(newData); }; const downloadCSV = useCallback(() => { if (!chartData || chartData.length === 0) return; // Get all columns except internal ones const columns = Object.keys(chartData[0]).filter(key => !['ID', 'Parent'].includes(key)); // Create CSV header const header = columns.join(','); // Create CSV rows const rows = chartData.map(row => columns.map(col => { let value = row[col] || ''; // Handle special characters in CSV if (typeof value === 'string' && (value.includes(',') || value.includes('"') || value.includes('\n'))) { value = `"${value.replace(/"/g, '""')}"`; } return value; }).join(',') ).join('\n'); // Combine header and rows const csv = `${header}\n${rows}`; // Create and trigger download const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.setAttribute('href', url); link.setAttribute('download', 'chart-data.csv'); document.body.appendChild(link); link.click(); document.body.removeChild(link); URL.revokeObjectURL(url); }, [chartData]); // Get default value for valueColumn const defaultValueColumn = useMemo(() => { return attributes.valueColumn || (options[0]?.value || ''); }, [attributes.valueColumn, options]); // Get all available columns const availableColumns = getAvailableColumns(); // Get all column options const allOptions = getColumnOptions(availableColumns); // Get numeric column options for bar chart value const numericOptions = getColumnOptions(availableColumns, 'lcpNumber'); // Determine which options to use for value column const valueColumnOptions = chartType === 'bar' ? numericOptions : allOptions; // Add "None" option for optional fields const optionalOptions = [{ label: __('None', 'lcp-visualize'), value: '' }, ...allOptions]; return (
{isOpen && ( setIsOpen(false)} title="Dataset Builder" style={{ width: '90vw', height: '90vh' }} >
{ const newColumnTypes = { ...attributes.columnTypes, [field]: type }; setAttributes({ columnTypes: newColumnTypes, // If we're changing from a numeric type and this is the value column, reset it valueColumn: field === attributes.valueColumn && type !== 'lcpNumber' && chartType === 'bar' ? '' : attributes.valueColumn }); }} />
setAttributes({ valueColumn: value })} /> {chartType === 'bar' && valueColumnOptions.length === 0 && (
{__('Please set at least one column type to Number to use as the value column', 'lcp-visualize')}
)} setAttributes({ labelsColumn: value })} /> setAttributes({ colorColumn: value })} /> setAttributes({ popoverColumn: value })} />
)}
); }; export default LCPDatasetBuilder;