diff --git a/static/js/components/shared/ModelTags.js b/static/js/components/shared/ModelTags.js index 8cabefe0..922af248 100644 --- a/static/js/components/shared/ModelTags.js +++ b/static/js/components/shared/ModelTags.js @@ -274,7 +274,17 @@ async function saveTags() { const filePath = editBtn.dataset.filePath; const tagElements = document.querySelectorAll('.metadata-item'); - const tags = Array.from(tagElements).map(tag => tag.dataset.tag); + let tags = Array.from(tagElements).map(tag => tag.dataset.tag); + + // Flush uncommitted input as a tag so it's not silently lost on save + const tagInput = document.querySelector('.metadata-input'); + if (tagInput) { + const pendingTag = tagInput.value.trim().toLowerCase(); + if (pendingTag && !tags.includes(pendingTag)) { + tags.push(pendingTag); + } + tagInput.value = ''; + } // Get original tags to compare const originalTagElements = document.querySelectorAll('.tooltip-tag'); @@ -465,6 +475,7 @@ function setupTagInput() { const tagInput = document.querySelector('.metadata-input'); if (tagInput) { + tagInput.focus(); tagInput.addEventListener('keydown', function(e) { if (e.key === 'Enter') { e.preventDefault(); diff --git a/static/js/managers/BulkManager.js b/static/js/managers/BulkManager.js index 52e95524..5b63d58e 100644 --- a/static/js/managers/BulkManager.js +++ b/static/js/managers/BulkManager.js @@ -785,6 +785,7 @@ export class BulkManager { // Setup tag input behavior const tagInput = document.querySelector('.bulk-metadata-input'); if (tagInput) { + tagInput.focus(); tagInput.addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); @@ -1008,7 +1009,17 @@ export class BulkManager { async saveBulkTags(mode = 'append') { const tagElements = document.querySelectorAll('#bulkTagsItems .metadata-item'); - const tags = Array.from(tagElements).map(tag => tag.dataset.tag); + let tags = Array.from(tagElements).map(tag => tag.dataset.tag); + + // Flush uncommitted input as a tag so it's not silently lost on save + const tagInput = document.querySelector('.bulk-metadata-input'); + if (tagInput) { + const pendingTag = tagInput.value.trim().toLowerCase(); + if (pendingTag && !tags.includes(pendingTag)) { + tags.push(pendingTag); + } + tagInput.value = ''; + } if (tags.length === 0) { showToast('toast.models.noTagsToAdd', {}, 'warning');