nextjs_zzyxyz/components/markcard/EditMarkCardModal.tsx
ZZY 73917d6001 dev feat(markcard, static): 实现书签卡片功能和静态资源获取
- 书签卡片相关的组件和页面
- 实现书签数据的获取、添加、编辑和删除功能
- 添加用户验证和权限控制
- 优化页面布局和样式
2024-12-22 15:21:07 +08:00

137 lines
4.6 KiB
TypeScript

'use client'
import { useState } from 'react'
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Textarea } from "@/components/ui/textarea"
import { Label } from "@/components/ui/label"
import { MarkCardI } from '@/lib/markcard/card'
interface EditCardModalProps {
isOpen: boolean
onClose: () => void
cardData: MarkCardI
onSave: (updatedData: Partial<EditCardModalProps['cardData']>) => void
}
export default function EditCardModal({ isOpen, onClose, cardData, onSave }: EditCardModalProps) {
const [editedData, setEditedData] = useState(cardData)
const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
const { name, value } = e.target
setEditedData((prev) => ({ ...prev, [name]: value }))
}
const handleLinkChange = (index: number, field: 'title' | 'url', value: string) => {
setEditedData((prev) => ({
...prev,
links: prev.links.map((link, i) => (i === index ? { ...link, [field]: value } : link)),
}))
}
const handleAddLink = () => {
setEditedData((prev) => ({
...prev,
links: [...prev.links, { title: '', url: '' }],
}))
}
const handleRemoveLink = (index: number) => {
setEditedData((prev) => ({
...prev,
links: prev.links.filter((_, i) => i !== index),
}))
}
const handleSave = () => {
onSave(editedData)
}
return (
<Dialog open={isOpen} onOpenChange={onClose}>
<DialogContent className="sm:max-w-[425px] max-h-[90vh] overflow-y-auto">
<DialogHeader>
<DialogTitle>Edit Card</DialogTitle>
<DialogDescription>
Here you can modify the card details and links. Click `Save changes` after you are done.
</DialogDescription>
</DialogHeader>
<div className="grid gap-4 py-4">
<div className="grid grid-cols-4 items-center gap-4">
<Label htmlFor="title" className="text-right">
Title
</Label>
<Input
id="title"
name="title"
value={editedData.title}
onChange={handleInputChange}
className="col-span-3"
/>
</div>
<div className="grid grid-cols-4 items-center gap-4">
<Label htmlFor="shortDescription" className="text-right">
Short Description
</Label>
<Input
id="shortDescription"
name="shortDescription"
value={editedData.shortDescription}
onChange={handleInputChange}
className="col-span-3"
/>
</div>
<div className="grid grid-cols-4 items-center gap-4">
<Label htmlFor="detailedDescription" className="text-right">
Detailed Description
</Label>
<Textarea
id="detailedDescription"
name="detailedDescription"
value={editedData.detailedDescription}
onChange={handleInputChange}
className="col-span-3"
/>
</div>
<div className="overflow-y-auto max-h-[40vh]">
{editedData.links.map((link, index) => (
<div key={index} className="grid grid-cols-4 items-center gap-4">
<Label htmlFor={`link-${index}`} className="text-right">
Link {index + 1}
</Label>
<div className="col-span-3 grid gap-2">
<Input
id={`link-${index}-title`}
value={link.title}
onChange={(e) => handleLinkChange(index, 'title', e.target.value)}
placeholder="Link Title"
/>
<Input
id={`link-${index}-url`}
value={link.url}
onChange={(e) => handleLinkChange(index, 'url', e.target.value)}
placeholder="Link URL"
/>
<Button type="button" variant="destructive" onClick={() => handleRemoveLink(index)}>
Remove Link
</Button>
</div>
</div>
))}
</div>
<Button type="button" onClick={handleAddLink} className="mt-4">
Add Link
</Button>
</div>
<DialogFooter>
<Button type="submit" onClick={handleSave}>Save changes</Button>
</DialogFooter>
</DialogContent>
</Dialog>
)
}