extension_functions.js 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428
  1. (function(){
  2. function module_init() {
  3. console.log("[lora-prompt-tool] load extension functions module");
  4. function show_trigger_words(event, model_type, model_path, model_name, bgimg, active_tab_type){
  5. lorahelper.debug("start show_trigger_words");
  6. //get hidden components of extension
  7. let js_show_trigger_words_btn = lorahelper.gradioApp().getElementById("lorahelp_js_show_trigger_words_btn");
  8. if (!js_show_trigger_words_btn) {
  9. return;
  10. }
  11. let {clientX: mouseX, clientY: mouseY} = event;
  12. if(!lorahelper.is_nullptr(event.changedTouches)){
  13. const touches = event.changedTouches;
  14. mouseX = touches[0].clientX;
  15. mouseY = touches[0].clientY;
  16. }
  17. //ajax to python side
  18. new lorahelper.myAJAX({
  19. "action": "show_trigger_words",
  20. "model_type": model_type,
  21. "model_path": model_path,
  22. }, js_show_trigger_words_btn).then(
  23. (function(mouseX, mouseY){return function(response){
  24. lorahelper.lorahelper_context_menu_list.innerHTML = "";
  25. lorahelper.lorahelper_context_menu_opt.innerHTML = "";
  26. let prompt_count = 0;
  27. try{
  28. let data = JSON.parse(response);
  29. if(!lorahelper.is_nullptr(data)){
  30. if(!lorahelper.is_nullptr(data.prompts)){
  31. let data_prompts = data.prompts;
  32. if (typeof data_prompts === 'string' || data_prompts instanceof String){
  33. data_prompts = [{"prompt": data_prompts}];
  34. }
  35. for(const prompt of data_prompts){
  36. if(!lorahelper.is_nullptr(prompt.prompt) && prompt.prompt !== ""){
  37. const is_neg = (lorahelper.load_boolean_flag(prompt.neg || "")==1);
  38. let context_menu_item = lorahelper.create_context_menu_button(prompt.prompt);
  39. context_menu_item.setAttribute("prompt", prompt.prompt);
  40. if(!lorahelper.is_nullptr(prompt.title) && prompt.title !== ""){
  41. context_menu_item.innerHTML = prompt.title;
  42. context_menu_item.setAttribute("title", prompt.prompt);
  43. }
  44. if(!lorahelper.is_nullptr(prompt.categorys) && prompt.categorys !== ""){
  45. context_menu_item.setAttribute("categorys", prompt.categorys);
  46. }
  47. let function_name = "lorahelper.add_selected_trigger_word";
  48. if(is_neg){
  49. function_name = "lorahelper.add_selected_neg_trigger_word";
  50. context_menu_item.innerHTML += ` (${lorahelper.my_getTranslation("Negative prompt")})`
  51. }
  52. context_menu_item.setAttribute("onclick",
  53. `${function_name}(event, '${model_type}', '${model_path}', ${JSON.stringify(prompt.prompt)}, '${active_tab_type}')`
  54. );
  55. lorahelper.lorahelper_context_menu_list.appendChild(context_menu_item);
  56. ++prompt_count;
  57. }
  58. }
  59. }
  60. //support for Civitai's JSON
  61. if(!lorahelper.is_nullptr(data.trainedWords)){
  62. for(const prompt of data.trainedWords){
  63. if(!lorahelper.is_nullptr(prompt) && prompt !== ""){
  64. let context_menu_item = lorahelper.create_context_menu_button(`${prompt} ${lorahelper.my_getTranslation("(from CivitAI)")}`);
  65. context_menu_item.setAttribute("prompt", prompt);
  66. context_menu_item.setAttribute("categorys", "civitai");
  67. context_menu_item.setAttribute("onclick",
  68. `lorahelper.add_selected_trigger_word(event, '${model_type}', '${model_path}', ${JSON.stringify(prompt)}, '${active_tab_type}')`
  69. );
  70. lorahelper.lorahelper_context_menu_list.appendChild(context_menu_item);
  71. ++prompt_count;
  72. }
  73. }
  74. }
  75. let options_count = 0;
  76. if(!lorahelper.is_nullptr(data.weight) || !lorahelper.is_nullptr(data.params)){
  77. let select_list = [];
  78. if(!lorahelper.is_empty(data.weight)){
  79. let syntax = lorahelper.build_hyper_cmd(model_type,model_name,data.weight,"");
  80. if(!lorahelper.is_empty(syntax)){
  81. let select_btn = lorahelper.create_context_menu_button(lorahelper.get_UI_display("Use suggested weight"));
  82. select_btn.setAttribute("onclick",
  83. `lorahelper.add_selected_trigger_word(event, '${model_type}', '${model_path}', '${lorahelper.build_hyper_cmd(model_type,model_name,data.weight,"")}', '${active_tab_type}')`
  84. );
  85. select_list.push(select_btn);
  86. }
  87. }
  88. if(!lorahelper.is_empty(data.params)){
  89. let syntax = lorahelper.build_hyper_cmd(model_type,model_name,1.0,data.params);
  90. if(!lorahelper.is_empty(syntax)){
  91. let select_btn = lorahelper.create_context_menu_button(lorahelper.get_UI_display("Use suggested params"));
  92. select_btn.setAttribute("onclick",
  93. `lorahelper.add_selected_trigger_word(event, '${model_type}', '${model_path}', '${lorahelper.build_hyper_cmd(model_type,model_name,1.0,data.params)}', '${active_tab_type}')`
  94. );
  95. select_list.push(select_btn);
  96. }
  97. }
  98. if(!lorahelper.is_empty(data.params) && !lorahelper.is_empty(data.weight)){
  99. let syntax = lorahelper.build_hyper_cmd(model_type,model_name,data.weight,data.params);
  100. if(!lorahelper.is_empty(syntax)){
  101. let select_btn = lorahelper.create_context_menu_button(lorahelper.get_UI_display("Use suggested weight and params"));
  102. select_btn.setAttribute("onclick",
  103. `lorahelper.add_selected_trigger_word(event, '${model_type}', '${model_path}', '${lorahelper.build_hyper_cmd(model_type,model_name,data.weight,data.params)}', '${active_tab_type}')`
  104. );
  105. select_list.push(select_btn);
  106. }
  107. }
  108. if(select_list.length > 0){
  109. let sub_menu = lorahelper.create_context_subset(lorahelper.get_UI_display("add model using suggested setting"), select_list);
  110. lorahelper.lorahelper_context_menu_opt.appendChild(sub_menu);
  111. ++options_count;
  112. }
  113. }
  114. if(!lorahelper.is_nullptr(data.images)){
  115. if(data.images.length > 0){
  116. let image_list = [];
  117. let image_setting_list = [];
  118. for(const image_data of data.images){
  119. if (!lorahelper.is_nullptr(image_data.meta)){
  120. if (!lorahelper.is_nullptr(image_data.meta.prompt) && !lorahelper.is_nullptr(image_data.url)){
  121. let image_btn = lorahelper.create_context_menu_button("");
  122. let image_ele = document.createElement("img");
  123. image_ele.setAttribute("src", image_data.url);
  124. image_ele.style.width = "100px";
  125. image_btn.appendChild(image_ele);
  126. image_btn.addEventListener("click", ((model_type, model_path, image_data, active_tab_type) => {return (event) => {
  127. lorahelper.add_selected_trigger_word(event, model_type, model_path, image_data.meta.prompt, active_tab_type);
  128. window.setTimeout(((model_type, model_path, image_data, active_tab_type) => {return (event) => {
  129. if(!lorahelper.is_nullptr(image_data.meta.negativePrompt) && (""+image_data.meta.negativePrompt).trim() !== ""){
  130. lorahelper.add_selected_neg_trigger_word(event, model_type, model_path, image_data.meta.negativePrompt, active_tab_type);
  131. }
  132. };})(model_type, model_path, image_data, active_tab_type),50);
  133. };})(model_type, model_path, image_data, active_tab_type));
  134. image_list.push(image_btn);
  135. let image_setting_btn = lorahelper.create_context_menu_button("");
  136. let image_setting_ele = document.createElement("img");
  137. image_setting_ele.setAttribute("src", image_data.url);
  138. image_setting_ele.style.width = "100px";
  139. image_setting_btn.appendChild(image_setting_ele);
  140. image_setting_btn.addEventListener("click", ((model_type, model_path, image_data, active_tab_type) => {return (event) => {
  141. lorahelper.add_selected_trigger_word(event, model_type, model_path, image_data.meta.prompt, active_tab_type, true);
  142. window.setTimeout(((event, model_type, model_path, image_data, active_tab_type) => {return () => {
  143. if(!lorahelper.is_nullptr(image_data.meta.negativePrompt) && (""+image_data.meta.negativePrompt).trim() !== ""){
  144. lorahelper.add_selected_neg_trigger_word(event, model_type, model_path, image_data.meta.negativePrompt, active_tab_type, true);
  145. }
  146. };})(event, model_type, model_path, image_data, active_tab_type),50);
  147. const tab_ele = lorahelper.gradioApp().querySelector(`#tab_${active_tab_type}`);
  148. if(!lorahelper.is_nullptr(tab_ele)){
  149. const load_size = /^\s*[\[\(\{<]?\s*(\d+)\s*[\*xX,]+\s*(\d+)\s*[\]\)\}>]?\s*$/.exec(image_data.meta.size || image_data.meta.Size);
  150. const image_size = {width:parseInt(load_size[1]), height:parseInt(load_size[2]||load_size[1])};
  151. const setting_panel = tab_ele.querySelector(`#${active_tab_type}_settings`);
  152. let sampling_element = setting_panel.querySelector(`#${active_tab_type}_sampling select`);
  153. let steps_element = setting_panel.querySelector(`#${active_tab_type}_steps`);
  154. let width_element = setting_panel.querySelector(`#${active_tab_type}_width`);
  155. let height_element = setting_panel.querySelector(`#${active_tab_type}_height`);
  156. let denoising_strength_element = setting_panel.querySelector(`#${active_tab_type}_denoising_strength`);
  157. let cfg_scale_element = setting_panel.querySelector(`#${active_tab_type}_cfg_scale`);
  158. let subseed_strength_element = setting_panel.querySelector(`#${active_tab_type}_subseed_strength`);
  159. let subseed_element = setting_panel.querySelector(`#${active_tab_type}_subseed`);
  160. let seed_element = setting_panel.querySelector(`#${active_tab_type}_seed input`);
  161. let mask_blur_element = setting_panel.querySelector(`#${active_tab_type}_mask_blur`);
  162. let enable_hr_element = setting_panel.querySelector(`#${active_tab_type}_enable_hr input`);
  163. let subseed_show_element = setting_panel.querySelector(`#${active_tab_type}_subseed_show input`);
  164. if (!Number.isNaN(image_size.width) && !Number.isNaN(image_size.height)){
  165. lorahelper.lora_help_change_number_input(width_element, image_size.width);
  166. lorahelper.lora_help_change_number_input(height_element, image_size.height);
  167. }
  168. for (const [key, value] of Object.entries(image_data.meta)) {
  169. const key_name = key.toLowerCase();
  170. if(key_name === "seed" && !lorahelper.is_nullptr(seed_element)){
  171. lorahelper.update_inputbox(seed_element, value);
  172. }
  173. if(key_name === "eta" && !lorahelper.is_nullptr(subseed_strength_element)){
  174. if(!lorahelper.is_nullptr(subseed_show_element)){
  175. subseed_show_element.checked = true;
  176. lorahelper.update_inputbox(subseed_show_element, subseed_show_element.value);
  177. }
  178. lorahelper.lora_help_change_number_input(subseed_strength_element, value);
  179. }
  180. if(key_name === "ensd" && !lorahelper.is_nullptr(subseed_element)){
  181. subseed_show_element.checked = true;
  182. lorahelper.update_inputbox(subseed_show_element, subseed_show_element.value);
  183. lorahelper.lora_help_change_number_input(subseed_element, value);
  184. }
  185. if(key_name === "sampler" && !lorahelper.is_nullptr(sampling_element)){
  186. let index = -1;
  187. let val = value;
  188. let opt_index = -1;
  189. let selected_option = null;
  190. for (var i=0; i<sampling_element.options.length; ++i){
  191. const option = sampling_element.options[i];
  192. if(option.getAttribute("value").toLowerCase() == value.toLowerCase()){
  193. index = i;
  194. val = option.getAttribute("value");
  195. opt_index = option.index;
  196. selected_option = option;
  197. }
  198. }
  199. if (index > 0){
  200. sampling_element.selectedIndex = opt_index;
  201. sampling_element.value = val;
  202. //set again avoid it disappear
  203. sampling_element.selectedIndex = opt_index;
  204. lorahelper.my_dispatchEvent(sampling_element, new Event("change", {
  205. bubbles: true,
  206. cancelable: true,
  207. }));
  208. lorahelper.my_dispatchEvent(sampling_element, new Event("input", {
  209. bubbles: true,
  210. cancelable: true,
  211. }));
  212. }
  213. }
  214. if((key_name === "step" || key_name === "steps") && !lorahelper.is_nullptr(steps_element)){
  215. lorahelper.lora_help_change_number_input(steps_element, value);
  216. }
  217. if((key_name === "cfgscale" || key_name === "cfg scale" ||
  218. key_name === "cfg_scale") && !lorahelper.is_nullptr(cfg_scale_element)){
  219. lorahelper.lora_help_change_number_input(cfg_scale_element, value);
  220. }
  221. if((key_name === "denoising strength" || key_name === "denoisingstrength") &&
  222. !lorahelper.is_nullptr(denoising_strength_element)){
  223. if(!lorahelper.is_nullptr(enable_hr_element)){
  224. enable_hr_element.checked = true;
  225. lorahelper.update_inputbox(enable_hr_element, enable_hr_element.value);
  226. }
  227. lorahelper.lora_help_change_number_input(denoising_strength_element, value);
  228. }
  229. if((key_name === "mask blur" || key_name === "maskblur") &&
  230. !lorahelper.is_nullptr(mask_blur_element)){
  231. lorahelper.lora_help_change_number_input(mask_blur_element, value);
  232. }
  233. }
  234. }
  235. };})(model_type, model_path, image_data, active_tab_type));
  236. image_setting_list.push(image_setting_btn);
  237. }
  238. }
  239. }
  240. if (image_list.length > 0){
  241. let sub_menu = lorahelper.create_context_subset(lorahelper.get_UI_display("add prompt by image"), image_list);
  242. let sub_setting_menu = lorahelper.create_context_subset(lorahelper.get_UI_display("use prompt and setting by image"), image_setting_list);
  243. lorahelper.lorahelper_context_menu_opt.appendChild(sub_menu);
  244. lorahelper.lorahelper_context_menu_opt.appendChild(sub_setting_menu);
  245. options_count += 2;
  246. }
  247. }
  248. }
  249. if (options_count > 0){
  250. lorahelper.lorahelper_context_menu_opt.prepend(lorahelper.create_context_menu_hr_item());
  251. }
  252. }
  253. } catch(ex){
  254. }
  255. if(prompt_count <= 0) {
  256. let context_menu_item = lorahelper.create_context_menu_button(lorahelper.get_UI_display("(No Trigger Word)"));
  257. context_menu_item.setAttribute("onclick","lorahelper.close_lora_context_menu()");
  258. lorahelper.lorahelper_context_menu_list.appendChild(context_menu_item);
  259. }
  260. lorahelper.context_menu_search_box_item.style.display = "block";
  261. lorahelper.show_edit_btn();
  262. lorahelper.lorahelper_context_menu_edit_btn.setAttribute("onclick", `lorahelper.update_trigger_words(event, '${model_type}', '${model_path}', '${bgimg}')`);
  263. lorahelper.show_lora_context_menu(mouseX, mouseY);
  264. }; })(mouseX, mouseY)
  265. ).sent();
  266. lorahelper.debug("end show_trigger_words");
  267. if(event){
  268. event.stopPropagation();
  269. event.preventDefault();
  270. }
  271. }
  272. function add_selected_trigger_word(event, model_type, model_path, addprompt, active_tab_type, overwrite){
  273. lorahelper.debug("start add_selected_trigger_word");
  274. //get hidden components of extension
  275. let js_add_selected_trigger_word_btn = lorahelper.gradioApp().getElementById("lorahelp_js_add_selected_trigger_word_btn");
  276. if (!js_add_selected_trigger_word_btn) {
  277. return;
  278. }
  279. let txt2img_prompt = lorahelper.txt2img_prompt;
  280. let img2img_prompt = lorahelper.img2img_prompt;
  281. let param = {
  282. "action": "add_selected_trigger_word",
  283. "addprompt":addprompt,
  284. "model_type": model_type,
  285. "model_path": model_path,
  286. "txt2img_prompt": txt2img_prompt.value,
  287. "img2img_prompt": img2img_prompt.value,
  288. "neg_prompt": "",
  289. "active_tab_type": active_tab_type
  290. };
  291. if(overwrite === true) param.overwrite = 1;
  292. //ajax to python side
  293. new lorahelper.myAJAX(param, js_add_selected_trigger_word_btn).sent();
  294. lorahelper.close_lora_context_menu();
  295. lorahelper.debug("end add_selected_trigger_word");
  296. if(event){
  297. event.stopPropagation();
  298. event.preventDefault();
  299. }
  300. }
  301. function add_selected_neg_trigger_word(event, model_type, model_path, addprompt, active_tab_type, overwrite){
  302. lorahelper.debug("start add_selected_neg_trigger_word");
  303. //get hidden components of extension
  304. let js_add_selected_neg_trigger_word_btn = lorahelper.gradioApp().getElementById("lorahelp_js_add_selected_neg_trigger_word_btn");
  305. if (!js_add_selected_neg_trigger_word_btn) {
  306. return;
  307. }
  308. let txt2img_prompt = lorahelper.neg_txt2img_prompt;
  309. let img2img_prompt = lorahelper.neg_img2img_prompt;
  310. let param = {
  311. "action": "add_selected_trigger_word",
  312. "addprompt":addprompt,
  313. "model_type": model_type,
  314. "model_path": model_path,
  315. "txt2img_prompt": txt2img_prompt.value,
  316. "img2img_prompt": img2img_prompt.value,
  317. "neg_prompt": "",
  318. "active_tab_type": active_tab_type
  319. }
  320. if(overwrite === true) param.overwrite = 1;
  321. //ajax to python side
  322. new lorahelper.myAJAX(param, js_add_selected_neg_trigger_word_btn).sent();
  323. lorahelper.close_lora_context_menu();
  324. lorahelper.debug("end add_selected_neg_trigger_word");
  325. if(event){
  326. event.stopPropagation();
  327. event.preventDefault();
  328. }
  329. }
  330. function update_trigger_words(event, model_type, model_path, bgimg){
  331. lorahelper.debug("start update_trigger_words");
  332. //get hidden components of extension
  333. let js_update_trigger_words_btn = lorahelper.gradioApp().getElementById("lorahelp_js_update_trigger_words_btn");
  334. if (!js_update_trigger_words_btn) {
  335. return;
  336. }
  337. //msg to python side
  338. new lorahelper.myAJAX({
  339. "action": "update_trigger_words",
  340. "model_type": model_type,
  341. "model_path": model_path,
  342. }, js_update_trigger_words_btn).sent();
  343. lorahelper.switch_to_helper_tab();
  344. lorahelper.close_lora_context_menu();
  345. lorahelper.dataedit_search_box.value = "";
  346. lorahelper.lorahelper_model_image.innerHTML = "";
  347. let state = {EditTab:false};
  348. let interval_id = window.setInterval((function(state_obj, bgimg_src){
  349. return function(){
  350. if(!state_obj.EditTab){
  351. state_obj.EditTab = true;
  352. let edit_model_tab = lorahelper.get_tab_by_name("Edit Model Trigger Words");
  353. if(edit_model_tab) edit_model_tab.click();
  354. else lorahelper.debug("fail to switch to edit tab.");
  355. }
  356. if(lorahelper.lorahelper_model_image_parent.clientWidth <= 0) return;
  357. let theHeight = lorahelper.lorahelper_model_image_parent.clientHeight;
  358. if (theHeight <= 0){
  359. theHeight = lorahelper.lorahelper_model_image_parent.clientWidth;
  360. }
  361. let preview_model_image = document.createElement("img");
  362. preview_model_image.setAttribute("src", bgimg_src);
  363. preview_model_image.style.margin = "0 auto";
  364. preview_model_image.style.height = `${theHeight}px`
  365. lorahelper.lorahelper_model_image.appendChild(preview_model_image);
  366. lorahelper.gradioApp().getElementById("lorahelp_js_trigger_words_dataframe").querySelector("table").parentElement.style.overflow = "scroll";
  367. lorahelper.gradioApp().getElementById("js_tab_adv_edit").parentElement.parentElement.querySelectorAll("button")[0].click();
  368. window.clearInterval(interval_id);
  369. };
  370. })(state, bgimg), 50);
  371. lorahelper.debug("end update_trigger_words");
  372. if(event){
  373. event.stopPropagation();
  374. event.preventDefault();
  375. }
  376. }
  377. lorahelper.show_trigger_words = show_trigger_words;
  378. lorahelper.add_selected_trigger_word = add_selected_trigger_word;
  379. lorahelper.add_selected_neg_trigger_word = add_selected_neg_trigger_word;
  380. lorahelper.update_trigger_words = update_trigger_words;
  381. }
  382. let module_loadded = false;
  383. document.addEventListener("DOMContentLoaded", () => {
  384. if (module_loadded) return;
  385. module_loadded = true;
  386. module_init();
  387. });
  388. document.addEventListener("load", () => {
  389. if (module_loadded) return;
  390. module_loadded = true;
  391. module_init();
  392. });
  393. })();