lora_prompt_tool.js 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. let lorahelper = {};
  2. console.log("[lora-prompt-tool] load the main module");
  3. lorahelper.lorahelper_model_image = null;
  4. lorahelper.lorahelper_model_image_parent = null;
  5. lorahelper.lorahelper_scope = null;
  6. lorahelper.lorahelper_scope_div = null;
  7. lorahelper.lorahelper_trigger_words_dataframe_scope = null;
  8. lorahelper.lorahelp_copy_paste_txtbox = null;
  9. lorahelper.lorahelp_js_output_message = null;
  10. lorahelper.lorahelp_translate_area = null;
  11. lorahelper.js_cors_request_btn = null;
  12. lorahelper.lorahelp_extension_name = null;
  13. lorahelper.gradio_no_select_event = false;
  14. onUiLoaded(() => {
  15. //load extension name
  16. lorahelper.lorahelp_extension_name = lorahelper.gradioApp().querySelector("#lorahelp_extension_name textarea").value;
  17. //check select event support or not
  18. lorahelper.gradio_no_select_event = !!(lorahelper.gradioApp().querySelector("#lorahelp_select_not_support"));
  19. if(lorahelper.gradio_no_select_event){
  20. var styleSheet = document.createElement("style");
  21. styleSheet.innerHTML = lorahelp_old_ver_css;
  22. document.head.appendChild(styleSheet);
  23. }
  24. //init
  25. lorahelper.setup_context_menu();
  26. lorahelper.setup_dataframe_edit();
  27. lorahelper.txt2img_prompt = lorahelper.gradioApp().querySelector("#txt2img_prompt textarea");
  28. lorahelper.img2img_prompt = lorahelper.gradioApp().querySelector("#img2img_prompt textarea");
  29. lorahelper.neg_txt2img_prompt = lorahelper.gradioApp().querySelector("#txt2img_neg_prompt textarea");
  30. lorahelper.neg_img2img_prompt = lorahelper.gradioApp().querySelector("#img2img_neg_prompt textarea");
  31. ace_txt2img_prompt = lorahelper.gradioApp().querySelector("#ace-txt2img_prompt");
  32. ace_img2img_prompt = lorahelper.gradioApp().querySelector("#ace-img2img_prompt");
  33. ace_txt2img_neg_prompt = lorahelper.gradioApp().querySelector("#ace-txt2img_neg_prompt");
  34. ace_img2img_neg_prompt = lorahelper.gradioApp().querySelector("#ace-img2img_neg_prompt");
  35. if(!lorahelper.is_nullptr(ace_txt2img_prompt)) lorahelper.txt2img_prompt = ace_txt2img_prompt;
  36. if(!lorahelper.is_nullptr(ace_img2img_prompt)) lorahelper.img2img_prompt = ace_img2img_prompt;
  37. if(!lorahelper.is_nullptr(ace_txt2img_neg_prompt)) lorahelper.neg_txt2img_prompt = ace_txt2img_neg_prompt;
  38. if(!lorahelper.is_nullptr(ace_img2img_neg_prompt)) lorahelper.neg_img2img_prompt = ace_img2img_neg_prompt;
  39. //preview image size handler
  40. lorahelper.lorahelper_model_image = lorahelper.gradioApp().getElementById("lorahelp_js_image_area");
  41. let parent_iter = lorahelper.lorahelper_model_image.parentElement
  42. while(!lorahelper.is_nullptr(parent_iter)){
  43. if(parent_iter.classList.contains('gradio-html') && parent_iter.classList.contains('block')){
  44. lorahelper.lorahelper_model_image_parent = parent_iter;
  45. break;
  46. }
  47. parent_iter = parent_iter.parentElement;
  48. }
  49. if(lorahelper.is_nullptr(lorahelper.lorahelper_model_image_parent)){
  50. parent_iter = lorahelper.lorahelper_model_image.parentElement
  51. while(!lorahelper.is_nullptr(parent_iter)){
  52. if(parent_iter.classList.contains('gr-block') && parent_iter.classList.contains('gr-box')){
  53. lorahelper.lorahelper_model_image_parent = parent_iter;
  54. break;
  55. }
  56. parent_iter = parent_iter.parentElement;
  57. }
  58. }
  59. //AJAX setup
  60. lorahelper.js_cors_request_btn = lorahelper.gradioApp().getElementById("lorahelp_js_cors_request_btn");
  61. lorahelper.lorahelp_js_ajax_txtbox_textarea = lorahelper.gradioApp().querySelector("#lorahelp_js_ajax_txtbox textarea");
  62. lorahelper.lorahelp_js_ajax_txtbox_textarea.addEventListener('input', lorahelper.call_lorahelp_js_ajax_txtbox_callback);
  63. lorahelper.lorahelp_js_output_message = lorahelper.gradioApp().querySelector("#lorahelp_js_output_message textarea");
  64. lorahelper.lorahelper_trigger_words_dataframe_scope = lorahelper.gradioApp().getElementById("lorahelp_js_trigger_words_dataframe").querySelector("table").parentElement;
  65. lorahelper.lorahelp_js_dataframe_observer.observe(lorahelper.lorahelper_trigger_words_dataframe_scope, lorahelper.lorahelp_js_dataframe_observer_config);
  66. lorahelper.select_index_text_box = lorahelper.gradioApp().querySelector("#lorahelp_dataedit_select_index_txtbox textarea");
  67. lorahelper.update_inputbox(lorahelper.select_index_text_box, JSON.stringify(lorahelper.lorahlep_dataframe_unselected));
  68. lorahelper.lorahelp_translate_area = lorahelper.gradioApp().getElementById("lorahelp_translate_area");
  69. lorahelper.localizationPromise.then(()=>{
  70. let helper_tag = lorahelper.get_tab_by_name("LoRA prompt helper");
  71. helper_tag.innerHTML = lorahelper.get_UI_display("LoRA prompt helper");
  72. lorahelper.gradioApp().getElementById("lorahelp_dataedit_refresh_event_btn").setAttribute("title", lorahelper.my_getTranslation("Reload trigger words from model information file."));
  73. lorahelper.gradioApp().getElementById("lorahelp_json_refresh_event_btn").setAttribute("title", lorahelper.my_getTranslation("Update the JSON data from user input."));
  74. lorahelper.gradioApp().getElementById("lorahelp_js_save_model_setting_btn").setAttribute("title", lorahelper.my_getTranslation("Save the trigger words to model information file."));
  75. let lorahelp_js_sort_order_radio = lorahelper.gradioApp().getElementById("lorahelp_js_sort_order_radio");
  76. let lorahelp_js_sort_order_radio_text = lorahelper.find_tag_by_innerHTML(lorahelp_js_sort_order_radio, "span", "Sort Order");
  77. if (!lorahelper.is_nullptr(lorahelp_js_sort_order_radio_text)) lorahelp_js_sort_order_radio_text.innerHTML = lorahelper.get_UI_display("Sort Order");
  78. lorahelper.find_tag_by_innerHTML(lorahelp_js_sort_order_radio, "span", "Ascending").innerHTML = lorahelper.get_UI_display("Ascending");
  79. lorahelper.find_tag_by_innerHTML(lorahelp_js_sort_order_radio, "span", "Descending").innerHTML = lorahelper.get_UI_display("Descending");
  80. lorahelper.translate_language_selector();
  81. lorahelper.fill_cell_placeholder();
  82. lorahelper.gradioApp().getElementById("lorahelp_js_load_textbox_prompt_btn").addEventListener('click', e=>{
  83. lorahelper.gradioApp().getElementById("js_tab_adv_edit").parentElement.parentElement.querySelectorAll("button")[1].click();
  84. lorahelper.dataedit_search_box.value = "";
  85. }, false);
  86. lorahelper.gradioApp().getElementById("lorahelp_js_load_civitai_setting_btn").addEventListener('click', e=>{
  87. lorahelper.gradioApp().getElementById("js_tab_adv_edit").parentElement.parentElement.querySelectorAll("button")[1].click();
  88. lorahelper.dataedit_search_box.value = "";
  89. }, false);
  90. lorahelper.gradioApp().getElementById("lorahelp_js_load_dreambooth_setting_btn").addEventListener('click', e=>{
  91. lorahelper.gradioApp().getElementById("js_tab_adv_edit").parentElement.parentElement.querySelectorAll("button")[1].click();
  92. lorahelper.dataedit_search_box.value = "";
  93. }, false);
  94. let dataedit_search = lorahelper.gradioApp().getElementById("lorahelp_js_dataframe_filter").querySelector("input, textarea");
  95. for(const eve_name of ["change", "keypress", "paste", "input"]){
  96. dataedit_search.addEventListener(eve_name, e=>{
  97. lorahelper.updateDataeditSearchingBox();
  98. }, false);
  99. }
  100. lorahelper.dataedit_search_box = dataedit_search;
  101. (()=>{
  102. // Select the node that will be observed for mutations
  103. const targetNode = document.getElementById("lorahelp_simpleedit_supergroup_other");
  104. // Options for the observer (which mutations to observe)
  105. const config = { attributes: true, childList: true, subtree: true };
  106. // Callback function to execute when mutations are observed
  107. const callback = (mutationList, observer) => {
  108. lorahelper.update_simpleedit_group();
  109. };
  110. // Create an observer instance linked to the callback function
  111. const observer = new MutationObserver(callback);
  112. // Start observing the target node for configured mutations
  113. observer.observe(targetNode, config);
  114. })();
  115. });
  116. //緒山真尋!! 緒山真尋!! 緒山真尋!! 緒山真尋!! 緒山真尋!!
  117. let mahiro_btn = lorahelper.gradioApp().getElementById("lorahelp_oyama_mahiro");
  118. if(!lorahelper.is_nullptr(mahiro_icon) && !lorahelper.is_nullptr(mahiro_icon2)){
  119. let mahiro_img = document.createElement("img");
  120. mahiro_img.setAttribute("src", mahiro_icon);
  121. mahiro_img.style.height = "32px";
  122. mahiro_img.style.position = "absolute";
  123. mahiro_btn.appendChild(mahiro_img);
  124. mahiro_btn.addEventListener('click', function(ev) {
  125. mahiro_img.setAttribute("src", mahiro_icon2);
  126. window.setTimeout(()=>{
  127. alert("你好,我是緒山真尋!!\nこんにちは、おやま まひろです!!");
  128. new Audio(watashiwoyamamahoro).play();
  129. lorahelper.lorahelp_js_output_message.value = "你去問緒山真尋這程式寫好沒!";
  130. window.setTimeout(()=>mahiro_img.setAttribute("src", mahiro_icon),1000);
  131. },100);
  132. }, false);
  133. mahiro_btn.addEventListener('mouseover', event => mahiro_img.setAttribute("src", mahiro_icon2), false);
  134. mahiro_btn.addEventListener('mouseleave', event => mahiro_img.setAttribute("src", mahiro_icon), false);
  135. mahiro_btn.setAttribute("title", "緒山真尋!");
  136. mahiro_btn.setAttribute("oncontextmenu","lorahelper.build_mahiro_menu(event)");
  137. mahiro_btn.setAttribute("ondblclick","lorahelper.build_mahiro_menu(event)");
  138. } else {
  139. //お兄ちゃんはおしまい!
  140. mahiro_btn.style.display = "none";
  141. }
  142. lorahelper.lorahelp_copy_paste_txtbox = lorahelper.gradioApp().querySelector("#lorahelp_copy_paste_txtbox textarea");
  143. //get gradio version
  144. let gradio_ver = lorahelper.lorahelp_gradio_version();
  145. lorahelper.debug("gradio_ver:" + gradio_ver);
  146. // get all extra network tabs
  147. let tab_prefix_list = ["txt2img", "img2img"];
  148. let model_type_list = ["textual_inversion", "hypernetworks", "checkpoints", "lora", "lycoris"];
  149. let cardid_suffix = "cards";
  150. function update_card_for_lorahelper(){
  151. let replace_preview_text = lorahelper.my_getTranslation("replace preview");
  152. if (!replace_preview_text) {
  153. replace_preview_text = "replace preview";
  154. }
  155. //initial values
  156. let extra_network_id = "";
  157. let extra_network_node = null;
  158. let model_path_node = null;
  159. let model_name_node = null;
  160. let model_path = "";
  161. let model_name = "";
  162. let model_type = "";
  163. let cards = null;
  164. //get current tab
  165. let active_tab_type = lorahelper.getActiveTabType();
  166. if (!active_tab_type){active_tab_type = "txt2img";}
  167. for (const tab_prefix of tab_prefix_list) {
  168. if (tab_prefix != active_tab_type) continue;
  169. let log_messages = [];
  170. //find out current selected model type tab
  171. let active_extra_tab_type = "";
  172. let extra_tabs = lorahelper.gradioApp().getElementById(tab_prefix+"_extra_tabs");
  173. if (!extra_tabs) {
  174. log_messages.push("can not find extra_tabs: " + tab_prefix+"_extra_tabs");
  175. }
  176. //get active extratab
  177. let try_to_get_extra_tab = Array.from(get_uiCurrentTabContent().querySelectorAll('.extra-network-cards,.extra-network-thumbs'))
  178. if(try_to_get_extra_tab.length <= 0){ //support for kitchen-theme and lobe-theme
  179. let txt2img_array_tmp = Array.from(lorahelper.gradioApp().querySelector("#txt2img-extra-network-sidebar, #txt2img-extra-netwrok-sidebar")?.querySelectorAll('.extra-network-cards,.extra-network-thumbs')||[]);
  180. let img2img_array_tmp = Array.from(lorahelper.gradioApp().querySelector("#img2img-extra-network-sidebar, #img2img-extra-netwrok-sidebar")?.querySelectorAll('.extra-network-cards,.extra-network-thumbs')||[]);
  181. try_to_get_extra_tab = txt2img_array_tmp.concat(img2img_array_tmp);
  182. }
  183. const active_extra_tab = try_to_get_extra_tab
  184. .find(el => el.closest('.tabitem').style.display === 'block')
  185. ?.id.match(/^(txt2img|img2img)_(.+)_cards$/)[2];
  186. switch (active_extra_tab) {
  187. case "textual_inversion":
  188. active_extra_tab_type = "ti";
  189. break;
  190. case "hypernetworks":
  191. active_extra_tab_type = "hyper";
  192. break;
  193. case "checkpoints":
  194. active_extra_tab_type = "ckp";
  195. break;
  196. case "lora":
  197. active_extra_tab_type = "lora";
  198. break;
  199. case "lycoris":
  200. active_extra_tab_type = "lyco";
  201. break;
  202. }
  203. let tab_counter = 0;
  204. for (const js_model_type of model_type_list) {
  205. //get model_type for python side
  206. switch (js_model_type) {
  207. case "textual_inversion":
  208. model_type = "ti";
  209. break;
  210. case "hypernetworks":
  211. model_type = "hyper";
  212. break;
  213. case "checkpoints":
  214. model_type = "ckp";
  215. break;
  216. case "lora":
  217. model_type = "lora";
  218. break;
  219. case "lycoris":
  220. model_type = "lyco";
  221. break;
  222. }
  223. if (!model_type) {
  224. log_messages.push("can not get model_type from: " + js_model_type);
  225. continue;
  226. }
  227. let extra_network_parent = null;
  228. //only handle current sub-tab
  229. extra_network_id = tab_prefix+"_"+js_model_type+"_"+cardid_suffix;
  230. if (model_type != active_extra_tab_type) continue;
  231. extra_network_node = lorahelper.gradioApp().getElementById(extra_network_id);
  232. // check if extr network is under thumbnail mode
  233. is_thumb_mode = false
  234. if (extra_network_node) {
  235. if (extra_network_node.className == "extra-network-thumbs") {
  236. log_messages.push(extra_network_id + " is in thumbnail mode");
  237. is_thumb_mode = true;
  238. }
  239. } else {
  240. log_messages.push("can not find extra_network_node: " + extra_network_id);
  241. continue;
  242. }
  243. let i = 0;
  244. // get all card nodes
  245. cards = extra_network_node.querySelectorAll(".card");
  246. for (let card of cards) {
  247. if(card.classList.contains("lorahelp-context_menu")) continue;
  248. card.classList.add("lorahelp-context_menu");
  249. if(i==0){
  250. log_messages.push("setup context menu for " + extra_network_id);
  251. for(const msg of log_messages) lorahelper.debug(msg);
  252. }
  253. //metadata_buttoncard
  254. metadata_button = card.querySelector(".metadata-button");
  255. //additional node
  256. additional_node = card.querySelector(".actions .additional");
  257. //get ul node, which is the parent of all buttons
  258. ul_node = card.querySelector(".actions .additional ul");
  259. // replace preview text button
  260. replace_preview_btn = card.querySelector(".actions .additional a");
  261. // model_path node
  262. // model_path = subfolder path + model name + ext
  263. model_path_node = card.querySelector(".actions .additional .search_term");
  264. if (!model_path_node){
  265. lorahelper.debug("can not find search_term node for cards in " + extra_network_id);
  266. continue;
  267. }
  268. model_name_node = card.querySelector(".actions .name");
  269. if (!model_name_node){
  270. lorahelper.debug("can not find name node for cards in " + extra_network_id);
  271. }
  272. // get model_path
  273. model_path = model_path_node.innerHTML;
  274. if (!model_path) {
  275. lorahelper.debug("model_path is empty for cards in " + extra_network_id);
  276. continue;
  277. }
  278. model_name = model_name_node.innerHTML;
  279. if (!model_name) {
  280. lorahelper.debug("model_name is empty for cards in " + extra_network_id);
  281. model_name = "";
  282. }
  283. model_path = model_path.replace(/(\.(bin|pt|safetensors|ckpt))(\s+)?([a-z0-9]+)?$/i, "$1");
  284. let bgimg = card.style.backgroundImage || "url(\"./file=html/card-no-preview.png\")";
  285. if(lorahelper.is_empty(card.style.backgroundImage)){
  286. let img_preview = card.querySelector("img.preview");
  287. let tmp_bgimg = "./file=html/card-no-preview.png";
  288. if(img_preview){
  289. tmp_bgimg = card.querySelector("img.preview").getAttribute('src');
  290. }
  291. if(lorahelper.is_empty(tmp_bgimg)){
  292. tmp_bgimg = "./file=html/card-no-preview.png";
  293. }
  294. bgimg = `url(\"${tmp_bgimg}\")`;
  295. }
  296. bgimg = bgimg.replace(/^\s*url\s*\(\s*\"/i, "lorahelper.pass_url(\"");
  297. card.setAttribute("oncontextmenu",
  298. `lorahelper.show_trigger_words(event, '${model_type}', '${model_path}', '${model_name}', ${bgimg}, '${active_tab_type}')`
  299. );
  300. let touch_icon = card.querySelector(".lorahelp-touch-icon");
  301. if(lorahelper.is_nullptr(touch_icon)){
  302. touch_icon = document.createElement("div");
  303. touch_icon.classList.add("lorahelp-touch-icon");
  304. let inside_span = document.createElement("span");
  305. touch_icon.appendChild(inside_span);
  306. card.appendChild(touch_icon);
  307. }
  308. let icon_label = touch_icon.querySelector("span");
  309. icon_label.innerHTML = "...";
  310. touch_icon.setAttribute("onclick",
  311. `lorahelper.show_trigger_words(event, '${model_type}', '${model_path}', '${model_name}', ${bgimg}, '${active_tab_type}')`
  312. );
  313. touch_icon.setAttribute("ontouchstart",
  314. `lorahelper.show_trigger_words(event, '${model_type}', '${model_path}', '${model_name}', ${bgimg}, '${active_tab_type}')`
  315. );
  316. if(lorahelper.isTouchDevice() || lorahelper.settings.touch_mode()){
  317. touch_icon.style.display = "block";
  318. }else{
  319. touch_icon.style.display = "none";
  320. }
  321. ++i;
  322. }
  323. if(tab_counter == 0){
  324. for(let node_ptr = lorahelper.gradioApp().getElementById(extra_network_id);
  325. !lorahelper.is_empty(node_ptr?.parentElement?.parentNode);
  326. node_ptr = node_ptr?.parentElement
  327. ){
  328. node_id = (node_ptr||{getAttribute:()=>null}).getAttribute("id");
  329. if(lorahelper.is_empty(node_id)) continue;
  330. if ((node_id||"").indexOf("extra_network") >= 0){
  331. extra_network_parent = node_ptr;
  332. break;
  333. }
  334. }
  335. if(!lorahelper.is_empty(extra_network_parent)){
  336. if (lorahelper.is_empty(lorahelper.extra_network_panel_list)){
  337. lorahelper.extra_network_panel_list = [];
  338. lorahelper.extra_network_observer_list = [];
  339. }
  340. if ((lorahelper.extra_network_panel_list?.length||-1) <= 0){
  341. lorahelper.extra_network_panel_list = [];
  342. lorahelper.extra_network_observer_list = [];
  343. }
  344. let observer_id = lorahelper.extra_network_panel_list.indexOf(extra_network_parent);
  345. if(observer_id < 0){
  346. lorahelper.extra_network_panel_list.push(extra_network_parent);
  347. observer_id = lorahelper.extra_network_panel_list.indexOf(extra_network_parent);
  348. let lorahelper_observer = new MutationObserver((function(self){
  349. return mutations => {
  350. if(lorahelper.extra_network_observer_list[self.id].working) return;
  351. lorahelper.extra_network_observer_list[self.id].working = true;
  352. lorahelper.update_card_for_lorahelper();
  353. lorahelper.extra_network_observer_list[self.id].working = false;
  354. }
  355. })({
  356. id: observer_id,
  357. tab_prefix: tab_prefix
  358. }) );
  359. lorahelper.extra_network_observer_list.push(lorahelper_observer);
  360. lorahelper_observer.observe(extra_network_parent, {
  361. characterData: true,
  362. childList: true,
  363. subtree: true,
  364. attributes: true
  365. });
  366. }
  367. }
  368. }
  369. ++tab_counter;
  370. }
  371. }
  372. }
  373. //update when tab is changed
  374. let all_tabs = lorahelper.gradioApp().querySelectorAll(".tab-nav, .ant-tabs");
  375. let tab_search = window.setInterval(function(){
  376. if(lorahelper.gradioApp().querySelectorAll(".tab-nav, .ant-tabs").length <= 0 && lorahelper.gradioApp().querySelectorAll(".tabs").length <= 0){
  377. return;
  378. }
  379. all_tabs = lorahelper.gradioApp().querySelectorAll(".tab-nav, .ant-tabs");
  380. window.clearInterval(tab_search);
  381. if(all_tabs.length <= 0){
  382. //support for old version
  383. all_tabs = lorahelper.gradioApp().querySelectorAll(".tabs");
  384. for (let tab_parent of all_tabs) {
  385. all_tab_items = tab_parent.childNodes[0].querySelectorAll("button, .ant-tabs-tab-btn");
  386. for (let the_tab of all_tab_items) {
  387. the_tab.addEventListener('click', function(ev) {
  388. (the_tab.querySelector("button, .ant-tabs-tab-btn")||{addEventListener:()=>false}).addEventListener('click', function(ev) {
  389. update_card_for_lorahelper();
  390. return true;
  391. }, false);
  392. update_card_for_lorahelper();
  393. return true;
  394. }, false);
  395. }
  396. }
  397. }else{
  398. for (let the_tab of all_tabs) {
  399. (the_tab.querySelector("button, .ant-tabs-tab-btn")||{addEventListener:()=>false}).addEventListener('click', function(ev) {
  400. update_card_for_lorahelper();
  401. return true;
  402. }, false);
  403. the_tab.addEventListener('click', function(ev) {
  404. update_card_for_lorahelper();
  405. return true;
  406. }, false);
  407. }
  408. }
  409. },20);
  410. lorahelper.simpleedit_group_extra_enabled = lorahelper.gradioApp().querySelector("#lorahelp_simpleedit_group_extra_enabled input");
  411. lorahelper.simpleedit_group_extra_body = lorahelper.gradioApp().querySelector("#lorahelp_simpleedit_group_extra_body");
  412. lorahelper.simpleedit_group_neg_enabled = lorahelper.gradioApp().querySelector("#lorahelp_simpleedit_group_neg_enabled input");
  413. lorahelper.simpleedit_group_neg_body= lorahelper.gradioApp().querySelector("#lorahelp_simpleedit_group_neg_body");
  414. lorahelper.sorting_group_enabled = lorahelper.gradioApp().querySelector("#lorahelp_sorting_group_enabled input");
  415. lorahelper.sorting_group_body = lorahelper.gradioApp().querySelector("#lorahelp_sorting_group");
  416. lorahelper.update_simpleedit_group = function(){
  417. if(lorahelper.simpleedit_group_extra_enabled.checked)
  418. lorahelper.simpleedit_group_extra_body.style.display="block";
  419. else
  420. lorahelper.simpleedit_group_extra_body.style.display="none";
  421. if(lorahelper.simpleedit_group_neg_enabled.checked)
  422. lorahelper.simpleedit_group_neg_body.style.display="block";
  423. else
  424. lorahelper.simpleedit_group_neg_body.style.display="none";
  425. if(lorahelper.sorting_group_enabled.checked)
  426. lorahelper.sorting_group_body.style.display="block";
  427. else
  428. lorahelper.sorting_group_body.style.display="none";
  429. return true;
  430. }
  431. lorahelper.simpleedit_group_extra_enabled.addEventListener('click', lorahelper.update_simpleedit_group, false);
  432. lorahelper.simpleedit_group_neg_enabled.addEventListener('click', lorahelper.update_simpleedit_group, false);
  433. lorahelper.sorting_group_enabled.addEventListener('click', lorahelper.update_simpleedit_group, false);
  434. lorahelper.update_simpleedit_group();
  435. //update when tab refreshed
  436. lorahelper.gradioApp().getElementById("txt2img_extra_refresh").addEventListener('click', function(ev) {
  437. update_card_for_lorahelper();
  438. return true;
  439. }, false);
  440. lorahelper.gradioApp().getElementById("img2img_extra_refresh").addEventListener('click', function(ev) {
  441. update_card_for_lorahelper();
  442. return true;
  443. }, false);
  444. //link dataframe edit actions
  445. for (const [key, value] of Object.entries(lorahelper.edit_action_list)) {
  446. var the_btn = lorahelper.gradioApp().getElementById(value+"_btn");
  447. the_btn.setAttribute("onclick", `lorahelper.dataframe_edit_action(event, '${key}')`);
  448. the_btn.setAttribute("title", key);
  449. }
  450. //check if Browser support paste from clipboard
  451. if (typeof(lorahelper.noop_func) !== typeof(navigator.clipboard.readText)){
  452. lorahelper.gradioApp().getElementById("lorahelp_dataedit_paste_btn").style.display = "none";
  453. lorahelper.gradioApp().getElementById("lorahelp_dataedit_paste_append_btn").style.display = "none";
  454. }
  455. //update when start webui
  456. update_card_for_lorahelper();
  457. lorahelper.dataframe_focus_check();
  458. lorahelper.update_card_for_lorahelper = update_card_for_lorahelper;
  459. });