diff --git a/javascript/aspectRatioOverlay.js b/javascript/aspectRatioOverlay.js index dd7e9f1e..bf80c886 100644 --- a/javascript/aspectRatioOverlay.js +++ b/javascript/aspectRatioOverlay.js @@ -10,90 +10,112 @@ function dimensionChange(e, is_width, is_height) { currentHeight = e.target.value * 1.0; } - var inImg2img = gradioApp().querySelector("#tab_img2img").style.display == "block"; + let inImg2img = gradioApp().querySelector("#tab_img2img").style.display == "block"; if (!inImg2img) { return; } - var targetElement = null; + let targetElement = null; - var tabIndex = get_tab_index('mode_img2img'); - if (tabIndex == 0) { // img2img - targetElement = gradioApp().querySelector('#img2img_image div[class=forge-image-container] img'); - } else if (tabIndex == 1) { //Sketch - targetElement = gradioApp().querySelector('#img2img_sketch div[class=forge-image-container] img'); - } else if (tabIndex == 2) { // Inpaint - targetElement = gradioApp().querySelector('#img2maskimg div[class=forge-image-container] img'); - } else if (tabIndex == 3) { // Inpaint sketch - targetElement = gradioApp().querySelector('#inpaint_sketch div[class=forge-image-container] img'); - } else if (tabIndex == 4) { // Inpaint upload - targetElement = gradioApp().querySelector('#img_inpaint_base div[data-testid=image] img'); + let tabIndex = get_tab_index("mode_img2img"); + if (tabIndex == 0) { + // img2img + targetElement = gradioApp().querySelector( + "#img2img_image div[class=forge-image-container] img", + ); + } else if (tabIndex == 1) { + // Sketch + targetElement = gradioApp().querySelector( + "#img2img_sketch div[class=forge-image-container] img", + ); + } else if (tabIndex == 2) { + // Inpaint + targetElement = gradioApp().querySelector( + "#img2maskimg div[class=forge-image-container] img", + ); + } else if (tabIndex == 3) { + // Inpaint sketch + targetElement = gradioApp().querySelector( + "#inpaint_sketch div[class=forge-image-container] img", + ); + } else if (tabIndex == 4) { + // Inpaint upload + targetElement = gradioApp().querySelector( + "#img_inpaint_base div[data-testid=image] img", + ); } if (targetElement) { - var arPreviewRect = gradioApp().querySelector('#imageARPreview'); + let arPreviewRect = gradioApp().querySelector("#imageARPreview"); if (!arPreviewRect) { - arPreviewRect = document.createElement('div'); + arPreviewRect = document.createElement("div"); arPreviewRect.id = "imageARPreview"; gradioApp().appendChild(arPreviewRect); } - var viewportOffset = targetElement.getBoundingClientRect(); - var viewportscale = Math.min(targetElement.clientWidth / targetElement.width, targetElement.clientHeight / targetElement.height); + let viewportOffset = targetElement.getBoundingClientRect(); + let viewportscale = Math.min( + targetElement.clientWidth / targetElement.width, + targetElement.clientHeight / targetElement.height, + ); - var scaledx = targetElement.width * viewportscale; - var scaledy = targetElement.height * viewportscale; + let scaledx = targetElement.width * viewportscale; + let scaledy = targetElement.height * viewportscale; - var clientRectTop = (viewportOffset.top + window.scrollY); - var clientRectLeft = (viewportOffset.left + window.scrollX); - var clientRectCentreY = clientRectTop + (targetElement.clientHeight / 2); - var clientRectCentreX = clientRectLeft + (targetElement.clientWidth / 2); + let clientRectTop = viewportOffset.top + window.scrollY; + let clientRectLeft = viewportOffset.left + window.scrollX; + let clientRectCentreY = clientRectTop + targetElement.clientHeight / 2; + let clientRectCentreX = clientRectLeft + targetElement.clientWidth / 2; - var arscale = Math.min(scaledx / currentWidth, scaledy / currentHeight); - var arscaledx = currentWidth * arscale; - var arscaledy = currentHeight * arscale; + let arscale = Math.min(scaledx / currentWidth, scaledy / currentHeight); + let arscaledx = currentWidth * arscale; + let arscaledy = currentHeight * arscale; - var arRectTop = clientRectCentreY - (arscaledy / 2); - var arRectLeft = clientRectCentreX - (arscaledx / 2); - var arRectWidth = arscaledx; - var arRectHeight = arscaledy; + let arRectTop = clientRectCentreY - arscaledy / 2; + let arRectLeft = clientRectCentreX - arscaledx / 2; + let arRectWidth = arscaledx; + let arRectHeight = arscaledy; - arPreviewRect.style.top = arRectTop + 'px'; - arPreviewRect.style.left = arRectLeft + 'px'; - arPreviewRect.style.width = arRectWidth + 'px'; - arPreviewRect.style.height = arRectHeight + 'px'; + arPreviewRect.style.top = arRectTop + "px"; + arPreviewRect.style.left = arRectLeft + "px"; + arPreviewRect.style.width = arRectWidth + "px"; + arPreviewRect.style.height = arRectHeight + "px"; clearTimeout(arFrameTimeout); - arFrameTimeout = setTimeout(function() { - arPreviewRect.style.display = 'none'; + arFrameTimeout = setTimeout(function () { + arPreviewRect.style.display = "none"; }, 2000); - arPreviewRect.style.display = 'block'; + arPreviewRect.style.display = "block"; } } -onAfterUiUpdate(function() { - var arPreviewRect = gradioApp().querySelector('#imageARPreview'); +onAfterUiUpdate(function () { + let arPreviewRect = gradioApp().querySelector("#imageARPreview"); if (arPreviewRect) { - arPreviewRect.style.display = 'none'; + arPreviewRect.style.display = "none"; } - var tabImg2img = gradioApp().querySelector("#tab_img2img"); + let tabImg2img = gradioApp().querySelector("#tab_img2img"); if (tabImg2img) { if (tabImg2img.style.display == "block") { - let inputs = gradioApp().querySelectorAll('input'); - inputs.forEach(function(e) { - var is_width = (e.parentElement.id == "img2img_width" && e.type == "range") || - (e.parentElement.parentElement.parentElement.id == "img2img_width" && e.type == "number"); - var is_height = (e.parentElement.id == "img2img_height" && e.type == "range") || - (e.parentElement.parentElement.parentElement.id == "img2img_height" && e.type == "number"); + let inputs = gradioApp().querySelectorAll("input"); + inputs.forEach(function (e) { + let is_width = + (e.parentElement.id == "img2img_width" && e.type == "range") || + (e.parentElement.parentElement.parentElement.id == "img2img_width" && + e.type == "number"); + let is_height = + (e.parentElement.id == "img2img_height" && e.type == "range") || + (e.parentElement.parentElement.parentElement.id == "img2img_height" && + e.type == "number"); - if ((is_width || is_height) && !e.classList.contains('scrollwatch')) { - e.addEventListener('input', function(e) { + if ((is_width || is_height) && !e.classList.contains("scrollwatch")) { + e.addEventListener("input", function (e) { dimensionChange(e, is_width, is_height); }); - e.classList.add('scrollwatch'); + e.classList.add("scrollwatch"); } if (is_width) { currentWidth = e.value * 1.0; diff --git a/javascript/contextMenus.js b/javascript/contextMenus.js index fc2ae43c..f2931d4e 100644 --- a/javascript/contextMenus.js +++ b/javascript/contextMenus.js @@ -1,69 +1,70 @@ - -var contextMenuInit = function() { +let contextMenuInit = function () { let eventListenerApplied = false; let menuSpecs = new Map(); - const uid = function() { + const uid = function () { return Date.now().toString(36) + Math.random().toString(36).substring(2); }; function showContextMenu(event, element, menuEntries) { - let oldMenu = gradioApp().querySelector('#context-menu'); + let oldMenu = gradioApp().querySelector("#context-menu"); if (oldMenu) { oldMenu.remove(); } let baseStyle = window.getComputedStyle(uiCurrentTab); - const contextMenu = document.createElement('nav'); + const contextMenu = document.createElement("nav"); contextMenu.id = "context-menu"; contextMenu.style.background = baseStyle.background; contextMenu.style.color = baseStyle.color; contextMenu.style.fontFamily = baseStyle.fontFamily; - contextMenu.style.top = event.pageY + 'px'; - contextMenu.style.left = event.pageX + 'px'; + contextMenu.style.top = event.pageY + "px"; + contextMenu.style.left = event.pageX + "px"; - const contextMenuList = document.createElement('ul'); - contextMenuList.className = 'context-menu-items'; + const contextMenuList = document.createElement("ul"); + contextMenuList.className = "context-menu-items"; contextMenu.append(contextMenuList); - menuEntries.forEach(function(entry) { - let contextMenuEntry = document.createElement('a'); - contextMenuEntry.innerHTML = entry['name']; - contextMenuEntry.addEventListener("click", function() { - entry['func'](); + menuEntries.forEach(function (entry) { + let contextMenuEntry = document.createElement("a"); + contextMenuEntry.innerHTML = entry["name"]; + contextMenuEntry.addEventListener("click", function () { + entry["func"](); }); contextMenuList.append(contextMenuEntry); - }); gradioApp().appendChild(contextMenu); } - function appendContextMenuOption(targetElementSelector, entryName, entryFunction) { - - var currentItems = menuSpecs.get(targetElementSelector); + function appendContextMenuOption( + targetElementSelector, + entryName, + entryFunction, + ) { + let currentItems = menuSpecs.get(targetElementSelector); if (!currentItems) { currentItems = []; menuSpecs.set(targetElementSelector, currentItems); } let newItem = { - id: targetElementSelector + '_' + uid(), + id: targetElementSelector + "_" + uid(), name: entryName, func: entryFunction, - isNew: true + isNew: true, }; currentItems.push(newItem); - return newItem['id']; + return newItem["id"]; } function removeContextMenuOption(uid) { - menuSpecs.forEach(function(v) { + menuSpecs.forEach(function (v) { let index = -1; - v.forEach(function(e, ei) { - if (e['id'] == uid) { + v.forEach(function (e, ei) { + if (e["id"] == uid) { index = ei; } }); @@ -77,28 +78,28 @@ var contextMenuInit = function() { if (eventListenerApplied) { return; } - gradioApp().addEventListener("click", function(e) { + gradioApp().addEventListener("click", function (e) { if (!e.isTrusted) { return; } - let oldMenu = gradioApp().querySelector('#context-menu'); + let oldMenu = gradioApp().querySelector("#context-menu"); if (oldMenu) { oldMenu.remove(); } }); - ['contextmenu', 'touchstart'].forEach((eventType) => { - gradioApp().addEventListener(eventType, function(e) { + ["contextmenu", "touchstart"].forEach((eventType) => { + gradioApp().addEventListener(eventType, function (e) { let ev = e; - if (eventType.startsWith('touch')) { + if (eventType.startsWith("touch")) { if (e.touches.length !== 2) return; ev = e.touches[0]; } - let oldMenu = gradioApp().querySelector('#context-menu'); + let oldMenu = gradioApp().querySelector("#context-menu"); if (oldMenu) { oldMenu.remove(); } - menuSpecs.forEach(function(v, k) { + menuSpecs.forEach(function (v, k) { if (e.composedPath()[0].matches(k)) { showContextMenu(ev, e.composedPath()[0], v); e.preventDefault(); @@ -107,77 +108,108 @@ var contextMenuInit = function() { }); }); eventListenerApplied = true; - } - return [appendContextMenuOption, removeContextMenuOption, addContextMenuEventListener]; + return [ + appendContextMenuOption, + removeContextMenuOption, + addContextMenuEventListener, + ]; }; -var initResponse = contextMenuInit(); -var appendContextMenuOption = initResponse[0]; -var removeContextMenuOption = initResponse[1]; -var addContextMenuEventListener = initResponse[2]; +let initResponse = contextMenuInit(); +let appendContextMenuOption = initResponse[0]; +let removeContextMenuOption = initResponse[1]; +let addContextMenuEventListener = initResponse[2]; -var regen_txt2img = null; -var regen_img2img = null; +let regen_txt2img = null; +let regen_img2img = null; -(function() { +(function () { //Start example Context Menu Items - let generateOnRepeat_txt2img = function() { - if ((regen_txt2img == null) && (regen_img2img == null)) { - let generate = gradioApp().querySelector('#txt2img_generate'); - let interrupt = gradioApp().querySelector('#txt2img_interrupt'); - if (!interrupt.offsetParent) { - generate.click(); - } + let generateOnRepeat_txt2img = function () { + if (regen_txt2img == null && regen_img2img == null) { + let generate = gradioApp().querySelector("#txt2img_generate"); + let interrupt = gradioApp().querySelector("#txt2img_interrupt"); + if (!interrupt.offsetParent) { + generate.click(); + } - regen_txt2img = setInterval(function() { - if (interrupt.style.display == 'none') { - generate.click(); - interrupt.style.display = 'block'; - } - }, - 500); - } + regen_txt2img = setInterval(function () { + if (interrupt.style.display == "none") { + generate.click(); + interrupt.style.display = "block"; + } + }, 500); + } }; - appendContextMenuOption('#txt2img_generate', 'Generate forever', generateOnRepeat_txt2img); - appendContextMenuOption('#txt2img_interrupt', 'Generate forever', generateOnRepeat_txt2img); + appendContextMenuOption( + "#txt2img_generate", + "Generate forever", + generateOnRepeat_txt2img, + ); + appendContextMenuOption( + "#txt2img_interrupt", + "Generate forever", + generateOnRepeat_txt2img, + ); - let cancel_regen_txt2img = function() { + let cancel_regen_txt2img = function () { clearInterval(regen_txt2img); - regen_txt2img = null; + regen_txt2img = null; }; - appendContextMenuOption('#txt2img_interrupt', 'Cancel generate forever', cancel_regen_txt2img); - appendContextMenuOption('#txt2img_generate', 'Cancel generate forever', cancel_regen_txt2img); + appendContextMenuOption( + "#txt2img_interrupt", + "Cancel generate forever", + cancel_regen_txt2img, + ); + appendContextMenuOption( + "#txt2img_generate", + "Cancel generate forever", + cancel_regen_txt2img, + ); - let generateOnRepeat_img2img = function() { - if ((regen_txt2img == null) && (regen_img2img == null)) { - let generate = gradioApp().querySelector('#img2img_generate'); - let interrupt = gradioApp().querySelector('#img2img_interrupt'); - if (!interrupt.offsetParent) { - generate.click(); - } + let generateOnRepeat_img2img = function () { + if (regen_txt2img == null && regen_img2img == null) { + let generate = gradioApp().querySelector("#img2img_generate"); + let interrupt = gradioApp().querySelector("#img2img_interrupt"); + if (!interrupt.offsetParent) { + generate.click(); + } - regen_img2img = setInterval(function() { - if (interrupt.style.display == 'none') { - generate.click(); - interrupt.style.display = 'block'; - } - }, - 500); - } + regen_img2img = setInterval(function () { + if (interrupt.style.display == "none") { + generate.click(); + interrupt.style.display = "block"; + } + }, 500); + } }; - appendContextMenuOption('#img2img_generate', 'Generate forever', generateOnRepeat_img2img); - appendContextMenuOption('#img2img_interrupt', 'Generate forever', generateOnRepeat_img2img); + appendContextMenuOption( + "#img2img_generate", + "Generate forever", + generateOnRepeat_img2img, + ); + appendContextMenuOption( + "#img2img_interrupt", + "Generate forever", + generateOnRepeat_img2img, + ); - let cancel_regen_img2img = function() { + let cancel_regen_img2img = function () { clearInterval(regen_img2img); - regen_img2img = null; + regen_img2img = null; }; - appendContextMenuOption('#img2img_interrupt', 'Cancel generate forever', cancel_regen_img2img); - appendContextMenuOption('#img2img_generate', 'Cancel generate forever', cancel_regen_img2img); - + appendContextMenuOption( + "#img2img_interrupt", + "Cancel generate forever", + cancel_regen_img2img, + ); + appendContextMenuOption( + "#img2img_generate", + "Cancel generate forever", + cancel_regen_img2img, + ); })(); - onAfterUiUpdate(addContextMenuEventListener); diff --git a/javascript/dragdrop.js b/javascript/dragdrop.js index 2b7a1456..eca83496 100644 --- a/javascript/dragdrop.js +++ b/javascript/dragdrop.js @@ -1,7 +1,11 @@ // allows drag-dropping files into gradio image elements, and also pasting images from clipboard function isValidImageList(files) { - return files && files?.length === 1 && ['image/png', 'image/gif', 'image/jpeg'].includes(files[0].type); + return ( + files && + files?.length === 1 && + ["image/png", "image/gif", "image/jpeg"].includes(files[0].type) + ); } function dropReplaceImage(imgWrap, files) { @@ -11,7 +15,11 @@ function dropReplaceImage(imgWrap, files) { const tmpFile = files[0]; - imgWrap.querySelector('.modify-upload button + button, .touch-none + div button + button')?.click(); + imgWrap + .querySelector( + ".modify-upload button + button, .touch-none + div button + button", + ) + ?.click(); const callback = () => { const fileInput = imgWrap.querySelector('input[type="file"]'); if (fileInput) { @@ -22,7 +30,7 @@ function dropReplaceImage(imgWrap, files) { } else { fileInput.files = files; } - fileInput.dispatchEvent(new Event('change')); + fileInput.dispatchEvent(new Event("change")); } }; @@ -32,7 +40,8 @@ function dropReplaceImage(imgWrap, files) { function eventHasFiles(e) { if (!e.dataTransfer || !e.dataTransfer.files) return false; if (e.dataTransfer.files.length > 0) return true; - if (e.dataTransfer.items.length > 0 && e.dataTransfer.items[0].kind == "file") return true; + if (e.dataTransfer.items.length > 0 && e.dataTransfer.items[0].kind == "file") + return true; return false; } @@ -47,60 +56,66 @@ function isURL(url) { } function dragDropTargetIsPrompt(target) { - if (target?.placeholder && target?.placeholder.indexOf("Prompt") >= 0) return true; - if (target?.parentNode?.parentNode?.className?.indexOf("prompt") > 0) return true; + if (target?.placeholder && target?.placeholder.indexOf("Prompt") >= 0) + return true; + if (target?.parentNode?.parentNode?.className?.indexOf("prompt") > 0) + return true; return false; } -window.document.addEventListener('dragover', e => { +window.document.addEventListener("dragover", (e) => { const target = e.composedPath()[0]; if (!eventHasFiles(e)) return; - var targetImage = target.closest('[data-testid="image"]'); + let targetImage = target.closest('[data-testid="image"]'); if (!dragDropTargetIsPrompt(target) && !targetImage) return; e.stopPropagation(); e.preventDefault(); - e.dataTransfer.dropEffect = 'copy'; + e.dataTransfer.dropEffect = "copy"; }); -window.document.addEventListener('drop', async e => { +window.document.addEventListener("drop", async (e) => { const target = e.composedPath()[0]; - const url = e.dataTransfer.getData('text/uri-list') || e.dataTransfer.getData('text/plain'); + const url = + e.dataTransfer.getData("text/uri-list") || + e.dataTransfer.getData("text/plain"); if (!eventHasFiles(e) && !isURL(url)) return; if (dragDropTargetIsPrompt(target)) { e.stopPropagation(); e.preventDefault(); - const isImg2img = get_tab_index('tabs') == 1; - let prompt_image_target = isImg2img ? "img2img_prompt_image" : "txt2img_prompt_image"; + const isImg2img = get_tab_index("tabs") == 1; + let prompt_image_target = isImg2img + ? "img2img_prompt_image" + : "txt2img_prompt_image"; const imgParent = gradioApp().getElementById(prompt_image_target); const files = e.dataTransfer.files; const fileInput = imgParent.querySelector('input[type="file"]'); if (eventHasFiles(e) && fileInput) { fileInput.files = files; - fileInput.dispatchEvent(new Event('change')); + fileInput.dispatchEvent(new Event("change")); } else if (url) { try { const request = await fetch(url); if (!request.ok) { - console.error('Error fetching URL:', url, request.status); + console.error("Error fetching URL:", url, request.status); return; } const data = new DataTransfer(); - data.items.add(new File([await request.blob()], 'image.png')); + data.items.add(new File([await request.blob()], "image.png")); fileInput.files = data.files; - fileInput.dispatchEvent(new Event('change')); + fileInput.dispatchEvent(new Event("change")); } catch (error) { - console.error('Error fetching URL:', url, error); + console.error("Error fetching URL:", url, error); return; } } } - var targetImage = target.closest('[data-testid="image"]'); + let targetImage = target.closest('[data-testid="image"]'); if (targetImage) { e.stopPropagation(); e.preventDefault(); @@ -110,28 +125,30 @@ window.document.addEventListener('drop', async e => { } }); -window.addEventListener('paste', e => { +window.addEventListener("paste", (e) => { const files = e.clipboardData.files; if (!isValidImageList(files)) { return; } - const visibleImageFields = [...gradioApp().querySelectorAll('[data-testid="image"]')] - .filter(el => uiElementIsVisible(el)) + const visibleImageFields = [ + ...gradioApp().querySelectorAll('[data-testid="image"]'), + ] + .filter((el) => uiElementIsVisible(el)) .sort((a, b) => uiElementInSight(b) - uiElementInSight(a)); - if (!visibleImageFields.length) { return; } - const firstFreeImageField = visibleImageFields - .filter(el => !el.querySelector('img'))?.[0]; + const firstFreeImageField = visibleImageFields.filter( + (el) => !el.querySelector("img"), + )?.[0]; dropReplaceImage( - firstFreeImageField ? - firstFreeImageField : - visibleImageFields[visibleImageFields.length - 1] - , files + firstFreeImageField + ? firstFreeImageField + : visibleImageFields[visibleImageFields.length - 1], + files, ); }); diff --git a/javascript/edit-attention.js b/javascript/edit-attention.js index b07ba97c..46ff6eb6 100644 --- a/javascript/edit-attention.js +++ b/javascript/edit-attention.js @@ -47,7 +47,7 @@ function keyupEditAttention(event) { function selectCurrentWord() { if (selectionStart !== selectionEnd) return false; - const whitespace_delimiters = {"Tab": "\t", "Carriage Return": "\r", "Line Feed": "\n"}; + const whitespace_delimiters = { "Tab": "\t", "Carriage Return": "\r", "Line Feed": "\n" }; let delimiters = opts.keyedit_delimiters; for (let i of opts.keyedit_delimiters_whitespace) { diff --git a/javascript/edit-order.js b/javascript/edit-order.js index ed4ef9ac..44a5120e 100644 --- a/javascript/edit-order.js +++ b/javascript/edit-order.js @@ -4,7 +4,10 @@ function keyupEditOrder(event) { if (!opts.keyedit_move) return; let target = event.originalTarget || event.composedPath()[0]; - if (!target.matches("*:is([id*='_toprow'] [id*='_prompt'], .prompt) textarea")) return; + if ( + !target.matches("*:is([id*='_toprow'] [id*='_prompt'], .prompt) textarea") + ) + return; if (!event.altKey) return; let isLeft = event.key == "ArrowLeft"; @@ -23,7 +26,8 @@ function keyupEditOrder(event) { if (isLeft && indexStart > 0) { items.splice(indexStart - 1, 0, ...items.splice(indexStart, range)); target.value = items.join(); - target.selectionStart = items.slice(0, indexStart - 1).join().length + (indexStart == 1 ? 0 : 1); + target.selectionStart = + items.slice(0, indexStart - 1).join().length + (indexStart == 1 ? 0 : 1); target.selectionEnd = items.slice(0, indexEnd).join().length; } else if (isRight && indexEnd < items.length - 1) { items.splice(indexStart + 1, 0, ...items.splice(indexStart, range)); @@ -36,6 +40,6 @@ function keyupEditOrder(event) { updateInput(target); } -addEventListener('keydown', (event) => { +addEventListener("keydown", (event) => { keyupEditOrder(event); }); diff --git a/javascript/extensions.js b/javascript/extensions.js index cc8ee220..c7b34380 100644 --- a/javascript/extensions.js +++ b/javascript/extensions.js @@ -1,12 +1,13 @@ - function extensions_apply(_disabled_list, _update_list, disable_all) { - var disable = []; - var update = []; - const extensions_input = gradioApp().querySelectorAll('#extensions input[type="checkbox"]'); + let disable = []; + let update = []; + const extensions_input = gradioApp().querySelectorAll( + '#extensions input[type="checkbox"]', + ); if (extensions_input.length == 0) { throw Error("Extensions page not yet loaded."); } - extensions_input.forEach(function(x) { + extensions_input.forEach(function (x) { if (x.name.startsWith("enable_") && !x.checked) { disable.push(x.name.substring(7)); } @@ -22,23 +23,29 @@ function extensions_apply(_disabled_list, _update_list, disable_all) { } function extensions_check() { - var disable = []; + let disable = []; - gradioApp().querySelectorAll('#extensions input[type="checkbox"]').forEach(function(x) { - if (x.name.startsWith("enable_") && !x.checked) { - disable.push(x.name.substring(7)); - } - }); + gradioApp() + .querySelectorAll('#extensions input[type="checkbox"]') + .forEach(function (x) { + if (x.name.startsWith("enable_") && !x.checked) { + disable.push(x.name.substring(7)); + } + }); - gradioApp().querySelectorAll('#extensions .extension_status').forEach(function(x) { - x.innerHTML = "Loading..."; - }); + gradioApp() + .querySelectorAll("#extensions .extension_status") + .forEach(function (x) { + x.innerHTML = "Loading..."; + }); - - var id = randomId(); - requestProgress(id, gradioApp().getElementById('extensions_installed_html'), null, function() { - - }); + let id = randomId(); + requestProgress( + id, + gradioApp().getElementById("extensions_installed_html"), + null, + function () { }, + ); return [id, JSON.stringify(disable)]; } @@ -47,14 +54,18 @@ function install_extension_from_index(button, url) { button.disabled = "disabled"; button.value = "Installing..."; - var textarea = gradioApp().querySelector('#extension_to_install textarea'); + let textarea = gradioApp().querySelector("#extension_to_install textarea"); textarea.value = url; updateInput(textarea); - gradioApp().querySelector('#install_extension_button').click(); + gradioApp().querySelector("#install_extension_button").click(); } -function config_state_confirm_restore(_, config_state_name, config_restore_type) { +function config_state_confirm_restore( + _, + config_state_name, + config_restore_type, +) { if (config_state_name == "Current") { return [false, config_state_name, config_restore_type]; } @@ -66,30 +77,41 @@ function config_state_confirm_restore(_, config_state_name, config_restore_type) } else { restored = "the webui version and all saved extension versions"; } - let confirmed = confirm("Are you sure you want to restore from this state?\nThis will reset " + restored + "."); + let confirmed = confirm( + "Are you sure you want to restore from this state?\nThis will reset " + + restored + + ".", + ); if (confirmed) { restart_reload(); - gradioApp().querySelectorAll('#extensions .extension_status').forEach(function(x) { - x.innerHTML = "Loading..."; - }); + gradioApp() + .querySelectorAll("#extensions .extension_status") + .forEach(function (x) { + x.innerHTML = "Loading..."; + }); } return [confirmed, config_state_name, config_restore_type]; } function toggle_all_extensions(event) { - gradioApp().querySelectorAll('#extensions .extension_toggle').forEach(function(checkbox_el) { - checkbox_el.checked = event.target.checked; - }); + gradioApp() + .querySelectorAll("#extensions .extension_toggle") + .forEach(function (checkbox_el) { + checkbox_el.checked = event.target.checked; + }); } function toggle_extension() { let all_extensions_toggled = true; - for (const checkbox_el of gradioApp().querySelectorAll('#extensions .extension_toggle')) { + for (const checkbox_el of gradioApp().querySelectorAll( + "#extensions .extension_toggle", + )) { if (!checkbox_el.checked) { all_extensions_toggled = false; break; } } - gradioApp().querySelector('#extensions .all_extensions_toggle').checked = all_extensions_toggled; + gradioApp().querySelector("#extensions .all_extensions_toggle").checked = + all_extensions_toggled; } diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js index 1306302f..58f3db41 100644 --- a/javascript/extraNetworks.js +++ b/javascript/extraNetworks.js @@ -1,172 +1,209 @@ function toggleCss(key, css, enable) { - var style = document.getElementById(key); + let style = document.getElementById(key); if (enable && !style) { - style = document.createElement('style'); + style = document.createElement("style"); style.id = key; - style.type = 'text/css'; + style.type = "text/css"; document.head.appendChild(style); } if (style && !enable) { document.head.removeChild(style); } if (style) { - style.innerHTML == ''; + style.innerHTML == ""; style.appendChild(document.createTextNode(css)); } } function setupExtraNetworksForTab(tabname) { function registerPrompt(tabname, id) { - var textarea = gradioApp().querySelector("#" + id + " > label > textarea"); + let textarea = gradioApp().querySelector("#" + id + " > label > textarea"); if (!activePromptTextarea[tabname]) { activePromptTextarea[tabname] = textarea; } - textarea.addEventListener("focus", function() { + textarea.addEventListener("focus", function () { activePromptTextarea[tabname] = textarea; }); } - var tabnav = gradioApp().querySelector('#' + tabname + '_extra_tabs > div.tab-nav'); - var controlsDiv = document.createElement('DIV'); - controlsDiv.classList.add('extra-networks-controls-div'); + let tabnav = gradioApp().querySelector( + "#" + tabname + "_extra_tabs > div.tab-nav", + ); + let controlsDiv = document.createElement("DIV"); + controlsDiv.classList.add("extra-networks-controls-div"); tabnav.appendChild(controlsDiv); tabnav.insertBefore(controlsDiv, null); - var this_tab = gradioApp().querySelector('#' + tabname + '_extra_tabs'); - this_tab.querySelectorAll(":scope > [id^='" + tabname + "_']").forEach(function(elem) { - // tabname_full = {tabname}_{extra_networks_tabname} - var tabname_full = elem.id; - var search = gradioApp().querySelector("#" + tabname_full + "_extra_search"); - var sort_dir = gradioApp().querySelector("#" + tabname_full + "_extra_sort_dir"); - var refresh = gradioApp().querySelector("#" + tabname_full + "_extra_refresh"); - var currentSort = ''; + let this_tab = gradioApp().querySelector("#" + tabname + "_extra_tabs"); + this_tab + .querySelectorAll(":scope > [id^='" + tabname + "_']") + .forEach(function (elem) { + // tabname_full = {tabname}_{extra_networks_tabname} + let tabname_full = elem.id; + let search = gradioApp().querySelector( + "#" + tabname_full + "_extra_search", + ); + let sort_dir = gradioApp().querySelector( + "#" + tabname_full + "_extra_sort_dir", + ); + let refresh = gradioApp().querySelector( + "#" + tabname_full + "_extra_refresh", + ); + let currentSort = ""; - // If any of the buttons above don't exist, we want to skip this iteration of the loop. - if (!search || !sort_dir || !refresh) { - return; // `return` is equivalent of `continue` but for forEach loops. - } - - var applyFilter = function(force) { - var searchTerm = search.value.toLowerCase(); - - // get UI preset - radioUI = gradioApp().querySelector('#forge_ui_preset'); - radioButtons = radioUI.getElementsByTagName('input'); - UIresult = 3; // default to 'all' - for (i = 0; i < radioButtons.length; i++) { - if (radioButtons[i].checked) { - UIresult = i; - } + // If any of the buttons above don't exist, we want to skip this iteration of the loop. + if (!search || !sort_dir || !refresh) { + return; // `return` is equivalent of `continue` but for forEach loops. } - gradioApp().querySelectorAll('#' + tabname + '_extra_tabs div.card').forEach(function(elem) { - var searchOnly = elem.querySelector('.search_only'); - var text = Array.prototype.map.call(elem.querySelectorAll('.search_terms, .description'), function(t) { - return t.textContent.toLowerCase(); - }).join(" "); + let applyFilter = function (force) { + let searchTerm = search.value.toLowerCase(); - var visible = true; - if (searchOnly && searchTerm.length < 4) visible = false; + // get UI preset + radioUI = gradioApp().querySelector("#forge_ui_preset"); + radioButtons = radioUI.getElementsByTagName("input"); + UIresult = 3; // default to 'all' + for (i = 0; i < radioButtons.length; i++) { + if (radioButtons[i].checked) { + UIresult = i; + } + } - splitSearch = searchTerm.split(" "); - splitSearch.forEach(function(partial) { - if (text.indexOf(partial) == -1) visible = false; - }) + gradioApp() + .querySelectorAll("#" + tabname + "_extra_tabs div.card") + .forEach(function (elem) { + let searchOnly = elem.querySelector(".search_only"); + let text = Array.prototype.map + .call( + elem.querySelectorAll(".search_terms, .description"), + function (t) { + return t.textContent.toLowerCase(); + }, + ) + .join(" "); - sdversion = elem.getAttribute('data-sort-sdversion'); - if (sdversion == null) ; - else if (sdversion == 'SdVersion.Unknown') ; - else if (opts.lora_filter_disabled == True) ; - else if (UIresult == 3) ; // 'all' - else if (UIresult == 0) { // 'sd' - if (sdversion != 'SdVersion.SD1' && sdversion != 'SdVersion.SD2') visible = false; + let visible = true; + if (searchOnly && searchTerm.length < 4) visible = false; + + splitSearch = searchTerm.split(" "); + splitSearch.forEach(function (partial) { + if (text.indexOf(partial) == -1) visible = false; + }); + + sdversion = elem.getAttribute("data-sort-sdversion"); + if (sdversion == null); + else if (sdversion == "SdVersion.Unknown"); + else if (opts.lora_filter_disabled == True); + else if (UIresult == 3); // 'all' + else if (UIresult == 0) { + // 'sd' + if (sdversion != "SdVersion.SD1" && sdversion != "SdVersion.SD2") + visible = false; + } else if (UIresult == 1) { + // 'xl' + if (sdversion != "SdVersion.SDXL") visible = false; + } else if (UIresult == 2) { + // 'flux' + if (sdversion != "SdVersion.Flux") visible = false; + } + + if (visible) { + elem.classList.remove("hidden"); + } else { + elem.classList.add("hidden"); + } + }); + + applySort(force); + }; + + let applySort = function (force) { + let cards = gradioApp().querySelectorAll( + "#" + tabname_full + " div.card", + ); + let parent = gradioApp().querySelector("#" + tabname_full + "_cards"); + let reverse = sort_dir.dataset.sortdir == "Descending"; + let activeSearchElem = gradioApp().querySelector( + "#" + + tabname_full + + "_controls .extra-network-control--sort.extra-network-control--enabled", + ); + let sortKey = activeSearchElem + ? activeSearchElem.dataset.sortkey + : "default"; + let sortKeyDataField = + "sort" + sortKey.charAt(0).toUpperCase() + sortKey.slice(1); + let sortKeyStore = + sortKey + "-" + sort_dir.dataset.sortdir + "-" + cards.length; + + if (sortKeyStore == currentSort && !force) { + return; } - else if (UIresult == 1) { // 'xl' - if (sdversion != 'SdVersion.SDXL') visible = false; - } - else if (UIresult == 2) { // 'flux' - if (sdversion != 'SdVersion.Flux') visible = false; - } - - if (visible) { - elem.classList.remove("hidden"); - } else { - elem.classList.add("hidden"); + currentSort = sortKeyStore; + + let sortedCards = Array.from(cards); + sortedCards.sort(function (cardA, cardB) { + let a = cardA.dataset[sortKeyDataField]; + let b = cardB.dataset[sortKeyDataField]; + if (!isNaN(a) && !isNaN(b)) { + return parseInt(a) - parseInt(b); + } + + return a < b ? -1 : a > b ? 1 : 0; + }); + + if (reverse) { + sortedCards.reverse(); } + + parent.innerHTML = ""; + + let frag = document.createDocumentFragment(); + sortedCards.forEach(function (card) { + frag.appendChild(card); + }); + parent.appendChild(frag); + }; + + search.addEventListener("input", function () { + applyFilter(); }); - - applySort(force); - }; - - - var applySort = function(force) { - var cards = gradioApp().querySelectorAll('#' + tabname_full + ' div.card'); - var parent = gradioApp().querySelector('#' + tabname_full + "_cards"); - var reverse = sort_dir.dataset.sortdir == "Descending"; - var activeSearchElem = gradioApp().querySelector('#' + tabname_full + "_controls .extra-network-control--sort.extra-network-control--enabled"); - var sortKey = activeSearchElem ? activeSearchElem.dataset.sortkey : "default"; - var sortKeyDataField = "sort" + sortKey.charAt(0).toUpperCase() + sortKey.slice(1); - var sortKeyStore = sortKey + "-" + sort_dir.dataset.sortdir + "-" + cards.length; - - if (sortKeyStore == currentSort && !force) { - return; - } - currentSort = sortKeyStore; - - var sortedCards = Array.from(cards); - sortedCards.sort(function(cardA, cardB) { - var a = cardA.dataset[sortKeyDataField]; - var b = cardB.dataset[sortKeyDataField]; - if (!isNaN(a) && !isNaN(b)) { - return parseInt(a) - parseInt(b); - } - - return (a < b ? -1 : (a > b ? 1 : 0)); - }); - - if (reverse) { - sortedCards.reverse(); - } - - parent.innerHTML = ''; - - var frag = document.createDocumentFragment(); - sortedCards.forEach(function(card) { - frag.appendChild(card); - }); - parent.appendChild(frag); - }; - - search.addEventListener("input", function() { + applySort(); applyFilter(); + + extraNetworksApplySort[tabname_full] = applySort; + extraNetworksApplyFilter[tabname_full] = applyFilter; + + let controls = gradioApp().querySelector( + "#" + tabname_full + "_controls", + ); + controlsDiv.insertBefore(controls, null); + + if (elem.style.display != "none") { + extraNetworksShowControlsForPage(tabname, tabname_full); + } }); - applySort(); - applyFilter(); - - extraNetworksApplySort[tabname_full] = applySort; - extraNetworksApplyFilter[tabname_full] = applyFilter; - - var controls = gradioApp().querySelector("#" + tabname_full + "_controls"); - controlsDiv.insertBefore(controls, null); - - if (elem.style.display != "none") { - extraNetworksShowControlsForPage(tabname, tabname_full); - } - }); registerPrompt(tabname, tabname + "_prompt"); registerPrompt(tabname, tabname + "_neg_prompt"); } -function extraNetworksMovePromptToTab(tabname, id, showPrompt, showNegativePrompt) { - if (!gradioApp().querySelector('.toprow-compact-tools')) return; // only applicable for compact prompt layout +function extraNetworksMovePromptToTab( + tabname, + id, + showPrompt, + showNegativePrompt, +) { + if (!gradioApp().querySelector(".toprow-compact-tools")) return; // only applicable for compact prompt layout - var promptContainer = gradioApp().getElementById(tabname + '_prompt_container'); - var prompt = gradioApp().getElementById(tabname + '_prompt_row'); - var negPrompt = gradioApp().getElementById(tabname + '_neg_prompt_row'); - var elem = id ? gradioApp().getElementById(id) : null; + let promptContainer = gradioApp().getElementById( + tabname + "_prompt_container", + ); + let prompt = gradioApp().getElementById(tabname + "_prompt_row"); + let negPrompt = gradioApp().getElementById(tabname + "_neg_prompt_row"); + let elem = id ? gradioApp().getElementById(id) : null; if (showNegativePrompt && elem) { elem.insertBefore(negPrompt, elem.firstChild); @@ -181,34 +218,47 @@ function extraNetworksMovePromptToTab(tabname, id, showPrompt, showNegativePromp } if (elem) { - elem.classList.toggle('extra-page-prompts-active', showNegativePrompt || showPrompt); + elem.classList.toggle( + "extra-page-prompts-active", + showNegativePrompt || showPrompt, + ); } } - function extraNetworksShowControlsForPage(tabname, tabname_full) { - gradioApp().querySelectorAll('#' + tabname + '_extra_tabs .extra-networks-controls-div > div').forEach(function(elem) { - var targetId = tabname_full + "_controls"; - elem.style.display = elem.id == targetId ? "" : "none"; - }); + gradioApp() + .querySelectorAll( + "#" + tabname + "_extra_tabs .extra-networks-controls-div > div", + ) + .forEach(function (elem) { + let targetId = tabname_full + "_controls"; + elem.style.display = elem.id == targetId ? "" : "none"; + }); } - -function extraNetworksUnrelatedTabSelected(tabname) { // called from python when user selects an unrelated tab (generate) - extraNetworksMovePromptToTab(tabname, '', false, false); +function extraNetworksUnrelatedTabSelected(tabname) { + // called from python when user selects an unrelated tab (generate) + extraNetworksMovePromptToTab(tabname, "", false, false); extraNetworksShowControlsForPage(tabname, null); } -function extraNetworksTabSelected(tabname, id, showPrompt, showNegativePrompt, tabname_full) { // called from python when user selects an extra networks tab +function extraNetworksTabSelected( + tabname, + id, + showPrompt, + showNegativePrompt, + tabname_full, +) { + // called from python when user selects an extra networks tab extraNetworksMovePromptToTab(tabname, id, showPrompt, showNegativePrompt); extraNetworksShowControlsForPage(tabname, tabname_full); } function applyExtraNetworkFilter(tabname_full) { - var doFilter = function() { - var applyFunction = extraNetworksApplyFilter[tabname_full]; + let doFilter = function () { + let applyFunction = extraNetworksApplyFilter[tabname_full]; if (applyFunction) { applyFunction(true); @@ -218,55 +268,76 @@ function applyExtraNetworkFilter(tabname_full) { } function applyExtraNetworkSort(tabname_full) { - var doSort = function() { + let doSort = function () { extraNetworksApplySort[tabname_full](true); }; setTimeout(doSort, 1); } -var extraNetworksApplyFilter = {}; -var extraNetworksApplySort = {}; -var activePromptTextarea = {}; +let extraNetworksApplyFilter = {}; +let extraNetworksApplySort = {}; +let activePromptTextarea = {}; function setupExtraNetworks() { - setupExtraNetworksForTab('txt2img'); - setupExtraNetworksForTab('img2img'); + setupExtraNetworksForTab("txt2img"); + setupExtraNetworksForTab("img2img"); } -var re_extranet = /<([^:^>]+:[^:]+):[\d.]+>(.*)/; -var re_extranet_g = /<([^:^>]+:[^:]+):[\d.]+>/g; +let re_extranet = /<([^:^>]+:[^:]+):[\d.]+>(.*)/; +let re_extranet_g = /<([^:^>]+:[^:]+):[\d.]+>/g; -var re_extranet_neg = /\(([^:^>]+:[\d.]+)\)/; -var re_extranet_g_neg = /\(([^:^>]+:[\d.]+)\)/g; +let re_extranet_neg = /\(([^:^>]+:[\d.]+)\)/; +let re_extranet_g_neg = /\(([^:^>]+:[\d.]+)\)/g; function tryToRemoveExtraNetworkFromPrompt(textarea, text, isNeg) { - var m = text.match(isNeg ? re_extranet_neg : re_extranet); - var replaced = false; - var newTextareaText; - var extraTextBeforeNet = opts.extra_networks_add_text_separator; + let m = text.match(isNeg ? re_extranet_neg : re_extranet); + let replaced = false; + let newTextareaText; + let extraTextBeforeNet = opts.extra_networks_add_text_separator; if (m) { - var extraTextAfterNet = m[2]; - var partToSearch = m[1]; - var foundAtPosition = -1; - newTextareaText = textarea.value.replaceAll(isNeg ? re_extranet_g_neg : re_extranet_g, function(found, net, pos) { - m = found.match(isNeg ? re_extranet_neg : re_extranet); - if (m[1] == partToSearch) { - replaced = true; - foundAtPosition = pos; - return ""; - } - return found; - }); + let extraTextAfterNet = m[2]; + let partToSearch = m[1]; + let foundAtPosition = -1; + newTextareaText = textarea.value.replaceAll( + isNeg ? re_extranet_g_neg : re_extranet_g, + function (found, net, pos) { + m = found.match(isNeg ? re_extranet_neg : re_extranet); + if (m[1] == partToSearch) { + replaced = true; + foundAtPosition = pos; + return ""; + } + return found; + }, + ); if (foundAtPosition >= 0) { - if (extraTextAfterNet && newTextareaText.substr(foundAtPosition, extraTextAfterNet.length) == extraTextAfterNet) { - newTextareaText = newTextareaText.substr(0, foundAtPosition) + newTextareaText.substr(foundAtPosition + extraTextAfterNet.length); + if ( + extraTextAfterNet && + newTextareaText.substr(foundAtPosition, extraTextAfterNet.length) == + extraTextAfterNet + ) { + newTextareaText = + newTextareaText.substr(0, foundAtPosition) + + newTextareaText.substr(foundAtPosition + extraTextAfterNet.length); } - if (newTextareaText.substr(foundAtPosition - extraTextBeforeNet.length, extraTextBeforeNet.length) == extraTextBeforeNet) { - newTextareaText = newTextareaText.substr(0, foundAtPosition - extraTextBeforeNet.length) + newTextareaText.substr(foundAtPosition); + if ( + newTextareaText.substr( + foundAtPosition - extraTextBeforeNet.length, + extraTextBeforeNet.length, + ) == extraTextBeforeNet + ) { + newTextareaText = + newTextareaText.substr( + 0, + foundAtPosition - extraTextBeforeNet.length, + ) + newTextareaText.substr(foundAtPosition); } } } else { - newTextareaText = textarea.value.replaceAll(new RegExp(`((?:${extraTextBeforeNet})?${text})`, "g"), ""); - replaced = (newTextareaText != textarea.value); + newTextareaText = textarea.value.replaceAll( + new RegExp(`((?:${extraTextBeforeNet})?${text})`, "g"), + "", + ); + replaced = newTextareaText != textarea.value; } if (replaced) { @@ -279,25 +350,44 @@ function tryToRemoveExtraNetworkFromPrompt(textarea, text, isNeg) { function updatePromptArea(text, textArea, isNeg) { if (!tryToRemoveExtraNetworkFromPrompt(textArea, text, isNeg)) { - textArea.value = textArea.value + opts.extra_networks_add_text_separator + text; + textArea.value = + textArea.value + opts.extra_networks_add_text_separator + text; } updateInput(textArea); } -function cardClicked(tabname, textToAdd, textToAddNegative, allowNegativePrompt) { +function cardClicked( + tabname, + textToAdd, + textToAddNegative, + allowNegativePrompt, +) { if (textToAddNegative.length > 0) { - updatePromptArea(textToAdd, gradioApp().querySelector("#" + tabname + "_prompt > label > textarea")); - updatePromptArea(textToAddNegative, gradioApp().querySelector("#" + tabname + "_neg_prompt > label > textarea"), true); + updatePromptArea( + textToAdd, + gradioApp().querySelector("#" + tabname + "_prompt > label > textarea"), + ); + updatePromptArea( + textToAddNegative, + gradioApp().querySelector( + "#" + tabname + "_neg_prompt > label > textarea", + ), + true, + ); } else { - var textarea = allowNegativePrompt ? activePromptTextarea[tabname] : gradioApp().querySelector("#" + tabname + "_prompt > label > textarea"); + let textarea = allowNegativePrompt + ? activePromptTextarea[tabname] + : gradioApp().querySelector("#" + tabname + "_prompt > label > textarea"); updatePromptArea(textToAdd, textarea); } } function saveCardPreview(event, tabname, filename) { - var textarea = gradioApp().querySelector("#" + tabname + '_preview_filename > label > textarea'); - var button = gradioApp().getElementById(tabname + '_save_preview'); + let textarea = gradioApp().querySelector( + "#" + tabname + "_preview_filename > label > textarea", + ); + let button = gradioApp().getElementById(tabname + "_save_preview"); textarea.value = filename; updateInput(textarea); @@ -309,15 +399,24 @@ function saveCardPreview(event, tabname, filename) { } function extraNetworksSearchButton(tabname, extra_networks_tabname, event) { - var searchTextarea = gradioApp().querySelector("#" + tabname + "_" + extra_networks_tabname + "_extra_search"); - var button = event.target; - var text = button.classList.contains("search-all") ? "" : button.textContent.trim(); + let searchTextarea = gradioApp().querySelector( + "#" + tabname + "_" + extra_networks_tabname + "_extra_search", + ); + let button = event.target; + let text = button.classList.contains("search-all") + ? "" + : button.textContent.trim(); searchTextarea.value = text; updateInput(searchTextarea); } -function extraNetworksTreeProcessFileClick(event, btn, tabname, extra_networks_tabname) { +function extraNetworksTreeProcessFileClick( + event, + btn, + tabname, + extra_networks_tabname, +) { /** * Processes `onclick` events when user clicks on files in tree. * @@ -330,7 +429,12 @@ function extraNetworksTreeProcessFileClick(event, btn, tabname, extra_networks_t return; } -function extraNetworksTreeProcessDirectoryClick(event, btn, tabname, extra_networks_tabname) { +function extraNetworksTreeProcessDirectoryClick( + event, + btn, + tabname, + extra_networks_tabname, +) { /** * Processes `onclick` events when user clicks on directories in tree. * @@ -345,10 +449,10 @@ function extraNetworksTreeProcessDirectoryClick(event, btn, tabname, extra_netwo * @param tabname The name of the active tab in the sd webui. Ex: txt2img, img2img, etc. * @param extra_networks_tabname The id of the active extraNetworks tab. Ex: lora, checkpoints, etc. */ - var ul = btn.nextElementSibling; + let ul = btn.nextElementSibling; // This is the actual target that the user clicked on within the target button. // We use this to detect if the chevron was clicked. - var true_targ = event.target; + let true_targ = event.target; function _expand_or_collapse(_ul, _btn) { // Expands