products
This commit is contained in:
@@ -537,6 +537,18 @@ const CreateProductModal = ({ onSubmit, onCancel, sharedProducts, categories })
|
|||||||
const [seedBlend, setSeedBlend] = useState([]); // [{cultivar:'', percent:0}]
|
const [seedBlend, setSeedBlend] = useState([]); // [{cultivar:'', percent:0}]
|
||||||
const [seedNewRate, setSeedNewRate] = useState('');
|
const [seedNewRate, setSeedNewRate] = useState('');
|
||||||
const [seedOverRate, setSeedOverRate] = useState('');
|
const [seedOverRate, setSeedOverRate] = useState('');
|
||||||
|
// Sync default rate field as average for compatibility
|
||||||
|
useEffect(() => {
|
||||||
|
if (formData.productType === 'seed') {
|
||||||
|
const n = parseFloat(seedNewRate);
|
||||||
|
const o = parseFloat(seedOverRate);
|
||||||
|
let avg = '';
|
||||||
|
if (!isNaN(n) && !isNaN(o)) avg = ((n + o) / 2).toFixed(2);
|
||||||
|
else if (!isNaN(n)) avg = n;
|
||||||
|
else if (!isNaN(o)) avg = o;
|
||||||
|
setFormData(prev => ({ ...prev, customRateAmount: avg }));
|
||||||
|
}
|
||||||
|
}, [formData.productType, seedNewRate, seedOverRate]);
|
||||||
const [availableSpreaders, setAvailableSpreaders] = useState([]);
|
const [availableSpreaders, setAvailableSpreaders] = useState([]);
|
||||||
const [loadingSpreaders, setLoadingSpreaders] = useState(false);
|
const [loadingSpreaders, setLoadingSpreaders] = useState(false);
|
||||||
const [newSpreaderSetting, setNewSpreaderSetting] = useState({
|
const [newSpreaderSetting, setNewSpreaderSetting] = useState({
|
||||||
@@ -713,19 +725,7 @@ const CreateProductModal = ({ onSubmit, onCancel, sharedProducts, categories })
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{formData.productType === 'seed' && (
|
{formData.productType === 'seed' && (
|
||||||
<>
|
<SeedBlendEditor value={seedBlend} onChange={setSeedBlend} />
|
||||||
<SeedBlendEditor value={seedBlend} onChange={setSeedBlend} />
|
|
||||||
<div className="grid grid-cols-2 gap-3 mt-3">
|
|
||||||
<div>
|
|
||||||
<label className="label text-xs">New Lawn Seeding Rate</label>
|
|
||||||
<input type="number" step="0.01" className="input" value={seedNewRate} onChange={(e)=> setSeedNewRate(e.target.value)} placeholder="e.g., 7" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label className="label text-xs">Overseeding Rate</label>
|
|
||||||
<input type="number" step="0.01" className="input" value={seedOverRate} onChange={(e)=> setSeedOverRate(e.target.value)} placeholder="e.g., 3" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
@@ -754,15 +754,33 @@ const CreateProductModal = ({ onSubmit, onCancel, sharedProducts, categories })
|
|||||||
|
|
||||||
<div className="grid grid-cols-2 gap-4">
|
<div className="grid grid-cols-2 gap-4">
|
||||||
<div>
|
<div>
|
||||||
<label className="label">Application Rate</label>
|
{formData.productType === 'seed' ? (
|
||||||
<input
|
<div>
|
||||||
type="number"
|
<label className="label">Seeding Rates</label>
|
||||||
step="0.01"
|
<div className="space-y-2">
|
||||||
className="input"
|
<div>
|
||||||
value={formData.customRateAmount}
|
<label className="label text-xs">New Lawn (lbs/1000 sq ft)</label>
|
||||||
onChange={(e) => setFormData({ ...formData, customRateAmount: e.target.value })}
|
<input type="number" step="0.01" className="input" value={seedNewRate} onChange={(e)=> setSeedNewRate(e.target.value)} placeholder="e.g., 7" />
|
||||||
placeholder="2.5"
|
</div>
|
||||||
/>
|
<div>
|
||||||
|
<label className="label text-xs">Overseeding (lbs/1000 sq ft)</label>
|
||||||
|
<input type="number" step="0.01" className="input" value={seedOverRate} onChange={(e)=> setSeedOverRate(e.target.value)} placeholder="e.g., 3" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<label className="label">Application Rate</label>
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
step="0.01"
|
||||||
|
className="input"
|
||||||
|
value={formData.customRateAmount}
|
||||||
|
onChange={(e) => setFormData({ ...formData, customRateAmount: e.target.value })}
|
||||||
|
placeholder="2.5"
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label className="label">Rate Unit</label>
|
<label className="label">Rate Unit</label>
|
||||||
@@ -936,6 +954,18 @@ const EditProductModal = ({ product, onSubmit, onCancel, sharedProducts, categor
|
|||||||
const [editSeedBlend, setEditSeedBlend] = useState([]);
|
const [editSeedBlend, setEditSeedBlend] = useState([]);
|
||||||
const [editSeedNewRate, setEditSeedNewRate] = useState('');
|
const [editSeedNewRate, setEditSeedNewRate] = useState('');
|
||||||
const [editSeedOverRate, setEditSeedOverRate] = useState('');
|
const [editSeedOverRate, setEditSeedOverRate] = useState('');
|
||||||
|
// Keep default rate synced in advanced edit when seed
|
||||||
|
useEffect(() => {
|
||||||
|
if (formData.productType === 'seed') {
|
||||||
|
const n = parseFloat(editSeedNewRate);
|
||||||
|
const o = parseFloat(editSeedOverRate);
|
||||||
|
let avg = '';
|
||||||
|
if (!isNaN(n) && !isNaN(o)) avg = ((n + o) / 2).toFixed(2);
|
||||||
|
else if (!isNaN(n)) avg = n;
|
||||||
|
else if (!isNaN(o)) avg = o;
|
||||||
|
setFormData(prev => ({ ...prev, customRateAmount: avg }));
|
||||||
|
}
|
||||||
|
}, [formData.productType, editSeedNewRate, editSeedOverRate]);
|
||||||
|
|
||||||
const [editMode, setEditMode] = useState('basic'); // 'basic' or 'advanced'
|
const [editMode, setEditMode] = useState('basic'); // 'basic' or 'advanced'
|
||||||
const [editSpreaderSettings, setEditSpreaderSettings] = useState([]);
|
const [editSpreaderSettings, setEditSpreaderSettings] = useState([]);
|
||||||
@@ -1400,19 +1430,7 @@ const EditProductModal = ({ product, onSubmit, onCancel, sharedProducts, categor
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{formData.productType === 'seed' ? (
|
{formData.productType === 'seed' ? (
|
||||||
<>
|
<SeedBlendEditor value={editSeedBlend} onChange={setEditSeedBlend} />
|
||||||
<SeedBlendEditor value={editSeedBlend} onChange={setEditSeedBlend} />
|
|
||||||
<div className="grid grid-cols-2 gap-3 mt-3">
|
|
||||||
<div>
|
|
||||||
<label className="label text-xs">New Lawn Seeding Rate</label>
|
|
||||||
<input type="number" step="0.01" className="input" value={editSeedNewRate} onChange={(e)=> setEditSeedNewRate(e.target.value)} placeholder="e.g., 7" />
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<label className="label text-xs">Overseeding Rate</label>
|
|
||||||
<input type="number" step="0.01" className="input" value={editSeedOverRate} onChange={(e)=> setEditSeedOverRate(e.target.value)} placeholder="e.g., 3" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</>
|
|
||||||
) : (
|
) : (
|
||||||
<div>
|
<div>
|
||||||
<label className="label">Active Ingredients</label>
|
<label className="label">Active Ingredients</label>
|
||||||
@@ -1439,15 +1457,33 @@ const EditProductModal = ({ product, onSubmit, onCancel, sharedProducts, categor
|
|||||||
|
|
||||||
<div className="grid grid-cols-2 gap-4">
|
<div className="grid grid-cols-2 gap-4">
|
||||||
<div>
|
<div>
|
||||||
<label className="label">Default Application Rate</label>
|
{formData.productType === 'seed' ? (
|
||||||
<input
|
<div>
|
||||||
type="number"
|
<label className="label">Seeding Rates</label>
|
||||||
step="0.01"
|
<div className="space-y-2">
|
||||||
className="input"
|
<div>
|
||||||
value={formData.customRateAmount}
|
<label className="label text-xs">New Lawn (lbs/1000 sq ft)</label>
|
||||||
onChange={(e) => setFormData({ ...formData, customRateAmount: e.target.value })}
|
<input type="number" step="0.01" className="input" value={editSeedNewRate} onChange={(e)=> setEditSeedNewRate(e.target.value)} placeholder="e.g., 7" />
|
||||||
placeholder="2.5"
|
</div>
|
||||||
/>
|
<div>
|
||||||
|
<label className="label text-xs">Overseeding (lbs/1000 sq ft)</label>
|
||||||
|
<input type="number" step="0.01" className="input" value={editSeedOverRate} onChange={(e)=> setEditSeedOverRate(e.target.value)} placeholder="e.g., 3" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<>
|
||||||
|
<label className="label">Default Application Rate</label>
|
||||||
|
<input
|
||||||
|
type="number"
|
||||||
|
step="0.01"
|
||||||
|
className="input"
|
||||||
|
value={formData.customRateAmount}
|
||||||
|
onChange={(e) => setFormData({ ...formData, customRateAmount: e.target.value })}
|
||||||
|
placeholder="2.5"
|
||||||
|
/>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<label className="label">Rate Unit</label>
|
<label className="label">Rate Unit</label>
|
||||||
|
|||||||
Reference in New Issue
Block a user