products
This commit is contained in:
@@ -537,6 +537,18 @@ const CreateProductModal = ({ onSubmit, onCancel, sharedProducts, categories })
|
||||
const [seedBlend, setSeedBlend] = useState([]); // [{cultivar:'', percent:0}]
|
||||
const [seedNewRate, setSeedNewRate] = 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 [loadingSpreaders, setLoadingSpreaders] = useState(false);
|
||||
const [newSpreaderSetting, setNewSpreaderSetting] = useState({
|
||||
@@ -713,19 +725,7 @@ const CreateProductModal = ({ onSubmit, onCancel, sharedProducts, categories })
|
||||
</div>
|
||||
|
||||
{formData.productType === 'seed' && (
|
||||
<>
|
||||
<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>
|
||||
</>
|
||||
<SeedBlendEditor value={seedBlend} onChange={setSeedBlend} />
|
||||
)}
|
||||
|
||||
<div>
|
||||
@@ -754,15 +754,33 @@ const CreateProductModal = ({ onSubmit, onCancel, sharedProducts, categories })
|
||||
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<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"
|
||||
/>
|
||||
{formData.productType === 'seed' ? (
|
||||
<div>
|
||||
<label className="label">Seeding Rates</label>
|
||||
<div className="space-y-2">
|
||||
<div>
|
||||
<label className="label text-xs">New Lawn (lbs/1000 sq ft)</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 (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>
|
||||
<label className="label">Rate Unit</label>
|
||||
@@ -936,6 +954,18 @@ const EditProductModal = ({ product, onSubmit, onCancel, sharedProducts, categor
|
||||
const [editSeedBlend, setEditSeedBlend] = useState([]);
|
||||
const [editSeedNewRate, setEditSeedNewRate] = 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 [editSpreaderSettings, setEditSpreaderSettings] = useState([]);
|
||||
@@ -1400,19 +1430,7 @@ const EditProductModal = ({ product, onSubmit, onCancel, sharedProducts, categor
|
||||
</div>
|
||||
|
||||
{formData.productType === 'seed' ? (
|
||||
<>
|
||||
<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>
|
||||
</>
|
||||
<SeedBlendEditor value={editSeedBlend} onChange={setEditSeedBlend} />
|
||||
) : (
|
||||
<div>
|
||||
<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>
|
||||
<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"
|
||||
/>
|
||||
{formData.productType === 'seed' ? (
|
||||
<div>
|
||||
<label className="label">Seeding Rates</label>
|
||||
<div className="space-y-2">
|
||||
<div>
|
||||
<label className="label text-xs">New Lawn (lbs/1000 sq ft)</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 (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>
|
||||
<label className="label">Rate Unit</label>
|
||||
|
||||
Reference in New Issue
Block a user