diff --git a/extras/addon_permalink_to_personal_result.js b/extras/addon_permalink_to_personal_result.js new file mode 100644 index 0000000..78ddd63 --- /dev/null +++ b/extras/addon_permalink_to_personal_result.js @@ -0,0 +1,167 @@ +// FUNKTION +// Erzeuge über der Ergebnistabelle einen Button, der einen Permalink kopiert, mit man zurück zu der persönlichen Ergebnisseite gelangt + +// 1.) Allgemeine Angaben +// Text im Button +const PERMALINK_BUTTON_TEXT = "Ergebnis speichern"; + +const PERMALINK_BUTTON_BACKGROUND_COLOR = "var(--secondary-color)"; + +const PERMALINK_BUTTON_TEXT_COLOR = "var(--secondary-text-color, #ffffff)"; + +// Erklärtext, der für ein paar Sekunden angezeigt wird, wenn man auf den Button klickt +const PERMALINK_DESCRIPTION_TEXT = + "Es wurde ein Permalink generiert und in deine Zwischenablage kopiert. Speichere diesen Link und rufe ihn später auf, um wieder zu dieser persönlichen Ergebnisseite zu gelangen - oder leite ihn weiter, um dein Ranking mit anderen zu teilen."; + +const PERMALINK_DESCRIPTION_BORDER_COLOR = "var(--success)"; + +const PERMALINK_DESCRIPTION_BORDER_RADIUS = "var(--border-radius)"; + +// Wie viele Sekunden soll der Erklärtext angezeigt werden, bevor er wieder verschwindet? +const PERMALINK_DESCRIPTION_DURATION = 8; + +const LOADING_MODAL_TEXT = "Deine Ergebnisseite lädt..."; + +// 2.) In der DEFINITION.JS in den Erweiterten Einstellungen das Add-On eintragen. +// Add the add-on to the advanced settings in DEFINITION.JS +// var addons = ["extras/addon_permalink_to_personal_results.js"] + +// 3.) Fertig. +// That's it. + +/// //////////////////////////////////////////////////////////////////// + +// Hier kommt nur noch Quellcode. Bitte gehen Sie weiter. Hier gibt es nichts zu sehen. +// That's just source code. Please move on. Nothing to see here. + +/// //////////////////////////////////////////////////////////////////// + +window.addEventListener("load", () => { + // Suche in der URL nach Parameter und führe ggf. Funktion aus + fnProcessPermalink(); + + const observerResults = new MutationObserver(fnGeneratePermalink); + observerResults.observe(document.querySelector("#resultsHeading"), { + childList: true, + }); + + // Ist eine inner function, damit sie Zugriff auf die Variable observerResults hat (zum Disconnecten) + function fnGeneratePermalink() { + // Ohne .disconnect() wird die Mutation aus irgendeinem Grund doppelt getriggert -> 2 Buttons + observerResults.disconnect(); + + const permalinkContainer = document.createElement("div"); + permalinkContainer.setAttribute("id", "permalink-container"); + permalinkContainer.innerHTML = ` +
\ + ${PERMALINK_DESCRIPTION_TEXT}
`; + const permalinkDescription = permalinkContainer.querySelector( + "#permalink-description" + ); + permalinkContainer + .querySelector("#permalink-button") + .addEventListener("click", () => { + let permalinkUrl = window.location.origin + window.location.pathname; + // Add parameter with personal positions + permalinkUrl += "?personalpositions=" + arPersonalPositions.join(","); + // Add parameter with voting double values, encode to numbers to avoid confusing strings like "false,false,false..." in the URL + permalinkUrl += + "&votingdouble=" + + arVotingDouble.map((element) => +element).join(","); + navigator.clipboard.writeText(permalinkUrl); + permalinkDescription.style.maxHeight = + permalinkDescription.scrollHeight + 20 + "px"; + permalinkDescription.classList.add("permalink-description-visible"); + setTimeout(() => { + permalinkDescription.style.maxHeight = 0; + permalinkDescription.classList.remove( + "permalink-description-visible" + ); + }, PERMALINK_DESCRIPTION_DURATION * 1000); + }); + document + .querySelector("#resultsShort") + .insertBefore( + permalinkContainer, + document.querySelector("#resultsShortTable") + ); + } + + addCssForPermalinkElements(); +}); + +function fnProcessPermalink() { + const urlParams = new URLSearchParams(window.location.search); + const personalPositionsFromUrl = urlParams.get("personalpositions"); + const votingDoubleFromUrl = urlParams.get("votingdouble"); + if (personalPositionsFromUrl) { + // Ladebildschirm anzeigen + document.querySelector(".container").classList.add("d-none"); + const loadingModalContainer = document.createElement("div"); + loadingModalContainer.innerHTML = ` +