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 + }); +}