diff --git a/frontend/src/admin/Editable.tsx b/frontend/src/admin/Editable.tsx index c861da0..e57ca65 100644 --- a/frontend/src/admin/Editable.tsx +++ b/frontend/src/admin/Editable.tsx @@ -3,6 +3,7 @@ import type { ReactNode } from 'react' import { ArrowDownIcon, ArrowUpIcon, PencilIcon, PlusIcon, Trash2Icon } from 'lucide-react' import Swal from 'sweetalert2' import { useSiteData } from '../api' +import type { SiteData } from '../api' import { useAdmin } from './AdminContext' import { adminApi } from './adminClient' import { ENTITIES } from './entities' @@ -142,9 +143,17 @@ export function EditableItem({ } /** دکمه افزودن آیتم جدید به یک مجموعه — فقط در حالت ویرایش */ -export function AddItemButton({ resource }: { resource: string }) { +export function AddItemButton({ + resource, + label, + variant = 'cell', +}: { + resource: string + label?: string + variant?: 'cell' | 'button' +}) { const { isAuthenticated, isEditMode, runSave } = useAdmin() - const { reload } = useSiteData() + const { updateSite } = useSiteData() const config = ENTITIES[resource] const [newItem, setNewItem] = useState(null) @@ -153,11 +162,35 @@ export function AddItemButton({ resource }: { resource: string }) { const create = () => { void runSave(async () => { const created = await adminApi.create(config.resource, config.defaults) - reload() + // درج خوش‌بینانه — reload کل درخت را بازسازی می‌کند و کشوی تازه‌ساخته‌شده می‌میرد + updateSite((d) => { + const list = d[config.dataKey as keyof SiteData] as unknown as ItemWithId[] + if (Array.isArray(list)) list.push(created) + }) setNewItem(created) }) } + const drawer = newItem ? ( + setNewItem(null)} /> + ) : null + + if (variant === 'button') { + return ( + <> + + {drawer} + + ) + } + return ( <> - {newItem && ( - setNewItem(null)} /> - )} + {drawer} ) } diff --git a/frontend/src/admin/entities.ts b/frontend/src/admin/entities.ts index dfec55f..be35d11 100644 --- a/frontend/src/admin/entities.ts +++ b/frontend/src/admin/entities.ts @@ -55,9 +55,14 @@ export const ENTITIES: Record = { resource: 'articles', dataKey: 'articles', title: 'مقالات', kind: 'collection', titleKey: 'title', fields: [ - F('title', 'عنوان'), F('slug', 'نشانی (slug)'), F('date', 'تاریخ'), F('category', 'دسته'), - F('image', 'تصویر شاخص', 'image'), F('read', 'زمان مطالعه'), F('excerpt', 'چکیده', 'textarea'), + F('title', 'عنوان'), F('body', 'متن مقاله', 'wysiwyg'), + F('excerpt', 'چکیده', 'textarea'), + F('image', 'تصویر شاخص', 'image'), + F('category', 'دسته'), + F('date', 'تاریخ'), + F('read', 'زمان مطالعه'), + F('slug', 'نشانی (slug)'), ], defaults: { title: 'مقاله جدید', slug: `article-${Date.now()}`, date: '', category: '', image: '', read: '', excerpt: '', body: { type: 'doc', content: [{ type: 'paragraph' }] } }, }, diff --git a/frontend/src/pages/Blog.tsx b/frontend/src/pages/Blog.tsx index e27c2c3..9a99559 100644 --- a/frontend/src/pages/Blog.tsx +++ b/frontend/src/pages/Blog.tsx @@ -18,6 +18,9 @@ export function Blog() {
+
+ +
))} -