This commit is contained in:
root
2026-01-03 06:06:54 +00:00
parent d138dae2ca
commit eeaa9a66bb
16 changed files with 728 additions and 348 deletions

View File

@@ -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