diff --git a/element/chapter/amd/build/chapter.min.js b/element/chapter/amd/build/chapter.min.js index 5b45dc0..ae735b9 100644 --- a/element/chapter/amd/build/chapter.min.js +++ b/element/chapter/amd/build/chapter.min.js @@ -1,3 +1,3 @@ -define("element_chapter/chapter",["jquery","mod_contentdesigner/elements","core/ajax","core/fragment","core/templates","core/loadingicon","core/notification","core/str"],(function($,Elements,AJAX,Fragment,Templates,LoadingIcon,Notification,Str){let completionIcon,completionStr;const completeChapterListener=e=>{var completeCTA=e.target.closest("button.complete-chapter");if(null!=completeCTA){e.preventDefault();var chapter=completeCTA.dataset.chapterid;completeChapter(chapter,completeCTA).done((()=>{updateProgress(),completeCTA.classList.remove("btn-outline-secondary"),completeCTA.classList.add("btn-success"),completeCTA.innerHTML=completionIcon+" "+completionStr,Elements.removeWarning(),Elements.refreshContent()})).catch(Notification.exception)}},stickyProgress=function(){var progressElem=document.querySelector(".contentdesigner-progress"),contentWrapper=document.querySelector(".contentdesigner-content");null!=contentWrapper&&contentWrapper.getBoundingClientRect().top<50?(contentWrapper.classList.add("sticky-progress"),progressElem.classList.add("fixed-top")):(progressElem.classList.remove("fixed-top"),contentWrapper.classList.remove("sticky-progress"))},completeChapter=(chapter,button)=>{var promises=AJAX.call([{methodname:"element_chapter_update_completion",args:{chapter:chapter,cmid:Elements.contentDesignerData().cmid}}]);return LoadingIcon.addIconToContainerRemoveOnCompletion(button,promises[0]),promises[0]},updateProgress=()=>{var params={cmid:Elements.contentDesignerData().cmid};Fragment.loadFragment("element_chapter","update_progressbar",Elements.contentDesignerData().contextid,params).done(((html,js)=>{Templates.replaceNode("div#contentdesigner-progressbar",html,js)})).catch(Notification.exception)};return{init:function(){Templates.renderPix("e/tick","core").done((function(img){completionIcon=img})),Str.get_string("completion_manual:done","course").done((str=>{completionStr=str})),document.body.removeEventListener("click",completeChapterListener),document.body.addEventListener("click",completeChapterListener),document.querySelector("#page").addEventListener("scroll",(()=>{stickyProgress()})),window.addEventListener("scroll",(()=>{stickyProgress()}))}}})); +define("element_chapter/chapter",["jquery","mod_contentdesigner/elements","core/ajax","core/fragment","core/templates","core/loadingicon","core/notification","core/str"],(function($,Elements,AJAX,Fragment,Templates,LoadingIcon,Notification,Str){let completionIcon,completionStr;const completeChapterListener=e=>{var completeCTA=e.target.closest("button.complete-chapter");if(null!=completeCTA){e.preventDefault();var chapter=completeCTA.dataset.chapterid;completeChapter(chapter,completeCTA).done((()=>{updateProgress(),completeCTA.classList.remove("btn-outline-secondary"),completeCTA.classList.add("btn-success"),completeCTA.innerHTML=completionIcon+" "+completionStr,Elements.removeWarning(),Elements.refreshContent()})).catch(Notification.exception)}},stickyProgress=function(){var progressElem=document.querySelector(".contentdesigner-progress"),contentWrapper=document.querySelector(".contentdesigner-content");null!=contentWrapper&&contentWrapper.getBoundingClientRect().top<50?(contentWrapper.classList.add("sticky-progress"),progressElem.classList.add("fixed-top")):(progressElem.classList.remove("fixed-top"),contentWrapper.classList.remove("sticky-progress"))},completeChapter=(chapter,button)=>{var promises=AJAX.call([{methodname:"element_chapter_update_completion",args:{chapter:chapter,cmid:Elements.contentDesignerData().cmid}}]);return LoadingIcon.addIconToContainerRemoveOnCompletion(button,promises[0]),promises[0]},updateProgress=()=>{var params={cmid:Elements.contentDesignerData().cmid};Fragment.loadFragment("element_chapter","update_progressbar",Elements.contentDesignerData().contextid,params).done(((html,js)=>{Templates.replaceNode("div#contentdesigner-progressbar",html,js)})).catch(Notification.exception)};return{init:function(){(()=>{Templates.renderPix("e/tick","core").done((function(img){completionIcon=img})),Str.get_string("completion_manual:done","course").done((str=>{completionStr=str})),document.body.removeEventListener("click",completeChapterListener),document.body.addEventListener("click",completeChapterListener),document.querySelector("#page").addEventListener("scroll",(()=>{stickyProgress()}));var popup=document.querySelector("body.format-popups .modal-content .modal-body");null!==popup&&popup.addEventListener("scroll",(()=>{stickyProgress()})),window.addEventListener("scroll",(()=>{stickyProgress()}))})()}}})); //# sourceMappingURL=chapter.min.js.map \ No newline at end of file diff --git a/element/chapter/amd/build/chapter.min.js.map b/element/chapter/amd/build/chapter.min.js.map index ddafcc5..d4a90b7 100644 --- a/element/chapter/amd/build/chapter.min.js.map +++ b/element/chapter/amd/build/chapter.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chapter.min.js","sources":["../src/chapter.js"],"sourcesContent":["define(['jquery', 'mod_contentdesigner/elements', 'core/ajax', 'core/fragment',\n 'core/templates', 'core/loadingicon', 'core/notification', 'core/str'],\n function ($, Elements, AJAX, Fragment, Templates, LoadingIcon, Notification, Str) {\n\n const chapterCTA = 'button.complete-chapter';\n\n const progressBar = 'div#contentdesigner-progressbar';\n\n let completionIcon, completionStr;\n\n const initEventListeners = () => {\n Templates.renderPix('e/tick', 'core').done(function (img) {\n completionIcon = img;\n });\n Str.get_string('completion_manual:done', 'course').done((str) => {\n completionStr = str;\n });\n // Remove previous eventlisteners on body. to support popup format.\n document.body.removeEventListener('click', completeChapterListener);\n document.body.addEventListener('click', completeChapterListener);\n\n document.querySelector('#page').addEventListener('scroll', () => {\n stickyProgress();\n });\n\n window.addEventListener('scroll', () => {\n stickyProgress();\n });\n };\n\n const completeChapterListener = (e) => {\n var completeCTA = e.target.closest(chapterCTA);\n if (completeCTA != undefined) {\n e.preventDefault();\n var chapter = completeCTA.dataset.chapterid;\n var promise = completeChapter(chapter, completeCTA);\n promise.done(() => {\n updateProgress();\n completeCTA.classList.remove('btn-outline-secondary');\n completeCTA.classList.add('btn-success');\n completeCTA.innerHTML = completionIcon + ' ' + completionStr;\n Elements.removeWarning();\n Elements.refreshContent();\n // TODO: Add a additional function to support loadnext chapter works like replaceonrefresh.\n // Until hide this loadNextchapters().\n // Elements.loadNextChapters(chapter);\n }).catch(Notification.exception);\n }\n };\n\n const stickyProgress = function () {\n var progressElem = document.querySelector('.contentdesigner-progress');\n var contentWrapper = document.querySelector('.contentdesigner-content');\n if (contentWrapper != undefined && contentWrapper.getBoundingClientRect().top < 50) {\n contentWrapper.classList.add('sticky-progress');\n progressElem.classList.add('fixed-top');\n } else {\n progressElem.classList.remove('fixed-top');\n contentWrapper.classList.remove('sticky-progress');\n }\n };\n\n const completeChapter = (chapter, button) => {\n var promises = AJAX.call([{\n methodname: 'element_chapter_update_completion',\n args: {\n chapter: chapter,\n cmid: Elements.contentDesignerData().cmid\n }\n }]);\n LoadingIcon.addIconToContainerRemoveOnCompletion(button, promises[0]);\n\n return promises[0];\n };\n\n const updateProgress = () => {\n var params = { cmid: Elements.contentDesignerData().cmid };\n Fragment.loadFragment('element_chapter', 'update_progressbar', Elements.contentDesignerData().contextid, params).done((html, js) => {\n Templates.replaceNode(progressBar, html, js);\n }).catch(Notification.exception);\n };\n\n return {\n init: function () {\n initEventListeners();\n },\n };\n });\n"],"names":["define","$","Elements","AJAX","Fragment","Templates","LoadingIcon","Notification","Str","completionIcon","completionStr","completeChapterListener","e","completeCTA","target","closest","undefined","preventDefault","chapter","dataset","chapterid","completeChapter","done","updateProgress","classList","remove","add","innerHTML","removeWarning","refreshContent","catch","exception","stickyProgress","progressElem","document","querySelector","contentWrapper","getBoundingClientRect","top","button","promises","call","methodname","args","cmid","contentDesignerData","addIconToContainerRemoveOnCompletion","params","loadFragment","contextid","html","js","replaceNode","init","renderPix","img","get_string","str","body","removeEventListener","addEventListener","window"],"mappings":"AAAAA,iCAAO,CAAC,SAAU,+BAAgC,YAAa,gBAC3D,iBAAkB,mBAAoB,oBAAqB,aAC3D,SAAUC,EAAGC,SAAUC,KAAMC,SAAUC,UAAWC,YAAaC,aAAcC,SAMrEC,eAAgBC,oBAsBdC,wBAA2BC,QACzBC,YAAcD,EAAEE,OAAOC,QA3BZ,8BA4BIC,MAAfH,YAA0B,CAC1BD,EAAEK,qBACEC,QAAUL,YAAYM,QAAQC,UACpBC,gBAAgBH,QAASL,aAC/BS,MAAK,KACTC,iBACAV,YAAYW,UAAUC,OAAO,yBAC7BZ,YAAYW,UAAUE,IAAI,eAC1Bb,YAAYc,UAAYlB,eAAiB,IAAMC,cAC/CR,SAAS0B,gBACT1B,SAAS2B,oBAIVC,MAAMvB,aAAawB,aAIxBC,eAAiB,eACfC,aAAeC,SAASC,cAAc,6BACtCC,eAAiBF,SAASC,cAAc,4BACtBnB,MAAlBoB,gBAA+BA,eAAeC,wBAAwBC,IAAM,IAC5EF,eAAeZ,UAAUE,IAAI,mBAC7BO,aAAaT,UAAUE,IAAI,eAE3BO,aAAaT,UAAUC,OAAO,aAC9BW,eAAeZ,UAAUC,OAAO,qBAIlCJ,gBAAkB,CAACH,QAASqB,cAC1BC,SAAWrC,KAAKsC,KAAK,CAAC,CACtBC,WAAY,oCACZC,KAAM,CACFzB,QAASA,QACT0B,KAAM1C,SAAS2C,sBAAsBD,gBAG7CtC,YAAYwC,qCAAqCP,OAAQC,SAAS,IAE3DA,SAAS,IAGdjB,eAAiB,SACfwB,OAAS,CAAEH,KAAM1C,SAAS2C,sBAAsBD,MACpDxC,SAAS4C,aAAa,kBAAmB,qBAAsB9C,SAAS2C,sBAAsBI,UAAWF,QAAQzB,MAAK,CAAC4B,KAAMC,MACzH9C,UAAU+C,YAxEE,kCAwEuBF,KAAMC,OAC1CrB,MAAMvB,aAAawB,kBAGnB,CACHsB,KAAM,WAxENhD,UAAUiD,UAAU,SAAU,QAAQhC,MAAK,SAAUiC,KACjD9C,eAAiB8C,OAErB/C,IAAIgD,WAAW,yBAA0B,UAAUlC,MAAMmC,MACrD/C,cAAgB+C,OAGpBvB,SAASwB,KAAKC,oBAAoB,QAAShD,yBAC3CuB,SAASwB,KAAKE,iBAAiB,QAASjD,yBAExCuB,SAASC,cAAc,SAASyB,iBAAiB,UAAU,KACvD5B,oBAGJ6B,OAAOD,iBAAiB,UAAU,KAC9B5B"} \ No newline at end of file +{"version":3,"file":"chapter.min.js","sources":["../src/chapter.js"],"sourcesContent":["define(['jquery', 'mod_contentdesigner/elements', 'core/ajax', 'core/fragment',\n 'core/templates', 'core/loadingicon', 'core/notification', 'core/str'],\n function ($, Elements, AJAX, Fragment, Templates, LoadingIcon, Notification, Str) {\n\n const chapterCTA = 'button.complete-chapter';\n\n const progressBar = 'div#contentdesigner-progressbar';\n\n let completionIcon, completionStr;\n\n const initEventListeners = () => {\n Templates.renderPix('e/tick', 'core').done(function (img) {\n completionIcon = img;\n });\n Str.get_string('completion_manual:done', 'course').done((str) => {\n completionStr = str;\n });\n // Remove previous eventlisteners on body. to support popup format.\n document.body.removeEventListener('click', completeChapterListener);\n document.body.addEventListener('click', completeChapterListener);\n\n document.querySelector('#page').addEventListener('scroll', () => {\n stickyProgress();\n });\n\n // Popup format support.\n var popup = document.querySelector('body.format-popups .modal-content .modal-body');\n if (popup !== null) {\n popup.addEventListener('scroll', () => {\n stickyProgress();\n });\n }\n\n window.addEventListener('scroll', () => {\n stickyProgress();\n });\n };\n\n const completeChapterListener = (e) => {\n var completeCTA = e.target.closest(chapterCTA);\n if (completeCTA != undefined) {\n e.preventDefault();\n var chapter = completeCTA.dataset.chapterid;\n var promise = completeChapter(chapter, completeCTA);\n promise.done(() => {\n updateProgress();\n completeCTA.classList.remove('btn-outline-secondary');\n completeCTA.classList.add('btn-success');\n completeCTA.innerHTML = completionIcon + ' ' + completionStr;\n Elements.removeWarning();\n Elements.refreshContent();\n // TODO: Add a additional function to support loadnext chapter works like replaceonrefresh.\n // Until hide this loadNextchapters().\n // Elements.loadNextChapters(chapter);\n }).catch(Notification.exception);\n }\n };\n\n const stickyProgress = function () {\n var progressElem = document.querySelector('.contentdesigner-progress');\n var contentWrapper = document.querySelector('.contentdesigner-content');\n if (contentWrapper != undefined && contentWrapper.getBoundingClientRect().top < 50) {\n contentWrapper.classList.add('sticky-progress');\n progressElem.classList.add('fixed-top');\n } else {\n progressElem.classList.remove('fixed-top');\n contentWrapper.classList.remove('sticky-progress');\n }\n };\n\n const completeChapter = (chapter, button) => {\n var promises = AJAX.call([{\n methodname: 'element_chapter_update_completion',\n args: {\n chapter: chapter,\n cmid: Elements.contentDesignerData().cmid\n }\n }]);\n LoadingIcon.addIconToContainerRemoveOnCompletion(button, promises[0]);\n\n return promises[0];\n };\n\n const updateProgress = () => {\n var params = { cmid: Elements.contentDesignerData().cmid };\n Fragment.loadFragment('element_chapter', 'update_progressbar', Elements.contentDesignerData().contextid, params).done((html, js) => {\n Templates.replaceNode(progressBar, html, js);\n }).catch(Notification.exception);\n };\n\n return {\n init: function () {\n initEventListeners();\n },\n };\n });\n"],"names":["define","$","Elements","AJAX","Fragment","Templates","LoadingIcon","Notification","Str","completionIcon","completionStr","completeChapterListener","e","completeCTA","target","closest","undefined","preventDefault","chapter","dataset","chapterid","completeChapter","done","updateProgress","classList","remove","add","innerHTML","removeWarning","refreshContent","catch","exception","stickyProgress","progressElem","document","querySelector","contentWrapper","getBoundingClientRect","top","button","promises","call","methodname","args","cmid","contentDesignerData","addIconToContainerRemoveOnCompletion","params","loadFragment","contextid","html","js","replaceNode","init","renderPix","img","get_string","str","body","removeEventListener","addEventListener","popup","window","initEventListeners"],"mappings":"AAAAA,iCAAO,CAAC,SAAU,+BAAgC,YAAa,gBAC3D,iBAAkB,mBAAoB,oBAAqB,aAC3D,SAAUC,EAAGC,SAAUC,KAAMC,SAAUC,UAAWC,YAAaC,aAAcC,SAMrEC,eAAgBC,oBA8BdC,wBAA2BC,QACzBC,YAAcD,EAAEE,OAAOC,QAnCZ,8BAoCIC,MAAfH,YAA0B,CAC1BD,EAAEK,qBACEC,QAAUL,YAAYM,QAAQC,UACpBC,gBAAgBH,QAASL,aAC/BS,MAAK,KACTC,iBACAV,YAAYW,UAAUC,OAAO,yBAC7BZ,YAAYW,UAAUE,IAAI,eAC1Bb,YAAYc,UAAYlB,eAAiB,IAAMC,cAC/CR,SAAS0B,gBACT1B,SAAS2B,oBAIVC,MAAMvB,aAAawB,aAIxBC,eAAiB,eACfC,aAAeC,SAASC,cAAc,6BACtCC,eAAiBF,SAASC,cAAc,4BACtBnB,MAAlBoB,gBAA+BA,eAAeC,wBAAwBC,IAAM,IAC5EF,eAAeZ,UAAUE,IAAI,mBAC7BO,aAAaT,UAAUE,IAAI,eAE3BO,aAAaT,UAAUC,OAAO,aAC9BW,eAAeZ,UAAUC,OAAO,qBAIlCJ,gBAAkB,CAACH,QAASqB,cAC1BC,SAAWrC,KAAKsC,KAAK,CAAC,CACtBC,WAAY,oCACZC,KAAM,CACFzB,QAASA,QACT0B,KAAM1C,SAAS2C,sBAAsBD,gBAG7CtC,YAAYwC,qCAAqCP,OAAQC,SAAS,IAE3DA,SAAS,IAGdjB,eAAiB,SACfwB,OAAS,CAAEH,KAAM1C,SAAS2C,sBAAsBD,MACpDxC,SAAS4C,aAAa,kBAAmB,qBAAsB9C,SAAS2C,sBAAsBI,UAAWF,QAAQzB,MAAK,CAAC4B,KAAMC,MACzH9C,UAAU+C,YAhFE,kCAgFuBF,KAAMC,OAC1CrB,MAAMvB,aAAawB,kBAGnB,CACHsB,KAAM,WAjFiB,MACvBhD,UAAUiD,UAAU,SAAU,QAAQhC,MAAK,SAAUiC,KACjD9C,eAAiB8C,OAErB/C,IAAIgD,WAAW,yBAA0B,UAAUlC,MAAMmC,MACrD/C,cAAgB+C,OAGpBvB,SAASwB,KAAKC,oBAAoB,QAAShD,yBAC3CuB,SAASwB,KAAKE,iBAAiB,QAASjD,yBAExCuB,SAASC,cAAc,SAASyB,iBAAiB,UAAU,KACvD5B,wBAIA6B,MAAQ3B,SAASC,cAAc,iDACrB,OAAV0B,OACAA,MAAMD,iBAAiB,UAAU,KAC7B5B,oBAIR8B,OAAOF,iBAAiB,UAAU,KAC9B5B,qBA0DA+B"} \ No newline at end of file diff --git a/element/chapter/amd/src/chapter.js b/element/chapter/amd/src/chapter.js index e33daed..a911c0e 100644 --- a/element/chapter/amd/src/chapter.js +++ b/element/chapter/amd/src/chapter.js @@ -23,6 +23,14 @@ define(['jquery', 'mod_contentdesigner/elements', 'core/ajax', 'core/fragment', stickyProgress(); }); + // Popup format support. + var popup = document.querySelector('body.format-popups .modal-content .modal-body'); + if (popup !== null) { + popup.addEventListener('scroll', () => { + stickyProgress(); + }); + } + window.addEventListener('scroll', () => { stickyProgress(); }); diff --git a/styles.css b/styles.css index 362a4ba..ac455db 100644 --- a/styles.css +++ b/styles.css @@ -317,4 +317,11 @@ body#page-mod-contentdesigner-view { cursor: pointer; } } +} + +.format-popups .modal .modal-body .contentdesigner-content.sticky-progress { + .contentdesigner-progress.fixed-top { + position: sticky; + top: -20px; + } } \ No newline at end of file diff --git a/version.php b/version.php index 326e1a5..7049201 100644 --- a/version.php +++ b/version.php @@ -23,7 +23,7 @@ */ defined('MOODLE_INTERNAL') || die(); -$plugin->version = 2024110802; // The current module version (Date: YYYYMMDDXX). +$plugin->version = 2024110803; // The current module version (Date: YYYYMMDDXX). $plugin->requires = 2020061500; // Requires this Moodle version. $plugin->component = 'mod_contentdesigner'; // Full name of the plugin (used for diagnostics). $plugin->release = 'v1.1';