|
"use strict"; |
|
|
|
|
|
function ch_convert_file_path_to_url(path){ |
|
let prefix = "file="; |
|
let path_to_url = path.replaceAll('\\', '/'); |
|
return prefix+path_to_url; |
|
} |
|
|
|
function ch_img_node_str(path){ |
|
return `<img src='${ch_convert_file_path_to_url(path)}' style="width:24px"/>`; |
|
} |
|
|
|
|
|
function ch_gradio_version(){ |
|
let foot = gradioApp().getElementById("footer"); |
|
if (!foot){return null;} |
|
|
|
let versions = foot.querySelector(".versions"); |
|
if (!versions){return null;} |
|
|
|
if (versions.innerHTML.indexOf("gradio: 3.16.2")>0) { |
|
return "3.16.2"; |
|
} else { |
|
return "3.23.0"; |
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function send_ch_py_msg(msg){ |
|
console.log("run send_ch_py_msg") |
|
let js_msg_txtbox = gradioApp().querySelector("#ch_js_msg_txtbox textarea"); |
|
if (js_msg_txtbox && msg) { |
|
|
|
js_msg_txtbox.value = JSON.stringify(msg); |
|
js_msg_txtbox.dispatchEvent(new Event("input")); |
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function get_ch_py_msg(){ |
|
console.log("run get_ch_py_msg") |
|
const py_msg_txtbox = gradioApp().querySelector("#ch_py_msg_txtbox textarea"); |
|
if (py_msg_txtbox && py_msg_txtbox.value) { |
|
console.log("find py_msg_txtbox"); |
|
console.log("py_msg_txtbox value: "); |
|
console.log(py_msg_txtbox.value) |
|
return py_msg_txtbox.value |
|
} else { |
|
return "" |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
const get_new_ch_py_msg = (max_count=3) => new Promise((resolve, reject) => { |
|
console.log("run get_new_ch_py_msg") |
|
|
|
let count = 0; |
|
let new_msg = ""; |
|
let find_msg = false; |
|
const interval = setInterval(() => { |
|
const py_msg_txtbox = gradioApp().querySelector("#ch_py_msg_txtbox textarea"); |
|
count++; |
|
|
|
if (py_msg_txtbox && py_msg_txtbox.value) { |
|
console.log("find py_msg_txtbox"); |
|
console.log("py_msg_txtbox value: "); |
|
console.log(py_msg_txtbox.value) |
|
|
|
new_msg = py_msg_txtbox.value |
|
if (new_msg != "") { |
|
find_msg=true |
|
} |
|
} |
|
|
|
if (find_msg) { |
|
|
|
py_msg_txtbox.value = ""; |
|
py_msg_txtbox.dispatchEvent(new Event("input")); |
|
|
|
resolve(new_msg); |
|
clearInterval(interval); |
|
} else if (count > max_count) { |
|
|
|
py_msg_txtbox.value = ""; |
|
py_msg_txtbox.dispatchEvent(new Event("input")); |
|
|
|
reject(''); |
|
clearInterval(interval); |
|
} |
|
|
|
}, 1000); |
|
}) |
|
|
|
|
|
function getActiveTabType() { |
|
const currentTab = get_uiCurrentTabContent(); |
|
switch (currentTab.id) { |
|
case "tab_txt2img": |
|
return "txt2img"; |
|
case "tab_img2img": |
|
return "img2img"; |
|
} |
|
return null; |
|
} |
|
|
|
|
|
|
|
function getActivePrompt() { |
|
const currentTab = get_uiCurrentTabContent(); |
|
switch (currentTab.id) { |
|
case "tab_txt2img": |
|
return currentTab.querySelector("#txt2img_prompt textarea"); |
|
case "tab_img2img": |
|
return currentTab.querySelector("#img2img_prompt textarea"); |
|
} |
|
return null; |
|
} |
|
|
|
function getActiveNegativePrompt() { |
|
const currentTab = get_uiCurrentTabContent(); |
|
switch (currentTab.id) { |
|
case "tab_txt2img": |
|
return currentTab.querySelector("#txt2img_neg_prompt textarea"); |
|
case "tab_img2img": |
|
return currentTab.querySelector("#img2img_neg_prompt textarea"); |
|
} |
|
return null; |
|
} |
|
|
|
|
|
|
|
async function open_model_url(event, model_type, search_term){ |
|
console.log("start open_model_url"); |
|
|
|
|
|
let js_open_url_btn = gradioApp().getElementById("ch_js_open_url_btn"); |
|
if (!js_open_url_btn) { |
|
return |
|
} |
|
|
|
|
|
|
|
let msg = { |
|
"action": "", |
|
"model_type": "", |
|
"search_term": "", |
|
"prompt": "", |
|
"neg_prompt": "", |
|
} |
|
|
|
|
|
msg["action"] = "open_url"; |
|
msg["model_type"] = model_type; |
|
msg["search_term"] = search_term; |
|
msg["prompt"] = ""; |
|
msg["neg_prompt"] = ""; |
|
|
|
|
|
send_ch_py_msg(msg) |
|
|
|
|
|
js_open_url_btn.click(); |
|
|
|
|
|
event.stopPropagation() |
|
event.preventDefault() |
|
|
|
|
|
let new_py_msg = await get_new_ch_py_msg(); |
|
console.log("new_py_msg:"); |
|
console.log(new_py_msg); |
|
|
|
|
|
if (new_py_msg) { |
|
let py_msg_json = JSON.parse(new_py_msg); |
|
|
|
if (py_msg_json && py_msg_json.content) { |
|
if (py_msg_json.content.url) { |
|
window.open(py_msg_json.content.url, "_blank"); |
|
} |
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
console.log("end open_model_url"); |
|
|
|
|
|
} |
|
|
|
function add_trigger_words(event, model_type, search_term){ |
|
console.log("start add_trigger_words"); |
|
|
|
|
|
let js_add_trigger_words_btn = gradioApp().getElementById("ch_js_add_trigger_words_btn"); |
|
if (!js_add_trigger_words_btn) { |
|
return |
|
} |
|
|
|
|
|
|
|
let msg = { |
|
"action": "", |
|
"model_type": "", |
|
"search_term": "", |
|
"prompt": "", |
|
"neg_prompt": "", |
|
} |
|
|
|
msg["action"] = "add_trigger_words"; |
|
msg["model_type"] = model_type; |
|
msg["search_term"] = search_term; |
|
msg["neg_prompt"] = ""; |
|
|
|
|
|
let act_prompt = getActivePrompt(); |
|
msg["prompt"] = act_prompt.value; |
|
|
|
|
|
send_ch_py_msg(msg) |
|
|
|
|
|
js_add_trigger_words_btn.click(); |
|
|
|
console.log("end add_trigger_words"); |
|
|
|
event.stopPropagation() |
|
event.preventDefault() |
|
|
|
|
|
} |
|
|
|
function use_preview_prompt(event, model_type, search_term){ |
|
console.log("start use_preview_prompt"); |
|
|
|
|
|
let js_use_preview_prompt_btn = gradioApp().getElementById("ch_js_use_preview_prompt_btn"); |
|
if (!js_use_preview_prompt_btn) { |
|
return |
|
} |
|
|
|
|
|
let msg = { |
|
"action": "", |
|
"model_type": "", |
|
"search_term": "", |
|
"prompt": "", |
|
"neg_prompt": "", |
|
} |
|
|
|
msg["action"] = "use_preview_prompt"; |
|
msg["model_type"] = model_type; |
|
msg["search_term"] = search_term; |
|
|
|
|
|
let act_prompt = getActivePrompt(); |
|
msg["prompt"] = act_prompt.value; |
|
|
|
|
|
let neg_prompt = getActiveNegativePrompt(); |
|
msg["neg_prompt"] = neg_prompt.value; |
|
|
|
|
|
send_ch_py_msg(msg) |
|
|
|
|
|
js_use_preview_prompt_btn.click(); |
|
|
|
console.log("end use_preview_prompt"); |
|
|
|
event.stopPropagation() |
|
event.preventDefault() |
|
|
|
} |
|
|
|
|
|
|
|
|
|
function ch_dl_model_new_version(event, model_path, version_id, download_url){ |
|
console.log("start ch_dl_model_new_version"); |
|
|
|
|
|
let dl_confirm = "\nConfirm to download.\n\nCheck Download Model Section's log and console log for detail."; |
|
if (!confirm(dl_confirm)) { |
|
return |
|
} |
|
|
|
|
|
let js_dl_model_new_version_btn = gradioApp().getElementById("ch_js_dl_model_new_version_btn"); |
|
if (!js_dl_model_new_version_btn) { |
|
return |
|
} |
|
|
|
|
|
let msg = { |
|
"action": "", |
|
"model_path": "", |
|
"version_id": "", |
|
"download_url": "", |
|
} |
|
|
|
msg["action"] = "dl_model_new_version"; |
|
msg["model_path"] = model_path; |
|
msg["version_id"] = version_id; |
|
msg["download_url"] = download_url; |
|
|
|
|
|
send_ch_py_msg(msg) |
|
|
|
|
|
js_dl_model_new_version_btn.click(); |
|
|
|
console.log("end dl_model_new_version"); |
|
|
|
event.stopPropagation() |
|
event.preventDefault() |
|
|
|
|
|
} |
|
|
|
|
|
onUiLoaded(() => { |
|
|
|
|
|
let gradio_ver = ch_gradio_version(); |
|
console.log("gradio_ver:" + gradio_ver); |
|
|
|
|
|
let tab_prefix_list = ["txt2img", "img2img"]; |
|
let model_type_list = ["textual_inversion", "hypernetworks", "checkpoints", "lora"]; |
|
let cardid_suffix = "cards"; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function update_card_for_civitai(){ |
|
|
|
|
|
let btn_margin = "0px 5px"; |
|
let btn_fontSize = "200%"; |
|
let btn_thumb_fontSize = "100%"; |
|
let btn_thumb_display = "inline"; |
|
let btn_thumb_pos = "static"; |
|
let btn_thumb_backgroundImage = "none"; |
|
let btn_thumb_background = "rgba(0, 0, 0, 0.8)"; |
|
|
|
let ch_btn_txts = ['๐', '๐ก', '๐ท๏ธ']; |
|
let replace_preview_text = getTranslation("replace preview"); |
|
if (!replace_preview_text) { |
|
replace_preview_text = "replace preview"; |
|
} |
|
|
|
|
|
|
|
|
|
let ch_always_display_ckb = gradioApp().querySelector("#ch_always_display_ckb input"); |
|
let ch_show_btn_on_thumb_ckb = gradioApp().querySelector("#ch_show_btn_on_thumb_ckb input"); |
|
let ch_always_display = false; |
|
let ch_show_btn_on_thumb = false; |
|
if (ch_always_display_ckb) { |
|
ch_always_display = ch_always_display_ckb.checked; |
|
} |
|
if (ch_show_btn_on_thumb_ckb) { |
|
ch_show_btn_on_thumb = ch_show_btn_on_thumb_ckb.checked; |
|
} |
|
|
|
|
|
|
|
let extra_network_id = ""; |
|
let extra_network_node = null; |
|
let metadata_button = null; |
|
let additional_node = null; |
|
let replace_preview_btn = null; |
|
let ul_node = null; |
|
let search_term_node = null; |
|
let search_term = ""; |
|
let model_type = ""; |
|
let cards = null; |
|
let need_to_add_buttons = false; |
|
let is_thumb_mode = false; |
|
|
|
|
|
let active_tab_type = getActiveTabType(); |
|
if (!active_tab_type){active_tab_type = "txt2img";} |
|
|
|
for (const tab_prefix of tab_prefix_list) { |
|
if (tab_prefix != active_tab_type) {continue;} |
|
|
|
|
|
|
|
let active_extra_tab_type = ""; |
|
let extra_tabs = gradioApp().getElementById(tab_prefix+"_extra_tabs"); |
|
if (!extra_tabs) {console.log("can not find extra_tabs: " + tab_prefix+"_extra_tabs");} |
|
|
|
|
|
const active_extra_tab = Array.from(get_uiCurrentTabContent().querySelectorAll('.extra-network-cards,.extra-network-thumbs')) |
|
.find(el => el.closest('.tabitem').style.display === 'block') |
|
?.id.match(/^(txt2img|img2img)_(.+)_cards$/)[2] |
|
|
|
|
|
console.log("found active tab: " + active_extra_tab); |
|
|
|
switch (active_extra_tab) { |
|
case "textual_inversion": |
|
active_extra_tab_type = "ti"; |
|
break; |
|
case "hypernetworks": |
|
active_extra_tab_type = "hyper"; |
|
break; |
|
case "checkpoints": |
|
active_extra_tab_type = "ckp"; |
|
break; |
|
case "lora": |
|
active_extra_tab_type = "lora"; |
|
break; |
|
} |
|
|
|
|
|
for (const js_model_type of model_type_list) { |
|
|
|
switch (js_model_type) { |
|
case "textual_inversion": |
|
model_type = "ti"; |
|
break; |
|
case "hypernetworks": |
|
model_type = "hyper"; |
|
break; |
|
case "checkpoints": |
|
model_type = "ckp"; |
|
break; |
|
case "lora": |
|
model_type = "lora"; |
|
break; |
|
} |
|
|
|
if (!model_type) { |
|
console.log("can not get model_type from: " + js_model_type); |
|
continue; |
|
} |
|
|
|
|
|
|
|
if (model_type != active_extra_tab_type) { |
|
continue; |
|
} |
|
|
|
console.log("handle active extra tab"); |
|
|
|
|
|
extra_network_id = tab_prefix+"_"+js_model_type+"_"+cardid_suffix; |
|
|
|
extra_network_node = gradioApp().getElementById(extra_network_id); |
|
|
|
is_thumb_mode = false |
|
if (extra_network_node) { |
|
if (extra_network_node.className == "extra-network-thumbs") { |
|
console.log(extra_network_id + " is in thumbnail mode"); |
|
is_thumb_mode = true; |
|
|
|
} |
|
} else { |
|
console.log("can not find extra_network_node: " + extra_network_id); |
|
continue; |
|
} |
|
|
|
|
|
|
|
cards = extra_network_node.querySelectorAll(".card"); |
|
for (let card of cards) { |
|
|
|
metadata_button = card.querySelector(".metadata-button"); |
|
|
|
additional_node = card.querySelector(".actions .additional"); |
|
|
|
ul_node = card.querySelector(".actions .additional ul"); |
|
|
|
replace_preview_btn = card.querySelector(".actions .additional a"); |
|
|
|
|
|
if (is_thumb_mode) { |
|
additional_node.style.display = null; |
|
|
|
if (ch_show_btn_on_thumb) { |
|
ul_node.style.background = btn_thumb_background; |
|
} else { |
|
|
|
ul_node.style.background = null; |
|
|
|
|
|
if (ul_node) { |
|
|
|
let atags = ul_node.querySelectorAll("a"); |
|
|
|
for (let atag of atags) { |
|
|
|
atag.style.display = null; |
|
|
|
if (ch_btn_txts.indexOf(atag.innerHTML)>=0) { |
|
|
|
ul_node.removeChild(atag); |
|
} else { |
|
|
|
atag.innerHTML = replace_preview_text; |
|
atag.style.display = null; |
|
atag.style.fontSize = null; |
|
atag.style.position = null; |
|
atag.style.backgroundImage = null; |
|
} |
|
} |
|
|
|
|
|
let brtag = ul_node.querySelector("br"); |
|
if (brtag) { |
|
ul_node.removeChild(brtag); |
|
} |
|
|
|
} |
|
|
|
continue; |
|
|
|
} |
|
|
|
} else { |
|
|
|
if (ch_always_display) { |
|
additional_node.style.display = "block"; |
|
} else { |
|
additional_node.style.display = null; |
|
} |
|
|
|
|
|
let brtag = ul_node.querySelector("br"); |
|
if (brtag) { |
|
ul_node.removeChild(brtag); |
|
} |
|
|
|
} |
|
|
|
|
|
if (replace_preview_btn) { |
|
if (replace_preview_btn.innerHTML !== "๐ผ๏ธ") { |
|
need_to_add_buttons = true; |
|
replace_preview_btn.innerHTML = "๐ผ๏ธ"; |
|
if (!is_thumb_mode) { |
|
replace_preview_btn.style.fontSize = btn_fontSize; |
|
replace_preview_btn.style.margin = btn_margin; |
|
} else { |
|
replace_preview_btn.style.display = btn_thumb_display; |
|
replace_preview_btn.style.fontSize = btn_thumb_fontSize; |
|
replace_preview_btn.style.position = btn_thumb_pos; |
|
replace_preview_btn.style.backgroundImage = btn_thumb_backgroundImage; |
|
} |
|
|
|
} |
|
} |
|
|
|
if (!need_to_add_buttons) { |
|
continue; |
|
} |
|
|
|
|
|
|
|
|
|
search_term_node = card.querySelector(".actions .additional .search_term"); |
|
if (!search_term_node){ |
|
console.log("can not find search_term node for cards in " + extra_network_id); |
|
continue; |
|
} |
|
|
|
|
|
search_term = search_term_node.innerHTML; |
|
if (!search_term) { |
|
console.log("search_term is empty for cards in " + extra_network_id); |
|
continue; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let open_url_node = document.createElement("a"); |
|
open_url_node.href = "#"; |
|
open_url_node.innerHTML = "๐"; |
|
if (!is_thumb_mode) { |
|
open_url_node.style.fontSize = btn_fontSize; |
|
open_url_node.style.margin = btn_margin; |
|
} else { |
|
open_url_node.style.display = btn_thumb_display; |
|
open_url_node.style.fontSize = btn_thumb_fontSize; |
|
open_url_node.style.position = btn_thumb_pos; |
|
open_url_node.style.backgroundImage = btn_thumb_backgroundImage; |
|
} |
|
open_url_node.title = "Open this model's civitai url"; |
|
open_url_node.setAttribute("onclick","open_model_url(event, '"+model_type+"', '"+search_term+"')"); |
|
|
|
let add_trigger_words_node = document.createElement("a"); |
|
add_trigger_words_node.href = "#"; |
|
add_trigger_words_node.innerHTML = "๐ก"; |
|
if (!is_thumb_mode) { |
|
add_trigger_words_node.style.fontSize = btn_fontSize; |
|
add_trigger_words_node.style.margin = btn_margin; |
|
} else { |
|
add_trigger_words_node.style.display = btn_thumb_display; |
|
add_trigger_words_node.style.fontSize = btn_thumb_fontSize; |
|
add_trigger_words_node.style.position = btn_thumb_pos; |
|
add_trigger_words_node.style.backgroundImage = btn_thumb_backgroundImage; |
|
} |
|
|
|
add_trigger_words_node.title = "Add trigger words to prompt"; |
|
add_trigger_words_node.setAttribute("onclick","add_trigger_words(event, '"+model_type+"', '"+search_term+"')"); |
|
|
|
let use_preview_prompt_node = document.createElement("a"); |
|
use_preview_prompt_node.href = "#"; |
|
use_preview_prompt_node.innerHTML = "๐ท๏ธ"; |
|
if (!is_thumb_mode) { |
|
use_preview_prompt_node.style.fontSize = btn_fontSize; |
|
use_preview_prompt_node.style.margin = btn_margin; |
|
} else { |
|
use_preview_prompt_node.style.display = btn_thumb_display; |
|
use_preview_prompt_node.style.fontSize = btn_thumb_fontSize; |
|
use_preview_prompt_node.style.position = btn_thumb_pos; |
|
use_preview_prompt_node.style.backgroundImage = btn_thumb_backgroundImage; |
|
} |
|
use_preview_prompt_node.title = "Use prompt from preview image"; |
|
use_preview_prompt_node.setAttribute("onclick","use_preview_prompt(event, '"+model_type+"', '"+search_term+"')"); |
|
|
|
|
|
ul_node.appendChild(open_url_node); |
|
|
|
if (is_thumb_mode && metadata_button) { |
|
ul_node.appendChild(document.createElement("br")); |
|
} |
|
ul_node.appendChild(add_trigger_words_node); |
|
ul_node.appendChild(use_preview_prompt_node); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
} |
|
} |
|
|
|
|
|
} |
|
|
|
|
|
let tab_id = "" |
|
let extra_tab = null; |
|
let extra_toolbar = null; |
|
let extra_network_refresh_btn = null; |
|
|
|
for (let prefix of tab_prefix_list) { |
|
tab_id = prefix + "_extra_tabs"; |
|
extra_tab = gradioApp().getElementById(tab_id); |
|
|
|
|
|
|
|
extra_network_refresh_btn = gradioApp().getElementById(prefix+"_extra_refresh"); |
|
|
|
|
|
if (!extra_network_refresh_btn){ |
|
console.log("can not get extra network refresh button for " + tab_id); |
|
continue; |
|
} |
|
|
|
|
|
let ch_refresh = document.createElement("button"); |
|
ch_refresh.innerHTML = "๐"; |
|
ch_refresh.title = "Refresh Civitai Helper's additional buttons"; |
|
ch_refresh.className = "lg secondary gradio-button"; |
|
ch_refresh.style.fontSize = "200%"; |
|
ch_refresh.onclick = update_card_for_civitai; |
|
|
|
extra_network_refresh_btn.parentNode.appendChild(ch_refresh); |
|
|
|
} |
|
|
|
|
|
|
|
update_card_for_civitai(); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|