sd-webui-oldsix-prompt/javascript/old_six_prompt.js

313 lines
7.7 KiB
JavaScript

function loadNodes() {
let Elements = {
prompt: getEle('#oldsix-prompt1'),
prompt2: getEle('#oldsix-prompt2'),
txt2img: getEle("#txt2img_prompt_container"),
img2img: getEle("#img2img_prompt_container"),
txtpromt: document.querySelector('#txt2img_prompt textarea'),
txtnpromt: document.querySelector('#txt2img_neg_prompt textarea'),
imgpromt: document.querySelector('#img2img_prompt textarea'),
imgnpromt: document.querySelector('#img2img_neg_prompt textarea'),
btnReload:[],
btnClearP:[],
btnClearNP:[]
}
return Elements
}
function getEle(key) {
return gradioApp().querySelector(key)
}
function CreateEle(type,parentDom,css,html){
let dom= document.createElement(type)
setCss(dom, css)
dom.innerHTML=html
parentDom.appendChild(dom)
return dom
}
function addNPrompt(e) {
let elementprompt = e.target.dataset.pageindex==1 ? Elements.imgnpromt : Elements.txtnpromt
elementprompt.focus();
document.execCommand('insertText', false, e.target.dataset.sixoldtit + ',')
}
function toggleNavCss(dom){
let tabrow=dom.parentNode.parentNode.parentNode;
let tabnav=tabrow.parentNode.previousSibling;
let activebtns=tabrow.querySelectorAll(".oldsix-btn.active")
let target= tabnav.children[tabrow.dataset.tabitem]
if(activebtns.length){
target.classList.add("active")
}
else{
target.classList.remove("active")
}
}
function addPrompt(e) {
let dom=e.target;
let str= e.target.dataset.sixoldtit + ','
let elementprompt =e.target.dataset.pageindex==1 ? Elements.imgpromt : Elements.txtpromt
dom.classList.toggle("active")
toggleNavCss(dom)
ishas=false;
for (const item of dom.classList) {
if(item=='active'){
ishas=true
}
}
if(!ishas){
elementprompt.focus();
elementprompt.value= elementprompt.value.replace(new RegExp(`(${str})`, 'g'), '');
return
}
elementprompt.focus();
document.execCommand('insertText', false,str)
}
async function getJsonStr() {
await new Promise(resolve => setTimeout(resolve, 1500));
let val1 = document.querySelector("#oldsix-area1 textarea").value
let val2 = document.querySelector("#oldsix-area2 textarea").value
return val1||val2
}
function clearTextarea(){
document.querySelector("#oldsix-area1 textarea").value='area1'
document.querySelector("#oldsix-area2 textarea").value='area2'
}
function createBtnTitle(name,parent){
let div=document.createElement('div')
let btn=document.createElement('button')
setCss(div,'oldsix-row ')
setCss(btn,'oldsix-btn-tit sm primary gradio-button svelte-1ipelgc')
btn.innerHTML=name
div.appendChild(btn)
parent.appendChild(div)
return div
}
function createBtnPrompt(key,val,parent,pageindex){
let btn=document.createElement('button')
setCss(btn,'sm secondary gradio-button svelte-1ipelgc oldsix-btn')
btn.innerHTML=key
btn.dataset.sixoldtit=val
btn.dataset.pageindex=pageindex
parent.appendChild(btn)
btn.addEventListener('click',function(e){
addPrompt(e)
})
btn.addEventListener('contextmenu', function (e) {
e.preventDefault();
addNPrompt(e)
})
return btn
}
function traverse(obj,parent,pageindex) {
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
let resdom= createBtnTitle(key,parent)
traverse(obj[key],resdom,pageindex);
} else {
createBtnPrompt(key,obj[key],parent,pageindex)
}
}
}
}
function setCss(dom, css) {
dom.setAttribute("class", css)
}
function tabClick(self){
let selfdivs=self.parentNode.children
let contents=self.parentNode.nextSibling.children
let index=self.dataset.tabitem
for (let i = 0; i < selfdivs.length; i++) {
if(i==index){
contents[i].classList.remove('six-hide')
selfdivs[i].classList.add('selected')
}
else{
contents[i].classList.add('six-hide')
selfdivs[i].classList.remove('selected')
}
}
}
function reloadNodes(jsonstring, btnreloadDom) {
let jsonObj = JSON.parse(jsonstring)
let tabs = document.createElement('div')
let tabnav = document.createElement('div')
let contentContainer=document.createElement('div')
let count=0
Object.keys(jsonObj).forEach(function (key) {
let tabbtn=CreateEle('button',tabnav,'svelte-1g805jl',key)
tabbtn.dataset.tabitem=count
tabbtn.addEventListener('click',()=>{
tabClick(tabbtn)
})
let tabitem=CreateEle('div',contentContainer,'tab-item six-hide','')
tabitem.dataset.tabitem=count
let content=CreateEle('div',tabitem,'oldsix-content','')
if(count==0){
tabbtn.classList.add('selected')
tabitem.classList.remove('six-hide')
}
traverse(jsonObj[key],content,btnreloadDom.dataset.page)
count++
});
setCss(tabs, 'oldsix-tabs gradio-tabs svelte-1g805jl')
setCss(tabnav, 'oldsix-tab-nav scroll-hide svelte-1g805jl')
setCss(contentContainer, 'tab-container')
tabs.appendChild(tabnav)
tabs.appendChild(contentContainer)
btnreloadDom.parentNode.parentNode.appendChild(tabs)
}
async function loadCustomUI(){
let jsonstr= await getJsonStr()
if (jsonstr) {
reloadNodes(jsonstr, Elements.btnReload[0])
reloadNodes(jsonstr, Elements.btnReload[1])
}
}
function reloadUI(){
divs= document.querySelectorAll('.oldsix-tabs')
divs.forEach(item=>{
item.remove()
})
loadCustomUI()
}
function move(){
Elements = loadNodes()
Elements.txt2img.appendChild(Elements.prompt)
Elements.img2img.appendChild(Elements.prompt2)
}
function clearPrompt(pageindex){
let textarea, container;
if(pageindex==0){
textarea=Elements.txtpromt;
container=Elements.prompt
}else{
textarea=Elements.imgpromt;
container=Elements.prompt2
}
textarea.value='';
let tabs=container.querySelector(".oldsix-tab-nav").children
let btns=container.querySelectorAll(".oldsix-btn.active")
for (const item of tabs) {
item.classList.remove('active')
}
btns.forEach(btn=>{
btn.classList.remove('active')
})
}
function clearNPrompt(pageindex){
let textarea=pageindex=='1'?Elements.imgnpromt:Elements.txtnpromt;
textarea.value='';
}
function loadClearbtn(){
let btns1= Elements.prompt.querySelectorAll('.oldsix-clear')
let btns2= Elements.prompt2.querySelectorAll('.oldsix-clear')
btns1.forEach(item=>item.dataset.page='0')
btns2.forEach(item=>item.dataset.page='1')
Elements.btnClearP.push(btns1[0])
Elements.btnClearP.push(btns2[0])
Elements.btnClearNP.push(btns1[1])
Elements.btnClearNP.push(btns2[1])
Elements.btnClearP.forEach(item=>{
item.addEventListener('click',function(e){
clearPrompt(item.dataset.page)
})
});
Elements.btnClearNP.forEach(item=>{
item.addEventListener('click',function(e){
clearNPrompt(item.dataset.page)
})
})
}
onUiLoaded(async => {
move()
loadClearbtn()
Elements.btnReload= document.querySelectorAll('.oldsix-reload');
Elements.btnReload.forEach((item,index) => {
item.dataset.page=index
item.addEventListener('click', () => {
reloadUI()
})
})
loadCustomUI()
})