diff --git a/config/plugins/webhooks/gtn/script.js b/config/plugins/webhooks/gtn/script.js index 1845c99a9b0..77f1b1e9f5a 100644 --- a/config/plugins/webhooks/gtn/script.js +++ b/config/plugins/webhooks/gtn/script.js @@ -1,84 +1,89 @@ -var gtnWebhookLoaded = false; -var lastUpdate = 0; +(function () { + var gtnWebhookLoaded = false; + var lastUpdate = 0; -function removeOverlay() { - document.getElementById("gtn-container").style.visibility = "hidden"; -} - -function showOverlay() { - document.getElementById("gtn-container").style.visibility = "visible"; -} - -function getIframeUrl() { - var loc; - try { - loc = document.getElementById("gtn-embed").contentWindow.location.pathname; - } catch (e) { - loc = null; + function removeOverlay() { + const container = document.getElementById("gtn-container"); + if (container) { + container.style.visibility = "hidden"; + } } - return loc; -} -function getIframeScroll() { - var loc; - try { - loc = parseInt(document.getElementById("gtn-embed").contentWindow.scrollY); - } catch (e) { - loc = 0; + function showOverlay() { + document.getElementById("gtn-container").style.visibility = "visible"; } - return loc; -} -function restoreLocation() {} - -function persistLocation() { - // Don't save every scroll event. - var time = new Date().getTime(); - if (time - lastUpdate < 1000) { - return; + function getIframeUrl() { + var loc; + try { + loc = document.getElementById("gtn-embed").contentWindow.location.pathname; + } catch (e) { + loc = null; + } + return loc; } - lastUpdate = time; - window.localStorage.setItem("gtn-in-galaxy", `${getIframeScroll()} ${getIframeUrl()}`); -} -function addIframe() { - let url, message, onloadscroll; - gtnWebhookLoaded = true; - let storedData = false; - let safe = false; + function getIframeScroll() { + var loc; + try { + loc = parseInt(document.getElementById("gtn-embed").contentWindow.scrollY); + } catch (e) { + loc = 0; + } + return loc; + } - // Test for the presence of /training-material/. If that is available we - // can opt in the fancy click-to-run features. Otherwise we fallback to - // displaying the real GTN. - fetch("/training-material/") - .then((response) => { - if (!response.ok) { - url = "https://training.galaxyproject.org/training-material/?utm_source=webhook&utm_medium=noproxy&utm_campaign=gxy"; - message = ` + function restoreLocation() {} + + function persistLocation() { + // Don't save every scroll event. + var time = new Date().getTime(); + if (time - lastUpdate < 1000) { + return; + } + lastUpdate = time; + window.localStorage.setItem("gtn-in-galaxy", `${getIframeScroll()} ${getIframeUrl()}`); + } + + function addIframe() { + let url, message, onloadscroll; + gtnWebhookLoaded = true; + let storedData = false; + let safe = false; + + // Test for the presence of /training-material/. If that is available we + // can opt in the fancy click-to-run features. Otherwise we fallback to + // displaying the real GTN. + fetch("/training-material/") + .then((response) => { + if (!response.ok) { + url = + "https://training.galaxyproject.org/training-material/?utm_source=webhook&utm_medium=noproxy&utm_campaign=gxy"; + message = ` Click to run unavailable. `; - } else { - safe = true; - - var storedLocation = window.localStorage.getItem("gtn-in-galaxy"); - if ( - storedLocation !== null && - storedLocation.split(" ")[1] !== undefined && - storedLocation.split(" ")[1].startsWith("/training-material/") - ) { - onloadscroll = storedLocation.split(" ")[0]; - url = storedLocation.split(" ")[1]; } else { - url = "/training-material/?utm_source=webhook&utm_medium=proxy&utm_campaign=gxy"; + safe = true; + + var storedLocation = window.localStorage.getItem("gtn-in-galaxy"); + if ( + storedLocation !== null && + storedLocation.split(" ")[1] !== undefined && + storedLocation.split(" ")[1].startsWith("/training-material/") + ) { + onloadscroll = storedLocation.split(" ")[0]; + url = storedLocation.split(" ")[1]; + } else { + url = "/training-material/?utm_source=webhook&utm_medium=proxy&utm_campaign=gxy"; + } + message = ""; } - message = ""; - } - }) - .then(() => { - document.querySelector("body.full-content").insertAdjacentHTML( - "afterbegin", - ` + }) + .then(() => { + document.querySelector("body.full-content").insertAdjacentHTML( + "afterbegin", + `
@@ -88,100 +93,101 @@ function addIframe() {
` - ); + ); - // Clicking outside of GTN closes it - document.getElementById("gtn-screen").addEventListener("click", () => { - removeOverlay(); - }); - - // Only setup the listener if it won't crash things. - if (safe) { - // Listen to the scroll position - document.getElementById("gtn-embed").contentWindow.addEventListener("scroll", () => { - persistLocation(); - }); - } - - // Depends on the iframe being present - document.getElementById("gtn-embed").addEventListener("load", () => { - // Save our current location when possible - if (onloadscroll !== undefined) { - document.getElementById("gtn-embed").contentWindow.scrollTo(0, parseInt(onloadscroll)); - onloadscroll = undefined; - } - - if (safe) { - persistLocation(); - } - var gtn_tools = $("#gtn-embed").contents().find("span[data-tool]"); - // Buttonify - gtn_tools.addClass("galaxy-proxy-active"); - - gtn_tools.click((e) => { - var target = e.target; - - // Sometimes we get the i or the strong, not the parent. - if (e.target.tagName.toLowerCase() !== "span") { - target = e.target.parentElement; - } - - tool_id = $(target).data("tool"); - - if (tool_id === "upload1" || tool_id === "upload") { - document.getElementById("tool-panel-upload-button").click(); - } else { - Galaxy.router.push(`?tool_id=${tool_id}`); - } + // Clicking outside of GTN closes it + document.getElementById("gtn-screen").addEventListener("click", () => { removeOverlay(); }); - }); - }); -} -/* The masthead icon may not exist yet when this webhook executes; we need this to wait for that to happen. - * elementReady function from gist: - * https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e - */ -function elementReady(selector) { - return new Promise((resolve, reject) => { - let el = document.querySelector(selector); - if (el) { - resolve(el); - } - new MutationObserver((mutationRecords, observer) => { - // Query for elements matching the specified selector - Array.from(document.querySelectorAll(selector)).forEach((element) => { - resolve(element); - //Once we have resolved we don't need the observer anymore. - observer.disconnect(); - }); - }).observe(document.documentElement, { - childList: true, - subtree: true, - }); - }); -} -elementReady("#gtn a").then((el) => { - // External stuff may also have attached a click handler here (vue-based masthead) - // replace with a clean copy of the node to remove all that cruft. - clean = el.cloneNode(true); - el.parentNode.replaceChild(clean, el); - clean.addEventListener("click", (e) => { - e.preventDefault(); - e.stopPropagation(); - if (!gtnWebhookLoaded) { - addIframe(); - } else { - showOverlay(); - } - }); -}); + // Only setup the listener if it won't crash things. + if (safe) { + // Listen to the scroll position + document.getElementById("gtn-embed").contentWindow.addEventListener("scroll", () => { + persistLocation(); + }); + } -// Remove the overlay on escape button click -document.addEventListener("keydown", (e) => { - // Check for escape button - "27" - if (e.which === 27 || e.keyCode === 27) { - removeOverlay(); + // Depends on the iframe being present + document.getElementById("gtn-embed").addEventListener("load", () => { + // Save our current location when possible + if (onloadscroll !== undefined) { + document.getElementById("gtn-embed").contentWindow.scrollTo(0, parseInt(onloadscroll)); + onloadscroll = undefined; + } + + if (safe) { + persistLocation(); + } + var gtn_tools = $("#gtn-embed").contents().find("span[data-tool]"); + // Buttonify + gtn_tools.addClass("galaxy-proxy-active"); + + gtn_tools.click((e) => { + var target = e.target; + + // Sometimes we get the i or the strong, not the parent. + if (e.target.tagName.toLowerCase() !== "span") { + target = e.target.parentElement; + } + + tool_id = $(target).data("tool"); + + if (tool_id === "upload1" || tool_id === "upload") { + document.getElementById("tool-panel-upload-button").click(); + } else { + Galaxy.router.push(`?tool_id=${tool_id}`); + } + removeOverlay(); + }); + }); + }); } -}); + /* The masthead icon may not exist yet when this webhook executes; we need this to wait for that to happen. + * elementReady function from gist: + * https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e + */ + function elementReady(selector) { + return new Promise((resolve, reject) => { + let el = document.querySelector(selector); + if (el) { + resolve(el); + } + new MutationObserver((mutationRecords, observer) => { + // Query for elements matching the specified selector + Array.from(document.querySelectorAll(selector)).forEach((element) => { + resolve(element); + //Once we have resolved we don't need the observer anymore. + observer.disconnect(); + }); + }).observe(document.documentElement, { + childList: true, + subtree: true, + }); + }); + } + + elementReady("#gtn a").then((el) => { + // External stuff may also have attached a click handler here (vue-based masthead) + // replace with a clean copy of the node to remove all that cruft. + clean = el.cloneNode(true); + el.parentNode.replaceChild(clean, el); + clean.addEventListener("click", (e) => { + e.preventDefault(); + e.stopPropagation(); + if (!gtnWebhookLoaded) { + addIframe(); + } else { + showOverlay(); + } + }); + }); + + // Remove the overlay on escape button click + document.addEventListener("keydown", (e) => { + // Check for escape button - "27" + if (e.which === 27 || e.keyCode === 27) { + removeOverlay(); + } + }); +})(); diff --git a/config/plugins/webhooks/news/script.js b/config/plugins/webhooks/news/script.js index 01b9d5354a7..688de22d74e 100644 --- a/config/plugins/webhooks/news/script.js +++ b/config/plugins/webhooks/news/script.js @@ -1,80 +1,84 @@ -function hideNewsOverlay() { - document.getElementById("news-container").style.visibility = "hidden"; -} - -function newsSeen() { - // When it's seen, remove fa, add far. - const newsIconSpan = document.querySelector("#news .fa-bell"); - newsIconSpan.classList.remove("fa"); - newsIconSpan.classList.add("far"); - window.localStorage.setItem("galaxy-news-seen-release", Galaxy.config.version_major); -} - -function newsUnseen() { - // When there is news, remove far, add fa for (default -- same as fas) solid style. - const newsIconSpan = document.querySelector("#news .fa-bell"); - newsIconSpan.classList.remove("far"); - newsIconSpan.classList.add("fa"); -} - -/* The masthead icon may not exist yet when this webhook executes; we need this to wait for that to happen. - * elementReady function from gist: - * https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e - */ -function elementReadyNews(selector) { - return new Promise((resolve, reject) => { - const el = document.querySelector(selector); - if (el) { - resolve(el); +(function () { + function hideNewsOverlay() { + const container = document.getElementById("news-container"); + if (container) { + container.style.visibility = "hidden"; } - new MutationObserver((mutationRecords, observer) => { - // Query for elements matching the specified selector - Array.from(document.querySelectorAll(selector)).forEach((element) => { - resolve(element); - //Once we have resolved we don't need the observer anymore. - observer.disconnect(); + } + + function newsSeen() { + // When it's seen, remove fa, add far. + const newsIconSpan = document.querySelector("#news .fa-bell"); + newsIconSpan.classList.remove("fa"); + newsIconSpan.classList.add("far"); + window.localStorage.setItem("galaxy-news-seen-release", Galaxy.config.version_major); + } + + function newsUnseen() { + // When there is news, remove far, add fa for (default -- same as fas) solid style. + const newsIconSpan = document.querySelector("#news .fa-bell"); + newsIconSpan.classList.remove("far"); + newsIconSpan.classList.add("fa"); + } + + /* The masthead icon may not exist yet when this webhook executes; we need this to wait for that to happen. + * elementReady function from gist: + * https://gist.github.com/jwilson8767/db379026efcbd932f64382db4b02853e + */ + function elementReadyNews(selector) { + return new Promise((resolve, reject) => { + const el = document.querySelector(selector); + if (el) { + resolve(el); + } + new MutationObserver((mutationRecords, observer) => { + // Query for elements matching the specified selector + Array.from(document.querySelectorAll(selector)).forEach((element) => { + resolve(element); + //Once we have resolved we don't need the observer anymore. + observer.disconnect(); + }); + }).observe(document.documentElement, { + childList: true, + subtree: true, }); - }).observe(document.documentElement, { - childList: true, - subtree: true, }); - }); -} - -elementReadyNews("#news a").then((el) => { - // External stuff may also have attached a click handler here (vue-based masthead) - // replace with a clean copy of the node to remove all that cruft. - clean = el.cloneNode(true); - el.parentNode.replaceChild(clean, el); - - let currentGalaxyVersion = Galaxy.config.version_major; - - // TODO/@hexylena: By 21.01 we will have a proper solution for this. For - // now we'll hardcode the version users 'see'. @hexylena will remove this - // code when she writes the user-facing release notes, and then will file - // an issue for how we'll fix this properly. - if (currentGalaxyVersion == "22.01") { - currentGalaxyVersion = "21.09"; } - const releaseNotes = `https://docs.galaxyproject.org/en/latest/releases/${currentGalaxyVersion}_announce_user.html`; - const lastSeenVersion = window.localStorage.getItem("galaxy-news-seen-release"); - // Check that they've seen the current version's release notes. - if (lastSeenVersion != currentGalaxyVersion) { - newsUnseen(); - } else { - newsSeen(); - } + elementReadyNews("#news a").then((el) => { + // External stuff may also have attached a click handler here (vue-based masthead) + // replace with a clean copy of the node to remove all that cruft. + clean = el.cloneNode(true); + el.parentNode.replaceChild(clean, el); - clean.addEventListener("click", (e) => { - e.preventDefault(); - e.stopPropagation(); + let currentGalaxyVersion = Galaxy.config.version_major; - // If element doesn't exist, add it. - if (document.getElementById("news-container") == null) { - document.querySelector("body.full-content").insertAdjacentHTML( - "afterbegin", - ` + // TODO/@hexylena: By 21.01 we will have a proper solution for this. For + // now we'll hardcode the version users 'see'. @hexylena will remove this + // code when she writes the user-facing release notes, and then will file + // an issue for how we'll fix this properly. + if (currentGalaxyVersion == "22.01") { + currentGalaxyVersion = "21.09"; + } + + const releaseNotes = `https://docs.galaxyproject.org/en/latest/releases/${currentGalaxyVersion}_announce_user.html`; + const lastSeenVersion = window.localStorage.getItem("galaxy-news-seen-release"); + // Check that they've seen the current version's release notes. + if (lastSeenVersion != currentGalaxyVersion) { + newsUnseen(); + } else { + newsSeen(); + } + + clean.addEventListener("click", (e) => { + e.preventDefault(); + e.stopPropagation(); + + // If element doesn't exist, add it. + if (document.getElementById("news-container") == null) { + document.querySelector("body.full-content").insertAdjacentHTML( + "afterbegin", + ` ` - ); - // Clicking outside of GTN closes it - document.getElementById("news-screen").addEventListener("click", () => { - hideNewsOverlay(); - }); - } - document.getElementById("news-container").style.visibility = "visible"; - newsSeen(); + ); + // Clicking outside of GTN closes it + document.getElementById("news-screen").addEventListener("click", () => { + hideNewsOverlay(); + }); + } + document.getElementById("news-container").style.visibility = "visible"; + newsSeen(); + }); }); -}); -// Remove the overlay on escape button click -document.addEventListener("keydown", (e) => { - // Check for escape button - "27" - if (e.which === 27 || e.keyCode === 27) { - hideNewsOverlay(); - } -}); + // Remove the overlay on escape button click + document.addEventListener("keydown", (e) => { + // Check for escape button - "27" + if (e.which === 27 || e.keyCode === 27) { + hideNewsOverlay(); + } + }); +})();