Files
users/components/dialogs/create-package-dialog.tsx
v0 b17b488f8e refactor: restructure navigation and module layout
Reorganize navigation and module structure based on new requirements.

Co-authored-by: null <4804959+fnvtk@users.noreply.github.com>
2026-01-31 04:32:36 +00:00

185 lines
6.9 KiB
TypeScript

"use client"
import { useState } from "react"
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Textarea } from "@/components/ui/textarea"
import { Badge } from "@/components/ui/badge"
import { X, Plus } from "lucide-react"
interface CreatePackageDialogProps {
open: boolean
onOpenChange: (open: boolean) => void
}
export function CreatePackageDialog({ open, onOpenChange }: CreatePackageDialogProps) {
const [formData, setFormData] = useState({
name: "",
description: "",
conditions: [] as { field: string; operator: string; value: string }[],
tags: [] as string[],
})
const [newTag, setNewTag] = useState("")
const addCondition = () => {
setFormData({
...formData,
conditions: [...formData.conditions, { field: "", operator: "", value: "" }],
})
}
const removeCondition = (index: number) => {
setFormData({
...formData,
conditions: formData.conditions.filter((_, i) => i !== index),
})
}
const addTag = () => {
if (newTag && !formData.tags.includes(newTag)) {
setFormData({ ...formData, tags: [...formData.tags, newTag] })
setNewTag("")
}
}
const removeTag = (tag: string) => {
setFormData({ ...formData, tags: formData.tags.filter((t) => t !== tag) })
}
const handleSubmit = () => {
console.log("创建流量包:", formData)
onOpenChange(false)
}
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="sm:max-w-[600px]">
<DialogHeader>
<DialogTitle></DialogTitle>
</DialogHeader>
<div className="space-y-4 py-4 max-h-[60vh] overflow-y-auto">
<div className="space-y-2">
<Label></Label>
<Input
placeholder="输入名称"
value={formData.name}
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
/>
</div>
<div className="space-y-2">
<Label></Label>
<Textarea
placeholder="描述流量包的用途"
value={formData.description}
onChange={(e) => setFormData({ ...formData, description: e.target.value })}
/>
</div>
<div className="space-y-2">
<div className="flex items-center justify-between">
<Label></Label>
<Button variant="outline" size="sm" onClick={addCondition}>
<Plus className="w-3 h-3 mr-1" />
</Button>
</div>
{formData.conditions.length === 0 ? (
<div className="p-4 border border-dashed rounded-lg text-center text-gray-500 text-sm">
"添加条件"
</div>
) : (
<div className="space-y-2">
{formData.conditions.map((condition, index) => (
<div key={index} className="flex items-center gap-2 p-3 bg-gray-50 rounded-lg">
<select
className="flex-1 px-3 py-2 border rounded-md text-sm"
value={condition.field}
onChange={(e) => {
const newConditions = [...formData.conditions]
newConditions[index].field = e.target.value
setFormData({ ...formData, conditions: newConditions })
}}
>
<option value=""></option>
<option value="rfm_score">RFM评分</option>
<option value="clv_score">CLV分数</option>
<option value="churn_prob"></option>
<option value="last_active"></option>
<option value="total_amount"></option>
</select>
<select
className="w-24 px-3 py-2 border rounded-md text-sm"
value={condition.operator}
onChange={(e) => {
const newConditions = [...formData.conditions]
newConditions[index].operator = e.target.value
setFormData({ ...formData, conditions: newConditions })
}}
>
<option value=""></option>
<option value="gt"></option>
<option value="lt"></option>
<option value="eq"></option>
<option value="gte"></option>
<option value="lte"></option>
</select>
<Input
className="w-32"
placeholder="值"
value={condition.value}
onChange={(e) => {
const newConditions = [...formData.conditions]
newConditions[index].value = e.target.value
setFormData({ ...formData, conditions: newConditions })
}}
/>
<Button variant="ghost" size="sm" onClick={() => removeCondition(index)}>
<X className="w-4 h-4" />
</Button>
</div>
))}
</div>
)}
</div>
<div className="space-y-2">
<Label></Label>
<div className="flex items-center gap-2">
<Input
placeholder="输入标签"
value={newTag}
onChange={(e) => setNewTag(e.target.value)}
onKeyDown={(e) => e.key === "Enter" && addTag()}
/>
<Button variant="outline" onClick={addTag}>
</Button>
</div>
{formData.tags.length > 0 && (
<div className="flex flex-wrap gap-2 mt-2">
{formData.tags.map((tag) => (
<Badge key={tag} variant="secondary" className="pr-1">
{tag}
<button onClick={() => removeTag(tag)} className="ml-1 hover:text-red-500">
<X className="w-3 h-3" />
</button>
</Badge>
))}
</div>
)}
</div>
</div>
<DialogFooter>
<Button variant="outline" onClick={() => onOpenChange(false)}>
</Button>
<Button onClick={handleSubmit}></Button>
</DialogFooter>
</DialogContent>
</Dialog>
)
}