diff --git a/components/ILIAS/UI/resources/js/Prompt/dist/prompt.min.js b/components/ILIAS/UI/resources/js/Prompt/dist/prompt.min.js index 788838ffbdba..7248d4887457 100644 --- a/components/ILIAS/UI/resources/js/Prompt/dist/prompt.min.js +++ b/components/ILIAS/UI/resources/js/Prompt/dist/prompt.min.js @@ -12,4 +12,4 @@ * https://www.ilias.de * https://github.com/ILIAS-eLearning */ -!function(t,e){"use strict";class r{#t;#e;#r;constructor(t,e){if(this.#t=t,this.#e=document.getElementById(e),null===this.#e)throw new Error(`Could not find a Prompt for id '${e}'.`);this.#r=this.#e.getElementsByTagName("dialog").item(0)}show(t){this.load(t),this.#r.showModal()}close(){this.#r.close()}async load(t,e={}){await fetch(t,e).then((t=>t.text())).then((t=>{const e=(new this.#t).parseFromString(t,"text/html"),r=e.querySelector('section[data-section="il-prompt-state__title"]'),n=e.querySelector('section[data-section="il-prompt-state__contents"]'),o=e.querySelector('section[data-section="il-prompt-state__buttons"]'),i=e.querySelector('section[data-section="il-prompt-state__command"]'),s=e.querySelector('section[data-section="il-prompt-state__parameters"]'),a=e.querySelector("script"),c=this.#r.querySelector("span.il-prompt__title"),p=this.#r.querySelector("div.il-prompt__contents"),l=this.#r.querySelector("div.il-prompt__buttons");c.innerHTML=r.innerHTML,p.innerHTML=n.innerHTML,l.innerHTML=o.innerHTML,this.#n(p),this.#o(p),a&&this.#i(a.text);const m=[];return s.querySelectorAll("data").forEach((t=>{m[t.innerHTML.trim()]=t.getAttribute("value")})),{cmd:i.innerHTML.trim(),params:m}})).then((t=>{const e=t.cmd,{params:r}=t;"close"===e&&this.close(),"redirect"===e&&window.location.replace(r.redirect)}))}#i(t){const e=this.#e.querySelector("section.il-prompt__scripts"),r=document.createElement("script");r.text=t,e.innerHTML="",e.appendChild(r)}#n(t){t.getElementsByTagName("form").forEach((t=>{t.addEventListener("submit",(e=>{e.preventDefault(),this.load(t.action,{method:t.method,body:new FormData(t)})}))}))}#o(t){t.getElementsByTagName("a").forEach((t=>{const{target:e}=t;if("_blank"!==e){const e=t.href;t.addEventListener("click",(()=>this.load(e))),t.removeAttribute("href")}}))}}t.UI=t.UI||{},t.UI.prompt=new class{#t;#s=[];constructor(t){this.#t=t}init(t){if(void 0!==this.#s[t])throw new Error(`Prompt with id '${t}' has already been initialized.`);this.#s[t]=new r(this.#t,t)}get(t){return this.#s[t]??null}}(e)}(il,DOMParser); +!function(t,e){"use strict";class r{#t;#e;#r;constructor(t,e){if(this.#t=t,this.#e=document.getElementById(e),null===this.#e)throw new Error(`Could not find a Prompt for id '${e}'.`);this.#r=this.#e.getElementsByTagName("dialog").item(0)}show(t){this.load(t),this.#r.showModal()}close(){this.#r.close()}async load(t,e={}){await fetch(t,e).then((t=>t.text())).then((t=>{const e=(new this.#t).parseFromString(t,"text/html"),r=e.querySelector('section[data-section="il-prompt-state__title"]'),n=e.querySelector('section[data-section="il-prompt-state__contents"]'),o=e.querySelector('section[data-section="il-prompt-state__buttons"]'),i=e.querySelector('section[data-section="il-prompt-state__command"]'),s=e.querySelector('section[data-section="il-prompt-state__parameters"]'),a=e.querySelector("script[data-replace-marker=\"script\"]"),c=this.#r.querySelector("span.il-prompt__title"),p=this.#r.querySelector("div.il-prompt__contents"),l=this.#r.querySelector("div.il-prompt__buttons");r&&(c.innerHTML=r.innerHTML),n&&(p.innerHTML=n.innerHTML),o&&(l.innerHTML=o.innerHTML),this.#n(p),this.#o(p),a&&this.#i(a.text);const m=[];return s&&s.querySelectorAll("data").forEach((t=>{m[t.innerHTML.trim()]=t.getAttribute("value")})),{cmd:i?i.innerHTML.trim():"",params:m}})).then((t=>{const e=t.cmd,{params:r}=t;"close"===e&&this.close(),"redirect"===e&&window.location.replace(r.redirect)}))}#i(t){const e=this.#e.querySelector("section.il-prompt__scripts"),r=document.createElement("script");r.text=t.replace(/il\.UI\.prompt\.init\([^)]*\);?/g,"").replace(/\$\(this\)\.trigger\('(il_signal_[^']+)'/g,"$(document).trigger('$1'"),e.innerHTML="",e.appendChild(r)}#n(t){t.querySelectorAll("form").forEach((t=>{t.addEventListener("submit",(e=>{e.preventDefault(),this.load(t.action,{method:t.method,body:new FormData(t)})}))}))}#o(t){t.querySelectorAll("a").forEach((t=>{const{target:e}=t;if("_blank"!==e){const e=t.href;t.addEventListener("click",(()=>this.load(e))),t.removeAttribute("href")}}))}}t.UI=t.UI||{},t.UI.prompt=new class{#t;#s=[];constructor(t){this.#t=t}init(t){if(void 0!==this.#s[t])return;try{this.#s[t]=new r(this.#t,t)}catch(t){console.warn(t)}}get(t){return this.#s[t]??null}}(e)}(il,DOMParser); diff --git a/components/ILIAS/UI/resources/js/Prompt/src/prompt.class.js b/components/ILIAS/UI/resources/js/Prompt/src/prompt.class.js index e34ae4065d9a..e467888ca22b 100644 --- a/components/ILIAS/UI/resources/js/Prompt/src/prompt.class.js +++ b/components/ILIAS/UI/resources/js/Prompt/src/prompt.class.js @@ -70,13 +70,19 @@ export default class Prompt { const buttons = doc.querySelector('section[data-section="il-prompt-state__buttons"]'); const command = doc.querySelector('section[data-section="il-prompt-state__command"]'); const parameters = doc.querySelector('section[data-section="il-prompt-state__parameters"]'); - const scripts = doc.querySelector('script'); + const scripts = doc.querySelector('script[data-replace-marker="script"]'); const dialogTitle = this.#prompt.querySelector('span.il-prompt__title'); const dialogContents = this.#prompt.querySelector('div.il-prompt__contents'); const dialogButtons = this.#prompt.querySelector('div.il-prompt__buttons'); - dialogTitle.innerHTML = title.innerHTML; - dialogContents.innerHTML = contents.innerHTML; - dialogButtons.innerHTML = buttons.innerHTML; + if (title) { + dialogTitle.innerHTML = title.innerHTML; + } + if (contents) { + dialogContents.innerHTML = contents.innerHTML; + } + if (buttons) { + dialogButtons.innerHTML = buttons.innerHTML; + } this.#captureForms(dialogContents); this.#captureLinks(dialogContents); @@ -85,14 +91,16 @@ export default class Prompt { } const params = []; - parameters.querySelectorAll('data').forEach( - (data) => { - params[data.innerHTML.trim()] = data.getAttribute('value'); - }, - ); + if (parameters) { + parameters.querySelectorAll('data').forEach( + (data) => { + params[data.innerHTML.trim()] = data.getAttribute('value'); + }, + ); + } return { - cmd: command.innerHTML.trim(), + cmd: command ? command.innerHTML.trim() : '', params, }; }) @@ -117,7 +125,12 @@ export default class Prompt { #appendScript(js) { const dialogScript = this.#component.querySelector('section.il-prompt__scripts'); const script = document.createElement('script'); - script.text = js; + script.text = js + .replace(/il\.UI\.prompt\.init\([^)]*\);?/g, '') + .replace( + /\$\(this\)\.trigger\('(il_signal_[^']+)'/g, + "$(document).trigger('$1'", + ); dialogScript.innerHTML = ''; dialogScript.appendChild(script); } @@ -127,8 +140,7 @@ export default class Prompt { * @return {void} */ #captureForms(doc) { - const forms = doc.getElementsByTagName('form'); - forms.forEach( + doc.querySelectorAll('form').forEach( (form) => { form.addEventListener('submit', (e) => { e.preventDefault(); @@ -146,8 +158,7 @@ export default class Prompt { * @return {void} */ #captureLinks(doc) { - const links = doc.getElementsByTagName('a'); - links.forEach( + doc.querySelectorAll('a').forEach( (lnk) => { const { target } = lnk; if (target !== '_blank') { diff --git a/components/ILIAS/UI/resources/js/Prompt/src/prompt.factory.js b/components/ILIAS/UI/resources/js/Prompt/src/prompt.factory.js index e8daa037cdc4..9a5c2644e156 100644 --- a/components/ILIAS/UI/resources/js/Prompt/src/prompt.factory.js +++ b/components/ILIAS/UI/resources/js/Prompt/src/prompt.factory.js @@ -13,7 +13,7 @@ * https://github.com/ILIAS-eLearning */ -import Prompt from './prompt.class'; +import Prompt from './prompt.class.js'; export default class PromptFactory { /** @@ -40,10 +40,14 @@ export default class PromptFactory { */ init(id) { if (this.#instances[id] !== undefined) { - throw new Error(`Prompt with id '${id}' has already been initialized.`); + return; } - this.#instances[id] = new Prompt(this.#DOMParser, id); + try { + this.#instances[id] = new Prompt(this.#DOMParser, id); + } catch (error) { + // Prompt element may not exist yet during async content replacement. + } } /**