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 (