final
This commit is contained in:
@@ -6,10 +6,15 @@ import { useRouter } from 'next/navigation'
|
||||
interface Drop {
|
||||
id: number
|
||||
item: string
|
||||
description?: string | null
|
||||
size: number
|
||||
fill: number
|
||||
unit: string
|
||||
ppu: number
|
||||
price_chf?: number | null
|
||||
price_eur?: number | null
|
||||
wholesale_price_chf?: number | null
|
||||
wholesale_price_eur?: number | null
|
||||
image_url: string | null
|
||||
images?: string[]
|
||||
created_at: string
|
||||
@@ -42,9 +47,14 @@ export default function DropsManagementPage() {
|
||||
const [selectedDropId, setSelectedDropId] = useState<number | null>(null)
|
||||
const [formData, setFormData] = useState({
|
||||
item: '',
|
||||
description: '',
|
||||
size: '',
|
||||
unit: 'g',
|
||||
ppu: '',
|
||||
priceChf: '',
|
||||
priceEur: '',
|
||||
wholesalePriceChf: '',
|
||||
wholesalePriceEur: '',
|
||||
imageUrl: '',
|
||||
startTime: '',
|
||||
})
|
||||
@@ -88,9 +98,14 @@ export default function DropsManagementPage() {
|
||||
setEditingDrop(drop)
|
||||
setFormData({
|
||||
item: drop.item,
|
||||
description: drop.description || '',
|
||||
size: drop.size.toString(),
|
||||
unit: drop.unit,
|
||||
ppu: drop.ppu.toString(),
|
||||
priceChf: drop.price_chf?.toString() || '',
|
||||
priceEur: drop.price_eur?.toString() || '',
|
||||
wholesalePriceChf: drop.wholesale_price_chf?.toString() || '',
|
||||
wholesalePriceEur: drop.wholesale_price_eur?.toString() || '',
|
||||
imageUrl: drop.image_url || '',
|
||||
startTime: drop.start_time ? new Date(drop.start_time).toISOString().slice(0, 16) : '',
|
||||
})
|
||||
@@ -157,9 +172,14 @@ export default function DropsManagementPage() {
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
item: formData.item,
|
||||
description: formData.description || null,
|
||||
size: parseInt(formData.size),
|
||||
unit: formData.unit,
|
||||
ppu: parseInt(formData.ppu),
|
||||
priceChf: formData.priceChf ? parseFloat(formData.priceChf) : null,
|
||||
priceEur: formData.priceEur ? parseFloat(formData.priceEur) : null,
|
||||
wholesalePriceChf: formData.wholesalePriceChf ? parseFloat(formData.wholesalePriceChf) : null,
|
||||
wholesalePriceEur: formData.wholesalePriceEur ? parseFloat(formData.wholesalePriceEur) : null,
|
||||
imageUrl: finalImageUrls[0] || null, // Keep first image for legacy support
|
||||
startTime: formData.startTime || null,
|
||||
}),
|
||||
@@ -312,9 +332,14 @@ export default function DropsManagementPage() {
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
item: formData.item,
|
||||
description: formData.description || null,
|
||||
size: parseInt(formData.size),
|
||||
unit: formData.unit,
|
||||
ppu: parseInt(formData.ppu),
|
||||
priceChf: formData.priceChf ? parseFloat(formData.priceChf) : null,
|
||||
priceEur: formData.priceEur ? parseFloat(formData.priceEur) : null,
|
||||
wholesalePriceChf: formData.wholesalePriceChf ? parseFloat(formData.wholesalePriceChf) : null,
|
||||
wholesalePriceEur: formData.wholesalePriceEur ? parseFloat(formData.wholesalePriceEur) : null,
|
||||
imageUrl: finalImageUrls[0] || null, // Keep first image for legacy support
|
||||
startTime: formData.startTime || null,
|
||||
}),
|
||||
@@ -350,9 +375,14 @@ export default function DropsManagementPage() {
|
||||
alert('Drop created successfully')
|
||||
setFormData({
|
||||
item: '',
|
||||
description: '',
|
||||
size: '',
|
||||
unit: 'g',
|
||||
ppu: '',
|
||||
priceChf: '',
|
||||
priceEur: '',
|
||||
wholesalePriceChf: '',
|
||||
wholesalePriceEur: '',
|
||||
imageUrl: '',
|
||||
startTime: '',
|
||||
})
|
||||
@@ -434,9 +464,14 @@ export default function DropsManagementPage() {
|
||||
// Reset form when canceling
|
||||
setFormData({
|
||||
item: '',
|
||||
description: '',
|
||||
size: '',
|
||||
unit: 'g',
|
||||
ppu: '',
|
||||
priceChf: '',
|
||||
priceEur: '',
|
||||
wholesalePriceChf: '',
|
||||
wholesalePriceEur: '',
|
||||
imageUrl: '',
|
||||
startTime: '',
|
||||
})
|
||||
@@ -492,6 +527,25 @@ export default function DropsManagementPage() {
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div style={{ gridColumn: '1 / -1' }}>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Description</label>
|
||||
<textarea
|
||||
value={formData.description}
|
||||
onChange={(e) => setFormData({ ...formData, description: e.target.value })}
|
||||
rows={4}
|
||||
placeholder="Enter a detailed description of the drop..."
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)',
|
||||
fontFamily: 'inherit',
|
||||
resize: 'vertical'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Size *</label>
|
||||
<input
|
||||
@@ -548,6 +602,86 @@ export default function DropsManagementPage() {
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Regular Price CHF (per gram) *</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.0001"
|
||||
value={formData.priceChf}
|
||||
onChange={(e) => setFormData({ ...formData, priceChf: e.target.value })}
|
||||
required
|
||||
min="0"
|
||||
placeholder="0.0250"
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Regular Price EUR (per gram) *</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.0001"
|
||||
value={formData.priceEur}
|
||||
onChange={(e) => setFormData({ ...formData, priceEur: e.target.value })}
|
||||
required
|
||||
min="0"
|
||||
placeholder="0.0250"
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Wholesale Price CHF (per gram) *</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.0001"
|
||||
value={formData.wholesalePriceChf}
|
||||
onChange={(e) => setFormData({ ...formData, wholesalePriceChf: e.target.value })}
|
||||
required
|
||||
min="0"
|
||||
placeholder="0.0190"
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Wholesale Price EUR (per gram) *</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.0001"
|
||||
value={formData.wholesalePriceEur}
|
||||
onChange={(e) => setFormData({ ...formData, wholesalePriceEur: e.target.value })}
|
||||
required
|
||||
min="0"
|
||||
placeholder="0.0190"
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div style={{ gridColumn: '1 / -1' }}>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>
|
||||
Product Images (up to 4)
|
||||
@@ -732,6 +866,25 @@ export default function DropsManagementPage() {
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div style={{ gridColumn: '1 / -1' }}>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Description</label>
|
||||
<textarea
|
||||
value={formData.description}
|
||||
onChange={(e) => setFormData({ ...formData, description: e.target.value })}
|
||||
rows={4}
|
||||
placeholder="Enter a detailed description of the drop..."
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)',
|
||||
fontFamily: 'inherit',
|
||||
resize: 'vertical'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Size</label>
|
||||
<input
|
||||
@@ -781,6 +934,82 @@ export default function DropsManagementPage() {
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Regular Price CHF (per gram)</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.0001"
|
||||
value={formData.priceChf}
|
||||
onChange={(e) => setFormData({ ...formData, priceChf: e.target.value })}
|
||||
min="0"
|
||||
placeholder="0.0250"
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Regular Price EUR (per gram)</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.0001"
|
||||
value={formData.priceEur}
|
||||
onChange={(e) => setFormData({ ...formData, priceEur: e.target.value })}
|
||||
min="0"
|
||||
placeholder="0.0250"
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Wholesale Price CHF (per gram)</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.0001"
|
||||
value={formData.wholesalePriceChf}
|
||||
onChange={(e) => setFormData({ ...formData, wholesalePriceChf: e.target.value })}
|
||||
min="0"
|
||||
placeholder="0.0190"
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Wholesale Price EUR (per gram)</label>
|
||||
<input
|
||||
type="number"
|
||||
step="0.0001"
|
||||
value={formData.wholesalePriceEur}
|
||||
onChange={(e) => setFormData({ ...formData, wholesalePriceEur: e.target.value })}
|
||||
min="0"
|
||||
placeholder="0.0190"
|
||||
style={{
|
||||
width: '100%',
|
||||
padding: '8px',
|
||||
borderRadius: '8px',
|
||||
border: '1px solid var(--border)',
|
||||
background: 'var(--bg-soft)',
|
||||
color: 'var(--text)'
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<label style={{ display: 'block', marginBottom: '8px' }}>Start Time</label>
|
||||
<input
|
||||
|
||||
Reference in New Issue
Block a user