import { useState } from '@wordpress/element'; import { Button, Panel, PanelBody } from '@wordpress/components'; import Fields from '../Fields'; const templateLabel = (template, row, fields) => { if (!template?.includes('{{')) return template; return template.replace(/{{(.*?)}}/g, (_, name) => { const val = row[name]; if (val === undefined) return ''; return Array.isArray(val) ? val.join(', ') : String(val); }); }; const emptyRow = (fields) => Object.fromEntries(Object.entries(fields || {}).map(([name, f]) => [name, f.default ?? ''])); const RepeaterField = ({ field, value, onChange, meta }) => { const rows = Array.isArray(value) ? value : []; const subFields = field.fields || {}; const [openIndex, setOpenIndex] = useState(null); const updateRow = (index, name, val) => { const next = rows.map((row, i) => (i === index ? { ...row, [name]: val } : row)); onChange(next); }; const addRow = () => onChange([...rows, emptyRow(subFields)]); const removeRow = (index) => onChange(rows.filter((_, i) => i !== index)); return (

{field.label}

{rows.map((row, index) => ( setOpenIndex(openIndex === index ? null : index)} > {Object.entries(subFields).map(([name, subField]) => ( updateRow(index, name, val)} meta={ meta } /> ))} ))}
); }; export default RepeaterField;