From 3c83e78d9f3b5966d5b315996082f81c7d7a842c Mon Sep 17 00:00:00 2001 From: Will Miao Date: Thu, 2 Jul 2026 10:53:33 +0800 Subject: [PATCH] feat(ui): auto-newline after pasting URL in download and batch-import textareas Extract auto-newline-on-paste logic into shared setupAutoNewlineOnPaste() utility in uiHelpers.js. Apply it to both the Download modal (modelUrl) and Batch Import modal (batchUrlInput) textarea, so users can paste multiple URLs in succession without manually pressing Enter. --- static/js/managers/BatchImportManager.js | 5 +++- static/js/managers/DownloadManager.js | 5 ++-- static/js/utils/uiHelpers.js | 37 ++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/static/js/managers/BatchImportManager.js b/static/js/managers/BatchImportManager.js index 8ff070c3..866897f2 100644 --- a/static/js/managers/BatchImportManager.js +++ b/static/js/managers/BatchImportManager.js @@ -1,5 +1,5 @@ import { modalManager } from './ModalManager.js'; -import { showToast } from '../utils/uiHelpers.js'; +import { showToast, setupAutoNewlineOnPaste } from '../utils/uiHelpers.js'; import { translate } from '../utils/i18nHelpers.js'; import { WS_ENDPOINTS } from '../api/apiConfig.js'; import { getStorageItem, setStorageItem } from '../utils/storageHelpers.js'; @@ -43,6 +43,9 @@ export class BatchImportManager { setStorageItem('batch_import_skip_no_metadata', e.target.checked); }); } + + // Auto-append newline after pasting a URL in the batch URL input + setupAutoNewlineOnPaste('batchUrlInput'); } /** diff --git a/static/js/managers/DownloadManager.js b/static/js/managers/DownloadManager.js index f94548b8..225defa1 100644 --- a/static/js/managers/DownloadManager.js +++ b/static/js/managers/DownloadManager.js @@ -1,5 +1,5 @@ import { modalManager } from './ModalManager.js'; -import { showToast } from '../utils/uiHelpers.js'; +import { showToast, setupAutoNewlineOnPaste } from '../utils/uiHelpers.js'; import { state } from '../state/index.js'; import { LoadingManager } from './LoadingManager.js'; import { getModelApiClient, resetAndReload } from '../api/modelApiFactory.js'; @@ -107,7 +107,8 @@ export class DownloadManager { // Default path toggle handler document.getElementById('useDefaultPath').addEventListener('change', this.handleToggleDefaultPath); - + // Auto-append newline after pasting a URL so users can paste multiple URLs in succession + setupAutoNewlineOnPaste('modelUrl'); } updateModalLabels() { diff --git a/static/js/utils/uiHelpers.js b/static/js/utils/uiHelpers.js index 4df7bf56..a628027d 100644 --- a/static/js/utils/uiHelpers.js +++ b/static/js/utils/uiHelpers.js @@ -1482,3 +1482,40 @@ export async function openExampleImagesFolder(modelHash) { return false; } } + +/** + * Set up a paste handler on a textarea that automatically appends a newline + * after pasted content that looks like a URL (http/https). This lets users + * paste multiple URLs one after another without manually pressing Enter. + * @param {string} textareaId - The id of the textarea element + */ +export function setupAutoNewlineOnPaste(textareaId) { + const el = document.getElementById(textareaId); + if (!el || el.tagName !== 'TEXTAREA') return; + + el.addEventListener('paste', (e) => { + const pastedText = (e.clipboardData || window.clipboardData).getData('text'); + // Only apply to text that starts with http:// or https:// + if (/^https?:\/\//.test(pastedText) && !pastedText.endsWith('\n')) { + e.preventDefault(); + + const start = el.selectionStart; + const end = el.selectionEnd; + const text = el.value; + const before = text.substring(0, start); + const after = text.substring(end); + + // Append newline after the pasted URL + const modifiedText = pastedText + '\n'; + el.value = before + modifiedText + after; + + // Move cursor to just after the inserted text + const newCursorPos = start + modifiedText.length; + el.selectionStart = el.selectionEnd = newCursorPos; + + // Trigger input event so any listeners stay in sync + el.dispatchEvent(new Event('input', { bubbles: true })); + } + // Non-URL text or text already ending with \n — let default paste happen + }); +}