From 707e8355707fd41a05b432f525d4a0b1647590c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sun, 21 Jun 2026 21:16:54 +0300 Subject: [PATCH] ImageUploadEditorComponent ve ImageViewerEditorComponent MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bu komponentler için tıklanabilir ve preview hale getirildi. --- .../editors/ImageUploadEditorComponent.tsx | 10 +++ .../editors/ImageViewerEditorComponent.tsx | 30 ++----- .../views/form/editors/imageHoverPreview.ts | 90 +++++++++++++++++++ .../editors/ImageUploadEditorComponent.tsx | 10 +++ .../editors/ImageViewerEditorComponent.tsx | 30 ++----- 5 files changed, 128 insertions(+), 42 deletions(-) create mode 100644 ui/src/views/form/editors/imageHoverPreview.ts diff --git a/ui/src/views/form/editors/ImageUploadEditorComponent.tsx b/ui/src/views/form/editors/ImageUploadEditorComponent.tsx index 17da763..424bda8 100644 --- a/ui/src/views/form/editors/ImageUploadEditorComponent.tsx +++ b/ui/src/views/form/editors/ImageUploadEditorComponent.tsx @@ -1,6 +1,11 @@ import { ImageUploadOptionsDto } from '@/proxy/form/models' import { ReactElement, useRef, useState } from 'react' import { FaSpinner, FaUpload } from 'react-icons/fa' +import { + hideImageHoverPreview, + openImageInNewTab, + showImageHoverPreview, +} from './imageHoverPreview' const ImageUploadEditorComponent = ({ value, @@ -98,12 +103,17 @@ const ImageUploadEditorComponent = ({ showImageHoverPreview(url, event)} + onMouseMove={(event) => showImageHoverPreview(url, event)} + onMouseLeave={hideImageHoverPreview} + onClick={() => openImageInNewTab(url)} style={{ width: thumbW, height: thumbH, objectFit: 'cover', borderRadius: 4, border: '1px solid #ddd', + cursor: 'zoom-in', }} /> {!readOnly && ( diff --git a/ui/src/views/form/editors/ImageViewerEditorComponent.tsx b/ui/src/views/form/editors/ImageViewerEditorComponent.tsx index d321faf..0cc35b3 100644 --- a/ui/src/views/form/editors/ImageViewerEditorComponent.tsx +++ b/ui/src/views/form/editors/ImageViewerEditorComponent.tsx @@ -1,5 +1,10 @@ import { ImageUploadOptionsDto } from '@/proxy/form/models' import { ReactElement } from 'react' +import { + hideImageHoverPreview, + openImageInNewTab, + showImageHoverPreview, +} from './imageHoverPreview' const parseJsonObject = (value: unknown) => { if (!value) return undefined @@ -86,26 +91,6 @@ const normalizeImageValue = (value: unknown): string[] => { return source ? [toImageSource(source)] : [] } -const openImage = (url: string) => { - if (!url.startsWith('data:image/')) { - window.open(url, '_blank', 'noopener,noreferrer') - return - } - - try { - const match = url.match(/^data:(image\/[^;]+);base64,(.*)$/) - if (!match) return - - const binary = atob(match[2]) - const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0)) - const blobUrl = URL.createObjectURL(new Blob([bytes], { type: match[1] })) - window.open(blobUrl, '_blank', 'noopener,noreferrer') - window.setTimeout(() => URL.revokeObjectURL(blobUrl), 60000) - } catch { - window.open(url, '_blank', 'noopener,noreferrer') - } -} - const ImageViewerEditorComponent = ({ value, options, @@ -130,12 +115,15 @@ const ImageViewerEditorComponent = ({