Files
keeppay/components/waiter-dialog.tsx
T
root 841faca34a feat: 添加项目规范和配置文件
- 新增项目规范文档,包含语言设置和 Git 提交规范
- 更新 .gitignore 文件,添加环境文件和数据目录
- 新增 Prettier 配置文件和忽略文件
- 更新 package.json,添加 prettier 和 prisma 相关依赖
- 新增 API 路由处理佣金和消费数据

这些更改为项目提供了更好的结构和代码风格规范。
2026-05-12 21:43:25 +08:00

144 lines
5.7 KiB
TypeScript

'use client'
import { useState, useEffect } from 'react'
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'
import { Button } from '@/components/ui/button'
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'
import { Edit2, Trash2, Plus } from 'lucide-react'
import { WaiterForm } from './waiter-form'
import type { Waiter, CreateWaiterInput, UpdateWaiterInput } from '@/lib/types'
import { getWaiters, createWaiter, updateWaiter, deleteWaiter } from '@/lib/mock-data'
export function WaiterDialog() {
const [open, setOpen] = useState(false)
const [waiters, setWaiters] = useState<Waiter[]>([])
const [editingWaiter, setEditingWaiter] = useState<Waiter | null>(null)
const [showForm, setShowForm] = useState(false)
useEffect(() => {
if (open) {
setWaiters(getWaiters())
}
}, [open])
const refresh = () => {
setWaiters(getWaiters())
}
const handleSave = (input: CreateWaiterInput) => {
if (editingWaiter) {
updateWaiter(editingWaiter.id, input as UpdateWaiterInput)
} else {
createWaiter(input)
}
refresh()
setShowForm(false)
setEditingWaiter(null)
}
const handleDelete = (id: string) => {
deleteWaiter(id)
refresh()
}
const handleEdit = (waiter: Waiter) => {
setEditingWaiter(waiter)
setShowForm(true)
}
return (
<Dialog
open={open}
onOpenChange={(v) => {
setOpen(v)
if (!v) setShowForm(false)
}}
>
<DialogTrigger asChild>
<Button variant="ghost"></Button>
</DialogTrigger>
<DialogContent className="sm:max-w-[600px]">
<DialogHeader>
<DialogTitle className="flex items-center justify-between">
<span></span>
{!showForm && (
<Button
variant="outline"
size="sm"
onClick={() => {
setEditingWaiter(null)
setShowForm(true)
}}
>
<Plus className="h-4 w-4 mr-1" />
</Button>
)}
</DialogTitle>
</DialogHeader>
{showForm ? (
<div>
<WaiterForm
waiter={editingWaiter}
onSave={(input) => {
handleSave(input)
setShowForm(false)
}}
/>
<div className="flex justify-end gap-2 mt-4">
<Button
variant="outline"
onClick={() => {
setShowForm(false)
setEditingWaiter(null)
}}
>
</Button>
</div>
</div>
) : (
<Table>
<TableHeader>
<TableRow>
<TableHead></TableHead>
<TableHead></TableHead>
<TableHead></TableHead>
<TableHead className="w-[80px]"></TableHead>
</TableRow>
</TableHeader>
<TableBody>
{waiters.map((w) => (
<TableRow key={w.id}>
<TableCell className="font-medium">{w.name}</TableCell>
<TableCell>{w.specialty}</TableCell>
<TableCell>{w.commissionRate}%</TableCell>
<TableCell>
<div className="flex items-center gap-1">
<Button
variant="ghost"
size="icon"
className="h-8 w-8"
onClick={() => handleEdit(w)}
>
<Edit2 className="h-4 w-4" />
</Button>
<Button
variant="ghost"
size="icon"
className="h-8 w-8 text-red-500"
onClick={() => handleDelete(w.id)}
>
<Trash2 className="h-4 w-4" />
</Button>
</div>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
)}
</DialogContent>
</Dialog>
)
}