parent
11c90949fb
commit
30061272e8
@ -0,0 +1,87 @@ |
|||||||
|
const objToDom=obj => { |
||||||
|
if(obj[Popup.EM]) { |
||||||
|
let em=document.createElement('em'); |
||||||
|
em.appendChild(document.createTextNode(obj[Popup.EM])); |
||||||
|
return em; |
||||||
|
} else if(obj[Popup.STRONG]) { |
||||||
|
let em=document.createElement('strong'); |
||||||
|
em.appendChild(document.createTextNode(obj[Popup.STRONG])); |
||||||
|
return em; |
||||||
|
} else if(typeof obj=='string' || typeof obj=='number') { |
||||||
|
return document.createTextNode(obj+''); |
||||||
|
} else if(Array.isArray(obj)) { |
||||||
|
let ul=document.createElement('ul'); |
||||||
|
obj.forEach(elem => ul.appendChild(objToDom(elem))); |
||||||
|
return ul; |
||||||
|
} else { |
||||||
|
let table=document.createElement('table'); |
||||||
|
Object |
||||||
|
.keys(obj) |
||||||
|
.forEach(key => { |
||||||
|
let tr=table.appendChild(document.createElement('tr')); |
||||||
|
tr.appendChild(document.createElement('th')).appendChild(document.createTextNode(key)); |
||||||
|
tr.appendChild(document.createElement('td')).appendChild(objToDom(obj[key])); |
||||||
|
}); |
||||||
|
return table; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class Popup { |
||||||
|
constructor(title, content=[], buttons={}) { |
||||||
|
this.title=title; |
||||||
|
this.content=content.map(objToDom); |
||||||
|
this.buttons={...buttons}; |
||||||
|
} |
||||||
|
|
||||||
|
addContent(cnt) { |
||||||
|
this.content.push(objToDom(cnt)); |
||||||
|
} |
||||||
|
addText(cnt) { |
||||||
|
this.content.push(document.createTextNode(cnt)); |
||||||
|
} |
||||||
|
addEm(cnt) { |
||||||
|
this.content.push(objToDom({[Popup.EM]: cnt})); |
||||||
|
} |
||||||
|
addStrong(cnt) { |
||||||
|
this.content.push(objToDom({[Popup.STRONG]: cnt})); |
||||||
|
} |
||||||
|
|
||||||
|
async display() { |
||||||
|
let outer=document.createElement('div'); |
||||||
|
outer.classList.add('popup'); |
||||||
|
let popup=outer.appendChild(document.createElement('div')); |
||||||
|
popup.classList.add('content'); |
||||||
|
|
||||||
|
let title=popup.appendChild(document.createElement('h1')); |
||||||
|
title.innerText=this.title; |
||||||
|
|
||||||
|
let contentSection=popup.appendChild(document.createElement('section')); |
||||||
|
this.content.forEach(elem => contentSection.appendChild(elem)); |
||||||
|
|
||||||
|
let buttonSection=popup.appendChild(document.createElement('section')); |
||||||
|
let buttons=Object.keys(this.buttons).map(btn => { |
||||||
|
let button=document.createElement('button'); |
||||||
|
button.innerText=this.buttons[btn]; |
||||||
|
button.dataset.code=btn; |
||||||
|
return button; |
||||||
|
}); |
||||||
|
buttons.forEach(btn => buttonSection.appendChild(btn)); |
||||||
|
|
||||||
|
document.body.appendChild(outer); |
||||||
|
|
||||||
|
const code=await Promise.race(buttons.map(btn => new Promise(ok => { |
||||||
|
btn.addEventListener('click', e => { |
||||||
|
e.preventDefault(); |
||||||
|
return ok(btn.dataset.code); |
||||||
|
}); |
||||||
|
}))); |
||||||
|
|
||||||
|
document.body.removeChild(outer); |
||||||
|
return code; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Popup.EM=Symbol('EM'); |
||||||
|
Popup.STRONG=Symbol('STRONG'); |
||||||
|
|
||||||
|
return module.exports=Popup; |
Loading…
Reference in new issue