{"version":3,"file":"scrollspy.min.js","sources":["https:\/\/moodle.polymtl.ca\/theme\/boost_union\/amd\/src\/scrollspy.js"],"sourcesContent":["\/\/ This file is part of Moodle - http:\/\/moodle.org\/\n\/\/\n\/\/ Moodle is free software: you can redistribute it and\/or modify\n\/\/ it under the terms of the GNU General Public License as published by\n\/\/ the Free Software Foundation, either version 3 of the License, or\n\/\/ (at your option) any later version.\n\/\/\n\/\/ Moodle is distributed in the hope that it will be useful,\n\/\/ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\/\/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\/\/ GNU General Public License for more details.\n\/\/\n\/\/ You should have received a copy of the GNU General Public License\n\/\/ along with Moodle. If not, see .\n\n\/**\n * Theme Boost Union - JS code scroll-spy\n *\n * @module theme_boost_union\/scrollspy\n * @copyright 2022 Josha Bartsch \n * @copyright based on code from theme_fordson by Chris Kenniburg.\n * @license http:\/\/www.gnu.org\/copyleft\/gpl.html GNU GPL v3 or later\n *\/\n\n\/**\n * Runs once at initial load, and once at editmode-switch toggle.\n * Incase of initial load, checks sessionStorage whether a position was set and jumps to the appropriate position.\n *\n * Incase of a click on the switch, iterates over central elements (selector .section.main), determines element\n * with minimal distance between pixel-toprow of view and pixel-toprow of the element.\n * Writes element ID + distance of view from element into session storage.\n *\n * Saving a reference point + relative distance grants leeway for varying page elements.\n * (See original implementation: https:\/\/raw.githubusercontent.com\/dbnschools\/moodle-theme_fordson\/master\/javascript\/scrollspy.js)\n *\/\nconst initScrollSpy = () => {\n \/\/ Check if .section.main exist.\n if (document.querySelector('.section.main')) {\n \/\/ Unfortunately the editmode-switch carries no unique ID\n let editToggle = document.querySelector('form.editmode-switch-form');\n if (!editToggle) {\n \/\/ Do not continue when there is no edit toggle.\n return;\n }\n editToggle.addEventListener('click', () => {\n\n window.sessionStorage.setItem('theme_boost_union_scrollspy_edittoggled', true);\n\n let viewporttop = window.scrollY;\n let closest = null;\n let closestoffset = null;\n\n document.querySelectorAll('.section.main').forEach((node) => {\n let thisoffset = node.offsetTop;\n\n if (closest && closest.offsetTop) {\n closestoffset = closest.offsetTop;\n }\n if (closest === null || Math.abs(thisoffset - viewporttop) < Math.abs(closestoffset - viewporttop)) {\n closest = node;\n }\n });\n\n window.sessionStorage.setItem('theme_boost_union_scrollspy_closestid', closest.id);\n window.sessionStorage.setItem('theme_boost_union_scrollspy_closestdelta', viewporttop - closest.offsetTop);\n });\n let edittoggled = window.sessionStorage.getItem('theme_boost_union_scrollspy_edittoggled');\n if (edittoggled) {\n\n let closestid = window.sessionStorage.getItem('theme_boost_union_scrollspy_closestid');\n let closestdelta = window.sessionStorage.getItem('theme_boost_union_scrollspy_closestdelta');\n\n if (closestid && closestdelta) {\n let closest = document.getElementById(closestid);\n let y = closest.offsetTop + parseInt(closestdelta);\n\n window.scrollTo(0, y);\n }\n\n window.sessionStorage.removeItem('theme_boost_union_scrollspy_edittoggled');\n window.sessionStorage.removeItem('theme_boost_union_scrollspy_closestid');\n window.sessionStorage.removeItem('theme_boost_union_scrollspy_closestdelta');\n }\n }\n};\n\n\/**\n * Ensures the passed function will be called after the DOM is ready\/loaded:\n * Incase DOM is fully loaded when JS is called, call within next tick.\n * Otherwise sets an eventlistener for DOMEventLoaded\n *\n * @param {*} callback\n *\/\nconst docReady = (callback) => {\n if (document.readyState === \"complete\" || document.readyState === \"interactive\") {\n setTimeout(callback, 1);\n } else {\n document.addEventListener('DOMContentLoaded', callback);\n }\n};\n\nexport const init = () => {\n docReady(initScrollSpy);\n};\n"],"names":["initScrollSpy","document","querySelector","editToggle","addEventListener","window","sessionStorage","setItem","viewporttop","scrollY","closest","closestoffset","querySelectorAll","forEach","node","thisoffset","offsetTop","Math","abs","id","getItem","closestid","closestdelta","y","getElementById","parseInt","scrollTo","removeItem","callback","readyState","setTimeout"],"mappings":";;;;;;;;;MAmCMA,cAAgB,QAEdC,SAASC,cAAc,iBAAkB,KAErCC,WAAaF,SAASC,cAAc,iCACnCC,qBAILA,WAAWC,iBAAiB,SAAS,KAEjCC,OAAOC,eAAeC,QAAQ,2CAA2C,OAErEC,YAAcH,OAAOI,QACrBC,QAAU,KACVC,cAAgB,KAEpBV,SAASW,iBAAiB,iBAAiBC,SAASC,WAC5CC,WAAaD,KAAKE,UAElBN,SAAWA,QAAQM,YACnBL,cAAgBD,QAAQM,YAEZ,OAAZN,SAAoBO,KAAKC,IAAIH,WAAaP,aAAeS,KAAKC,IAAIP,cAAgBH,gBAClFE,QAAUI,SAIlBT,OAAOC,eAAeC,QAAQ,wCAAyCG,QAAQS,IAC\/Ed,OAAOC,eAAeC,QAAQ,2CAA4CC,YAAcE,QAAQM,cAElFX,OAAOC,eAAec,QAAQ,2CAC\/B,KAETC,UAAYhB,OAAOC,eAAec,QAAQ,yCAC1CE,aAAejB,OAAOC,eAAec,QAAQ,+CAE7CC,WAAaC,aAAc,KAEvBC,EADUtB,SAASuB,eAAeH,WACtBL,UAAYS,SAASH,cAErCjB,OAAOqB,SAAS,EAAGH,GAGvBlB,OAAOC,eAAeqB,WAAW,2CACjCtB,OAAOC,eAAeqB,WAAW,yCACjCtB,OAAOC,eAAeqB,WAAW,6DAoBzB,KARFC,IAAAA,SAAAA,SASL5B,cARmB,aAAxBC,SAAS4B,YAAqD,gBAAxB5B,SAAS4B,WAC\/CC,WAAWF,SAAU,GAErB3B,SAASG,iBAAiB,mBAAoBwB"}