seed stuff
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user