seed stuff

This commit is contained in:
Jake Kasper
2025-09-03 10:56:17 -04:00
parent 6dbdba0e38
commit e7cbaf844f
8 changed files with 271 additions and 28 deletions

View File

@@ -458,6 +458,7 @@ const CreateProductModal = ({ onSubmit, onCancel, sharedProducts, categories })
});
const [spreaderSettings, setSpreaderSettings] = useState([]);
const [seedBlend, setSeedBlend] = useState([]); // [{cultivar:'', percent:0}]
const [availableSpreaders, setAvailableSpreaders] = useState([]);
const [loadingSpreaders, setLoadingSpreaders] = useState(false);
const [newSpreaderSetting, setNewSpreaderSetting] = useState({
@@ -543,6 +544,11 @@ const CreateProductModal = ({ onSubmit, onCancel, sharedProducts, categories })
spreaderSettings: formData.productType === 'granular' ? spreaderSettings : []
};
// If this is a seed product and user entered a blend, pack it into activeIngredients as JSON
if (formData.productType === 'seed' && Array.isArray(seedBlend) && seedBlend.length > 0) {
submitData.activeIngredients = JSON.stringify({ seedBlend });
}
onSubmit(submitData);
};
@@ -618,6 +624,10 @@ const CreateProductModal = ({ onSubmit, onCancel, sharedProducts, categories })
</div>
</div>
{formData.productType === 'seed' && (
<SeedBlendEditor value={seedBlend} onChange={setSeedBlend} />
)}
<div>
<label className="label">Brand</label>
<input
@@ -1460,4 +1470,38 @@ const EditProductModal = ({ product, onSubmit, onCancel, sharedProducts, categor
);
};
export default Products;
// Editor component for seed blends
const SeedBlendEditor = ({ value = [], onChange }) => {
const [rows, setRows] = React.useState(value || []);
React.useEffect(()=>{ onChange && onChange(rows); }, [rows]);
const addRow = () => setRows([...(rows||[]), { cultivar: '', percent: '' }]);
const updateRow = (i, field, v) => setRows((rows||[]).map((r,idx)=> idx===i? { ...r, [field]: v } : r));
const removeRow = (i) => setRows((rows||[]).filter((_,idx)=> idx!==i));
const total = (rows||[]).reduce((s,r)=> s + (parseFloat(r.percent)||0), 0);
return (
<div className="border rounded-lg p-3">
<div className="flex justify-between items-center mb-2">
<label className="label m-0">Seed Blend</label>
<button type="button" className="text-sm text-blue-600" onClick={addRow}>Add Cultivar</button>
</div>
{(rows||[]).length === 0 ? (
<div className="text-sm text-gray-500">No cultivars added</div>
) : (
<div className="space-y-2">
{(rows||[]).map((row, i) => (
<div key={i} className="grid grid-cols-6 gap-2 items-center">
<input className="input col-span-4" placeholder="Cultivar name" value={row.cultivar} onChange={(e)=> updateRow(i,'cultivar', e.target.value)} />
<div className="col-span-1 flex items-center gap-1">
<input type="number" step="0.1" className="input" placeholder="%" value={row.percent} onChange={(e)=> updateRow(i,'percent', e.target.value)} />
</div>
<button type="button" className="text-red-600" onClick={()=> removeRow(i)}>Remove</button>
</div>
))}
<div className={`text-xs ${Math.abs(total-100) < 0.01 ? 'text-green-700' : 'text-gray-600'}`}>Total: {total.toFixed(1)}%</div>
</div>
)}
</div>
);
};
export default Products;