diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index c098feaa7..000000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -extensions -extensions-disabled -repositories -venv diff --git a/.eslintrc.json b/.eslintrc.json index e34b2792c..4912704df 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,90 +1,87 @@ { - "env": { - "browser": true, - "commonjs": false, - "node": false, - "jquery": false, - "es2020": true + "parserOptions": { + "ecmaVersion": 2020 }, - "parserOptions": { "ecmaVersion": 2020 }, "plugins": [], - "extends": ["eslint:recommended", "airbnb-base"], + "extends": [ + "eslint:recommended", + "airbnb-base" + ], + "env": { + "browser": true, + "commonjs": false, + "node": false, + "jquery": false, + "es2020": true + }, "rules": { - "arrow-spacing": "error", - "block-spacing": "error", - "brace-style": "error", - "comma-dangle": ["error", "only-multiline"], - "comma-spacing": "error", - "comma-style": ["error", "last"], - "curly": ["error", "multi-line", "consistent"], - "eol-last": "error", - "func-call-spacing": "error", - "function-call-argument-newline": ["error", "consistent"], - "function-paren-newline": ["error", "consistent"], - "indent": ["error", 4], - "key-spacing": "error", - "keyword-spacing": "error", - "linebreak-style": ["error", "unix"], - "no-extra-semi": "error", - "no-mixed-spaces-and-tabs": "error", - "no-multi-spaces": "error", - "no-redeclare": ["error", { "builtinGlobals": false }], - "no-trailing-spaces": "error", - "no-unused-vars": "off", - "no-whitespace-before-property": "error", - "object-curly-newline": ["error", { "consistent": true, "multiline": true }], - "object-curly-spacing": ["error", "never"], - "operator-linebreak": ["error", "after"], - "quote-props": ["error", "consistent-as-needed"], - "semi": ["error", "always"], - "semi-spacing": "error", - "semi-style": ["error", "last"], - "space-before-blocks": "error", - "space-before-function-paren": ["error", "never"], - "space-in-parens": ["error", "never"], - "space-infix-ops": "error", - "space-unary-ops": "error", - "switch-colon-spacing": "error", - "template-curly-spacing": ["error", "never"], - "unicode-bom": "error" + "max-len": [1, 275, 3], + "no-plusplus":"off", + "no-console":"off", + "no-unused-vars":"off", + "no-return-assign":"off", + "prefer-rest-params":"off", + "no-empty":"off", + "no-restricted-syntax":"off", + "no-param-reassign":"off", + "no-bitwise":"off", + "default-case":"off", + "no-restricted-globals":"off", + "no-mixed-operators":"off", + "camelcase":"off", + "no-confusing-arrow":"off", + "no-useless-escape":"off", + "radix":"off" }, "globals": { - //script.js - "gradioApp": "readonly", - "executeCallbacks": "readonly", - "onAfterUiUpdate": "readonly", - "onOptionsChanged": "readonly", - "onUiLoaded": "readonly", - "onUiUpdate": "readonly", - "uiCurrentTab": "writable", - "uiElementIsVisible": "readonly", - "uiElementInSight": "readonly", - //ui.js - "opts": "writable", - "all_gallery_buttons": "readonly", - "selected_gallery_button": "readonly", - "selected_gallery_index": "readonly", - "switch_to_txt2img": "readonly", - "switch_to_img2img_tab": "readonly", - "switch_to_img2img": "readonly", - "switch_to_sketch": "readonly", - "switch_to_inpaint": "readonly", - "witch_to_inpaint_sketch": "readonly", - "switch_to_extras": "readonly", - "get_tab_index": "readonly", - "create_submit_args": "readonly", - "restart_reload": "readonly", - "updateInput": "readonly", - //extraNetworks.js - "requestGet": "readonly", - "popup": "readonly", - // from python - "localization": "readonly", - // progrssbar.js - "randomId": "readonly", - "requestProgress": "readonly", - // imageviewer.js - "modalPrevImage": "readonly", - "modalNextImage": "readonly" - } + // asssets + "panzoom": "readonly", + //script.js + "gradioApp": "readonly", + "executeCallbacks": "readonly", + "onAfterUiUpdate": "readonly", + "onOptionsChanged": "readonly", + "optionsChangedCallbacks": "readonly", + "onUiLoaded": "readonly", + "onUiUpdate": "readonly", + "uiCurrentTab": "writable", + "uiElementIsVisible": "readonly", + "uiElementInSight": "readonly", + "getUICurrentTabContent": "readonly", + //ui.js + "opts": "writable", + "all_gallery_buttons": "readonly", + "selected_gallery_button": "readonly", + "selected_gallery_index": "readonly", + "switch_to_txt2img": "readonly", + "switch_to_img2img_tab": "readonly", + "switch_to_img2img": "readonly", + "switch_to_sketch": "readonly", + "switch_to_inpaint": "readonly", + "witch_to_inpaint_sketch": "readonly", + "switch_to_extras": "readonly", + "get_tab_index": "readonly", + "create_submit_args": "readonly", + "restart_reload": "readonly", + "updateInput": "readonly", + //extraNetworks.js + "requestGet": "readonly", + "popup": "readonly", + // from python + "localization": "readonly", + // progressbar.js + "randomId": "readonly", + "requestProgress": "readonly", + // imageviewer.js + "modalPrevImage": "readonly", + "modalNextImage": "readonly" + }, + "ignorePatterns": [ + "node_modules", + "extensions", + "extensions-builtin", + "repositories", + "venv", + "panzoom.js" + ] } diff --git a/extensions-builtin/sd-extension-system-info b/extensions-builtin/sd-extension-system-info index 9433a15b8..29b6f1602 160000 --- a/extensions-builtin/sd-extension-system-info +++ b/extensions-builtin/sd-extension-system-info @@ -1 +1 @@ -Subproject commit 9433a15b8965f9b0aa6a93cd44992f29de3f3e79 +Subproject commit 29b6f1602366556562bb76644444db2a51bd60bb diff --git a/extensions-builtin/sd-webui-agent-scheduler b/extensions-builtin/sd-webui-agent-scheduler index e4767fac5..bdd7de257 160000 --- a/extensions-builtin/sd-webui-agent-scheduler +++ b/extensions-builtin/sd-webui-agent-scheduler @@ -1 +1 @@ -Subproject commit e4767fac5850376ce3bc7bd76bc60d08172b10ca +Subproject commit bdd7de2574101063c385e95fcb5d62869f30d511 diff --git a/javascript/black-orange.css b/javascript/black-orange.css index 50cc2bf9e..778e65af2 100644 --- a/javascript/black-orange.css +++ b/javascript/black-orange.css @@ -88,7 +88,6 @@ svg.feather.feather-image, .feather .feather-image { display: none } #txt2img_prompt > label > textarea, #txt2img_neg_prompt > label > textarea, #img2img_prompt > label > textarea, #img2img_neg_prompt > label > textarea { font-size: 1.1rem; } #img2img_settings { min-width: calc(2 * var(--left-column)); max-width: calc(2 * var(--left-column)); background-color: #111111; padding-top: 16px; } #interrogate, #deepbooru { margin: 0 0px 10px 0px; max-width: 80px; max-height: 80px; font-weight: normal; font-size: 0.95em; } -#lightboxModal { background-color: rgba(20, 20, 20, 0.8) } #quicksettings .gr-button-tool { font-size: 1.6rem; box-shadow: none; margin-left: -20px; margin-top: -2px; height: 2.4em; } #quicksettings > div, #quicksettings > fieldset { min-width: 24em; max-width: 26em; line-height: 2em; } #open_folder_extras, #footer, #style_pos_col, #style_neg_col, #roll_col, #extras_upscaler_2, #extras_upscaler_2_visibility, #txt2img_seed_resize_from_w, #txt2img_seed_resize_from_h { display: none; } diff --git a/javascript/contextMenus.js b/javascript/contextMenus.js index 8aa3bb605..968ef0824 100644 --- a/javascript/contextMenus.js +++ b/javascript/contextMenus.js @@ -52,18 +52,19 @@ const contextMenuInit = () => { return newItem.id; } - function removeContextMenuOption(uid) { + function removeContextMenuOption(id) { menuSpecs.forEach((v, k) => { let index = -1; - v.forEach((e, ei) => { if (e.id === uid) { index = ei; } }); - if (index >= 0) { - v.splice(index, 1); - } + v.forEach((e, ei) => { + if (e.id === id) { index = ei; } + }); + if (index >= 0) v.splice(index, 1); }); } function addContextMenuEventListener() { if (eventListenerApplied) return; + console.log('initContextMenu'); gradioApp().addEventListener('click', (e) => { if (!e.isTrusted) return; const oldMenu = gradioApp().querySelector('#context-menu'); @@ -89,34 +90,25 @@ const appendContextMenuOption = initResponse[0]; const removeContextMenuOption = initResponse[1]; const addContextMenuEventListener = initResponse[2]; -(function () { +(function () { // eslint-disable-line // Start example Context Menu Items - const generateOnRepeat = function (genbuttonid, interruptbuttonid) { + const generateOnRepeat = (genbuttonid, interruptbuttonid) => { const genbutton = gradioApp().querySelector(genbuttonid); const busy = document.getElementById('progressbar')?.style.display === 'block'; - if (!busy) { - genbutton.click(); - } + if (!busy) genbutton.click(); clearInterval(window.generateOnRepeatInterval); window.generateOnRepeatInterval = setInterval( () => { - const busy = document.getElementById('progressbar')?.style.display === 'block'; - if (!busy) genbutton.click(); + const pbBusy = document.getElementById('progressbar')?.style.display === 'block'; + if (!pbBusy) genbutton.click(); }, 500, ); }; - appendContextMenuOption('#txt2img_generate', 'Generate forever', () => { - generateOnRepeat('#txt2img_generate', '#txt2img_interrupt'); - }); - appendContextMenuOption('#img2img_generate', 'Generate forever', () => { - generateOnRepeat('#img2img_generate', '#img2img_interrupt'); - }); - - const cancelGenerateForever = function () { - clearInterval(window.generateOnRepeatInterval); - }; + appendContextMenuOption('#txt2img_generate', 'Generate forever', () => generateOnRepeat('#txt2img_generate', '#txt2img_interrupt')); + appendContextMenuOption('#img2img_generate', 'Generate forever', () => generateOnRepeat('#img2img_generate', '#img2img_interrupt')); + const cancelGenerateForever = () => clearInterval(window.generateOnRepeatInterval); appendContextMenuOption('#txt2img_interrupt', 'Cancel generate forever', cancelGenerateForever); appendContextMenuOption('#txt2img_generate', 'Cancel generate forever', cancelGenerateForever); @@ -126,7 +118,7 @@ const addContextMenuEventListener = initResponse[2]; '#roll', 'Roll three', () => { - const rollbutton = get_uiCurrentTabContent().querySelector('#roll'); + const rollbutton = getUICurrentTabContent().querySelector('#roll'); setTimeout(() => { rollbutton.click(); }, 100); setTimeout(() => { rollbutton.click(); }, 200); setTimeout(() => { rollbutton.click(); }, 300); diff --git a/javascript/editAttention.js b/javascript/editAttention.js index e564a100c..9b59c041f 100644 --- a/javascript/editAttention.js +++ b/javascript/editAttention.js @@ -70,28 +70,23 @@ function keyupEditAttention(event) { selectionStart += 1; selectionEnd += 1; } - const end = text.slice(selectionEnd + 1).indexOf(closeCharacter) + 1; let weight = parseFloat(text.slice(selectionEnd + 1, selectionEnd + 1 + end)); if (Number.isNaN(weight)) return; - weight += isPlus ? delta : -delta; weight = parseFloat(weight.toPrecision(12)); if (String(weight).length === 1) weight += '.0'; - - if (closeCharacter == ')' && weight == 1) { + if (closeCharacter === ')' && weight === 1) { text = text.slice(0, selectionStart - 1) + text.slice(selectionStart, selectionEnd) + text.slice(selectionEnd + 5); selectionStart--; selectionEnd--; } else { text = text.slice(0, selectionEnd + 1) + weight + text.slice(selectionEnd + 1 + end - 1); } - target.focus(); target.value = text; target.selectionStart = selectionStart; target.selectionEnd = selectionEnd; - updateInput(target); } diff --git a/javascript/extraNetworks.js b/javascript/extraNetworks.js index 16c8cd1a3..1a27b6a1c 100644 --- a/javascript/extraNetworks.js +++ b/javascript/extraNetworks.js @@ -2,7 +2,30 @@ let globalPopup = null; let globalPopupInner = null; const activePromptTextarea = {}; -const getENActiveTab = () => gradioApp().getElementById('tab_txt2img').style.display == 'block' ? 'txt2img' : 'img2img'; +const getENActiveTab = () => gradioApp().getElementById('tab_txt2img').style.display === 'block' ? 'txt2img' : 'img2img'; + +function requestGet(url, data, handler, errorHandler) { + const xhr = new XMLHttpRequest(); + const args = Object.keys(data).map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(data[k])}`).join('&'); + xhr.open('GET', `${url}?${args}`, true); + xhr.onreadystatechange = () => { + if (xhr.readyState === 4) { + if (xhr.status === 200) { + try { + const js = JSON.parse(xhr.responseText); + handler(js); + } catch (error) { + console.error(error); + errorHandler(); + } + } else { + errorHandler(); + } + } + }; + const js = JSON.stringify(data); + xhr.send(js); +} function setupExtraNetworksForTab(tabname) { gradioApp().querySelector(`#${tabname}_extra_tabs`).classList.add('extra-networks'); @@ -16,23 +39,23 @@ function setupExtraNetworksForTab(tabname) { description.classList.add('description'); tabs.appendChild(refresh); tabs.appendChild(close); - div = document.createElement('div'); + const div = document.createElement('div'); div.classList.add('second-line'); tabs.appendChild(div); div.appendChild(search); div.appendChild(description); search.addEventListener('input', (evt) => { - searchTerm = search.value.toLowerCase(); + const searchTerm = search.value.toLowerCase(); gradioApp().querySelectorAll(`#${tabname}_extra_tabs div.card`).forEach((elem) => { - text = `${elem.querySelector('.name').textContent.toLowerCase()} ${elem.querySelector('.search_term').textContent.toLowerCase()}`; - text = text.replace('models--', 'Diffusers') - elem.style.display = text.indexOf(searchTerm) == -1 ? 'none' : ''; + let text = `${elem.querySelector('.name').textContent.toLowerCase()} ${elem.querySelector('.search_term').textContent.toLowerCase()}`; + text = text.replace('models--', 'Diffusers'); + elem.style.display = text.indexOf(searchTerm) === -1 ? 'none' : ''; }); }); - intersectionObserver = new IntersectionObserver((entries) => { - if (!en) return - for (el of Array.from(gradioApp().querySelectorAll('.extra-networks-page'))) el.style.height = window.opts.extra_networks_height + 'vh'; + const intersectionObserver = new IntersectionObserver((entries) => { + if (!en) return; + for (const el of Array.from(gradioApp().querySelectorAll('.extra-networks-page'))) el.style.height = `${window.opts.extra_networks_height}vh`; if (entries[0].intersectionRatio > 0) { if (window.opts.extra_networks_card_cover === 'cover') { en.style.transition = ''; @@ -41,15 +64,15 @@ function setupExtraNetworksForTab(tabname) { en.style.right = 'unset'; en.style.width = 'unset'; en.style.height = 'unset'; - gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = 'unset' + gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = 'unset'; } else if (window.opts.extra_networks_card_cover === 'sidebar') { en.style.transition = 'width 0.2s ease'; en.style.zIndex = 0; en.style.position = 'absolute'; en.style.right = '0'; - en.style.width = window.opts.extra_networks_sidebar_width + 'vw'; - en.style.height = '-webkit-fill-available' - gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = 100 - 2 - window.opts.extra_networks_sidebar_width + 'vw'; + en.style.width = `${window.opts.extra_networks_sidebar_width}vw`; + en.style.height = '-webkit-fill-available'; + gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = `${100 - 2 - window.opts.extra_networks_sidebar_width}vw`; } else { en.style.transition = ''; en.style.zIndex = 0; @@ -57,20 +80,20 @@ function setupExtraNetworksForTab(tabname) { en.style.right = 'unset'; en.style.width = 'unset'; en.style.height = 'unset'; - gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = 'unset' + gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = 'unset'; } } else { en.style.width = 0; - gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = 'unset' + gradioApp().getElementById(`${tabname}_settings`).parentNode.style.width = 'unset'; } }); - intersectionObserver.observe(en); // monitor visibility of + intersectionObserver.observe(en); // monitor visibility of } function setupExtraNetworks() { setupExtraNetworksForTab('txt2img'); setupExtraNetworksForTab('img2img'); - + function registerPrompt(tabname, id) { const textarea = gradioApp().querySelector(`#${id} > label > textarea`); if (!activePromptTextarea[tabname]) activePromptTextarea[tabname] = textarea; @@ -90,27 +113,27 @@ const re_extranet = /<([^:]+:[^:]+):[\d\.]+>/; const re_extranet_g = /\s+<([^:]+:[^:]+):[\d\.]+>/g; function tryToRemoveExtraNetworkFromPrompt(textarea, text) { - var m = text.match(re_extranet); - var replaced = false; - var newTextareaText; + let m = text.match(re_extranet); + let replaced = false; + let newTextareaText; if (m) { - var partToSearch = m[1]; - newTextareaText = textarea.value.replaceAll(re_extranet_g, function(found) { - m = found.match(re_extranet); - if (m[1] == partToSearch) { - replaced = true; - return ""; - } - return found; - }); + const partToSearch = m[1]; + newTextareaText = textarea.value.replaceAll(re_extranet_g, (found) => { + m = found.match(re_extranet); + if (m[1] === partToSearch) { + replaced = true; + return ''; + } + return found; + }); } else { - newTextareaText = textarea.value.replaceAll(new RegExp(text, "g"), function(found) { - if (found == text) { - replaced = true; - return ""; - } - return found; - }); + newTextareaText = textarea.value.replaceAll(new RegExp(text, 'g'), (found) => { + if (found === text) { + replaced = true; + return ''; + } + return found; + }); } if (replaced) { textarea.value = newTextareaText; @@ -170,9 +193,9 @@ function readCardDescription(event, filename, descript, extraPage, cardName) { function extraNetworksSearchButton(event) { const tabname = getENActiveTab(); - searchTextarea = gradioApp().querySelector(`#${tabname}_extra_tabs > div > div > textarea`); - button = event.target; - text = button.classList.contains('search-all') ? '' : `/${button.textContent.trim()}/`; + const searchTextarea = gradioApp().querySelector(`#${tabname}_extra_tabs > div > div > textarea`); + const button = event.target; + const text = button.classList.contains('search-all') ? '' : `/${button.textContent.trim()}/`; searchTextarea.value = text; updateInput(searchTextarea); } @@ -180,15 +203,15 @@ function extraNetworksSearchButton(event) { function popup(contents) { if (!globalPopup) { globalPopup = document.createElement('div'); - globalPopup.onclick = function () { globalPopup.style.display = 'none'; }; + globalPopup.onclick = () => { globalPopup.style.display = 'none'; }; globalPopup.classList.add('global-popup'); const close = document.createElement('div'); close.classList.add('global-popup-close'); - close.onclick = function () { globalPopup.style.display = 'none'; }; + close.onclick = () => { globalPopup.style.display = 'none'; }; close.title = 'Close'; globalPopup.appendChild(close); globalPopupInner = document.createElement('div'); - globalPopupInner.onclick = function (event) { event.stopPropagation(); return false; }; + globalPopupInner.onclick = (event) => { event.stopPropagation(); return false; }; globalPopupInner.classList.add('global-popup-inner'); globalPopup.appendChild(globalPopupInner); gradioApp().appendChild(globalPopup); @@ -200,8 +223,8 @@ function popup(contents) { function readCardMetadata(event, extraPage, cardName) { requestGet('./sd_extra_networks/metadata', { page: extraPage, item: cardName }, (data) => { - if (data?.metadata && (typeof(data?.metadata) === 'string')) { - elem = document.createElement('pre'); + if (data?.metadata && (typeof (data?.metadata) === 'string')) { + const elem = document.createElement('pre'); elem.classList.add('popup-metadata'); elem.textContent = data.metadata; popup(elem); @@ -213,8 +236,8 @@ function readCardMetadata(event, extraPage, cardName) { function readCardInformation(event, extraPage, cardName) { requestGet('./sd_extra_networks/info', { page: extraPage, item: cardName }, (data) => { - if (data?.info && (typeof(data?.info) === 'string')) { - elem = document.createElement('pre'); + if (data?.info && (typeof (data?.info) === 'string')) { + const elem = document.createElement('pre'); elem.classList.add('popup-metadata'); elem.textContent = data.info; popup(elem); @@ -223,26 +246,3 @@ function readCardInformation(event, extraPage, cardName) { event.stopPropagation(); event.preventDefault(); } - -function requestGet(url, data, handler, errorHandler) { - const xhr = new XMLHttpRequest(); - const args = Object.keys(data).map((k) => `${encodeURIComponent(k)}=${encodeURIComponent(data[k])}`).join('&'); - xhr.open('GET', `${url}?${args}`, true); - xhr.onreadystatechange = function () { - if (xhr.readyState === 4) { - if (xhr.status === 200) { - try { - const js = JSON.parse(xhr.responseText); - handler(js); - } catch (error) { - console.error(error); - errorHandler(); - } - } else { - errorHandler(); - } - } - }; - const js = JSON.stringify(data); - xhr.send(js); -} diff --git a/javascript/generationParams.js b/javascript/generationParams.js index 7787a8c25..fdda118b5 100644 --- a/javascript/generationParams.js +++ b/javascript/generationParams.js @@ -3,16 +3,10 @@ function attachGalleryListeners(tab_name) { const gallery = gradioApp().querySelector(`#${tab_name}_gallery`); gallery?.addEventListener('click', () => setTimeout(() => { - gradioApp() - .getElementById(`${tab_name}_generation_info_button`) - ?.click(); + gradioApp().getElementById(`${tab_name}_generation_info_button`)?.click(); }, 500)); gallery?.addEventListener('keydown', (e) => { - if (e.keyCode == 37 || e.keyCode == 39) { // left or right arrow - gradioApp() - .getElementById(`${tab_name}_generation_info_button`) - .click(); - } + if (e.keyCode === 37 || e.keyCode === 39) gradioApp().getElementById(`${tab_name}_generation_info_button`).click(); // left or right arrow }); return gallery; } @@ -20,21 +14,26 @@ function attachGalleryListeners(tab_name) { let txt2img_gallery; let img2img_gallery; let modal; +let generationParamsInitialized = false; + +function initiGenerationParams() { + if (generationParamsInitialized) return; + if (!modal) modal = gradioApp().getElementById('lightboxModal'); + if (!modal) return; + generationParamsInitialized = true; + + const modalObserver = new MutationObserver((mutations) => { + mutations.forEach((mutationRecord) => { + let selectedTab = gradioApp().querySelector('#tabs div button.selected')?.innerText; + if (!selectedTab) selectedTab = gradioApp().querySelector('#tabs div button')?.innerText; + if (mutationRecord.target.style.display === 'none' && (selectedTab === 'txt2img' || selectedTab === 'img2img')) { gradioApp().getElementById(`${selectedTab}_generation_info_button`)?.click(); } + }); + }); -onAfterUiUpdate(() => { if (!txt2img_gallery) txt2img_gallery = attachGalleryListeners('txt2img'); if (!img2img_gallery) img2img_gallery = attachGalleryListeners('img2img'); - if (!modal) { - modal = gradioApp().getElementById('lightboxModal'); - modalObserver.observe(modal, { attributes: true, attributeFilter: ['style'] }); - } -}); - -let modalObserver = new MutationObserver((mutations) => { - mutations.forEach((mutationRecord) => { - let selectedTab = gradioApp().querySelector('#tabs div button.selected')?.innerText; - if (!selectedTab) selectedTab = gradioApp().querySelector('#tabs div button')?.innerText; - if (mutationRecord.target.style.display === 'none' && (selectedTab === 'txt2img' || selectedTab === 'img2img')) { gradioApp().getElementById(`${selectedTab}_generation_info_button`)?.click(); } - }); -}); + modalObserver.observe(modal, { attributes: true, attributeFilter: ['style'] }); + console.log('initGenerationParams'); +} +onAfterUiUpdate(initiGenerationParams); diff --git a/javascript/hires.js b/javascript/hires.js index c7e94ff18..ceaa6b70d 100644 --- a/javascript/hires.js +++ b/javascript/hires.js @@ -1,13 +1,11 @@ function onCalcResolutionHires(enable_hr, width, height, hr_scale, hr_resize_x, hr_resize_y) { - function setInactive(elem, inactive) { - elem.classList.toggle('inactive', !!inactive); - } + const setInactive = (elem, inactive) => elem.classList.toggle('inactive', !!inactive); const hrUpscaleBy = gradioApp().getElementById('txt2img_hr_scale'); const hrResizeX = gradioApp().getElementById('txt2img_hr_resize_x'); const hrResizeY = gradioApp().getElementById('txt2img_hr_resize_y'); gradioApp().getElementById('txt2img_hires_fix_row3').style.display = opts.use_old_hires_fix_width_height ? 'none' : ''; setInactive(hrUpscaleBy, opts.use_old_hires_fix_width_height || hr_resize_x > 0 || hr_resize_y > 0); - setInactive(hrResizeX, opts.use_old_hires_fix_width_height || hr_resize_x == 0); - setInactive(hrResizeY, opts.use_old_hires_fix_width_height || hr_resize_y == 0); + setInactive(hrResizeX, opts.use_old_hires_fix_width_height || hr_resize_x === 0); + setInactive(hrResizeY, opts.use_old_hires_fix_width_height || hr_resize_y === 0); return [enable_hr, width, height, hr_scale, hr_resize_x, hr_resize_y]; } diff --git a/javascript/imageMaskFix.js b/javascript/imageMaskFix.js index bf10fe4a3..fd37caf90 100644 --- a/javascript/imageMaskFix.js +++ b/javascript/imageMaskFix.js @@ -8,29 +8,23 @@ function imageMaskResize() { window.removeEventListener('resize', imageMaskResize); return; } - const wrapper = canvases[0].closest('.touch-none'); const previewImage = wrapper.previousElementSibling; - if (!previewImage.complete) { previewImage.addEventListener('load', imageMaskResize); return; } - const w = previewImage.width; const h = previewImage.height; const nw = previewImage.naturalWidth; const nh = previewImage.naturalHeight; const portrait = nh > nw; - const wW = Math.min(w, portrait ? h / nh * nw : w / nw * nw); const wH = Math.min(h, portrait ? h / nh * nh : w / nw * nh); - wrapper.style.width = `${wW}px`; wrapper.style.height = `${wH}px`; wrapper.style.left = '0px'; wrapper.style.top = '0px'; - canvases.forEach((c) => { c.style.width = ''; c.style.height = ''; diff --git a/javascript/imageParams.js b/javascript/imageParams.js index f0caf7837..bc673812f 100644 --- a/javascript/imageParams.js +++ b/javascript/imageParams.js @@ -1,17 +1,19 @@ -window.onload = (function () { +window.onload = () => { window.addEventListener('drop', (e) => { const target = e.composedPath()[0]; if (!target.placeholder) return; - if (target.placeholder.indexOf('Prompt') == -1) return; - const prompt_target = get_tab_index('tabs') == 1 ? 'img2img_prompt_image' : 'txt2img_prompt_image'; + if (target.placeholder.indexOf('Prompt') === -1) return; + const promptTarget = get_tab_index('tabs') === 1 ? 'img2img_prompt_image' : 'txt2img_prompt_image'; e.stopPropagation(); e.preventDefault(); - const imgParent = gradioApp().getElementById(prompt_target); + const imgParent = gradioApp().getElementById(promptTarget); + if (!imgParent) return; const { files } = e.dataTransfer; const fileInput = imgParent.querySelector('input[type="file"]'); if (fileInput) { fileInput.files = files; fileInput.dispatchEvent(new Event('change')); + console.log('dropEvent'); } }); -}); +}; diff --git a/javascript/imageViewer.js b/javascript/imageViewer.js index 65e3b6828..525c15034 100644 --- a/javascript/imageViewer.js +++ b/javascript/imageViewer.js @@ -1,67 +1,77 @@ // A full size 'lightbox' preview modal shown when left clicking on gallery previews let previewTimestamp = Date.now(); let previewDrag = false; +let modalPreviewZone; function closeModal(force = false) { if (force) gradioApp().getElementById('lightboxModal').style.display = 'none'; if (previewDrag) return; - if ((Date.now() - previewTimestamp) < 250) return + if ((Date.now() - previewTimestamp) < 250) return; gradioApp().getElementById('lightboxModal').style.display = 'none'; } -function showModal(event) { - const source = event.target || event.srcElement; - const modalImage = gradioApp().getElementById('modalImage'); - const lb = gradioApp().getElementById('lightboxModal'); - modalImage.src = source.src; - if (modalImage.style.display === 'none') lb.style.setProperty('background-image', `url(${source.src})`); - lb.style.display = 'flex'; - lb.focus(); - previewTimestamp = Date.now() - event.stopPropagation(); -} - -function updateOnBackgroundChange() { - const modalImage = gradioApp().getElementById('modalImage'); - if (modalImage && modalImage.offsetParent) { - const currentButton = selected_gallery_button(); - if (currentButton?.children?.length > 0 && modalImage.src != currentButton.children[0].src) { - modalImage.src = currentButton.children[0].src; - if (modalImage.style.display === 'none') modal.style.setProperty('background-image', `url(${modalImage.src})`); - } - } -} - function modalImageSwitch(offset) { const galleryButtons = all_gallery_buttons(); if (galleryButtons.length > 1) { const currentButton = selected_gallery_button(); let result = -1; galleryButtons.forEach((v, i) => { - if (v == currentButton) result = i; + if (v === currentButton) result = i; }); const negmod = (n, m) => ((n % m) + m) % m; - if (result != -1) { - nextButton = galleryButtons[negmod((result + offset), galleryButtons.length)]; + if (result !== -1) { + const nextButton = galleryButtons[negmod((result + offset), galleryButtons.length)]; nextButton.click(); const modalImage = gradioApp().getElementById('modalImage'); const modal = gradioApp().getElementById('lightboxModal'); + modalImage.onload = () => modalPreviewZone.focus(); modalImage.src = nextButton.children[0].src; if (modalImage.style.display === 'none') modal.style.setProperty('background-image', `url(${modalImage.src})`); - setTimeout(() => modal.focus(), 10); } } } -function saveImage() { - if (gradioApp().getElementById('tab_txt2img').style.display != 'none') gradioApp().getElementById('save_txt2img').click(); - else if (gradioApp().getElementById('tab_img2img').style.display != 'none') gradioApp().getElementById('save_img2img').click(); - else if (gradioApp().getElementById('tab_process').style.display != 'none') gradioApp().getElementById('save_extras').click(); +function modalSaveImage(event) { + if (gradioApp().getElementById('tab_txt2img').style.display !== 'none') gradioApp().getElementById('save_txt2img').click(); + else if (gradioApp().getElementById('tab_img2img').style.display !== 'none') gradioApp().getElementById('save_img2img').click(); + else if (gradioApp().getElementById('tab_process').style.display !== 'none') gradioApp().getElementById('save_extras').click(); +} + +function modalKeyHandler(event) { + console.log('HERE2', event.key); + switch (event.key) { + case 's': + modalSaveImage(); + break; + case 'ArrowLeft': + modalImageSwitch(-1); + break; + case 'ArrowRight': + modalImageSwitch(1); + break; + case 'Escape': + closeModal(true); + break; + } + event.stopPropagation(); +} + +function showModal(event) { + const source = event.target || event.srcElement; + const modalImage = gradioApp().getElementById('modalImage'); + const lb = gradioApp().getElementById('lightboxModal'); + modalImage.onload = () => modalPreviewZone.focus(); + modalImage.src = source.src; + if (modalImage.style.display === 'none') lb.style.setProperty('background-image', `url(${source.src})`); + lb.style.display = 'flex'; + lb.onkeydown = modalKeyHandler; + previewTimestamp = Date.now(); + event.stopPropagation(); } function modalDownloadImage() { - const link = document.createElement("a"); - link.style.display = "none"; + const link = document.createElement('a'); + link.style.display = 'none'; link.href = gradioApp().getElementById('modalImage').src; link.download = 'image'; document.body.appendChild(link); @@ -72,52 +82,19 @@ function modalDownloadImage() { }, 0); } -function modalSaveImage(event) { - saveImage(); - event.stopPropagation(); -} - -function modalNextImage(event) { - modalImageSwitch(1); - event.stopPropagation(); -} - -function modalPrevImage(event) { - modalImageSwitch(-1); - event.stopPropagation(); -} - -function modalKeyHandler(event) { - switch (event.key) { - case 's': - saveImage(); - break; - case 'ArrowLeft': - modalPrevImage(event); - break; - case 'ArrowRight': - modalNextImage(event); - break; - case 'Escape': - closeModal(true); - break; - } -} - function modalZoomSet(modalImage, enable) { localStorage.setItem('modalZoom', enable ? 'yes' : 'no'); if (modalImage) modalImage.classList.toggle('modalImageFullscreen', !!enable); } function setupImageForLightbox(e) { - if (e.dataset.modded) return; + if (e.dataset.modded) return; e.dataset.modded = true; e.style.cursor = 'pointer'; e.style.userSelect = 'none'; - e.addEventListener('mousedown', (evt) => { - if (evt.button != 0) return; - const initialZoom = (localStorage.getItem('modalZoom') || true) == 'yes'; + if (evt.button !== 0) return; + const initialZoom = (localStorage.getItem('modalZoom') || true) === 'yes'; modalZoomSet(gradioApp().getElementById('modalImage'), initialZoom); evt.preventDefault(); showModal(evt); @@ -144,30 +121,29 @@ function modalTileToggle(event) { event.stopPropagation(); } -function galleryImageHandler(e) { - e.onclick = showGalleryImage; -} +let imageViewerInitialized = false; -onAfterUiUpdate(() => { - fullImg_preview = gradioApp().querySelectorAll('.gradio-gallery > div > img'); - if (fullImg_preview != null) fullImg_preview.forEach(setupImageForLightbox); - updateOnBackgroundChange(); -}); +function initImageViewer() { + const fullImgPreview = gradioApp().querySelectorAll('.gradio-gallery > div > img'); + if (fullImgPreview.length > 0) fullImgPreview.forEach(setupImageForLightbox); + if (imageViewerInitialized) return; + imageViewerInitialized = true; -document.addEventListener('DOMContentLoaded', () => { // main elements const modal = document.createElement('div'); modal.id = 'lightboxModal'; - modal.addEventListener('keydown', modalKeyHandler, true); + // modal.addEventListener('keydown', modalKeyHandler, true); - const modalPreviewZone = document.createElement('div'); - modalPreviewZone.className = 'lightboxModalPreviewZone' + modalPreviewZone = document.createElement('div'); + modalPreviewZone.className = 'lightboxModalPreviewZone'; const modalImage = document.createElement('img'); modalImage.id = 'modalImage'; - modalImage.addEventListener('keydown', modalKeyHandler, true); + // modalImage.addEventListener('keydown', modalKeyHandler, true); modalPreviewZone.appendChild(modalImage); - modalImage.onload = () => panzoom(modalImage, { zoomSpeed: 0.05, minZoom: 0.25, maxZoom: 4.0 }); + panzoom(modalImage, { + zoomSpeed: 0.05, minZoom: 0.25, maxZoom: 4.0, filterKey: (/* e, dx, dy, dz */) => true, + }); // toolbar const modalZoom = document.createElement('span'); @@ -206,25 +182,25 @@ document.addEventListener('DOMContentLoaded', () => { modalClose.addEventListener('click', closeModal, true); // handlers - modalPreviewZone.addEventListener('mousedown', () => previewDrag = false); - modalPreviewZone.addEventListener('touchstart', () => { previewDrag = false }, { passive: true }); - modalPreviewZone.addEventListener('mousemove', () => previewDrag = true); - modalPreviewZone.addEventListener('touchmove', () => { previewDrag = true }, { passive: true }); - modalPreviewZone.addEventListener('scroll', () => previewDrag = true); + modalPreviewZone.addEventListener('mousedown', () => { previewDrag = false; }); + modalPreviewZone.addEventListener('touchstart', () => { previewDrag = false; }, { passive: true }); + modalPreviewZone.addEventListener('mousemove', () => { previewDrag = true; }); + modalPreviewZone.addEventListener('touchmove', () => { previewDrag = true; }, { passive: true }); + modalPreviewZone.addEventListener('scroll', () => { previewDrag = true; }); modalPreviewZone.addEventListener('mouseup', () => closeModal()); modalPreviewZone.addEventListener('touchend', () => closeModal()); - + const modalPrev = document.createElement('a'); modalPrev.className = 'modalPrev'; modalPrev.innerHTML = '❮'; - modalPrev.addEventListener('click', modalPrevImage, true); - modalPrev.addEventListener('keydown', modalKeyHandler, true); + modalPrev.addEventListener('click', () => modalImageSwitch(-1), true); + // modalPrev.addEventListener('keydown', modalKeyHandler, true); const modalNext = document.createElement('a'); modalNext.className = 'modalNext'; modalNext.innerHTML = '❯'; - modalNext.addEventListener('click', modalNextImage, true); - modalNext.addEventListener('keydown', modalKeyHandler, true); + modalNext.addEventListener('click', () => modalImageSwitch(-1), true); + // modalNext.addEventListener('keydown', modalKeyHandler, true); const modalControls = document.createElement('div'); modalControls.className = 'modalControls gradio-container'; @@ -240,5 +216,8 @@ document.addEventListener('DOMContentLoaded', () => { modalControls.appendChild(modalDownload); modalControls.appendChild(modalClose); - try { gradioApp().appendChild(modal); } catch (e) { gradioApp().body.appendChild(modal); } -}); + gradioApp().appendChild(modal); + console.log('initImageViewer'); +} + +onAfterUiUpdate(initImageViewer); diff --git a/javascript/logMonitor.js b/javascript/logMonitor.js index 3d163e911..bc2abfee1 100644 --- a/javascript/logMonitor.js +++ b/javascript/logMonitor.js @@ -15,22 +15,26 @@ async function logMonitor() { logMonitorEl.parentElement.style.display = 'block'; const lines = await res.json(); for (const line of lines) { - try { + try { const l = JSON.parse(line); - const row = document.createElement("tr"); + const row = document.createElement('tr'); row.style = 'padding: 10px; margin: 0;'; row.innerHTML = `