extraNetworks.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. function setupExtraNetworksForTab(tabname) {
  2. gradioApp().querySelector('#' + tabname + '_extra_tabs').classList.add('extra-networks');
  3. var tabs = gradioApp().querySelector('#' + tabname + '_extra_tabs > div');
  4. var search = gradioApp().querySelector('#' + tabname + '_extra_search textarea');
  5. var refresh = gradioApp().getElementById(tabname + '_extra_refresh');
  6. search.classList.add('search');
  7. tabs.appendChild(search);
  8. tabs.appendChild(refresh);
  9. var applyFilter = function() {
  10. var searchTerm = search.value.toLowerCase();
  11. gradioApp().querySelectorAll('#' + tabname + '_extra_tabs div.card').forEach(function(elem) {
  12. var searchOnly = elem.querySelector('.search_only');
  13. var text = elem.querySelector('.name').textContent.toLowerCase() + " " + elem.querySelector('.search_term').textContent.toLowerCase();
  14. var visible = text.indexOf(searchTerm) != -1;
  15. if (searchOnly && searchTerm.length < 4) {
  16. visible = false;
  17. }
  18. elem.style.display = visible ? "" : "none";
  19. });
  20. };
  21. search.addEventListener("input", applyFilter);
  22. applyFilter();
  23. extraNetworksApplyFilter[tabname] = applyFilter;
  24. }
  25. function applyExtraNetworkFilter(tabname) {
  26. setTimeout(extraNetworksApplyFilter[tabname], 1);
  27. }
  28. var extraNetworksApplyFilter = {};
  29. var activePromptTextarea = {};
  30. function setupExtraNetworks() {
  31. setupExtraNetworksForTab('txt2img');
  32. setupExtraNetworksForTab('img2img');
  33. function registerPrompt(tabname, id) {
  34. var textarea = gradioApp().querySelector("#" + id + " > label > textarea");
  35. if (!activePromptTextarea[tabname]) {
  36. activePromptTextarea[tabname] = textarea;
  37. }
  38. textarea.addEventListener("focus", function() {
  39. activePromptTextarea[tabname] = textarea;
  40. });
  41. }
  42. registerPrompt('txt2img', 'txt2img_prompt');
  43. registerPrompt('txt2img', 'txt2img_neg_prompt');
  44. registerPrompt('img2img', 'img2img_prompt');
  45. registerPrompt('img2img', 'img2img_neg_prompt');
  46. }
  47. onUiLoaded(setupExtraNetworks);
  48. var re_extranet = /<([^:]+:[^:]+):[\d.]+>/;
  49. var re_extranet_g = /\s+<([^:]+:[^:]+):[\d.]+>/g;
  50. function tryToRemoveExtraNetworkFromPrompt(textarea, text) {
  51. var m = text.match(re_extranet);
  52. var replaced = false;
  53. var newTextareaText;
  54. if (m) {
  55. var partToSearch = m[1];
  56. newTextareaText = textarea.value.replaceAll(re_extranet_g, function(found) {
  57. m = found.match(re_extranet);
  58. if (m[1] == partToSearch) {
  59. replaced = true;
  60. return "";
  61. }
  62. return found;
  63. });
  64. } else {
  65. newTextareaText = textarea.value.replaceAll(new RegExp(text, "g"), function(found) {
  66. if (found == text) {
  67. replaced = true;
  68. return "";
  69. }
  70. return found;
  71. });
  72. }
  73. if (replaced) {
  74. textarea.value = newTextareaText;
  75. return true;
  76. }
  77. return false;
  78. }
  79. function cardClicked(tabname, textToAdd, allowNegativePrompt) {
  80. var textarea = allowNegativePrompt ? activePromptTextarea[tabname] : gradioApp().querySelector("#" + tabname + "_prompt > label > textarea");
  81. if (!tryToRemoveExtraNetworkFromPrompt(textarea, textToAdd)) {
  82. textarea.value = textarea.value + opts.extra_networks_add_text_separator + textToAdd;
  83. }
  84. updateInput(textarea);
  85. }
  86. function saveCardPreview(event, tabname, filename) {
  87. var textarea = gradioApp().querySelector("#" + tabname + '_preview_filename > label > textarea');
  88. var button = gradioApp().getElementById(tabname + '_save_preview');
  89. textarea.value = filename;
  90. updateInput(textarea);
  91. button.click();
  92. event.stopPropagation();
  93. event.preventDefault();
  94. }
  95. function extraNetworksSearchButton(tabs_id, event) {
  96. var searchTextarea = gradioApp().querySelector("#" + tabs_id + ' > div > textarea');
  97. var button = event.target;
  98. var text = button.classList.contains("search-all") ? "" : button.textContent.trim();
  99. searchTextarea.value = text;
  100. updateInput(searchTextarea);
  101. }
  102. var globalPopup = null;
  103. var globalPopupInner = null;
  104. function popup(contents) {
  105. if (!globalPopup) {
  106. globalPopup = document.createElement('div');
  107. globalPopup.onclick = function() {
  108. globalPopup.style.display = "none";
  109. };
  110. globalPopup.classList.add('global-popup');
  111. var close = document.createElement('div');
  112. close.classList.add('global-popup-close');
  113. close.onclick = function() {
  114. globalPopup.style.display = "none";
  115. };
  116. close.title = "Close";
  117. globalPopup.appendChild(close);
  118. globalPopupInner = document.createElement('div');
  119. globalPopupInner.onclick = function(event) {
  120. event.stopPropagation(); return false;
  121. };
  122. globalPopupInner.classList.add('global-popup-inner');
  123. globalPopup.appendChild(globalPopupInner);
  124. gradioApp().appendChild(globalPopup);
  125. }
  126. globalPopupInner.innerHTML = '';
  127. globalPopupInner.appendChild(contents);
  128. globalPopup.style.display = "flex";
  129. }
  130. function extraNetworksShowMetadata(text) {
  131. var elem = document.createElement('pre');
  132. elem.classList.add('popup-metadata');
  133. elem.textContent = text;
  134. popup(elem);
  135. }
  136. function requestGet(url, data, handler, errorHandler) {
  137. var xhr = new XMLHttpRequest();
  138. var args = Object.keys(data).map(function(k) {
  139. return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]);
  140. }).join('&');
  141. xhr.open("GET", url + "?" + args, true);
  142. xhr.onreadystatechange = function() {
  143. if (xhr.readyState === 4) {
  144. if (xhr.status === 200) {
  145. try {
  146. var js = JSON.parse(xhr.responseText);
  147. handler(js);
  148. } catch (error) {
  149. console.error(error);
  150. errorHandler();
  151. }
  152. } else {
  153. errorHandler();
  154. }
  155. }
  156. };
  157. var js = JSON.stringify(data);
  158. xhr.send(js);
  159. }
  160. function extraNetworksRequestMetadata(event, extraPage, cardName) {
  161. var showError = function() {
  162. extraNetworksShowMetadata("there was an error getting metadata");
  163. };
  164. requestGet("./sd_extra_networks/metadata", {page: extraPage, item: cardName}, function(data) {
  165. if (data && data.metadata) {
  166. extraNetworksShowMetadata(data.metadata);
  167. } else {
  168. showError();
  169. }
  170. }, showError);
  171. event.stopPropagation();
  172. }