]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commitdiff
webui: Allow pasting file from clipboard (#13526)
authorLuca Stefani <redacted>
Wed, 14 May 2025 08:07:31 +0000 (10:07 +0200)
committerGitHub <redacted>
Wed, 14 May 2025 08:07:31 +0000 (10:07 +0200)
* server: Allow pasting file from clipboard

* server: Prevent default action on file paste

* update build

* format then build combined

---------

Co-authored-by: Xuan Son Nguyen <redacted>
tools/server/public/index.html.gz
tools/server/webui/package.json
tools/server/webui/src/components/ChatScreen.tsx

index d7363e13eb25ae845b984662a2b8f42ee631f3d5..a2a2ee12473103ab30c9213ecf86d1475d8dfa5d 100644 (file)
Binary files a/tools/server/public/index.html.gz and b/tools/server/public/index.html.gz differ
index ab1b920bdc5d6095f524beaa0502e400361d4710..b83defdf34f5f3947732b565986acb2a990479be 100644 (file)
@@ -5,7 +5,7 @@
   "type": "module",
   "scripts": {
     "dev": "vite",
-    "build": "tsc -b && vite build",
+    "build": "npm run format && tsc -b && vite build",
     "format": "eslint . && prettier --write .",
     "lint": "eslint .",
     "preview": "vite preview"
index b645a494d6853e5f3a81d7cc1f1fcc6ba33ea900..7d53fe8ac27eed19be02219dbcb04e13f13fe425 100644 (file)
@@ -1,4 +1,4 @@
-import { useEffect, useMemo, useRef, useState } from 'react';
+import { ClipboardEvent, useEffect, useMemo, useRef, useState } from 'react';
 import { CallbackGeneratedChunk, useAppContext } from '../utils/app.context';
 import ChatMessage from './ChatMessage';
 import { CanvasType, Message, PendingMessage } from '../utils/types';
@@ -328,6 +328,17 @@ function ChatInput({
         {({ getRootProps, getInputProps }) => (
           <div
             className="flex flex-col rounded-xl border-1 border-base-content/30 p-3 w-full"
+            onPasteCapture={(e: ClipboardEvent<HTMLInputElement>) => {
+              const files = Array.from(e.clipboardData.items)
+                .filter((item) => item.kind === 'file')
+                .map((item) => item.getAsFile())
+                .filter((file) => file !== null);
+
+              if (files.length > 0) {
+                e.preventDefault();
+                extraContext.onFileAdded(files);
+              }
+            }}
             {...getRootProps()}
           >
             {!isGenerating && (