From 9c8286c63f45ffde3dcff747c3306ca661ec21cf Mon Sep 17 00:00:00 2001 From: parsa aghaei Date: Wed, 29 Jul 2026 16:42:23 +0330 Subject: [PATCH] fix(admin): resolve 500 on missing product update and add direct image URL & paste support --- backend/src/admin/admin.service.ts | 5 ++ .../src/components/ui/MediaSelector.tsx | 11 ++++ frontend/admin-panel/src/pages/Products.tsx | 61 ++++++++++++++----- 3 files changed, 63 insertions(+), 14 deletions(-) diff --git a/backend/src/admin/admin.service.ts b/backend/src/admin/admin.service.ts index 4fd8d34..cffa124 100644 --- a/backend/src/admin/admin.service.ts +++ b/backend/src/admin/admin.service.ts @@ -168,6 +168,11 @@ export class AdminService { } async updateProduct(id: string, data: any) { + const existing = await this.prisma.product.findUnique({ where: { id } }); + if (!existing) { + throw new NotFoundException(`محصولی با شناسه ${id} یافت نشد.`); + } + const product = await this.prisma.product.update({ where: { id }, data: { diff --git a/frontend/admin-panel/src/components/ui/MediaSelector.tsx b/frontend/admin-panel/src/components/ui/MediaSelector.tsx index 272501e..adc9a99 100644 --- a/frontend/admin-panel/src/components/ui/MediaSelector.tsx +++ b/frontend/admin-panel/src/components/ui/MediaSelector.tsx @@ -36,6 +36,17 @@ export default function MediaSelector({ isOpen, onClose, onSelect, multiple = fa if (!isOpen) return; const handlePaste = (e: ClipboardEvent) => { + const clipboardText = e.clipboardData?.getData('text'); + if (clipboardText && (clipboardText.startsWith('http://') || clipboardText.startsWith('https://'))) { + e.preventDefault(); + setPasteStatus('لینک تصویر چسبانده شد!'); + onSelect(clipboardText); + if (!multiple) onClose(); + if (pasteTimerRef.current) clearTimeout(pasteTimerRef.current); + pasteTimerRef.current = setTimeout(() => setPasteStatus(null), 3000); + return; + } + const items = e.clipboardData?.items; if (!items) return; diff --git a/frontend/admin-panel/src/pages/Products.tsx b/frontend/admin-panel/src/pages/Products.tsx index 8c390e3..1245185 100644 --- a/frontend/admin-panel/src/pages/Products.tsx +++ b/frontend/admin-panel/src/pages/Products.tsx @@ -692,40 +692,73 @@ export default function Products() { {/* Media Tab */} -
+
+ {/* Direct Image URL Input Box */} +
+ +
+ { + setFormData({...formData, imageUrl: e.target.value}); + setMediaImageError(false); + }} + placeholder="https://example.com/images/product.png یا /uploads/photo.jpg" + className="flex-1 px-4 py-2.5 rounded-xl border border-gray-200 focus:border-purple-500 outline-none font-mono text-sm" + dir="ltr" + /> + +
+
+ + {/* Preview Container */}
{formData.imageUrl && !mediaImageError ? (
setMediaImageError(true)} className="max-w-xs h-48 object-contain rounded-xl shadow-md border border-gray-100" />
- + +
-

- {formData.imageUrl.split('/').pop()} +

+ {formData.imageUrl}

-

برای تغییر عکس، روی تصویر کلیک کنید یا دکمه زیر را بزنید

- +

تصویر با موفقیت بارگذاری و تایید شد.

) : ( <>
- +
-

تصویر محصول یافت نشد یا انتخاب نشده است

-

از گالری رسانه تصویر انتخاب کنید یا با Ctrl+V از کلیپ‌بورد بچسبانید

- )}