From c6d5485d6b95ba62f899d6c751983f3c8833233f Mon Sep 17 00:00:00 2001 From: Peter Mayer Date: Thu, 16 May 2024 00:59:34 +0200 Subject: [PATCH] Use cache for getting mootimeter state to indicate changes --- amd/build/get_mootimeterstate.min.js | 3 + amd/build/get_mootimeterstate.min.js.map | 1 + amd/build/handler_input.min.js | 2 +- amd/build/handler_input.min.js.map | 2 +- amd/build/reload_on_state_change.min.js | 3 - amd/build/reload_on_state_change.min.js.map | 1 - amd/build/reload_page.min.js | 2 +- amd/build/reload_page.min.js.map | 2 +- amd/build/reload_page_content.min.js | 2 +- amd/build/reload_page_content.min.js.map | 2 +- amd/build/reload_page_on_state_change.min.js | 3 - .../reload_page_on_state_change.min.js.map | 1 - amd/build/reload_page_settings.min.js | 2 +- amd/build/reload_page_settings.min.js.map | 2 +- amd/build/reload_pagelist.min.js | 2 +- amd/build/reload_pagelist.min.js.map | 2 +- amd/src/get_mootimeterstate.js | 118 ++++++++++++++++++ amd/src/handler_input.js | 14 +-- amd/src/reload_on_state_change.js | 70 ----------- amd/src/reload_page.js | 107 ++++++++++------ amd/src/reload_page_content.js | 5 +- amd/src/reload_page_on_state_change.js | 43 ------- amd/src/reload_page_settings.js | 5 +- amd/src/reload_pagelist.js | 59 +++------ classes/external/get_mootimeterstate.php | 117 +++++++++++++++++ classes/helper.php | 96 +++----------- classes/local/mootimeterstate.php | 67 ++++++++++ classes/local/pagelist.php | 29 +---- db/services.php | 8 ++ lib.php | 5 +- .../snippet_mootimeter_state.mustache | 6 +- tests/generator/lib.php | 1 + tests/helper_test.php | 35 ++++-- tests/privacy/provider_test.php | 3 + tools/quiz/amd/build/chart_draw.min.js | 2 +- tools/quiz/amd/build/chart_draw.min.js.map | 2 +- tools/quiz/amd/src/chart_draw.js | 14 ++- tools/quiz/classes/external/get_answers.php | 2 - tools/quiz/classes/quiz.php | 9 +- tools/quiz/templates/view_content.mustache | 4 - tools/quiz/templates/view_overview.mustache | 4 - tools/quiz/templates/view_results.mustache | 3 - .../amd/build/redraw_wordcloud.min.js | 2 +- .../amd/build/redraw_wordcloud.min.js.map | 2 +- tools/wordcloud/amd/src/redraw_wordcloud.js | 15 +-- .../classes/external/get_answers.php | 12 +- tools/wordcloud/classes/wordcloud.php | 2 +- .../wordcloud/templates/view_content.mustache | 4 - .../templates/view_overview.mustache | 4 - .../wordcloud/templates/view_results.mustache | 10 ++ version.php | 2 +- view.php | 3 +- 52 files changed, 524 insertions(+), 392 deletions(-) create mode 100644 amd/build/get_mootimeterstate.min.js create mode 100644 amd/build/get_mootimeterstate.min.js.map delete mode 100644 amd/build/reload_on_state_change.min.js delete mode 100644 amd/build/reload_on_state_change.min.js.map delete mode 100644 amd/build/reload_page_on_state_change.min.js delete mode 100644 amd/build/reload_page_on_state_change.min.js.map create mode 100644 amd/src/get_mootimeterstate.js delete mode 100644 amd/src/reload_on_state_change.js delete mode 100644 amd/src/reload_page_on_state_change.js create mode 100644 classes/external/get_mootimeterstate.php diff --git a/amd/build/get_mootimeterstate.min.js b/amd/build/get_mootimeterstate.min.js new file mode 100644 index 00000000..6b973014 --- /dev/null +++ b/amd/build/get_mootimeterstate.min.js @@ -0,0 +1,3 @@ +define("mod_mootimeter/get_mootimeterstate",["exports","core/ajax","core/log","mod_mootimeter/reload_page"],(function(_exports,_ajax,_log,_reload_page){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=_exports.getMootimeterstate=void 0,_log=(obj=_log)&&obj.__esModule?obj:{default:obj};_exports.init=refreshintervall=>{document.getElementById("mootimeterstate")?(refreshintervall<1e3&&(refreshintervall=1e3),initMootimeterstate(),setInterval((()=>{getMootimeterstate()}),refreshintervall)):window.console.log("Early exit")};const initMootimeterstate=async()=>{await getMootimeterstate();var dataset=document.getElementById("mootimeterstate").dataset;const queryString=window.location.search,urlParams=new URLSearchParams(queryString),cmid=urlParams.get("id");urlParams.get("r")&&(dataset.r=urlParams.get("r")),urlParams.get("o")&&(dataset.o=urlParams.get("o"));var pageid=0;dataset.pageid?pageid=dataset.pageid:urlParams.get("pageid")&&(pageid=urlParams.get("pageid")),await(0,_reload_page.execReloadPage)(pageid,cmid,dataset)},getMootimeterstate=async()=>{var mtmstate=document.getElementById("mootimeterstate"),dataset=mtmstate.dataset;const queryString=window.location.search,urlParams=new URLSearchParams(queryString),cmid=urlParams.get("id");urlParams.get("r")&&(dataset.r=urlParams.get("r")),urlParams.get("o")&&(dataset.o=urlParams.get("o"));var pageid=0;dataset.pageid?pageid=dataset.pageid:urlParams.get("pageid")&&(pageid=urlParams.get("pageid"));const response=await((pageid,cmid,dataset)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_mootimeterstate",args:{pageid:pageid,cmid:cmid,dataset:dataset}}])[0])(pageid,cmid,JSON.stringify(dataset));if(200!=response.code&&_log.default.error(response.string),200==response.code){const states=JSON.parse(response.state);for(let dataattribute in states)mtmstate.setAttribute("data-"+dataattribute,states[dataattribute]);mtmstate.dataset.contentchangedat_prev!=mtmstate.dataset.contentchangedat&&(mtmstate.setAttribute("data-settingschangedat_prev",0),mtmstate.setAttribute("data-contentlastupdated",0),(0,_reload_page.execReloadPage)(pageid,cmid,dataset))}};_exports.getMootimeterstate=getMootimeterstate})); + +//# sourceMappingURL=get_mootimeterstate.min.js.map \ No newline at end of file diff --git a/amd/build/get_mootimeterstate.min.js.map b/amd/build/get_mootimeterstate.min.js.map new file mode 100644 index 00000000..78b152b5 --- /dev/null +++ b/amd/build/get_mootimeterstate.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"get_mootimeterstate.min.js","sources":["../src/get_mootimeterstate.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\nimport {execReloadPage as reloadPage} from 'mod_mootimeter/reload_page';\n\nexport const init = (refreshintervall) => {\n\n var obj = document.getElementById('mootimeterstate');\n if (!obj) {\n window.console.log(\"Early exit\");\n return;\n }\n\n if (refreshintervall < 1000) {\n refreshintervall = 1000;\n }\n\n initMootimeterstate();\n\n setInterval(() => {\n getMootimeterstate();\n }, refreshintervall);\n};\n\n/**\n * Make the call to get the Mootimeterstate\n * @param {int} pageid\n * @param {int} cmid\n * @param {string} dataset\n * @returns {array}\n */\nconst getMootimeterstateExecute = (\n pageid,\n cmid,\n dataset\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_mootimeterstate',\n args: {\n pageid,\n cmid,\n dataset\n },\n}])[0];\n\nconst initMootimeterstate = async() => {\n\n await getMootimeterstate();\n\n var mtmstate = document.getElementById('mootimeterstate');\n var dataset = mtmstate.dataset;\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n\n if (urlParams.get('r')) {\n dataset.r = urlParams.get('r');\n }\n\n if (urlParams.get('o')) {\n dataset.o = urlParams.get('o');\n }\n\n var pageid = 0;\n if (dataset.pageid) {\n pageid = dataset.pageid;\n } else if (urlParams.get('pageid')) {\n pageid = urlParams.get('pageid');\n }\n\n await reloadPage(pageid, cmid, dataset);\n};\n\n/**\n * Executes the call to store input value.\n */\nexport const getMootimeterstate = async() => {\n var mtmstate = document.getElementById('mootimeterstate');\n var dataset = mtmstate.dataset;\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n\n if (urlParams.get('r')) {\n dataset.r = urlParams.get('r');\n }\n\n if (urlParams.get('o')) {\n dataset.o = urlParams.get('o');\n }\n\n var pageid = 0;\n if (dataset.pageid) {\n pageid = dataset.pageid;\n } else if (urlParams.get('pageid')) {\n pageid = urlParams.get('pageid');\n }\n\n const response = await getMootimeterstateExecute(pageid, cmid, JSON.stringify(dataset));\n\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n const states = JSON.parse(response.state);\n\n // Set all datasets to mootimeterstate.\n for (let dataattribute in states) {\n mtmstate.setAttribute('data-' + dataattribute, states[dataattribute]);\n }\n\n if (mtmstate.dataset.contentchangedat_prev != mtmstate.dataset.contentchangedat) {\n mtmstate.setAttribute('data-settingschangedat_prev', 0);\n mtmstate.setAttribute('data-contentlastupdated', 0);\n reloadPage(pageid, cmid, dataset);\n }\n }\n\n};\n"],"names":["refreshintervall","document","getElementById","initMootimeterstate","setInterval","getMootimeterstate","window","console","log","async","dataset","queryString","location","search","urlParams","URLSearchParams","cmid","get","r","o","pageid","mtmstate","response","methodname","args","getMootimeterstateExecute","JSON","stringify","code","error","string","states","parse","state","dataattribute","setAttribute","contentchangedat_prev","contentchangedat"],"mappings":"yUAIqBA,mBAEPC,SAASC,eAAe,oBAM9BF,iBAAmB,MACnBA,iBAAmB,KAGvBG,sBAEAC,aAAY,KACRC,uBACDL,mBAZCM,OAAOC,QAAQC,IAAI,qBAmCrBL,oBAAsBM,gBAElBJ,yBAGFK,QADWT,SAASC,eAAe,mBAChBQ,cACjBC,YAAcL,OAAOM,SAASC,OAC9BC,UAAY,IAAIC,gBAAgBJ,aAChCK,KAAOF,UAAUG,IAAI,MAEvBH,UAAUG,IAAI,OACdP,QAAQQ,EAAIJ,UAAUG,IAAI,MAG1BH,UAAUG,IAAI,OACdP,QAAQS,EAAIL,UAAUG,IAAI,UAG1BG,OAAS,EACTV,QAAQU,OACRA,OAASV,QAAQU,OACVN,UAAUG,IAAI,YACrBG,OAASN,UAAUG,IAAI,iBAGrB,+BAAWG,OAAQJ,KAAMN,UAMtBL,mBAAqBI,cAC1BY,SAAWpB,SAASC,eAAe,mBACnCQ,QAAUW,SAASX,cACjBC,YAAcL,OAAOM,SAASC,OAC9BC,UAAY,IAAIC,gBAAgBJ,aAChCK,KAAOF,UAAUG,IAAI,MAEvBH,UAAUG,IAAI,OACdP,QAAQQ,EAAIJ,UAAUG,IAAI,MAG1BH,UAAUG,IAAI,OACdP,QAAQS,EAAIL,UAAUG,IAAI,UAG1BG,OAAS,EACTV,QAAQU,OACRA,OAASV,QAAQU,OACVN,UAAUG,IAAI,YACrBG,OAASN,UAAUG,IAAI,iBAGrBK,cAlEwB,EAC9BF,OACAJ,KACAN,WACC,cAAU,CAAC,CACZa,WAAY,qCACZC,KAAM,CACFJ,OAAAA,OACAJ,KAAAA,KACAN,QAAAA,YAEJ,GAuDuBe,CAA0BL,OAAQJ,KAAMU,KAAKC,UAAUjB,aAEzD,KAAjBY,SAASM,mBACLC,MAAMP,SAASQ,QAGF,KAAjBR,SAASM,KAAa,OAChBG,OAASL,KAAKM,MAAMV,SAASW,WAG9B,IAAIC,iBAAiBH,OACtBV,SAASc,aAAa,QAAUD,cAAeH,OAAOG,gBAGtDb,SAASX,QAAQ0B,uBAAyBf,SAASX,QAAQ2B,mBAC3DhB,SAASc,aAAa,8BAA+B,GACrDd,SAASc,aAAa,0BAA2B,mCACtCf,OAAQJ,KAAMN"} \ No newline at end of file diff --git a/amd/build/handler_input.min.js b/amd/build/handler_input.min.js index 0b4d77fb..b8642180 100644 --- a/amd/build/handler_input.min.js +++ b/amd/build/handler_input.min.js @@ -1,3 +1,3 @@ -define("mod_mootimeter/handler_input",["exports","core/ajax","core/log"],(function(_exports,_ajax,_log){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_log=(obj=_log)&&obj.__esModule?obj:{default:obj};_exports.init=uniqueID=>{const obj=document.getElementById(uniqueID);let typingTimer;function mootimeterStoreInput(){const id=obj.id,pageid=obj.dataset.pageid,ajaxmethode=obj.dataset.ajaxmethode,inputname=obj.dataset.name,inputvalue=document.getElementById(id).value,thisDataset=JSON.stringify(obj.dataset);return execStoreInputValue(ajaxmethode,pageid,inputname,inputvalue,thisDataset)}document.getElementById(uniqueID)&&obj.addEventListener("keyup",(function(){clearTimeout(typingTimer),typingTimer=setTimeout(mootimeterStoreInput,350)}))};const execStoreInputValue=async(ajaxmethode,pageid,inputname,inputvalue,thisDataset)=>{const response=await((ajaxmethode,pageid,inputname,inputvalue,thisDataset)=>(0,_ajax.call)([{methodname:ajaxmethode,args:{pageid:pageid,inputname:inputname,inputvalue:inputvalue,thisDataset:thisDataset}}])[0])(ajaxmethode,pageid,inputname,inputvalue,thisDataset);200!=response.code&&_log.default.error(response.string),200==response.code&&_log.default.info(response.string)}})); +define("mod_mootimeter/handler_input",["exports","core/ajax","core/log"],(function(_exports,_ajax,_log){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_log=(obj=_log)&&obj.__esModule?obj:{default:obj};_exports.init=uniqueID=>{const obj=document.getElementById(uniqueID);document.getElementById(uniqueID)&&obj.addEventListener("focusout",(function(){const id=obj.id,pageid=obj.dataset.pageid,ajaxmethode=obj.dataset.ajaxmethode,inputname=obj.dataset.name,inputvalue=document.getElementById(id).value,thisDataset=JSON.stringify(obj.dataset);return execStoreInputValue(ajaxmethode,pageid,inputname,inputvalue,thisDataset)}))};const execStoreInputValue=async(ajaxmethode,pageid,inputname,inputvalue,thisDataset)=>{const response=await((ajaxmethode,pageid,inputname,inputvalue,thisDataset)=>(0,_ajax.call)([{methodname:ajaxmethode,args:{pageid:pageid,inputname:inputname,inputvalue:inputvalue,thisDataset:thisDataset}}])[0])(ajaxmethode,pageid,inputname,inputvalue,thisDataset);200!=response.code&&_log.default.error(response.string),200==response.code&&_log.default.info(response.string)}})); //# sourceMappingURL=handler_input.min.js.map \ No newline at end of file diff --git a/amd/build/handler_input.min.js.map b/amd/build/handler_input.min.js.map index 212373da..d4d4f2f7 100644 --- a/amd/build/handler_input.min.js.map +++ b/amd/build/handler_input.min.js.map @@ -1 +1 @@ -{"version":3,"file":"handler_input.min.js","sources":["../src/handler_input.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\n\nexport const init = (uniqueID) => {\n const obj = document.getElementById(uniqueID);\n let typingTimer;\n let doneTypingInterval = 350;\n\n if (!document.getElementById(uniqueID)) {\n return;\n }\n\n obj.addEventListener(\"keyup\", eventHandler);\n\n /**\n * Eventhandler\n */\n function eventHandler() {\n clearTimeout(typingTimer);\n typingTimer = setTimeout(mootimeterStoreInput, doneTypingInterval);\n }\n\n /**\n * Store the value.\n * @returns {mixed}\n */\n function mootimeterStoreInput() {\n const id = obj.id;\n const pageid = obj.dataset.pageid;\n const ajaxmethode = obj.dataset.ajaxmethode;\n const inputname = obj.dataset.name;\n const inputvalue = document.getElementById(id).value;\n const thisDataset = JSON.stringify(obj.dataset);\n return execStoreInputValue(ajaxmethode, pageid, inputname, inputvalue, thisDataset);\n }\n};\n\n/**\n * Call to store input value\n * @param {string} ajaxmethode\n * @param {int} pageid\n * @param {string} inputname\n * @param {string} inputvalue\n * @param {string} thisDataset\n * @returns {mixed}\n */\nconst storeInputValue = (\n ajaxmethode,\n pageid,\n inputname,\n inputvalue,\n thisDataset\n) => fetchMany([{\n methodname: ajaxmethode,\n args: {\n pageid,\n inputname,\n inputvalue,\n thisDataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {string} ajaxmethode\n * @param {int} pageid\n * @param {string} inputname\n * @param {string} inputvalue\n * @param {string} thisDataset\n */\nconst execStoreInputValue = async(ajaxmethode, pageid, inputname, inputvalue, thisDataset) => {\n const response = await storeInputValue(ajaxmethode, pageid, inputname, inputvalue, thisDataset);\n if (response.code != 200) {\n Log.error(response.string);\n }\n if (response.code == 200) {\n Log.info(response.string);\n }\n};"],"names":["uniqueID","obj","document","getElementById","typingTimer","mootimeterStoreInput","id","pageid","dataset","ajaxmethode","inputname","name","inputvalue","value","thisDataset","JSON","stringify","execStoreInputValue","addEventListener","clearTimeout","setTimeout","async","response","methodname","args","storeInputValue","code","error","string","info"],"mappings":"6PAGqBA,iBACXC,IAAMC,SAASC,eAAeH,cAChCI,qBAqBKC,6BACCC,GAAKL,IAAIK,GACTC,OAASN,IAAIO,QAAQD,OACrBE,YAAcR,IAAIO,QAAQC,YAC1BC,UAAYT,IAAIO,QAAQG,KACxBC,WAAaV,SAASC,eAAeG,IAAIO,MACzCC,YAAcC,KAAKC,UAAUf,IAAIO,gBAChCS,oBAAoBR,YAAaF,OAAQG,UAAWE,WAAYE,aAzBtEZ,SAASC,eAAeH,WAI7BC,IAAIiB,iBAAiB,oBAMjBC,aAAaf,aACbA,YAAcgB,WAAWf,qBAbJ,eAgEvBY,oBAAsBI,MAAMZ,YAAaF,OAAQG,UAAWE,WAAYE,qBACpEQ,cAzBc,EACpBb,YACAF,OACAG,UACAE,WACAE,eACC,cAAU,CAAC,CACZS,WAAYd,YACZe,KAAM,CACFjB,OAAAA,OACAG,UAAAA,UACAE,WAAAA,WACAE,YAAAA,gBAEJ,GAWuBW,CAAgBhB,YAAaF,OAAQG,UAAWE,WAAYE,aAC9D,KAAjBQ,SAASI,mBACLC,MAAML,SAASM,QAEF,KAAjBN,SAASI,mBACLG,KAAKP,SAASM"} \ No newline at end of file +{"version":3,"file":"handler_input.min.js","sources":["../src/handler_input.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\n\nexport const init = (uniqueID) => {\n const obj = document.getElementById(uniqueID);\n\n if (!document.getElementById(uniqueID)) {\n return;\n }\n\n obj.addEventListener(\"focusout\", mootimeterStoreInput);\n\n /**\n * Store the value.\n * @returns {mixed}\n */\n function mootimeterStoreInput() {\n const id = obj.id;\n const pageid = obj.dataset.pageid;\n const ajaxmethode = obj.dataset.ajaxmethode;\n const inputname = obj.dataset.name;\n const inputvalue = document.getElementById(id).value;\n const thisDataset = JSON.stringify(obj.dataset);\n return execStoreInputValue(ajaxmethode, pageid, inputname, inputvalue, thisDataset);\n }\n};\n\n/**\n * Call to store input value\n * @param {string} ajaxmethode\n * @param {int} pageid\n * @param {string} inputname\n * @param {string} inputvalue\n * @param {string} thisDataset\n * @returns {mixed}\n */\nconst storeInputValue = (\n ajaxmethode,\n pageid,\n inputname,\n inputvalue,\n thisDataset\n) => fetchMany([{\n methodname: ajaxmethode,\n args: {\n pageid,\n inputname,\n inputvalue,\n thisDataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {string} ajaxmethode\n * @param {int} pageid\n * @param {string} inputname\n * @param {string} inputvalue\n * @param {string} thisDataset\n */\nconst execStoreInputValue = async(ajaxmethode, pageid, inputname, inputvalue, thisDataset) => {\n const response = await storeInputValue(ajaxmethode, pageid, inputname, inputvalue, thisDataset);\n if (response.code != 200) {\n Log.error(response.string);\n }\n if (response.code == 200) {\n Log.info(response.string);\n }\n};\n"],"names":["uniqueID","obj","document","getElementById","addEventListener","id","pageid","dataset","ajaxmethode","inputname","name","inputvalue","value","thisDataset","JSON","stringify","execStoreInputValue","async","response","methodname","args","storeInputValue","code","error","string","info"],"mappings":"6PAGqBA,iBACXC,IAAMC,SAASC,eAAeH,UAE/BE,SAASC,eAAeH,WAI7BC,IAAIG,iBAAiB,6BAOXC,GAAKJ,IAAII,GACTC,OAASL,IAAIM,QAAQD,OACrBE,YAAcP,IAAIM,QAAQC,YAC1BC,UAAYR,IAAIM,QAAQG,KACxBC,WAAaT,SAASC,eAAeE,IAAIO,MACzCC,YAAcC,KAAKC,UAAUd,IAAIM,gBAChCS,oBAAoBR,YAAaF,OAAQG,UAAWE,WAAYE,uBAqCzEG,oBAAsBC,MAAMT,YAAaF,OAAQG,UAAWE,WAAYE,qBACpEK,cAzBc,EACpBV,YACAF,OACAG,UACAE,WACAE,eACC,cAAU,CAAC,CACZM,WAAYX,YACZY,KAAM,CACFd,OAAAA,OACAG,UAAAA,UACAE,WAAAA,WACAE,YAAAA,gBAEJ,GAWuBQ,CAAgBb,YAAaF,OAAQG,UAAWE,WAAYE,aAC9D,KAAjBK,SAASI,mBACLC,MAAML,SAASM,QAEF,KAAjBN,SAASI,mBACLG,KAAKP,SAASM"} \ No newline at end of file diff --git a/amd/build/reload_on_state_change.min.js b/amd/build/reload_on_state_change.min.js deleted file mode 100644 index 4d7a3ef5..00000000 --- a/amd/build/reload_on_state_change.min.js +++ /dev/null @@ -1,3 +0,0 @@ -define("mod_mootimeter/reload_on_state_change",["exports","core/ajax","core/log"],(function(_exports,_ajax,_log){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_log=(obj=_log)&&obj.__esModule?obj:{default:obj};_exports.init=statename=>{var obj=document.getElementById("mootimeterstate");obj?obj.dataset.pageid?statename?setInterval((function(){getState(obj.dataset.pageid,statename)}),1e3):window.console.log("Statename not set in methods argument"):window.console.log("Pageid not set in mootimeterstate"):window.console.log("mootimeterstate not found")};const getState=async(pageid,statename)=>{const response=await((pageid,statename)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_state",args:{pageid:pageid,statename:statename}}])[0])(pageid,statename);200!=response.code&&_log.default.error(response.string),200==response.code&&(document.getElementById("mootimeterstate").dataset[statename]||document.getElementById("mootimeterstate").setAttribute("data-"+statename,response.state),document.getElementById("mootimeterstate").dataset[statename]!=response.state&&location.reload())}})); - -//# sourceMappingURL=reload_on_state_change.min.js.map \ No newline at end of file diff --git a/amd/build/reload_on_state_change.min.js.map b/amd/build/reload_on_state_change.min.js.map deleted file mode 100644 index ff787a82..00000000 --- a/amd/build/reload_on_state_change.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reload_on_state_change.min.js","sources":["../src/reload_on_state_change.js"],"sourcesContent":["/**\n * Listen to a state change. If changed, reload the page.\n */\n\nimport {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\n\n\nexport const init = (statename) => {\n var obj = document.getElementById('mootimeterstate');\n\n if (!obj) {\n window.console.log('mootimeterstate not found');\n return;\n }\n\n if (!obj.dataset.pageid) {\n window.console.log('Pageid not set in mootimeterstate');\n return;\n }\n\n if (!statename) {\n window.console.log('Statename not set in methods argument');\n return;\n }\n setInterval(function() {\n getState(obj.dataset.pageid, statename);\n }, 1000);\n};\n\n/**\n * Call to create a new instance\n * @param {int} pageid\n * @param {string} statename\n * @returns {string}\n */\nconst execGetState = (\n pageid,\n statename,\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_state',\n args: {\n pageid,\n statename,\n },\n}])[0];\n\n/**\n * Executes the call to create a new page.\n * @param {int} pageid\n * @param {string} statename\n */\nconst getState = async(pageid, statename) => {\n const response = await execGetState(pageid, statename);\n\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n\n if (!document.getElementById('mootimeterstate').dataset[statename]) {\n document.getElementById('mootimeterstate').setAttribute('data-' + statename, response.state);\n }\n\n if (document.getElementById('mootimeterstate').dataset[statename] != response.state) {\n location.reload();\n }\n }\n};"],"names":["statename","obj","document","getElementById","dataset","pageid","setInterval","getState","window","console","log","async","response","methodname","args","execGetState","code","error","string","setAttribute","state","location","reload"],"mappings":"sQAQqBA,gBACbC,IAAMC,SAASC,eAAe,mBAE7BF,IAKAA,IAAIG,QAAQC,OAKZL,UAILM,aAAY,WACRC,SAASN,IAAIG,QAAQC,OAAQL,aAC9B,KALCQ,OAAOC,QAAQC,IAAI,yCALnBF,OAAOC,QAAQC,IAAI,qCALnBF,OAAOC,QAAQC,IAAI,oCAwCrBH,SAAWI,MAAMN,OAAQL,mBACrBY,cAjBW,EACjBP,OACAL,aACC,cAAU,CAAC,CACZa,WAAY,2BACZC,KAAM,CACFT,OAAAA,OACAL,UAAAA,cAEJ,GAQuBe,CAAaV,OAAQL,WAEvB,KAAjBY,SAASI,mBACLC,MAAML,SAASM,QAGF,KAAjBN,SAASI,OAEJd,SAASC,eAAe,mBAAmBC,QAAQJ,YACpDE,SAASC,eAAe,mBAAmBgB,aAAa,QAAUnB,UAAWY,SAASQ,OAGtFlB,SAASC,eAAe,mBAAmBC,QAAQJ,YAAcY,SAASQ,OAC1EC,SAASC"} \ No newline at end of file diff --git a/amd/build/reload_page.min.js b/amd/build/reload_page.min.js index b817921a..2df66427 100644 --- a/amd/build/reload_page.min.js +++ b/amd/build/reload_page.min.js @@ -1,3 +1,3 @@ -define("mod_mootimeter/reload_page",["exports","core/ajax","core/log","core/notification","core/templates","mod_mootimeter/reload_pagelist","mod_mootimeter/utils"],(function(_exports,_ajax,_log,_notification,_templates,_reload_pagelist,_utils){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=_exports.execReloadPage=void 0,_log=_interopRequireDefault(_log),_templates=_interopRequireDefault(_templates);_exports.init=uniqueID=>{const obj=document.getElementById(uniqueID);obj&&obj.addEventListener("click",(function(){var pageid=0,dataset="";this.dataset&&(pageid=this.dataset.pageid,dataset=this.dataset);null!=pageid&&"undefined"!=pageid&&0!=pageid.length||(pageid=0);const queryString=window.location.search,cmid=new URLSearchParams(queryString).get("id");execReloadPage(pageid,cmid,dataset)}))};const execReloadPage=async(pageid,cmid,dataset)=>{dataset?Object.assign(dataset,(0,_utils.getGetParams)()):dataset=(0,_utils.getGetParams)(),dataset=JSON.stringify(dataset);const response=await((pageid,cmid,dataset)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_pagecontentparams",args:{pageid:pageid,cmid:cmid,dataset:dataset}}])[0])(pageid,cmid,dataset);if(200!=response.code&&_log.default.error(response.string),200==response.code){var mtmstate=document.getElementById("mootimeterstate");const pageparmas=JSON.parse(response.pageparams);if(_templates.default.renderForPromise(pageparmas.pagecontent.template,pageparmas.pagecontent).then((_ref=>{let{html:html,js:js}=_ref;return _templates.default.replaceNodeContents("#mootimeter-pagecontent",html,js),!0})).catch((error=>(0,_notification.exception)(error))),pageparmas.contentmenu&&(_templates.default.renderForPromise(pageparmas.contentmenu.template,pageparmas.contentmenu).then((_ref2=>{let{html:html,js:js}=_ref2;return _templates.default.replaceNode("#mootimeter-pagecontentmenu",html,js),!0})).catch((error=>(0,_notification.exception)(error))),pageparmas.contentmenu.sp))for(const[key,value]of Object.entries(pageparmas.contentmenu.sp))(0,_utils.setGetParam)(key,value);pageparmas.colsettings&&_templates.default.renderForPromise(pageparmas.colsettings.template,pageparmas.colsettings).then((_ref3=>{let{html:html,js:js}=_ref3;return _templates.default.replaceNodeContents("#mootimeter-col-settings",html,js),!0})).catch((error=>(0,_notification.exception)(error))),pageparmas.pageid&&(mtmstate.setAttribute("data-pageid",pageparmas.pageid),(0,_utils.setGetParam)("pageid",pageparmas.pageid)),(0,_reload_pagelist.execReloadPagelist)(pageid,cmid,!0),document.querySelectorAll(".tooltip").forEach((e=>e.remove()))}};_exports.execReloadPage=execReloadPage})); +define("mod_mootimeter/reload_page",["exports","core/ajax","core/log","core/notification","core/templates","mod_mootimeter/reload_pagelist","mod_mootimeter/utils"],(function(_exports,_ajax,_log,_notification,_templates,_reload_pagelist,_utils){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.reloadSettingsCol=_exports.reloadPageContent=_exports.reloadContentMenu=_exports.init=_exports.execReloadPage=void 0,_log=_interopRequireDefault(_log),_templates=_interopRequireDefault(_templates);_exports.init=uniqueID=>{const obj=document.getElementById(uniqueID);obj&&obj.addEventListener("click",(function(){var pageid=0,dataset="";this.dataset&&(pageid=this.dataset.pageid,dataset=this.dataset);null!=pageid&&"undefined"!=pageid&&0!=pageid.length||(pageid=0);const queryString=window.location.search,cmid=new URLSearchParams(queryString).get("id");execReloadPage(pageid,cmid,dataset)}))};const execReloadPage=async(pageid,cmid,dataset)=>{dataset?Object.assign(dataset,(0,_utils.getGetParams)()):dataset=(0,_utils.getGetParams)(),dataset=JSON.stringify(dataset);const response=await((pageid,cmid,dataset)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_pagecontentparams",args:{pageid:pageid,cmid:cmid,dataset:dataset}}])[0])(pageid,cmid,dataset);if(200!=response.code&&_log.default.error(response.string),200==response.code){var mtmstate=document.getElementById("mootimeterstate");const pageparmas=JSON.parse(response.pageparams);mtmstate.dataset.contentchangedat_prev&&mtmstate.dataset.contentchangedat_prev==mtmstate.contentchangedat&&mtmstate.dataset.teacherpermissiontoview_prev&&mtmstate.dataset.teacherpermissiontoview_prev==mtmstate.dataset.teacherpermissiontoviewteacherpermissiontoview||(reloadPageContent(pageparmas.pagecontent),(0,_reload_pagelist.execReloadPagelist)(pageid,cmid,!0)),mtmstate.dataset.pagecontentmenuchangedat_prev&&mtmstate.dataset.pagecontentmenuchangedat_prev==mtmstate.settingschangedat||reloadContentMenu(pageparmas.contentmenu),!pageparmas.colsettings||mtmstate.dataset.settingschangedat_prev&&mtmstate.dataset.settingschangedat_prev==mtmstate.settingschangedat||reloadSettingsCol(pageparmas.colsettings),pageparmas.pageid&&(mtmstate.setAttribute("data-pageid",pageparmas.pageid),(0,_utils.setGetParam)("pageid",pageparmas.pageid))}};_exports.execReloadPage=execReloadPage;const reloadSettingsCol=async pageparmas=>{var mtmstate=document.getElementById("mootimeterstate");_templates.default.renderForPromise(pageparmas.template,pageparmas).then((_ref=>{let{html:html,js:js}=_ref;return _templates.default.replaceNodeContents("#mootimeter-col-settings",html,js),mtmstate.setAttribute("data-settingschangedat_prev",mtmstate.dataset.settingschangedat),!0})).catch((error=>(0,_notification.exception)(error)))};_exports.reloadSettingsCol=reloadSettingsCol;const reloadContentMenu=async pageparmas=>{var mtmstate=document.getElementById("mootimeterstate");if(_templates.default.renderForPromise(pageparmas.template,pageparmas).then((_ref2=>{let{html:html,js:js}=_ref2;return _templates.default.replaceNode("#mootimeter-pagecontentmenu",html,js),mtmstate.setAttribute("data-pagecontentmenuchangedat_prev",mtmstate.dataset.pagecontentmenuchangedat),!0})).catch((error=>(0,_notification.exception)(error))),pageparmas.sp)for(const[key,value]of Object.entries(pageparmas.sp))(0,_utils.setGetParam)(key,value)};_exports.reloadContentMenu=reloadContentMenu;const reloadPageContent=async pageparmas=>{var mtmstate=document.getElementById("mootimeterstate");_templates.default.renderForPromise(pageparmas.template,pageparmas).then((_ref3=>{let{html:html,js:js}=_ref3;return _templates.default.replaceNodeContents("#mootimeter-pagecontent",html,js),mtmstate.setAttribute("data-contentchangedat_prev",mtmstate.dataset.contentchangedat),mtmstate.setAttribute("data-teacherpermissiontoview_prev",mtmstate.dataset.teacherpermissiontoview),!0})).catch((error=>(0,_notification.exception)(error)))};_exports.reloadPageContent=reloadPageContent})); //# sourceMappingURL=reload_page.min.js.map \ No newline at end of file diff --git a/amd/build/reload_page.min.js.map b/amd/build/reload_page.min.js.map index aa910933..2a863980 100644 --- a/amd/build/reload_page.min.js.map +++ b/amd/build/reload_page.min.js.map @@ -1 +1 @@ -{"version":3,"file":"reload_page.min.js","sources":["../src/reload_page.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\nimport {exception as displayException} from 'core/notification';\nimport Templates from 'core/templates';\nimport {execReloadPagelist as reloadPagelist} from 'mod_mootimeter/reload_pagelist';\nimport {getGetParams} from 'mod_mootimeter/utils';\nimport {setGetParam} from 'mod_mootimeter/utils';\n\nexport const init = (uniqueID) => {\n\n const obj = document.getElementById(uniqueID);\n if (!obj) {\n return;\n }\n obj.addEventListener(\"click\", changePage);\n\n /**\n * Store the value.\n */\n function changePage() {\n var pageid = 0;\n var dataset = \"\";\n if (this.dataset) {\n pageid = this.dataset.pageid;\n dataset = this.dataset;\n }\n\n if (pageid === null || pageid === undefined || pageid == \"undefined\" || pageid.length == 0) {\n pageid = 0;\n }\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n execReloadPage(pageid, cmid, dataset);\n }\n};\n\n/**\n * Call to store input value\n * @param {int} pageid\n * @param {int} cmid\n * @param {string} dataset\n * @returns {array}\n */\nconst reloadPage = (\n pageid,\n cmid,\n dataset\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_pagecontentparams',\n args: {\n pageid,\n cmid,\n dataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {int} pageid\n * @param {int} cmid\n * @param {array} dataset\n */\nexport const execReloadPage = async(pageid, cmid, dataset) => {\n\n if (!dataset) {\n dataset = getGetParams();\n } else {\n Object.assign(dataset, getGetParams());\n }\n\n dataset = JSON.stringify(dataset);\n const response = await reloadPage(pageid, cmid, dataset);\n\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n\n var mtmstate = document.getElementById('mootimeterstate');\n\n const pageparmas = JSON.parse(response.pageparams);\n\n // Replace the pagecontent.\n Templates.renderForPromise(pageparmas.pagecontent.template, pageparmas.pagecontent)\n .then(({html, js}) => {\n Templates.replaceNodeContents('#mootimeter-pagecontent', html, js);\n return true;\n })\n .catch((error) => displayException(error));\n\n // Replace the pagecontent menu.\n if (pageparmas.contentmenu) {\n Templates.renderForPromise(pageparmas.contentmenu.template, pageparmas.contentmenu)\n .then(({html, js}) => {\n Templates.replaceNode('#mootimeter-pagecontentmenu', html, js);\n return true;\n })\n .catch((error) => displayException(error));\n\n // Set subpage URL parameters.\n if (pageparmas.contentmenu.sp) {\n for (const [key, value] of Object.entries(pageparmas.contentmenu.sp)) {\n setGetParam(key, value);\n }\n }\n }\n\n // Replace the settings col if necessary.\n if (pageparmas.colsettings) {\n Templates.renderForPromise(pageparmas.colsettings.template, pageparmas.colsettings)\n .then(({html, js}) => {\n Templates.replaceNodeContents('#mootimeter-col-settings', html, js);\n return true;\n })\n .catch((error) => displayException(error));\n }\n\n if (pageparmas.pageid) {\n\n // Set new pageid.\n mtmstate.setAttribute('data-pageid', pageparmas.pageid);\n\n // Set URL parameter - pageid.\n setGetParam('pageid', pageparmas.pageid);\n\n }\n\n // Set active page marked in pageslist.\n reloadPagelist(pageid, cmid, true);\n\n // Remove all tooltips of pageslist that are still present.\n document.querySelectorAll('.tooltip').forEach(e => e.remove());\n }\n};\n"],"names":["uniqueID","obj","document","getElementById","addEventListener","pageid","dataset","this","length","queryString","window","location","search","cmid","URLSearchParams","get","execReloadPage","async","Object","assign","JSON","stringify","response","methodname","args","reloadPage","code","error","string","mtmstate","pageparmas","parse","pageparams","renderForPromise","pagecontent","template","then","_ref","html","js","replaceNodeContents","catch","contentmenu","_ref2","replaceNode","sp","key","value","entries","colsettings","_ref3","setAttribute","querySelectorAll","forEach","e","remove"],"mappings":"ygBAQqBA,iBAEXC,IAAMC,SAASC,eAAeH,UAC/BC,KAGLA,IAAIG,iBAAiB,wBAMbC,OAAS,EACTC,QAAU,GACVC,KAAKD,UACLD,OAASE,KAAKD,QAAQD,OACtBC,QAAUC,KAAKD,SAGfD,MAAAA,QAAqD,aAAVA,QAA0C,GAAjBA,OAAOG,SAC3EH,OAAS,SAGPI,YAAcC,OAAOC,SAASC,OAE9BC,KADY,IAAIC,gBAAgBL,aACfM,IAAI,MAC3BC,eAAeX,OAAQQ,KAAMP,mBA8BxBU,eAAiBC,MAAMZ,OAAQQ,KAAMP,WAEzCA,QAGDY,OAAOC,OAAOb,SAAS,0BAFvBA,SAAU,yBAKdA,QAAUc,KAAKC,UAAUf,eACnBgB,cA5BS,EACfjB,OACAQ,KACAP,WACC,cAAU,CAAC,CACZiB,WAAY,uCACZC,KAAM,CACFnB,OAAAA,OACAQ,KAAAA,KACAP,QAAAA,YAEJ,GAiBuBmB,CAAWpB,OAAQQ,KAAMP,YAE3B,KAAjBgB,SAASI,mBACLC,MAAML,SAASM,QAGF,KAAjBN,SAASI,KAAa,KAElBG,SAAW3B,SAASC,eAAe,yBAEjC2B,WAAaV,KAAKW,MAAMT,SAASU,kCAG7BC,iBAAiBH,WAAWI,YAAYC,SAAUL,WAAWI,aAClEE,MAAKC,WAACC,KAACA,KAADC,GAAOA,mCACAC,oBAAoB,0BAA2BF,KAAMC,KACxD,KAEVE,OAAOd,QAAU,2BAAiBA,SAGnCG,WAAWY,iCACDT,iBAAiBH,WAAWY,YAAYP,SAAUL,WAAWY,aAClEN,MAAKO,YAACL,KAACA,KAADC,GAAOA,oCACAK,YAAY,8BAA+BN,KAAMC,KACpD,KAEVE,OAAOd,QAAU,2BAAiBA,SAGnCG,WAAWY,YAAYG,QAClB,MAAOC,IAAKC,SAAU7B,OAAO8B,QAAQlB,WAAWY,YAAYG,2BACjDC,IAAKC,OAMzBjB,WAAWmB,gCACDhB,iBAAiBH,WAAWmB,YAAYd,SAAUL,WAAWmB,aAClEb,MAAKc,YAACZ,KAACA,KAADC,GAAOA,oCACAC,oBAAoB,2BAA4BF,KAAMC,KACzD,KAEVE,OAAOd,QAAU,2BAAiBA,SAGvCG,WAAWzB,SAGXwB,SAASsB,aAAa,cAAerB,WAAWzB,+BAGpC,SAAUyB,WAAWzB,iDAKtBA,OAAQQ,MAAM,GAG7BX,SAASkD,iBAAiB,YAAYC,SAAQC,GAAKA,EAAEC"} \ No newline at end of file +{"version":3,"file":"reload_page.min.js","sources":["../src/reload_page.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\nimport {exception as displayException} from 'core/notification';\nimport Templates from 'core/templates';\nimport {execReloadPagelist as reloadPagelist} from 'mod_mootimeter/reload_pagelist';\nimport {getGetParams} from 'mod_mootimeter/utils';\nimport {setGetParam} from 'mod_mootimeter/utils';\n\nexport const init = (uniqueID) => {\n\n const obj = document.getElementById(uniqueID);\n if (!obj) {\n return;\n }\n obj.addEventListener(\"click\", changePage);\n\n /**\n * Store the value.\n */\n function changePage() {\n var pageid = 0;\n var dataset = \"\";\n if (this.dataset) {\n pageid = this.dataset.pageid;\n dataset = this.dataset;\n }\n\n if (pageid === null || pageid === undefined || pageid == \"undefined\" || pageid.length == 0) {\n pageid = 0;\n }\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n execReloadPage(pageid, cmid, dataset);\n }\n};\n\n/**\n * Call to store input value\n * @param {int} pageid\n * @param {int} cmid\n * @param {string} dataset\n * @returns {array}\n */\nconst reloadPage = (\n pageid,\n cmid,\n dataset\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_pagecontentparams',\n args: {\n pageid,\n cmid,\n dataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {int} pageid\n * @param {int} cmid\n * @param {array} dataset\n */\nexport const execReloadPage = async(pageid, cmid, dataset) => {\n\n if (!dataset) {\n dataset = getGetParams();\n } else {\n Object.assign(dataset, getGetParams());\n }\n\n dataset = JSON.stringify(dataset);\n const response = await reloadPage(pageid, cmid, dataset);\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n\n var mtmstate = document.getElementById('mootimeterstate');\n\n const pageparmas = JSON.parse(response.pageparams);\n\n // Replace the pagecontent.\n if (\n !mtmstate.dataset.contentchangedat_prev\n || mtmstate.dataset.contentchangedat_prev != mtmstate.contentchangedat\n || !mtmstate.dataset.teacherpermissiontoview_prev\n || mtmstate.dataset.teacherpermissiontoview_prev != mtmstate.dataset.teacherpermissiontoviewteacherpermissiontoview\n ) {\n reloadPageContent(pageparmas.pagecontent);\n\n // Set active page marked in pageslist.\n reloadPagelist(pageid, cmid, true);\n }\n\n // Replace the pagecontent menu.\n if (\n !mtmstate.dataset.pagecontentmenuchangedat_prev\n || mtmstate.dataset.pagecontentmenuchangedat_prev != mtmstate.settingschangedat\n ) {\n reloadContentMenu(pageparmas.contentmenu);\n }\n\n if (\n pageparmas.colsettings\n && (\n !mtmstate.dataset.settingschangedat_prev\n || mtmstate.dataset.settingschangedat_prev != mtmstate.settingschangedat\n )\n ) {\n reloadSettingsCol(pageparmas.colsettings);\n }\n\n if (pageparmas.pageid) {\n // Set new pageid.\n mtmstate.setAttribute('data-pageid', pageparmas.pageid);\n\n // Set URL parameter - pageid.\n setGetParam('pageid', pageparmas.pageid);\n }\n }\n};\n\nexport const reloadSettingsCol = async(pageparmas) => {\n\n var mtmstate = document.getElementById('mootimeterstate');\n\n // Replace the settings col if necessary.\n Templates.renderForPromise(pageparmas.template, pageparmas)\n .then(({html, js}) => {\n Templates.replaceNodeContents('#mootimeter-col-settings', html, js);\n mtmstate.setAttribute('data-settingschangedat_prev', mtmstate.dataset.settingschangedat);\n return true;\n })\n .catch((error) => displayException(error));\n\n};\n\nexport const reloadContentMenu = async(pageparmas) => {\n\n var mtmstate = document.getElementById('mootimeterstate');\n\n // Replace the settings col if necessary.\n Templates.renderForPromise(pageparmas.template, pageparmas)\n .then(({html, js}) => {\n Templates.replaceNode('#mootimeter-pagecontentmenu', html, js);\n mtmstate.setAttribute('data-pagecontentmenuchangedat_prev', mtmstate.dataset.pagecontentmenuchangedat);\n return true;\n })\n .catch((error) => displayException(error));\n\n // Set subpage URL parameters.\n if (pageparmas.sp) {\n for (const [key, value] of Object.entries(pageparmas.sp)) {\n setGetParam(key, value);\n }\n }\n};\n\nexport const reloadPageContent = async(pageparmas) => {\n\n var mtmstate = document.getElementById('mootimeterstate');\n\n Templates.renderForPromise(pageparmas.template, pageparmas)\n .then(({html, js}) => {\n Templates.replaceNodeContents('#mootimeter-pagecontent', html, js);\n mtmstate.setAttribute('data-contentchangedat_prev', mtmstate.dataset.contentchangedat);\n mtmstate.setAttribute('data-teacherpermissiontoview_prev', mtmstate.dataset.teacherpermissiontoview);\n return true;\n })\n .catch((error) => displayException(error));\n};\n"],"names":["uniqueID","obj","document","getElementById","addEventListener","pageid","dataset","this","length","queryString","window","location","search","cmid","URLSearchParams","get","execReloadPage","async","Object","assign","JSON","stringify","response","methodname","args","reloadPage","code","error","string","mtmstate","pageparmas","parse","pageparams","contentchangedat_prev","contentchangedat","teacherpermissiontoview_prev","teacherpermissiontoviewteacherpermissiontoview","reloadPageContent","pagecontent","pagecontentmenuchangedat_prev","settingschangedat","reloadContentMenu","contentmenu","colsettings","settingschangedat_prev","reloadSettingsCol","setAttribute","renderForPromise","template","then","_ref","html","js","replaceNodeContents","catch","_ref2","replaceNode","pagecontentmenuchangedat","sp","key","value","entries","_ref3","teacherpermissiontoview"],"mappings":"0lBAQqBA,iBAEXC,IAAMC,SAASC,eAAeH,UAC/BC,KAGLA,IAAIG,iBAAiB,wBAMbC,OAAS,EACTC,QAAU,GACVC,KAAKD,UACLD,OAASE,KAAKD,QAAQD,OACtBC,QAAUC,KAAKD,SAGfD,MAAAA,QAAqD,aAAVA,QAA0C,GAAjBA,OAAOG,SAC3EH,OAAS,SAGPI,YAAcC,OAAOC,SAASC,OAE9BC,KADY,IAAIC,gBAAgBL,aACfM,IAAI,MAC3BC,eAAeX,OAAQQ,KAAMP,mBA8BxBU,eAAiBC,MAAMZ,OAAQQ,KAAMP,WAEzCA,QAGDY,OAAOC,OAAOb,SAAS,0BAFvBA,SAAU,yBAKdA,QAAUc,KAAKC,UAAUf,eACnBgB,cA5BS,EACfjB,OACAQ,KACAP,WACC,cAAU,CAAC,CACZiB,WAAY,uCACZC,KAAM,CACFnB,OAAAA,OACAQ,KAAAA,KACAP,QAAAA,YAEJ,GAiBuBmB,CAAWpB,OAAQQ,KAAMP,YAC3B,KAAjBgB,SAASI,mBACLC,MAAML,SAASM,QAGF,KAAjBN,SAASI,KAAa,KAElBG,SAAW3B,SAASC,eAAe,yBAEjC2B,WAAaV,KAAKW,MAAMT,SAASU,YAIlCH,SAASvB,QAAQ2B,uBACfJ,SAASvB,QAAQ2B,uBAAyBJ,SAASK,kBAClDL,SAASvB,QAAQ6B,8BAClBN,SAASvB,QAAQ6B,8BAAgCN,SAASvB,QAAQ8B,iDAErEC,kBAAkBP,WAAWQ,qDAGdjC,OAAQQ,MAAM,IAK5BgB,SAASvB,QAAQiC,+BACfV,SAASvB,QAAQiC,+BAAiCV,SAASW,mBAE9DC,kBAAkBX,WAAWY,cAI7BZ,WAAWa,aAENd,SAASvB,QAAQsC,wBACff,SAASvB,QAAQsC,wBAA0Bf,SAASW,mBAG3DK,kBAAkBf,WAAWa,aAG7Bb,WAAWzB,SAEXwB,SAASiB,aAAa,cAAehB,WAAWzB,+BAGpC,SAAUyB,WAAWzB,wDAKhCwC,kBAAoB5B,MAAAA,iBAEzBY,SAAW3B,SAASC,eAAe,sCAG7B4C,iBAAiBjB,WAAWkB,SAAUlB,YAC3CmB,MAAKC,WAACC,KAACA,KAADC,GAAOA,mCACAC,oBAAoB,2BAA4BF,KAAMC,IAChEvB,SAASiB,aAAa,8BAA+BjB,SAASvB,QAAQkC,oBAC/D,KAEVc,OAAO3B,QAAU,2BAAiBA,6DAI9Bc,kBAAoBxB,MAAAA,iBAEzBY,SAAW3B,SAASC,eAAe,yCAG7B4C,iBAAiBjB,WAAWkB,SAAUlB,YAC3CmB,MAAKM,YAACJ,KAACA,KAADC,GAAOA,oCACAI,YAAY,8BAA+BL,KAAMC,IAC3DvB,SAASiB,aAAa,qCAAsCjB,SAASvB,QAAQmD,2BACtE,KAEVH,OAAO3B,QAAU,2BAAiBA,SAGnCG,WAAW4B,OACN,MAAOC,IAAKC,SAAU1C,OAAO2C,QAAQ/B,WAAW4B,2BACrCC,IAAKC,2DAKhBvB,kBAAoBpB,MAAAA,iBAEzBY,SAAW3B,SAASC,eAAe,sCAE7B4C,iBAAiBjB,WAAWkB,SAAUlB,YAC3CmB,MAAKa,YAACX,KAACA,KAADC,GAAOA,oCACAC,oBAAoB,0BAA2BF,KAAMC,IAC/DvB,SAASiB,aAAa,6BAA8BjB,SAASvB,QAAQ4B,kBACrEL,SAASiB,aAAa,oCAAqCjB,SAASvB,QAAQyD,0BACrE,KAEVT,OAAO3B,QAAU,2BAAiBA"} \ No newline at end of file diff --git a/amd/build/reload_page_content.min.js b/amd/build/reload_page_content.min.js index 9f4f9f39..b7e2e508 100644 --- a/amd/build/reload_page_content.min.js +++ b/amd/build/reload_page_content.min.js @@ -1,3 +1,3 @@ -define("mod_mootimeter/reload_page_content",["exports","core/ajax","core/log","core/notification","core/templates","mod_mootimeter/reload_pagelist","mod_mootimeter/utils"],(function(_exports,_ajax,_log,_notification,_templates,_reload_pagelist,_utils){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_log=_interopRequireDefault(_log),_templates=_interopRequireDefault(_templates);_exports.init=uniqueID=>{const obj=document.getElementById(uniqueID);obj&&obj.addEventListener("change",(function(){var pageid=this.dataset.pageid;const queryString=window.location.search,cmid=new URLSearchParams(queryString).get("id");execReloadPage(pageid,cmid,this.dataset)}))};const execReloadPage=async(pageid,cmid,dataset)=>{dataset=dataset?JSON.stringify(dataset):JSON.stringify([]);const response=await((pageid,cmid,dataset)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_pagecontentparams",args:{pageid:pageid,cmid:cmid,dataset:dataset}}])[0])(pageid,cmid,dataset);if(200!=response.code&&_log.default.error(response.string),200==response.code){var mtmstate=document.getElementById("mootimeterstate");const pageparmas=JSON.parse(response.pageparams);mtmstate.setAttribute("data-pageid",pageparmas.pageid),_templates.default.renderForPromise(pageparmas.pagecontent.template,pageparmas.pagecontent).then((_ref=>{let{html:html,js:js}=_ref;return _templates.default.replaceNodeContents("#mootimeter-pagecontent",html,js),!0})).catch((error=>(0,_notification.exception)(error))),(0,_utils.setGetParam)("pageid",pageparmas.pageid),(0,_reload_pagelist.execReloadPagelist)(pageid,cmid,!0),document.querySelectorAll(".tooltip").forEach((e=>e.remove()))}}})); +define("mod_mootimeter/reload_page_content",["exports","core/ajax","core/log","core/notification","core/templates","mod_mootimeter/reload_pagelist","mod_mootimeter/utils"],(function(_exports,_ajax,_log,_notification,_templates,_reload_pagelist,_utils){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=_exports.execReloadPage=void 0,_log=_interopRequireDefault(_log),_templates=_interopRequireDefault(_templates);_exports.init=uniqueID=>{const obj=document.getElementById(uniqueID);obj&&obj.addEventListener("change",(function(){var pageid=this.dataset.pageid;const queryString=window.location.search,cmid=new URLSearchParams(queryString).get("id");execReloadPage(pageid,cmid,this.dataset)}))};const execReloadPage=async(pageid,cmid,dataset)=>{dataset=dataset?JSON.stringify(dataset):JSON.stringify([]);const response=await((pageid,cmid,dataset)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_pagecontentparams",args:{pageid:pageid,cmid:cmid,dataset:dataset}}])[0])(pageid,cmid,dataset);if(200!=response.code&&_log.default.error(response.string),200==response.code){var mtmstate=document.getElementById("mootimeterstate");const pageparmas=JSON.parse(response.pageparams);mtmstate.setAttribute("data-pageid",pageparmas.pageid),_templates.default.renderForPromise(pageparmas.pagecontent.template,pageparmas.pagecontent).then((_ref=>{let{html:html,js:js}=_ref;return _templates.default.replaceNodeContents("#mootimeter-pagecontent",html,js),mtmstate.setAttribute("data-contentchangedat_prev",mtmstate.dataset.contentchangedat),!0})).catch((error=>(0,_notification.exception)(error))),(0,_utils.setGetParam)("pageid",pageparmas.pageid),(0,_reload_pagelist.execReloadPagelist)(pageid,cmid,!0)}};_exports.execReloadPage=execReloadPage})); //# sourceMappingURL=reload_page_content.min.js.map \ No newline at end of file diff --git a/amd/build/reload_page_content.min.js.map b/amd/build/reload_page_content.min.js.map index e1caceab..bc231583 100644 --- a/amd/build/reload_page_content.min.js.map +++ b/amd/build/reload_page_content.min.js.map @@ -1 +1 @@ -{"version":3,"file":"reload_page_content.min.js","sources":["../src/reload_page_content.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\nimport {exception as displayException} from 'core/notification';\nimport Templates from 'core/templates';\nimport {execReloadPagelist as reloadPagelist} from 'mod_mootimeter/reload_pagelist';\nimport {setGetParam} from 'mod_mootimeter/utils';\n\nexport const init = (uniqueID) => {\n\n const obj = document.getElementById(uniqueID);\n if (!obj) {\n return;\n }\n obj.addEventListener(\"change\", changePage);\n\n /**\n * Store the value.\n */\n function changePage() {\n var pageid = this.dataset.pageid;\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n execReloadPage(pageid, cmid, this.dataset);\n }\n};\n\n/**\n * Call to store input value\n * @param {int} pageid\n * @param {int} cmid\n * @param {string} dataset\n * @returns {array}\n */\nconst reloadPage = (\n pageid,\n cmid,\n dataset\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_pagecontentparams',\n args: {\n pageid,\n cmid,\n dataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {int} pageid\n * @param {int} cmid\n * @param {array} dataset\n */\nconst execReloadPage = async(pageid, cmid, dataset) => {\n\n if (!dataset) {\n dataset = JSON.stringify([]);\n } else {\n dataset = JSON.stringify(dataset);\n }\n\n const response = await reloadPage(pageid, cmid, dataset);\n\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n\n var mtmstate = document.getElementById('mootimeterstate');\n\n const pageparmas = JSON.parse(response.pageparams);\n\n // Set new pageid.\n mtmstate.setAttribute('data-pageid', pageparmas.pageid);\n\n // Replace the pagecontent.\n Templates.renderForPromise(pageparmas.pagecontent.template, pageparmas.pagecontent)\n .then(({html, js}) => {\n Templates.replaceNodeContents('#mootimeter-pagecontent', html, js);\n return true;\n })\n .catch((error) => displayException(error));\n\n // Set URL parameter.\n setGetParam('pageid', pageparmas.pageid);\n\n // Set active page marked in pageslist.\n reloadPagelist(pageid, cmid, true);\n\n // Remove all tooltips of pageslist that are still present.\n document.querySelectorAll('.tooltip').forEach(e => e.remove());\n }\n};\n"],"names":["uniqueID","obj","document","getElementById","addEventListener","pageid","this","dataset","queryString","window","location","search","cmid","URLSearchParams","get","execReloadPage","async","JSON","stringify","response","methodname","args","reloadPage","code","error","string","mtmstate","pageparmas","parse","pageparams","setAttribute","renderForPromise","pagecontent","template","then","_ref","html","js","replaceNodeContents","catch","querySelectorAll","forEach","e","remove"],"mappings":"yfAOqBA,iBAEXC,IAAMC,SAASC,eAAeH,UAC/BC,KAGLA,IAAIG,iBAAiB,yBAMbC,OAASC,KAAKC,QAAQF,aACpBG,YAAcC,OAAOC,SAASC,OAE9BC,KADY,IAAIC,gBAAgBL,aACfM,IAAI,MAC3BC,eAAeV,OAAQO,KAAMN,KAAKC,mBA8BpCQ,eAAiBC,MAAMX,OAAQO,KAAML,WAKnCA,QAHCA,QAGSU,KAAKC,UAAUX,SAFfU,KAAKC,UAAU,UAKvBC,cA3BS,EACfd,OACAO,KACAL,WACC,cAAU,CAAC,CACZa,WAAY,uCACZC,KAAM,CACFhB,OAAAA,OACAO,KAAAA,KACAL,QAAAA,YAEJ,GAgBuBe,CAAWjB,OAAQO,KAAML,YAE3B,KAAjBY,SAASI,mBACLC,MAAML,SAASM,QAGF,KAAjBN,SAASI,KAAa,KAElBG,SAAWxB,SAASC,eAAe,yBAEjCwB,WAAaV,KAAKW,MAAMT,SAASU,YAGvCH,SAASI,aAAa,cAAeH,WAAWtB,2BAGtC0B,iBAAiBJ,WAAWK,YAAYC,SAAUN,WAAWK,aAClEE,MAAKC,WAACC,KAACA,KAADC,GAAOA,mCACAC,oBAAoB,0BAA2BF,KAAMC,KACxD,KAEVE,OAAOf,QAAU,2BAAiBA,gCAG3B,SAAUG,WAAWtB,gDAGlBA,OAAQO,MAAM,GAG7BV,SAASsC,iBAAiB,YAAYC,SAAQC,GAAKA,EAAEC"} \ No newline at end of file +{"version":3,"file":"reload_page_content.min.js","sources":["../src/reload_page_content.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\nimport {exception as displayException} from 'core/notification';\nimport Templates from 'core/templates';\nimport {execReloadPagelist as reloadPagelist} from 'mod_mootimeter/reload_pagelist';\nimport {setGetParam} from 'mod_mootimeter/utils';\n\nexport const init = (uniqueID) => {\n\n const obj = document.getElementById(uniqueID);\n if (!obj) {\n return;\n }\n obj.addEventListener(\"change\", changePage);\n\n /**\n * Store the value.\n */\n function changePage() {\n var pageid = this.dataset.pageid;\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n execReloadPage(pageid, cmid, this.dataset);\n }\n};\n\n/**\n * Call to store input value\n * @param {int} pageid\n * @param {int} cmid\n * @param {string} dataset\n * @returns {array}\n */\nconst reloadPage = (\n pageid,\n cmid,\n dataset\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_pagecontentparams',\n args: {\n pageid,\n cmid,\n dataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {int} pageid\n * @param {int} cmid\n * @param {array} dataset\n */\nexport const execReloadPage = async(pageid, cmid, dataset) => {\n\n if (!dataset) {\n dataset = JSON.stringify([]);\n } else {\n dataset = JSON.stringify(dataset);\n }\n\n const response = await reloadPage(pageid, cmid, dataset);\n\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n\n var mtmstate = document.getElementById('mootimeterstate');\n\n const pageparmas = JSON.parse(response.pageparams);\n\n // Set new pageid.\n mtmstate.setAttribute('data-pageid', pageparmas.pageid);\n\n // Replace the pagecontent.\n Templates.renderForPromise(pageparmas.pagecontent.template, pageparmas.pagecontent)\n .then(({html, js}) => {\n Templates.replaceNodeContents('#mootimeter-pagecontent', html, js);\n mtmstate.setAttribute('data-contentchangedat_prev', mtmstate.dataset.contentchangedat);\n return true;\n })\n .catch((error) => displayException(error));\n\n // Set URL parameter.\n setGetParam('pageid', pageparmas.pageid);\n\n // Set active page marked in pageslist.\n reloadPagelist(pageid, cmid, true);\n\n }\n};\n"],"names":["uniqueID","obj","document","getElementById","addEventListener","pageid","this","dataset","queryString","window","location","search","cmid","URLSearchParams","get","execReloadPage","async","JSON","stringify","response","methodname","args","reloadPage","code","error","string","mtmstate","pageparmas","parse","pageparams","setAttribute","renderForPromise","pagecontent","template","then","_ref","html","js","replaceNodeContents","contentchangedat","catch"],"mappings":"ihBAOqBA,iBAEXC,IAAMC,SAASC,eAAeH,UAC/BC,KAGLA,IAAIG,iBAAiB,yBAMbC,OAASC,KAAKC,QAAQF,aACpBG,YAAcC,OAAOC,SAASC,OAE9BC,KADY,IAAIC,gBAAgBL,aACfM,IAAI,MAC3BC,eAAeV,OAAQO,KAAMN,KAAKC,mBA8B7BQ,eAAiBC,MAAMX,OAAQO,KAAML,WAK1CA,QAHCA,QAGSU,KAAKC,UAAUX,SAFfU,KAAKC,UAAU,UAKvBC,cA3BS,EACfd,OACAO,KACAL,WACC,cAAU,CAAC,CACZa,WAAY,uCACZC,KAAM,CACFhB,OAAAA,OACAO,KAAAA,KACAL,QAAAA,YAEJ,GAgBuBe,CAAWjB,OAAQO,KAAML,YAE3B,KAAjBY,SAASI,mBACLC,MAAML,SAASM,QAGF,KAAjBN,SAASI,KAAa,KAElBG,SAAWxB,SAASC,eAAe,yBAEjCwB,WAAaV,KAAKW,MAAMT,SAASU,YAGvCH,SAASI,aAAa,cAAeH,WAAWtB,2BAGtC0B,iBAAiBJ,WAAWK,YAAYC,SAAUN,WAAWK,aAClEE,MAAKC,WAACC,KAACA,KAADC,GAAOA,mCACAC,oBAAoB,0BAA2BF,KAAMC,IAC/DX,SAASI,aAAa,6BAA8BJ,SAASnB,QAAQgC,mBAC9D,KAEVC,OAAOhB,QAAU,2BAAiBA,gCAG3B,SAAUG,WAAWtB,gDAGlBA,OAAQO,MAAM"} \ No newline at end of file diff --git a/amd/build/reload_page_on_state_change.min.js b/amd/build/reload_page_on_state_change.min.js deleted file mode 100644 index 7da04466..00000000 --- a/amd/build/reload_page_on_state_change.min.js +++ /dev/null @@ -1,3 +0,0 @@ -define("mod_mootimeter/reload_page_on_state_change",["exports","mod_mootimeter/reload_page"],(function(_exports,_reload_page){Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0;_exports.init=id=>{document.getElementById("mootimeterstate").dataset.pageid&&setTimeout((()=>{const intervalms=document.getElementById("mootimeterstate").dataset.refreshinterval,interval=setInterval((()=>{document.getElementById(id)?reloadPageOnStateChange():clearInterval(interval)}),intervalms)}),2500)};const reloadPageOnStateChange=()=>{const mtmstate=document.getElementById("mootimeterstate");if(mtmstate.dataset.lastupdated==mtmstate.dataset.contentchangedat)return;const queryString=window.location.search,cmid=new URLSearchParams(queryString).get("id");(0,_reload_page.execReloadPage)(mtmstate.dataset.pageid,cmid,mtmstate.dataset)}})); - -//# sourceMappingURL=reload_page_on_state_change.min.js.map \ No newline at end of file diff --git a/amd/build/reload_page_on_state_change.min.js.map b/amd/build/reload_page_on_state_change.min.js.map deleted file mode 100644 index 161d6b14..00000000 --- a/amd/build/reload_page_on_state_change.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"reload_page_on_state_change.min.js","sources":["../src/reload_page_on_state_change.js"],"sourcesContent":["import {execReloadPage as reloadPage} from 'mod_mootimeter/reload_page';\n\n/**\n * Initializes refresh on state change.\n *\n * @param {string} id\n * @returns\n */\nexport const init = (id) => {\n if (!document.getElementById('mootimeterstate').dataset.pageid) {\n return;\n }\n\n setTimeout(() => {\n const intervalms = document.getElementById('mootimeterstate').dataset.refreshinterval;\n const interval = setInterval(() => {\n if (!document.getElementById(id)) {\n clearInterval(interval);\n return;\n }\n reloadPageOnStateChange();\n }, intervalms);\n }, 2500);\n};\n\n/**\n * Refresh the page on a state change.\n * @returns {mixed}\n */\nconst reloadPageOnStateChange = () => {\n const mtmstate = document.getElementById('mootimeterstate');\n\n // Early exit if there are no changes.\n if (mtmstate.dataset.lastupdated == mtmstate.dataset.contentchangedat) {\n return;\n }\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n\n reloadPage(mtmstate.dataset.pageid, cmid, mtmstate.dataset);\n};\n"],"names":["id","document","getElementById","dataset","pageid","setTimeout","intervalms","refreshinterval","interval","setInterval","reloadPageOnStateChange","clearInterval","mtmstate","lastupdated","contentchangedat","queryString","window","location","search","cmid","URLSearchParams","get"],"mappings":"yNAQqBA,KACZC,SAASC,eAAe,mBAAmBC,QAAQC,QAIxDC,YAAW,WACDC,WAAaL,SAASC,eAAe,mBAAmBC,QAAQI,gBAChEC,SAAWC,aAAY,KACpBR,SAASC,eAAeF,IAI7BU,0BAHIC,cAAcH,YAInBF,cACJ,aAODI,wBAA0B,WACtBE,SAAWX,SAASC,eAAe,sBAGrCU,SAAST,QAAQU,aAAeD,SAAST,QAAQW,8BAI/CC,YAAcC,OAAOC,SAASC,OAE9BC,KADY,IAAIC,gBAAgBL,aACfM,IAAI,sCAEhBT,SAAST,QAAQC,OAAQe,KAAMP,SAAST"} \ No newline at end of file diff --git a/amd/build/reload_page_settings.min.js b/amd/build/reload_page_settings.min.js index 9b408b3b..31b1fd15 100644 --- a/amd/build/reload_page_settings.min.js +++ b/amd/build/reload_page_settings.min.js @@ -1,3 +1,3 @@ -define("mod_mootimeter/reload_page_settings",["exports","core/ajax","core/log","core/notification","core/templates","mod_mootimeter/reload_pagelist"],(function(_exports,_ajax,_log,_notification,_templates,_reload_pagelist){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_log=_interopRequireDefault(_log),_templates=_interopRequireDefault(_templates);_exports.init=uniqueID=>{const obj=document.getElementById(uniqueID);obj&&obj.addEventListener("change",(function(){var pageid=this.dataset.pageid;const queryString=window.location.search,cmid=new URLSearchParams(queryString).get("id");execReloadPage(pageid,cmid,this.dataset)}))};const execReloadPage=async(pageid,cmid,dataset)=>{dataset=dataset?JSON.stringify(dataset):JSON.stringify([]);const response=await((pageid,cmid,dataset)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_pagecontentparams",args:{pageid:pageid,cmid:cmid,dataset:dataset}}])[0])(pageid,cmid,dataset);if(200!=response.code&&_log.default.error(response.string),200==response.code){var mtmstate=document.getElementById("mootimeterstate");const pageparmas=JSON.parse(response.pageparams);mtmstate.setAttribute("data-pageid",pageparmas.pageid),_templates.default.renderForPromise(pageparmas.colsettings.template,pageparmas.colsettings).then((_ref=>{let{html:html,js:js}=_ref;return _templates.default.replaceNodeContents("#mootimeter-col-settings",html,js),!0})).catch((error=>(0,_notification.exception)(error))),function(key,value){if(history.pushState){var params=new URLSearchParams(window.location.search);params.set(key,value);var newUrl=window.location.origin+window.location.pathname+"?"+params.toString();window.history.pushState({path:newUrl},"",newUrl)}}("pageid",pageparmas.pageid),(0,_reload_pagelist.execReloadPagelist)(pageid,cmid,!0),document.querySelectorAll(".tooltip").forEach((e=>e.remove()))}}})); +define("mod_mootimeter/reload_page_settings",["exports","core/ajax","core/log","core/notification","core/templates","mod_mootimeter/reload_pagelist"],(function(_exports,_ajax,_log,_notification,_templates,_reload_pagelist){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_log=_interopRequireDefault(_log),_templates=_interopRequireDefault(_templates);_exports.init=uniqueID=>{const obj=document.getElementById(uniqueID);obj&&obj.addEventListener("change",(function(){var pageid=this.dataset.pageid;const queryString=window.location.search,cmid=new URLSearchParams(queryString).get("id");execReloadPage(pageid,cmid,this.dataset)}))};const execReloadPage=async(pageid,cmid,dataset)=>{dataset=dataset?JSON.stringify(dataset):JSON.stringify([]);const response=await((pageid,cmid,dataset)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_pagecontentparams",args:{pageid:pageid,cmid:cmid,dataset:dataset}}])[0])(pageid,cmid,dataset);if(200!=response.code&&_log.default.error(response.string),200==response.code){var mtmstate=document.getElementById("mootimeterstate");const pageparmas=JSON.parse(response.pageparams);mtmstate.setAttribute("data-pageid",pageparmas.pageid),_templates.default.renderForPromise(pageparmas.colsettings.template,pageparmas.colsettings).then((_ref=>{let{html:html,js:js}=_ref;return _templates.default.replaceNodeContents("#mootimeter-col-settings",html,js),mtmstate.setAttribute("data-settingschangedat_prev",mtmstate.dataset.settingschangedat),!0})).catch((error=>(0,_notification.exception)(error))),function(key,value){if(history.pushState){var params=new URLSearchParams(window.location.search);params.set(key,value);var newUrl=window.location.origin+window.location.pathname+"?"+params.toString();window.history.pushState({path:newUrl},"",newUrl)}}("pageid",pageparmas.pageid),(0,_reload_pagelist.execReloadPagelist)(pageid,cmid,!0),document.querySelectorAll(".tooltip").forEach((e=>e.remove()))}}})); //# sourceMappingURL=reload_page_settings.min.js.map \ No newline at end of file diff --git a/amd/build/reload_page_settings.min.js.map b/amd/build/reload_page_settings.min.js.map index 44a6d4b9..adb8e982 100644 --- a/amd/build/reload_page_settings.min.js.map +++ b/amd/build/reload_page_settings.min.js.map @@ -1 +1 @@ -{"version":3,"file":"reload_page_settings.min.js","sources":["../src/reload_page_settings.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\nimport {exception as displayException} from 'core/notification';\nimport Templates from 'core/templates';\nimport {execReloadPagelist as reloadPagelist} from 'mod_mootimeter/reload_pagelist';\n\nexport const init = (uniqueID) => {\n\n const obj = document.getElementById(uniqueID);\n if (!obj) {\n return;\n }\n obj.addEventListener(\"change\", changePage);\n\n /**\n * Store the value.\n */\n function changePage() {\n var pageid = this.dataset.pageid;\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n execReloadPage(pageid, cmid, this.dataset);\n }\n};\n\n/**\n * Call to store input value\n * @param {int} pageid\n * @param {int} cmid\n * @param {string} dataset\n * @returns {array}\n */\nconst reloadPage = (\n pageid,\n cmid,\n dataset\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_pagecontentparams',\n args: {\n pageid,\n cmid,\n dataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {int} pageid\n * @param {int} cmid\n * @param {array} dataset\n */\nconst execReloadPage = async(pageid, cmid, dataset) => {\n\n if (!dataset) {\n dataset = JSON.stringify([]);\n } else {\n dataset = JSON.stringify(dataset);\n }\n\n const response = await reloadPage(pageid, cmid, dataset);\n\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n\n var mtmstate = document.getElementById('mootimeterstate');\n\n const pageparmas = JSON.parse(response.pageparams);\n\n // Set new pageid.\n mtmstate.setAttribute('data-pageid', pageparmas.pageid);\n\n // Replace the settings col if necessary.\n Templates.renderForPromise(pageparmas.colsettings.template, pageparmas.colsettings)\n .then(({html, js}) => {\n Templates.replaceNodeContents('#mootimeter-col-settings', html, js);\n return true;\n })\n .catch((error) => displayException(error));\n\n // Set URL parameter.\n setGetParam('pageid', pageparmas.pageid);\n\n // Set active page marked in pageslist.\n reloadPagelist(pageid, cmid, true);\n\n // Remove all tooltips of pageslist that are still present.\n document.querySelectorAll('.tooltip').forEach(e => e.remove());\n }\n};\n\n/**\n * Set the Query Parameter.\n * @param {string} key\n * @param {string} value\n */\nfunction setGetParam(key, value) {\n if (history.pushState) {\n var params = new URLSearchParams(window.location.search);\n params.set(key, value);\n var newUrl = window.location.origin\n + window.location.pathname\n + '?' + params.toString();\n window.history.pushState({path: newUrl}, '', newUrl);\n }\n}"],"names":["uniqueID","obj","document","getElementById","addEventListener","pageid","this","dataset","queryString","window","location","search","cmid","URLSearchParams","get","execReloadPage","async","JSON","stringify","response","methodname","args","reloadPage","code","error","string","mtmstate","pageparmas","parse","pageparams","setAttribute","renderForPromise","colsettings","template","then","_ref","html","js","replaceNodeContents","catch","key","value","history","pushState","params","set","newUrl","origin","pathname","toString","path","setGetParam","querySelectorAll","forEach","e","remove"],"mappings":"4dAMqBA,iBAEXC,IAAMC,SAASC,eAAeH,UAC/BC,KAGLA,IAAIG,iBAAiB,yBAMbC,OAASC,KAAKC,QAAQF,aACpBG,YAAcC,OAAOC,SAASC,OAE9BC,KADY,IAAIC,gBAAgBL,aACfM,IAAI,MAC3BC,eAAeV,OAAQO,KAAMN,KAAKC,mBA8BpCQ,eAAiBC,MAAMX,OAAQO,KAAML,WAKnCA,QAHCA,QAGSU,KAAKC,UAAUX,SAFfU,KAAKC,UAAU,UAKvBC,cA3BS,EACfd,OACAO,KACAL,WACC,cAAU,CAAC,CACZa,WAAY,uCACZC,KAAM,CACFhB,OAAAA,OACAO,KAAAA,KACAL,QAAAA,YAEJ,GAgBuBe,CAAWjB,OAAQO,KAAML,YAE3B,KAAjBY,SAASI,mBACLC,MAAML,SAASM,QAGF,KAAjBN,SAASI,KAAa,KAElBG,SAAWxB,SAASC,eAAe,yBAEjCwB,WAAaV,KAAKW,MAAMT,SAASU,YAGvCH,SAASI,aAAa,cAAeH,WAAWtB,2BAGtC0B,iBAAiBJ,WAAWK,YAAYC,SAAUN,WAAWK,aAClEE,MAAKC,WAACC,KAACA,KAADC,GAAOA,mCACAC,oBAAoB,2BAA4BF,KAAMC,KACzD,KAEVE,OAAOf,QAAU,2BAAiBA,kBAkB1BgB,IAAKC,UAClBC,QAAQC,UAAW,KACfC,OAAS,IAAI/B,gBAAgBJ,OAAOC,SAASC,QACjDiC,OAAOC,IAAIL,IAAKC,WACZK,OAASrC,OAAOC,SAASqC,OACvBtC,OAAOC,SAASsC,SAChB,IAAMJ,OAAOK,WACnBxC,OAAOiC,QAAQC,UAAU,CAACO,KAAMJ,QAAS,GAAIA,SAtB7CK,CAAY,SAAUxB,WAAWtB,gDAGlBA,OAAQO,MAAM,GAG7BV,SAASkD,iBAAiB,YAAYC,SAAQC,GAAKA,EAAEC"} \ No newline at end of file +{"version":3,"file":"reload_page_settings.min.js","sources":["../src/reload_page_settings.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\nimport {exception as displayException} from 'core/notification';\nimport Templates from 'core/templates';\nimport {execReloadPagelist as reloadPagelist} from 'mod_mootimeter/reload_pagelist';\n\nexport const init = (uniqueID) => {\n\n const obj = document.getElementById(uniqueID);\n if (!obj) {\n return;\n }\n obj.addEventListener(\"change\", changePage);\n\n /**\n * Store the value.\n */\n function changePage() {\n var pageid = this.dataset.pageid;\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n execReloadPage(pageid, cmid, this.dataset);\n }\n};\n\n/**\n * Call to store input value\n * @param {int} pageid\n * @param {int} cmid\n * @param {string} dataset\n * @returns {array}\n */\nconst reloadPage = (\n pageid,\n cmid,\n dataset\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_pagecontentparams',\n args: {\n pageid,\n cmid,\n dataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {int} pageid\n * @param {int} cmid\n * @param {array} dataset\n */\nconst execReloadPage = async(pageid, cmid, dataset) => {\n\n if (!dataset) {\n dataset = JSON.stringify([]);\n } else {\n dataset = JSON.stringify(dataset);\n }\n\n const response = await reloadPage(pageid, cmid, dataset);\n\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n var mtmstate = document.getElementById('mootimeterstate');\n const pageparmas = JSON.parse(response.pageparams);\n\n // Set new pageid.\n mtmstate.setAttribute('data-pageid', pageparmas.pageid);\n\n // Replace the settings col if necessary.\n Templates.renderForPromise(pageparmas.colsettings.template, pageparmas.colsettings)\n .then(({html, js}) => {\n Templates.replaceNodeContents('#mootimeter-col-settings', html, js);\n mtmstate.setAttribute('data-settingschangedat_prev', mtmstate.dataset.settingschangedat);\n return true;\n })\n .catch((error) => displayException(error));\n\n // Set URL parameter.\n setGetParam('pageid', pageparmas.pageid);\n\n // Set active page marked in pageslist.\n reloadPagelist(pageid, cmid, true);\n\n // Remove all tooltips of pageslist that are still present.\n document.querySelectorAll('.tooltip').forEach(e => e.remove());\n }\n};\n\n/**\n * Set the Query Parameter.\n * @param {string} key\n * @param {string} value\n */\nfunction setGetParam(key, value) {\n if (history.pushState) {\n var params = new URLSearchParams(window.location.search);\n params.set(key, value);\n var newUrl = window.location.origin\n + window.location.pathname\n + '?' + params.toString();\n window.history.pushState({path: newUrl}, '', newUrl);\n }\n}\n"],"names":["uniqueID","obj","document","getElementById","addEventListener","pageid","this","dataset","queryString","window","location","search","cmid","URLSearchParams","get","execReloadPage","async","JSON","stringify","response","methodname","args","reloadPage","code","error","string","mtmstate","pageparmas","parse","pageparams","setAttribute","renderForPromise","colsettings","template","then","_ref","html","js","replaceNodeContents","settingschangedat","catch","key","value","history","pushState","params","set","newUrl","origin","pathname","toString","path","setGetParam","querySelectorAll","forEach","e","remove"],"mappings":"4dAMqBA,iBAEXC,IAAMC,SAASC,eAAeH,UAC/BC,KAGLA,IAAIG,iBAAiB,yBAMbC,OAASC,KAAKC,QAAQF,aACpBG,YAAcC,OAAOC,SAASC,OAE9BC,KADY,IAAIC,gBAAgBL,aACfM,IAAI,MAC3BC,eAAeV,OAAQO,KAAMN,KAAKC,mBA8BpCQ,eAAiBC,MAAMX,OAAQO,KAAML,WAKnCA,QAHCA,QAGSU,KAAKC,UAAUX,SAFfU,KAAKC,UAAU,UAKvBC,cA3BS,EACfd,OACAO,KACAL,WACC,cAAU,CAAC,CACZa,WAAY,uCACZC,KAAM,CACFhB,OAAAA,OACAO,KAAAA,KACAL,QAAAA,YAEJ,GAgBuBe,CAAWjB,OAAQO,KAAML,YAE3B,KAAjBY,SAASI,mBACLC,MAAML,SAASM,QAGF,KAAjBN,SAASI,KAAa,KAClBG,SAAWxB,SAASC,eAAe,yBACjCwB,WAAaV,KAAKW,MAAMT,SAASU,YAGvCH,SAASI,aAAa,cAAeH,WAAWtB,2BAGtC0B,iBAAiBJ,WAAWK,YAAYC,SAAUN,WAAWK,aAClEE,MAAKC,WAACC,KAACA,KAADC,GAAOA,mCACAC,oBAAoB,2BAA4BF,KAAMC,IAChEX,SAASI,aAAa,8BAA+BJ,SAASnB,QAAQgC,oBAC/D,KAEVC,OAAOhB,QAAU,2BAAiBA,kBAkB1BiB,IAAKC,UAClBC,QAAQC,UAAW,KACfC,OAAS,IAAIhC,gBAAgBJ,OAAOC,SAASC,QACjDkC,OAAOC,IAAIL,IAAKC,WACZK,OAAStC,OAAOC,SAASsC,OACvBvC,OAAOC,SAASuC,SAChB,IAAMJ,OAAOK,WACnBzC,OAAOkC,QAAQC,UAAU,CAACO,KAAMJ,QAAS,GAAIA,SAtB7CK,CAAY,SAAUzB,WAAWtB,gDAGlBA,OAAQO,MAAM,GAG7BV,SAASmD,iBAAiB,YAAYC,SAAQC,GAAKA,EAAEC"} \ No newline at end of file diff --git a/amd/build/reload_pagelist.min.js b/amd/build/reload_pagelist.min.js index fff0a03d..fa907f6e 100644 --- a/amd/build/reload_pagelist.min.js +++ b/amd/build/reload_pagelist.min.js @@ -1,3 +1,3 @@ -define("mod_mootimeter/reload_pagelist",["exports","core/ajax","core/log","core/notification","core/templates","mod_mootimeter/reload_page","core/sortable_list","jquery","mod_mootimeter/utils"],(function(_exports,_ajax,_log,_notification,_templates,_reload_page,_sortable_list,_jquery,_utils){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=_exports.execReloadPagelist=void 0,_log=_interopRequireDefault(_log),_templates=_interopRequireDefault(_templates),_sortable_list=_interopRequireDefault(_sortable_list),_jquery=_interopRequireDefault(_jquery);_exports.init=pagerefreshintervall=>{if(!document.getElementById("mootimeterstate"))return;pagerefreshintervall<500&&(pagerefreshintervall=500),setInterval((()=>{!function(){var pageid=0;document.getElementById("mootimeterstate").dataset.pageid&&("undefined"!=(pageid=document.getElementById("mootimeterstate").dataset.pageid)&&0!=pageid.length||(pageid=0));const queryString=window.location.search,cmid=new URLSearchParams(queryString).get("id");execReloadPagelist(pageid,cmid)}()}),pagerefreshintervall);const queryString=window.location.search,urlParams=new URLSearchParams(queryString),cmid=urlParams.get("id");var pageid=urlParams.get("pageid");null!=pageid&&0!=pageid.length||(pageid=0),(0,_reload_page.execReloadPage)(pageid,cmid,"")};const reloadPagelist=(pageid,cmid,dataset)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_pages_list",args:{pageid:pageid,cmid:cmid,dataset:dataset}}])[0],execReloadPagelist=async function(pageid,cmid){let forcereload=arguments.length>2&&void 0!==arguments[2]&&arguments[2];var mtmstate=document.getElementById("mootimeterstate"),dataset=mtmstate.dataset;const queryString=window.location.search,urlParams=new URLSearchParams(queryString);urlParams.get("r")&&(dataset.r=urlParams.get("r")),urlParams.get("o")&&(dataset.o=urlParams.get("o")),dataset.useUrlParams=1;const response=await reloadPagelist(pageid,cmid,JSON.stringify(dataset));if(200!=response.code&&_log.default.error(response.string),200==response.code){const pagelist=JSON.parse(response.pagelist),loadpageid=pagelist.loadpageid;pagelist.loadpageid&&(0,_reload_page.execReloadPage)(loadpageid,cmid,""),mtmstate.getAttribute("data-teacherpermissiontoview")&&mtmstate.getAttribute("data-teacherpermissiontoview")!=pagelist.dataset.teacherpermissiontoview&&(0,_reload_page.execReloadPage)(mtmstate.getAttribute("data-pageid"),cmid,"");for(let dataattribute in pagelist.dataset)pagelist.dataset.hasOwnProperty(dataattribute)&&mtmstate.setAttribute("data-"+dataattribute,pagelist.dataset[dataattribute]);if(mtmstate.dataset.pagelisttime==pagelist.dataset.pagelisttime&&!forcereload)return;_templates.default.renderForPromise("mod_mootimeter/elements/snippet_page_list",pagelist).then((_ref=>{let{html:html,js:js}=_ref;document.getElementById("mootimeter-addpage-button")&&document.getElementById("mootimeter-addpage-button").remove(),_templates.default.replaceNode(document.getElementById("mootimeter-pages-list"),html,js);var listelements=document.getElementsByClassName("mootimeter_pages_li");if(listelements[0]){var uniqid=listelements[0].dataset.uniqid;new _sortable_list.default("#mootimeter-pages-list",{moveHandlerSelector:".mootimeter_page_move_sortablehandle_"+uniqid}),(0,_jquery.default)(".mootimeter_pages_li_sortable_"+uniqid).on(_sortable_list.default.EVENTS.DROP,(async function(_,info){var newIndex=info.targetList.children().index(info.element);await storePagePosition(this.dataset.pageid,newIndex),execReloadPagelist(pageid,cmid,!0)}))}return document.querySelectorAll(".tooltip").forEach((e=>e.remove())),!0})).catch((error=>(0,_notification.exception)(error)))}};_exports.execReloadPagelist=execReloadPagelist;const storePagePosition=(pageid,newIndex)=>{(0,_utils.ajaxRequestInput)("mod_mootimeter_store_page_details",pageid,"sortorder",newIndex,"")}})); +define("mod_mootimeter/reload_pagelist",["exports","core/ajax","core/log","core/notification","core/templates","core/sortable_list","jquery","mod_mootimeter/utils"],(function(_exports,_ajax,_log,_notification,_templates,_sortable_list,_jquery,_utils){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}}Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=_exports.execReloadPagelist=void 0,_log=_interopRequireDefault(_log),_templates=_interopRequireDefault(_templates),_sortable_list=_interopRequireDefault(_sortable_list),_jquery=_interopRequireDefault(_jquery);_exports.init=pagerefreshintervall=>{document.getElementById("mootimeterstate")&&(pagerefreshintervall<500&&(pagerefreshintervall=500),setInterval((()=>{!function(){var pageid=0;document.getElementById("mootimeterstate").dataset.pageid&&("undefined"!=(pageid=document.getElementById("mootimeterstate").dataset.pageid)&&0!=pageid.length||(pageid=0));const queryString=window.location.search,cmid=new URLSearchParams(queryString).get("id");execReloadPagelist(pageid,cmid)}()}),pagerefreshintervall))};const reloadPagelist=(pageid,cmid,dataset)=>(0,_ajax.call)([{methodname:"mod_mootimeter_get_pages_list",args:{pageid:pageid,cmid:cmid,dataset:dataset}}])[0],execReloadPagelist=async function(pageid,cmid){let forcereload=arguments.length>2&&void 0!==arguments[2]&&arguments[2];var mtmstate=document.getElementById("mootimeterstate"),dataset=mtmstate.dataset;if(mtmstate.dataset.pagelistchangedat_prev&&mtmstate.dataset.pagelistchangedat==mtmstate.dataset.pagelistchangedat_prev&&!forcereload)return;const queryString=window.location.search,urlParams=new URLSearchParams(queryString);urlParams.get("r")&&(dataset.r=urlParams.get("r")),urlParams.get("o")&&(dataset.o=urlParams.get("o")),dataset.useUrlParams=1;const response=await reloadPagelist(pageid,cmid,JSON.stringify(dataset));if(200!=response.code&&_log.default.error(response.string),200==response.code){const pagelist=JSON.parse(response.pagelist);_templates.default.renderForPromise("mod_mootimeter/elements/snippet_page_list",pagelist).then((_ref=>{let{html:html,js:js}=_ref;document.getElementById("mootimeter-addpage-button")&&document.getElementById("mootimeter-addpage-button").remove(),_templates.default.replaceNode(document.getElementById("mootimeter-pages-list"),html,js);var listelements=document.getElementsByClassName("mootimeter_pages_li");if(listelements[0]){var uniqid=listelements[0].dataset.uniqid;new _sortable_list.default("#mootimeter-pages-list",{moveHandlerSelector:".mootimeter_page_move_sortablehandle_"+uniqid}),(0,_jquery.default)(".mootimeter_pages_li_sortable_"+uniqid).on(_sortable_list.default.EVENTS.DROP,(async function(_,info){var newIndex=info.targetList.children().index(info.element);await storePagePosition(this.dataset.pageid,newIndex)}))}return document.querySelectorAll(".tooltip").forEach((e=>e.remove())),!0})).catch((error=>(0,_notification.exception)(error))),mtmstate.setAttribute("data-pagelistchangedat_prev",mtmstate.dataset.pagelistchangedat),document.querySelectorAll(".tooltip").forEach((e=>e.remove()))}};_exports.execReloadPagelist=execReloadPagelist;const storePagePosition=(pageid,newIndex)=>{(0,_utils.ajaxRequestInput)("mod_mootimeter_store_page_details",pageid,"sortorder",newIndex,"")}})); //# sourceMappingURL=reload_pagelist.min.js.map \ No newline at end of file diff --git a/amd/build/reload_pagelist.min.js.map b/amd/build/reload_pagelist.min.js.map index 61582d9b..04d1aede 100644 --- a/amd/build/reload_pagelist.min.js.map +++ b/amd/build/reload_pagelist.min.js.map @@ -1 +1 @@ -{"version":3,"file":"reload_pagelist.min.js","sources":["../src/reload_pagelist.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\nimport {exception as displayException} from 'core/notification';\nimport Templates from 'core/templates';\nimport {execReloadPage as reloadPage} from 'mod_mootimeter/reload_page';\nimport SortableList from 'core/sortable_list';\nimport jQuery from 'jquery';\nimport {ajaxRequestInput} from 'mod_mootimeter/utils';\n\nexport const init = (pagerefreshintervall) => {\n var obj = document.getElementById('mootimeterstate');\n\n if (!obj) {\n return;\n }\n\n if (pagerefreshintervall < 500) {\n pagerefreshintervall = 500;\n }\n\n setInterval(() => {\n getPagelist();\n }, pagerefreshintervall);\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n var pageid = urlParams.get('pageid');\n\n if (pageid === null || pageid === undefined || pageid.length == 0) {\n pageid = 0;\n }\n reloadPage(pageid, cmid, '');\n\n /**\n * Store the value.\n */\n function getPagelist() {\n var pageid = 0;\n\n if (document.getElementById('mootimeterstate').dataset.pageid) {\n pageid = document.getElementById('mootimeterstate').dataset.pageid;\n if (pageid == \"undefined\" || pageid.length == 0) {\n pageid = 0;\n }\n }\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n execReloadPagelist(pageid, cmid);\n }\n};\n\n/**\n * Call to store input value\n * @param {int} pageid\n * @param {int} cmid\n * @param {string} dataset\n * @returns {array}\n */\nconst reloadPagelist = (\n pageid,\n cmid,\n dataset\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_pages_list',\n args: {\n pageid,\n cmid,\n dataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {int} pageid\n * @param {int} cmid\n * @param {bool} forcereload\n */\nexport const execReloadPagelist = async(pageid, cmid, forcereload = false) => {\n var mtmstate = document.getElementById('mootimeterstate');\n var dataset = mtmstate.dataset;\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n\n if (urlParams.get('r')) {\n dataset.r = urlParams.get('r');\n }\n\n if (urlParams.get('o')) {\n dataset.o = urlParams.get('o');\n }\n\n dataset.useUrlParams = 1;\n\n const response = await reloadPagelist(pageid, cmid, JSON.stringify(dataset));\n\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n\n const pagelist = JSON.parse(response.pagelist);\n const loadpageid = pagelist.loadpageid;\n\n // Reload pagecontent if page does not exit any more.\n if (pagelist.loadpageid) {\n reloadPage(loadpageid, cmid, '');\n }\n\n // Reload page if teacherpermission to view changed.\n if (\n mtmstate.getAttribute('data-teacherpermissiontoview')\n && mtmstate.getAttribute('data-teacherpermissiontoview') != pagelist.dataset['teacherpermissiontoview']\n ) {\n reloadPage(mtmstate.getAttribute('data-pageid'), cmid, '');\n }\n\n // Set all datasets to mootimeterstate.\n for (let dataattribute in pagelist.dataset) {\n if (pagelist.dataset.hasOwnProperty(dataattribute)) {\n mtmstate.setAttribute('data-' + dataattribute, pagelist.dataset[dataattribute]);\n }\n }\n\n // If there are no changes in pagelist. We are finished.\n if (mtmstate.dataset.pagelisttime == pagelist.dataset.pagelisttime && !forcereload) {\n return;\n }\n\n // Set new pagelisttime state.\n\n // Replace the pages list.\n Templates.renderForPromise('mod_mootimeter/elements/snippet_page_list', pagelist)\n .then(({html, js}) => {\n if (document.getElementById('mootimeter-addpage-button')) {\n document.getElementById('mootimeter-addpage-button').remove();\n }\n Templates.replaceNode(document.getElementById('mootimeter-pages-list'), html, js);\n\n // Finally make pageslist sortable.\n var listelements = document.getElementsByClassName('mootimeter_pages_li');\n if (listelements[0]) {\n var uniqid = listelements[0].dataset.uniqid;\n new SortableList('#mootimeter-pages-list', {\n moveHandlerSelector: '.mootimeter_page_move_sortablehandle_' + uniqid,\n });\n jQuery('.mootimeter_pages_li_sortable_' + uniqid).on(SortableList.EVENTS.DROP, async function(_, info) {\n var newIndex = info.targetList.children().index(info.element);\n await storePagePosition(this.dataset.pageid, newIndex);\n // We need to reload the pagelist, because the page numbers would not update otherwise.\n execReloadPagelist(pageid, cmid, true);\n });\n }\n\n // Remove all tooltips of pageslist that are still present.\n document.querySelectorAll('.tooltip').forEach(e => e.remove());\n\n return true;\n })\n .catch((error) => displayException(error));\n }\n};\n\n/**\n * Store the new page position.\n * @param {int} pageid\n * @param {int} newIndex\n */\nconst storePagePosition = (pageid, newIndex) => {\n ajaxRequestInput(\n 'mod_mootimeter_store_page_details',\n pageid,\n 'sortorder',\n newIndex,\n ''\n );\n};\n"],"names":["pagerefreshintervall","document","getElementById","setInterval","pageid","dataset","length","queryString","window","location","search","cmid","URLSearchParams","get","execReloadPagelist","getPagelist","urlParams","reloadPagelist","methodname","args","async","forcereload","mtmstate","r","o","useUrlParams","response","JSON","stringify","code","error","string","pagelist","parse","loadpageid","getAttribute","dataattribute","hasOwnProperty","setAttribute","pagelisttime","renderForPromise","then","_ref","html","js","remove","replaceNode","listelements","getElementsByClassName","uniqid","SortableList","moveHandlerSelector","on","EVENTS","DROP","_","info","newIndex","targetList","children","index","element","storePagePosition","this","querySelectorAll","forEach","e","catch"],"mappings":"4pBASqBA,2BACPC,SAASC,eAAe,0BAM9BF,qBAAuB,MACvBA,qBAAuB,KAG3BG,aAAY,qBAkBJC,OAAS,EAETH,SAASC,eAAe,mBAAmBG,QAAQD,SAErC,cADdA,OAASH,SAASC,eAAe,mBAAmBG,QAAQD,SACd,GAAjBA,OAAOE,SAChCF,OAAS,UAIXG,YAAcC,OAAOC,SAASC,OAE9BC,KADY,IAAIC,gBAAgBL,aACfM,IAAI,MAC3BC,mBAAmBV,OAAQO,MA7B3BI,KACDf,4BAEGO,YAAcC,OAAOC,SAASC,OAC9BM,UAAY,IAAIJ,gBAAgBL,aAChCI,KAAOK,UAAUH,IAAI,UACvBT,OAASY,UAAUH,IAAI,UAEvBT,MAAAA,QAA4D,GAAjBA,OAAOE,SAClDF,OAAS,mCAEFA,OAAQO,KAAM,WA6BvBM,eAAiB,CACnBb,OACAO,KACAN,WACC,cAAU,CAAC,CACZa,WAAY,gCACZC,KAAM,CACFf,OAAAA,OACAO,KAAAA,KACAN,QAAAA,YAEJ,GAQSS,mBAAqBM,eAAMhB,OAAQO,UAAMU,wEAC9CC,SAAWrB,SAASC,eAAe,mBACnCG,QAAUiB,SAASjB,cACjBE,YAAcC,OAAOC,SAASC,OAC9BM,UAAY,IAAIJ,gBAAgBL,aAElCS,UAAUH,IAAI,OACdR,QAAQkB,EAAIP,UAAUH,IAAI,MAG1BG,UAAUH,IAAI,OACdR,QAAQmB,EAAIR,UAAUH,IAAI,MAG9BR,QAAQoB,aAAe,QAEjBC,eAAiBT,eAAeb,OAAQO,KAAMgB,KAAKC,UAAUvB,aAE9C,KAAjBqB,SAASG,mBACLC,MAAMJ,SAASK,QAGF,KAAjBL,SAASG,KAAa,OAEhBG,SAAWL,KAAKM,MAAMP,SAASM,UAC/BE,WAAaF,SAASE,WAGxBF,SAASE,4CACEA,WAAYvB,KAAM,IAK7BW,SAASa,aAAa,iCACnBb,SAASa,aAAa,iCAAmCH,SAAS3B,QAAT,yDAEjDiB,SAASa,aAAa,eAAgBxB,KAAM,QAItD,IAAIyB,iBAAiBJ,SAAS3B,QAC3B2B,SAAS3B,QAAQgC,eAAeD,gBAChCd,SAASgB,aAAa,QAAUF,cAAeJ,SAAS3B,QAAQ+B,mBAKpEd,SAASjB,QAAQkC,cAAgBP,SAAS3B,QAAQkC,eAAiBlB,sCAO7DmB,iBAAiB,4CAA6CR,UACnES,MAAKC,WAACC,KAACA,KAADC,GAAOA,SACN3C,SAASC,eAAe,8BACxBD,SAASC,eAAe,6BAA6B2C,4BAE/CC,YAAY7C,SAASC,eAAe,yBAA0ByC,KAAMC,QAG1EG,aAAe9C,SAAS+C,uBAAuB,0BAC/CD,aAAa,GAAI,KACbE,OAASF,aAAa,GAAG1C,QAAQ4C,WACjCC,uBAAa,yBAA0B,CACvCC,oBAAqB,wCAA0CF,6BAE5D,iCAAmCA,QAAQG,GAAGF,uBAAaG,OAAOC,MAAMlC,eAAemC,EAAGC,UACzFC,SAAWD,KAAKE,WAAWC,WAAWC,MAAMJ,KAAKK,eAC/CC,kBAAkBC,KAAK1D,QAAQD,OAAQqD,UAE7C3C,mBAAmBV,OAAQO,MAAM,aAKzCV,SAAS+D,iBAAiB,YAAYC,SAAQC,GAAKA,EAAErB,YAE9C,KAEVsB,OAAOrC,QAAU,2BAAiBA,gEASzCgC,kBAAoB,CAAC1D,OAAQqD,wCAE3B,oCACArD,OACA,YACAqD,SACA"} \ No newline at end of file +{"version":3,"file":"reload_pagelist.min.js","sources":["../src/reload_pagelist.js"],"sourcesContent":["import {call as fetchMany} from 'core/ajax';\nimport Log from 'core/log';\nimport {exception as displayException} from 'core/notification';\nimport Templates from 'core/templates';\nimport SortableList from 'core/sortable_list';\nimport jQuery from 'jquery';\nimport {ajaxRequestInput} from 'mod_mootimeter/utils';\n\nexport const init = (pagerefreshintervall) => {\n var obj = document.getElementById('mootimeterstate');\n\n if (!obj) {\n return;\n }\n\n if (pagerefreshintervall < 500) {\n pagerefreshintervall = 500;\n }\n\n setInterval(() => {\n getPagelist();\n }, pagerefreshintervall);\n\n /**\n * Store the value.\n */\n function getPagelist() {\n var pageid = 0;\n\n if (document.getElementById('mootimeterstate').dataset.pageid) {\n pageid = document.getElementById('mootimeterstate').dataset.pageid;\n if (pageid == \"undefined\" || pageid.length == 0) {\n pageid = 0;\n }\n }\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n const cmid = urlParams.get('id');\n execReloadPagelist(pageid, cmid);\n }\n};\n\n/**\n * Call to store input value\n * @param {int} pageid\n * @param {int} cmid\n * @param {string} dataset\n * @returns {array}\n */\nconst reloadPagelist = (\n pageid,\n cmid,\n dataset\n) => fetchMany([{\n methodname: 'mod_mootimeter_get_pages_list',\n args: {\n pageid,\n cmid,\n dataset\n },\n}])[0];\n\n/**\n * Executes the call to store input value.\n * @param {int} pageid\n * @param {int} cmid\n * @param {bool} forcereload\n */\nexport const execReloadPagelist = async(pageid, cmid, forcereload = false) => {\n var mtmstate = document.getElementById('mootimeterstate');\n var dataset = mtmstate.dataset;\n\n // Early exit if there were no changes.\n if (\n (\n mtmstate.dataset.pagelistchangedat_prev\n && mtmstate.dataset.pagelistchangedat == mtmstate.dataset.pagelistchangedat_prev\n )\n && !forcereload\n ) {\n return;\n }\n\n const queryString = window.location.search;\n const urlParams = new URLSearchParams(queryString);\n\n if (urlParams.get('r')) {\n dataset.r = urlParams.get('r');\n }\n\n if (urlParams.get('o')) {\n dataset.o = urlParams.get('o');\n }\n\n dataset.useUrlParams = 1;\n\n const response = await reloadPagelist(pageid, cmid, JSON.stringify(dataset));\n\n if (response.code != 200) {\n Log.error(response.string);\n }\n\n if (response.code == 200) {\n\n const pagelist = JSON.parse(response.pagelist);\n\n // Replace the pages list.\n Templates.renderForPromise('mod_mootimeter/elements/snippet_page_list', pagelist)\n .then(({html, js}) => {\n if (document.getElementById('mootimeter-addpage-button')) {\n document.getElementById('mootimeter-addpage-button').remove();\n }\n Templates.replaceNode(document.getElementById('mootimeter-pages-list'), html, js);\n\n // Finally make pageslist sortable.\n var listelements = document.getElementsByClassName('mootimeter_pages_li');\n if (listelements[0]) {\n var uniqid = listelements[0].dataset.uniqid;\n new SortableList('#mootimeter-pages-list', {\n moveHandlerSelector: '.mootimeter_page_move_sortablehandle_' + uniqid,\n });\n jQuery('.mootimeter_pages_li_sortable_' + uniqid).on(SortableList.EVENTS.DROP, async function(_, info) {\n var newIndex = info.targetList.children().index(info.element);\n await storePagePosition(this.dataset.pageid, newIndex);\n });\n }\n\n // Remove all tooltips of pageslist that are still present.\n document.querySelectorAll('.tooltip').forEach(e => e.remove());\n\n return true;\n })\n .catch((error) => displayException(error));\n\n // Set new pagelistchangedat_prev state.\n mtmstate.setAttribute('data-pagelistchangedat_prev', mtmstate.dataset.pagelistchangedat);\n\n // Remove all tooltips of pageslist that are still present.\n document.querySelectorAll('.tooltip').forEach(e => e.remove());\n }\n};\n\n/**\n * Store the new page position.\n * @param {int} pageid\n * @param {int} newIndex\n */\nconst storePagePosition = (pageid, newIndex) => {\n ajaxRequestInput(\n 'mod_mootimeter_store_page_details',\n pageid,\n 'sortorder',\n newIndex,\n ''\n );\n};\n"],"names":["pagerefreshintervall","document","getElementById","setInterval","pageid","dataset","length","queryString","window","location","search","cmid","URLSearchParams","get","execReloadPagelist","getPagelist","reloadPagelist","methodname","args","async","forcereload","mtmstate","pagelistchangedat_prev","pagelistchangedat","urlParams","r","o","useUrlParams","response","JSON","stringify","code","error","string","pagelist","parse","renderForPromise","then","_ref","html","js","remove","replaceNode","listelements","getElementsByClassName","uniqid","SortableList","moveHandlerSelector","on","EVENTS","DROP","_","info","newIndex","targetList","children","index","element","storePagePosition","this","querySelectorAll","forEach","e","catch","setAttribute"],"mappings":"knBAQqBA,uBACPC,SAASC,eAAe,qBAM9BF,qBAAuB,MACvBA,qBAAuB,KAG3BG,aAAY,qBAQJC,OAAS,EAETH,SAASC,eAAe,mBAAmBG,QAAQD,SAErC,cADdA,OAASH,SAASC,eAAe,mBAAmBG,QAAQD,SACd,GAAjBA,OAAOE,SAChCF,OAAS,UAIXG,YAAcC,OAAOC,SAASC,OAE9BC,KADY,IAAIC,gBAAgBL,aACfM,IAAI,MAC3BC,mBAAmBV,OAAQO,MAnB3BI,KACDf,8BA6BDgB,eAAiB,CACnBZ,OACAO,KACAN,WACC,cAAU,CAAC,CACZY,WAAY,gCACZC,KAAM,CACFd,OAAAA,OACAO,KAAAA,KACAN,QAAAA,YAEJ,GAQSS,mBAAqBK,eAAMf,OAAQO,UAAMS,wEAC9CC,SAAWpB,SAASC,eAAe,mBACnCG,QAAUgB,SAAShB,WAKfgB,SAAShB,QAAQiB,wBACdD,SAAShB,QAAQkB,mBAAqBF,SAAShB,QAAQiB,yBAE1DF,yBAKFb,YAAcC,OAAOC,SAASC,OAC9Bc,UAAY,IAAIZ,gBAAgBL,aAElCiB,UAAUX,IAAI,OACdR,QAAQoB,EAAID,UAAUX,IAAI,MAG1BW,UAAUX,IAAI,OACdR,QAAQqB,EAAIF,UAAUX,IAAI,MAG9BR,QAAQsB,aAAe,QAEjBC,eAAiBZ,eAAeZ,OAAQO,KAAMkB,KAAKC,UAAUzB,aAE9C,KAAjBuB,SAASG,mBACLC,MAAMJ,SAASK,QAGF,KAAjBL,SAASG,KAAa,OAEhBG,SAAWL,KAAKM,MAAMP,SAASM,6BAG3BE,iBAAiB,4CAA6CF,UACnEG,MAAKC,WAACC,KAACA,KAADC,GAAOA,SACNvC,SAASC,eAAe,8BACxBD,SAASC,eAAe,6BAA6BuC,4BAE/CC,YAAYzC,SAASC,eAAe,yBAA0BqC,KAAMC,QAG1EG,aAAe1C,SAAS2C,uBAAuB,0BAC/CD,aAAa,GAAI,KACbE,OAASF,aAAa,GAAGtC,QAAQwC,WACjCC,uBAAa,yBAA0B,CACvCC,oBAAqB,wCAA0CF,6BAE5D,iCAAmCA,QAAQG,GAAGF,uBAAaG,OAAOC,MAAM/B,eAAegC,EAAGC,UACzFC,SAAWD,KAAKE,WAAWC,WAAWC,MAAMJ,KAAKK,eAC/CC,kBAAkBC,KAAKtD,QAAQD,OAAQiD,oBAKrDpD,SAAS2D,iBAAiB,YAAYC,SAAQC,GAAKA,EAAErB,YAE9C,KAEVsB,OAAO/B,QAAU,2BAAiBA,SAGvCX,SAAS2C,aAAa,8BAA+B3C,SAAShB,QAAQkB,mBAGtEtB,SAAS2D,iBAAiB,YAAYC,SAAQC,GAAKA,EAAErB,kEASvDiB,kBAAoB,CAACtD,OAAQiD,wCAE3B,oCACAjD,OACA,YACAiD,SACA"} \ No newline at end of file diff --git a/amd/src/get_mootimeterstate.js b/amd/src/get_mootimeterstate.js new file mode 100644 index 00000000..d6a5e763 --- /dev/null +++ b/amd/src/get_mootimeterstate.js @@ -0,0 +1,118 @@ +import {call as fetchMany} from 'core/ajax'; +import Log from 'core/log'; +import {execReloadPage as reloadPage} from 'mod_mootimeter/reload_page'; + +export const init = (refreshintervall) => { + + var obj = document.getElementById('mootimeterstate'); + if (!obj) { + window.console.log("Early exit"); + return; + } + + if (refreshintervall < 1000) { + refreshintervall = 1000; + } + + initMootimeterstate(); + + setInterval(() => { + getMootimeterstate(); + }, refreshintervall); +}; + +/** + * Make the call to get the Mootimeterstate + * @param {int} pageid + * @param {int} cmid + * @param {string} dataset + * @returns {array} + */ +const getMootimeterstateExecute = ( + pageid, + cmid, + dataset +) => fetchMany([{ + methodname: 'mod_mootimeter_get_mootimeterstate', + args: { + pageid, + cmid, + dataset + }, +}])[0]; + +const initMootimeterstate = async() => { + + await getMootimeterstate(); + + var mtmstate = document.getElementById('mootimeterstate'); + var dataset = mtmstate.dataset; + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const cmid = urlParams.get('id'); + + if (urlParams.get('r')) { + dataset.r = urlParams.get('r'); + } + + if (urlParams.get('o')) { + dataset.o = urlParams.get('o'); + } + + var pageid = 0; + if (dataset.pageid) { + pageid = dataset.pageid; + } else if (urlParams.get('pageid')) { + pageid = urlParams.get('pageid'); + } + + await reloadPage(pageid, cmid, dataset); +}; + +/** + * Executes the call to store input value. + */ +export const getMootimeterstate = async() => { + var mtmstate = document.getElementById('mootimeterstate'); + var dataset = mtmstate.dataset; + const queryString = window.location.search; + const urlParams = new URLSearchParams(queryString); + const cmid = urlParams.get('id'); + + if (urlParams.get('r')) { + dataset.r = urlParams.get('r'); + } + + if (urlParams.get('o')) { + dataset.o = urlParams.get('o'); + } + + var pageid = 0; + if (dataset.pageid) { + pageid = dataset.pageid; + } else if (urlParams.get('pageid')) { + pageid = urlParams.get('pageid'); + } + + const response = await getMootimeterstateExecute(pageid, cmid, JSON.stringify(dataset)); + + if (response.code != 200) { + Log.error(response.string); + } + + if (response.code == 200) { + const states = JSON.parse(response.state); + + // Set all datasets to mootimeterstate. + for (let dataattribute in states) { + mtmstate.setAttribute('data-' + dataattribute, states[dataattribute]); + } + + if (mtmstate.dataset.contentchangedat_prev != mtmstate.dataset.contentchangedat) { + mtmstate.setAttribute('data-settingschangedat_prev', 0); + mtmstate.setAttribute('data-contentlastupdated', 0); + reloadPage(pageid, cmid, dataset); + } + } + +}; diff --git a/amd/src/handler_input.js b/amd/src/handler_input.js index 5b910000..0d42f44f 100644 --- a/amd/src/handler_input.js +++ b/amd/src/handler_input.js @@ -3,22 +3,12 @@ import Log from 'core/log'; export const init = (uniqueID) => { const obj = document.getElementById(uniqueID); - let typingTimer; - let doneTypingInterval = 350; if (!document.getElementById(uniqueID)) { return; } - obj.addEventListener("keyup", eventHandler); - - /** - * Eventhandler - */ - function eventHandler() { - clearTimeout(typingTimer); - typingTimer = setTimeout(mootimeterStoreInput, doneTypingInterval); - } + obj.addEventListener("focusout", mootimeterStoreInput); /** * Store the value. @@ -76,4 +66,4 @@ const execStoreInputValue = async(ajaxmethode, pageid, inputname, inputvalue, th if (response.code == 200) { Log.info(response.string); } -}; \ No newline at end of file +}; diff --git a/amd/src/reload_on_state_change.js b/amd/src/reload_on_state_change.js deleted file mode 100644 index f1296466..00000000 --- a/amd/src/reload_on_state_change.js +++ /dev/null @@ -1,70 +0,0 @@ -/** - * Listen to a state change. If changed, reload the page. - */ - -import {call as fetchMany} from 'core/ajax'; -import Log from 'core/log'; - - -export const init = (statename) => { - var obj = document.getElementById('mootimeterstate'); - - if (!obj) { - window.console.log('mootimeterstate not found'); - return; - } - - if (!obj.dataset.pageid) { - window.console.log('Pageid not set in mootimeterstate'); - return; - } - - if (!statename) { - window.console.log('Statename not set in methods argument'); - return; - } - setInterval(function() { - getState(obj.dataset.pageid, statename); - }, 1000); -}; - -/** - * Call to create a new instance - * @param {int} pageid - * @param {string} statename - * @returns {string} - */ -const execGetState = ( - pageid, - statename, -) => fetchMany([{ - methodname: 'mod_mootimeter_get_state', - args: { - pageid, - statename, - }, -}])[0]; - -/** - * Executes the call to create a new page. - * @param {int} pageid - * @param {string} statename - */ -const getState = async(pageid, statename) => { - const response = await execGetState(pageid, statename); - - if (response.code != 200) { - Log.error(response.string); - } - - if (response.code == 200) { - - if (!document.getElementById('mootimeterstate').dataset[statename]) { - document.getElementById('mootimeterstate').setAttribute('data-' + statename, response.state); - } - - if (document.getElementById('mootimeterstate').dataset[statename] != response.state) { - location.reload(); - } - } -}; \ No newline at end of file diff --git a/amd/src/reload_page.js b/amd/src/reload_page.js index 857409f6..7c70411d 100644 --- a/amd/src/reload_page.js +++ b/amd/src/reload_page.js @@ -72,7 +72,6 @@ export const execReloadPage = async(pageid, cmid, dataset) => { dataset = JSON.stringify(dataset); const response = await reloadPage(pageid, cmid, dataset); - if (response.code != 200) { Log.error(response.string); } @@ -84,54 +83,92 @@ export const execReloadPage = async(pageid, cmid, dataset) => { const pageparmas = JSON.parse(response.pageparams); // Replace the pagecontent. - Templates.renderForPromise(pageparmas.pagecontent.template, pageparmas.pagecontent) - .then(({html, js}) => { - Templates.replaceNodeContents('#mootimeter-pagecontent', html, js); - return true; - }) - .catch((error) => displayException(error)); + if ( + !mtmstate.dataset.contentchangedat_prev + || mtmstate.dataset.contentchangedat_prev != mtmstate.contentchangedat + || !mtmstate.dataset.teacherpermissiontoview_prev + || mtmstate.dataset.teacherpermissiontoview_prev != mtmstate.dataset.teacherpermissiontoviewteacherpermissiontoview + ) { + reloadPageContent(pageparmas.pagecontent); + + // Set active page marked in pageslist. + reloadPagelist(pageid, cmid, true); + } // Replace the pagecontent menu. - if (pageparmas.contentmenu) { - Templates.renderForPromise(pageparmas.contentmenu.template, pageparmas.contentmenu) - .then(({html, js}) => { - Templates.replaceNode('#mootimeter-pagecontentmenu', html, js); - return true; - }) - .catch((error) => displayException(error)); - - // Set subpage URL parameters. - if (pageparmas.contentmenu.sp) { - for (const [key, value] of Object.entries(pageparmas.contentmenu.sp)) { - setGetParam(key, value); - } - } + if ( + !mtmstate.dataset.pagecontentmenuchangedat_prev + || mtmstate.dataset.pagecontentmenuchangedat_prev != mtmstate.settingschangedat + ) { + reloadContentMenu(pageparmas.contentmenu); } - // Replace the settings col if necessary. - if (pageparmas.colsettings) { - Templates.renderForPromise(pageparmas.colsettings.template, pageparmas.colsettings) - .then(({html, js}) => { - Templates.replaceNodeContents('#mootimeter-col-settings', html, js); - return true; - }) - .catch((error) => displayException(error)); + if ( + pageparmas.colsettings + && ( + !mtmstate.dataset.settingschangedat_prev + || mtmstate.dataset.settingschangedat_prev != mtmstate.settingschangedat + ) + ) { + reloadSettingsCol(pageparmas.colsettings); } if (pageparmas.pageid) { - // Set new pageid. mtmstate.setAttribute('data-pageid', pageparmas.pageid); // Set URL parameter - pageid. setGetParam('pageid', pageparmas.pageid); - } + } +}; + +export const reloadSettingsCol = async(pageparmas) => { + + var mtmstate = document.getElementById('mootimeterstate'); + + // Replace the settings col if necessary. + Templates.renderForPromise(pageparmas.template, pageparmas) + .then(({html, js}) => { + Templates.replaceNodeContents('#mootimeter-col-settings', html, js); + mtmstate.setAttribute('data-settingschangedat_prev', mtmstate.dataset.settingschangedat); + return true; + }) + .catch((error) => displayException(error)); - // Set active page marked in pageslist. - reloadPagelist(pageid, cmid, true); +}; + +export const reloadContentMenu = async(pageparmas) => { + + var mtmstate = document.getElementById('mootimeterstate'); - // Remove all tooltips of pageslist that are still present. - document.querySelectorAll('.tooltip').forEach(e => e.remove()); + // Replace the settings col if necessary. + Templates.renderForPromise(pageparmas.template, pageparmas) + .then(({html, js}) => { + Templates.replaceNode('#mootimeter-pagecontentmenu', html, js); + mtmstate.setAttribute('data-pagecontentmenuchangedat_prev', mtmstate.dataset.pagecontentmenuchangedat); + return true; + }) + .catch((error) => displayException(error)); + + // Set subpage URL parameters. + if (pageparmas.sp) { + for (const [key, value] of Object.entries(pageparmas.sp)) { + setGetParam(key, value); + } } }; + +export const reloadPageContent = async(pageparmas) => { + + var mtmstate = document.getElementById('mootimeterstate'); + + Templates.renderForPromise(pageparmas.template, pageparmas) + .then(({html, js}) => { + Templates.replaceNodeContents('#mootimeter-pagecontent', html, js); + mtmstate.setAttribute('data-contentchangedat_prev', mtmstate.dataset.contentchangedat); + mtmstate.setAttribute('data-teacherpermissiontoview_prev', mtmstate.dataset.teacherpermissiontoview); + return true; + }) + .catch((error) => displayException(error)); +}; diff --git a/amd/src/reload_page_content.js b/amd/src/reload_page_content.js index 0b62a517..02298fab 100644 --- a/amd/src/reload_page_content.js +++ b/amd/src/reload_page_content.js @@ -51,7 +51,7 @@ const reloadPage = ( * @param {int} cmid * @param {array} dataset */ -const execReloadPage = async(pageid, cmid, dataset) => { +export const execReloadPage = async(pageid, cmid, dataset) => { if (!dataset) { dataset = JSON.stringify([]); @@ -78,6 +78,7 @@ const execReloadPage = async(pageid, cmid, dataset) => { Templates.renderForPromise(pageparmas.pagecontent.template, pageparmas.pagecontent) .then(({html, js}) => { Templates.replaceNodeContents('#mootimeter-pagecontent', html, js); + mtmstate.setAttribute('data-contentchangedat_prev', mtmstate.dataset.contentchangedat); return true; }) .catch((error) => displayException(error)); @@ -88,7 +89,5 @@ const execReloadPage = async(pageid, cmid, dataset) => { // Set active page marked in pageslist. reloadPagelist(pageid, cmid, true); - // Remove all tooltips of pageslist that are still present. - document.querySelectorAll('.tooltip').forEach(e => e.remove()); } }; diff --git a/amd/src/reload_page_on_state_change.js b/amd/src/reload_page_on_state_change.js deleted file mode 100644 index bc1211f9..00000000 --- a/amd/src/reload_page_on_state_change.js +++ /dev/null @@ -1,43 +0,0 @@ -import {execReloadPage as reloadPage} from 'mod_mootimeter/reload_page'; - -/** - * Initializes refresh on state change. - * - * @param {string} id - * @returns - */ -export const init = (id) => { - if (!document.getElementById('mootimeterstate').dataset.pageid) { - return; - } - - setTimeout(() => { - const intervalms = document.getElementById('mootimeterstate').dataset.refreshinterval; - const interval = setInterval(() => { - if (!document.getElementById(id)) { - clearInterval(interval); - return; - } - reloadPageOnStateChange(); - }, intervalms); - }, 2500); -}; - -/** - * Refresh the page on a state change. - * @returns {mixed} - */ -const reloadPageOnStateChange = () => { - const mtmstate = document.getElementById('mootimeterstate'); - - // Early exit if there are no changes. - if (mtmstate.dataset.lastupdated == mtmstate.dataset.contentchangedat) { - return; - } - - const queryString = window.location.search; - const urlParams = new URLSearchParams(queryString); - const cmid = urlParams.get('id'); - - reloadPage(mtmstate.dataset.pageid, cmid, mtmstate.dataset); -}; diff --git a/amd/src/reload_page_settings.js b/amd/src/reload_page_settings.js index 66c6f79e..c2a29ae4 100644 --- a/amd/src/reload_page_settings.js +++ b/amd/src/reload_page_settings.js @@ -65,9 +65,7 @@ const execReloadPage = async(pageid, cmid, dataset) => { } if (response.code == 200) { - var mtmstate = document.getElementById('mootimeterstate'); - const pageparmas = JSON.parse(response.pageparams); // Set new pageid. @@ -77,6 +75,7 @@ const execReloadPage = async(pageid, cmid, dataset) => { Templates.renderForPromise(pageparmas.colsettings.template, pageparmas.colsettings) .then(({html, js}) => { Templates.replaceNodeContents('#mootimeter-col-settings', html, js); + mtmstate.setAttribute('data-settingschangedat_prev', mtmstate.dataset.settingschangedat); return true; }) .catch((error) => displayException(error)); @@ -106,4 +105,4 @@ function setGetParam(key, value) { + '?' + params.toString(); window.history.pushState({path: newUrl}, '', newUrl); } -} \ No newline at end of file +} diff --git a/amd/src/reload_pagelist.js b/amd/src/reload_pagelist.js index 11bf58fc..526d95e4 100644 --- a/amd/src/reload_pagelist.js +++ b/amd/src/reload_pagelist.js @@ -2,7 +2,6 @@ import {call as fetchMany} from 'core/ajax'; import Log from 'core/log'; import {exception as displayException} from 'core/notification'; import Templates from 'core/templates'; -import {execReloadPage as reloadPage} from 'mod_mootimeter/reload_page'; import SortableList from 'core/sortable_list'; import jQuery from 'jquery'; import {ajaxRequestInput} from 'mod_mootimeter/utils'; @@ -22,16 +21,6 @@ export const init = (pagerefreshintervall) => { getPagelist(); }, pagerefreshintervall); - const queryString = window.location.search; - const urlParams = new URLSearchParams(queryString); - const cmid = urlParams.get('id'); - var pageid = urlParams.get('pageid'); - - if (pageid === null || pageid === undefined || pageid.length == 0) { - pageid = 0; - } - reloadPage(pageid, cmid, ''); - /** * Store the value. */ @@ -81,6 +70,18 @@ const reloadPagelist = ( export const execReloadPagelist = async(pageid, cmid, forcereload = false) => { var mtmstate = document.getElementById('mootimeterstate'); var dataset = mtmstate.dataset; + + // Early exit if there were no changes. + if ( + ( + mtmstate.dataset.pagelistchangedat_prev + && mtmstate.dataset.pagelistchangedat == mtmstate.dataset.pagelistchangedat_prev + ) + && !forcereload + ) { + return; + } + const queryString = window.location.search; const urlParams = new URLSearchParams(queryString); @@ -103,34 +104,6 @@ export const execReloadPagelist = async(pageid, cmid, forcereload = false) => { if (response.code == 200) { const pagelist = JSON.parse(response.pagelist); - const loadpageid = pagelist.loadpageid; - - // Reload pagecontent if page does not exit any more. - if (pagelist.loadpageid) { - reloadPage(loadpageid, cmid, ''); - } - - // Reload page if teacherpermission to view changed. - if ( - mtmstate.getAttribute('data-teacherpermissiontoview') - && mtmstate.getAttribute('data-teacherpermissiontoview') != pagelist.dataset['teacherpermissiontoview'] - ) { - reloadPage(mtmstate.getAttribute('data-pageid'), cmid, ''); - } - - // Set all datasets to mootimeterstate. - for (let dataattribute in pagelist.dataset) { - if (pagelist.dataset.hasOwnProperty(dataattribute)) { - mtmstate.setAttribute('data-' + dataattribute, pagelist.dataset[dataattribute]); - } - } - - // If there are no changes in pagelist. We are finished. - if (mtmstate.dataset.pagelisttime == pagelist.dataset.pagelisttime && !forcereload) { - return; - } - - // Set new pagelisttime state. // Replace the pages list. Templates.renderForPromise('mod_mootimeter/elements/snippet_page_list', pagelist) @@ -150,8 +123,6 @@ export const execReloadPagelist = async(pageid, cmid, forcereload = false) => { jQuery('.mootimeter_pages_li_sortable_' + uniqid).on(SortableList.EVENTS.DROP, async function(_, info) { var newIndex = info.targetList.children().index(info.element); await storePagePosition(this.dataset.pageid, newIndex); - // We need to reload the pagelist, because the page numbers would not update otherwise. - execReloadPagelist(pageid, cmid, true); }); } @@ -161,6 +132,12 @@ export const execReloadPagelist = async(pageid, cmid, forcereload = false) => { return true; }) .catch((error) => displayException(error)); + + // Set new pagelistchangedat_prev state. + mtmstate.setAttribute('data-pagelistchangedat_prev', mtmstate.dataset.pagelistchangedat); + + // Remove all tooltips of pageslist that are still present. + document.querySelectorAll('.tooltip').forEach(e => e.remove()); } }; diff --git a/classes/external/get_mootimeterstate.php b/classes/external/get_mootimeterstate.php new file mode 100644 index 00000000..6087f2ca --- /dev/null +++ b/classes/external/get_mootimeterstate.php @@ -0,0 +1,117 @@ +. + +/** + * Web service to get_mootimeterstate. + * + * @package mod_mootimeter + * @copyright 2024, ISB Bayern + * @author Peter Mayer + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace mod_mootimeter\external; + +use core_external\external_api; +use core_external\external_function_parameters; +use core_external\external_single_structure; +use core_external\external_value; +use mod_mootimeter\helper; +use mod_mootimeter\local\mootimeterstate; + +/** + * Web service to get_mootimeterstate. + * + * @package mod_mootimeter + * @copyright 2024, ISB Bayern + * @author Peter Mayer + * @license https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class get_mootimeterstate extends external_api { + /** + * Describes the parameters. + * + * @return external_function_parameters + */ + public static function execute_parameters(): external_function_parameters { + return new external_function_parameters([ + 'pageid' => new external_value(PARAM_RAW, 'pageid to be active', VALUE_REQUIRED), + 'cmid' => new external_value(PARAM_INT, 'The coursemodule id.', VALUE_REQUIRED), + 'dataset' => new external_value(PARAM_RAW, 'The dataset of the page.', VALUE_REQUIRED), + ]); + } + + /** + * Execute the service. + * + * @param int $pageid + * @param int $cmid + * @param string $dataset + * @return array + */ + public static function execute(int $pageid, int $cmid, string $dataset): array { + [ + 'pageid' => $pageid, + 'cmid' => $cmid, + 'dataset' => $dataset, + ] = self::validate_parameters(self::execute_parameters(), [ + 'pageid' => $pageid, + 'cmid' => $cmid, + 'dataset' => $dataset, + ]); + $cmcontext = \context_module::instance($cmid); + self::validate_context($cmcontext); + require_capability('mod/mootimeter:view', $cmcontext); + + $cm = get_coursemodule_from_id(null, $cmid); + if (empty($pageid)) { + $mootimeterstate = json_encode(mootimeterstate::get_mootimeterstate_default_params($cm)); + return ['code' => 200, 'string' => 'ok', 'state' => $mootimeterstate]; + } + + try { + + $dataset = json_decode($dataset); + $helper = new \mod_mootimeter\helper(); + $page = $helper->get_page($pageid); + if (empty($page)) { + $page = array_pop($helper->get_pages($cm->instance, "sortorder ASC")); + } + $mootimeterstate = json_encode(mootimeterstate::get_mootimeterstate_params($page, $dataset)); + $return = ['code' => 200, 'string' => 'ok', 'state' => $mootimeterstate]; + } catch (\Exception $e) { + $return = ['code' => 500, 'string' => $e->getMessage(), 'state' => '']; + } + + return $return; + } + + /** + * Describes the return structure of the service.. + * + * @return external_single_structure + */ + public static function execute_returns(): external_single_structure { + return new external_single_structure( + [ + 'code' => new external_value(PARAM_INT, 'Return code.'), + 'string' => new external_value(PARAM_TEXT, 'Return string / description'), + 'state' => new external_value(PARAM_RAW, 'Returned mootimeterstates.'), + ], + 'Most recent mootimeterstate.' + ); + } +} diff --git a/classes/helper.php b/classes/helper.php index d8f8c533..b72ea9ec 100644 --- a/classes/helper.php +++ b/classes/helper.php @@ -152,14 +152,13 @@ public function store_page(object $record): int|string { $origrecord->visible = $record->visible; $origrecord->sortorder = $record->sortorder; $DB->update_record('mootimeter_pages', $origrecord); + $this->notify_data_changed($cm, 'pagelist'); return $origrecord->id; } $record->timecreated = time(); $record->sortorder = $this->get_page_next_sortorder($instance); $defaultvisibility = get_config('mod_mootimeter', 'default_new_page_visibility'); - if (!property_exists($record, 'visible')) { - $record->visible = (empty($defaultvisibility)) ? 0 : $defaultvisibility; - } + $record->visible = (empty($defaultvisibility)) ? 0 : $defaultvisibility; $pageid = $DB->insert_record('mootimeter_pages', $record, true); // Hook to do further actions depending on mtmt tool. @@ -175,6 +174,8 @@ public function store_page(object $record): int|string { $record->id = $pageid; $toolhelper->hook_after_new_page_created($record); + $this->notify_data_changed($cm, 'pagelist'); + return $pageid; } @@ -512,24 +513,12 @@ public function get_result_page_params(object $cm, object $page): array { $defaultparams = [ 'sp' => ['r' => 1], + 'teacherpermissiontoview' => $this->get_teacherpermission_to_view($page), ]; return $toolhelper->get_tool_result_page_params($page, $defaultparams); } - /** - * Get the rendered page results - * @param object $cm - * @param object $page - * @return string - */ - public function get_result_page(object $cm, object $page): string { - global $OUTPUT; - - $params = $this->get_result_page_params($cm, $page); - return $OUTPUT->render_from_template($params['template'], $params); - } - /** * Get the params for anser overview page. * @@ -853,6 +842,8 @@ public function set_tool_config(object|int $pageorid, string $name, string $valu // Lastupdated timestamp hast to be reset in cache. $this->clear_caches($page->id); $this->notify_data_changed($page, 'settings'); + $this->notify_data_changed($cm, 'pagelist'); + $this->notify_data_changed($page, 'answers'); } /** @@ -980,6 +971,8 @@ public function delete_page($pageorid) { // Call mootimeter-core deletion processes. $DB->delete_records('mootimeter_pages', ['id' => $page->id]); $DB->delete_records('mootimeter_tool_settings', ['pageid' => $page->id]); + + $this->notify_data_changed($cm, 'pagelist'); return true; } @@ -1138,8 +1131,7 @@ public function store_answer( $this->clear_caches($pageid); $this->get_answers($table, $pageid, $answercolumn); $this->get_answers_grouped($table, ['pageid' => $pageid], $answercolumn); - $this->notify_data_changed($this->get_page($pageid), 'answers', true); - $this->notify_data_changed($this->get_page($pageid), 'answers', false); + $this->notify_data_changed($this->get_page($pageid), 'answers'); return $answerids; } @@ -1333,80 +1325,32 @@ public function get_answers_grouped(string $table, array $params, string $answer * Notify, that data changed. This sets a new timestamp to the cache. * Clients then knew, there is someting new, and they have to update this. * - * @param object $page + * @param object $obj This is normally $page object or in case of the pagelist $cm object * @param string $identifier - * @param bool $ignoreanswers * @return void */ - public function notify_data_changed(object $page, string $identifier = '', bool $ignoreanswers = false): void { + public function notify_data_changed(object $obj, string $identifier = ''): void { $cache = \cache::make('mod_mootimeter', 'lastupdated'); - $cachekey = 'lastupdate_' . $identifier . '_' . (int) $ignoreanswers . '_' . $page->id; + $cachekey = 'lastupdate_' . $identifier . '_' . $obj->id; $cache->set($cachekey, time()); } /** * Get the recent data changed timestamp * - * @param object $page + * @param object $obj This is normally $page object or in case of the pagelist $cm object * @param string $identifier - * @param bool $ignoreanswers * @return int */ - public function get_data_changed(object $page, string $identifier = '', bool $ignoreanswers = false): int { - + public function get_data_changed(object $obj, string $identifier = ''): int { $cache = \cache::make('mod_mootimeter', 'lastupdated'); - $cachekey = 'lastupdate_' . $identifier . '_' . (int) $ignoreanswers . '_' . $page->id; - - return (int) $cache->get($cachekey); - } - - /** - * Get the lastupdated timestamp. - * - * @param int|object $pageorid - * @param bool $ignoreanswers - * @return mixed - */ - public function get_page_last_update_time( - int|object $pageorid, - string $identifier = '', - bool $ignoreanswers = false - ): string|int { - - if (!in_array($identifier, ['settings', 'answers', ''])) { - throw new moodle_exception( - 'generalexceptionmessage', - 'error', - '', - get_string("cacheidentifiernotallowed", "mootimeter") . " => " . $identifier - ); - } - - if (is_object($pageorid)) { - $page = $pageorid; - } else { - $page = $this->get_page($pageorid); + $cachekey = 'lastupdate_' . $identifier . '_' . $obj->id; + if (empty($cachevalue = $cache->get($cachekey))) { + $this->notify_data_changed($obj, $identifier); + $cachevalue = $cache->get($cachekey); } - - // We only want to deliver results if the teacher allowed to view it. - $instance = self::get_instance_by_pageid($page->id); - $cm = self::get_cm_by_instance($instance); - if ( - empty($this->get_tool_config($page->id, 'showonteacherpermission')) - && !has_capability('mod/mootimeter:moderator', \context_module::instance($cm->id)) - ) { - return 0; - } - - if (empty($identifier)) { - $lastupdatesettings = (int) $this->get_data_changed($page, 'settings'); - $lastupdateanswers = (int) $this->get_data_changed($page, 'answers', $ignoreanswers); - return max($lastupdatesettings, $lastupdateanswers); - } - - - return (int) $this->get_data_changed($page, $identifier, $ignoreanswers); + return (int) $cachevalue; } /** diff --git a/classes/local/mootimeterstate.php b/classes/local/mootimeterstate.php index 613a14b4..40dd139b 100644 --- a/classes/local/mootimeterstate.php +++ b/classes/local/mootimeterstate.php @@ -26,6 +26,9 @@ namespace mod_mootimeter\local; +use coding_exception; +use mod_mootimeter\helper; + /** * The mod_mootimeter helper class for mootimeterstate. * @@ -107,4 +110,68 @@ public static function get_mootimeterstate_renderable(): string { } return join(' ', $datasetarray); } + + /** + * Get the params array for mootimeter state + * + * @param object $page + * @param object $dataset + * @return array + */ + public static function get_mootimeterstate_params(object $page, object $dataset): array { + + $stateinstance = self::get_instance(); + + $instance = $page->instance; + $cm = helper::get_cm_by_instance($instance); + + $datasetarray = []; + foreach ($stateinstance->mootimeterstate as $name => $value) { + $datasetarray[$name] = $value; + } + + // Get the most recent timestamp of the different sections. + $helper = new \mod_mootimeter\helper(); + $datasetarray['pageid'] = $page->id; + $datasetarray['pagelistchangedat'] = $helper->get_data_changed($cm, 'pagelist'); + $datasetarray['settingschangedat'] = $helper->get_data_changed($page, 'settings'); + + // We do not want to set the answerschangedat value if the user is on the question subpage. + $datasetarray['answerschangedat'] = 0; + if (!empty($dataset->o) || !empty($dataset->r)) { + $datasetarray['answerschangedat'] = $helper->get_data_changed($page, 'answers'); + } + + $datasetarray['teacherpermissiontoview'] = $helper->get_teacherpermission_to_view($helper->get_page($page->id)); + + $datasetarray['refreshinterval'] = get_config('mod_mootimeter', 'refreshinterval'); + + // We have to distinguish from which page the request comes. + // We differentiate between the standard content page (question page) and other pages (eg. results and overview page). + if (empty($dataset->r) && empty($dataset->o)) { + $datasetarray['contentchangedat'] = $helper->get_data_changed($page, 'settings'); + } else { + $datasetarray['contentchangedat'] = $helper->get_data_changed($page, 'answers'); + } + + return $datasetarray; + } + + /** + * Get the default params array for mootimeter state + * + * @param object $cm + * @return array + */ + public static function get_mootimeterstate_default_params(object $cm): array { + $helper = new helper(); + $datasetarray = []; + $datasetarray['pagelistchangedat'] = $helper->get_data_changed($cm, 'pagelist'); + $datasetarray['settingschangedat'] = 0; + $datasetarray['answerschangedat'] = 0; + $datasetarray['teacherpermissiontoview'] = 0; + $datasetarray['refreshinterval'] = 1000; + $datasetarray['contentchangedat'] = 0; + return $datasetarray; + } } diff --git a/classes/local/pagelist.php b/classes/local/pagelist.php index 3cb23922..03a49acd 100644 --- a/classes/local/pagelist.php +++ b/classes/local/pagelist.php @@ -58,7 +58,7 @@ class pagelist { * @throws moodle_exception */ public function get_pagelist_params(int $cmid, int $pageidselected, object $dataset): array { - global $USER, $PAGE; + global $PAGE, $USER; $helper = new \mod_mootimeter\helper(); @@ -69,18 +69,18 @@ public function get_pagelist_params(int $cmid, int $pageidselected, object $data $pages = $helper->get_pages($cm->instance, "sortorder ASC"); $temppages = []; - if (!in_array($pageidselected, array_keys($pages)) && $pageidselected > 0) { + if (!in_array($pageidselected, array_keys($pages)) && $pageidselected > 0 && $dataset->pageid != $pageidselected) { $temppages = $pages; $temppages['loadpageid'] = array_shift($temppages)->id; $pageidselected = $temppages['loadpageid']; } $pagenumber = 1; - $maxtimecreated = 0; $temppages['pageid'] = $pageidselected; $temppages['cmid'] = $cm->id; $temppages['instance'] = $cm->instance; + if (has_capability('mod/mootimeter:moderator', \context_module::instance($cm->id)) && !empty($USER->editing)) { $temppages['isediting'] = $USER->editing; } @@ -99,34 +99,14 @@ public function get_pagelist_params(int $cmid, int $pageidselected, object $data 'id' => $uniqid, 'tooltip' => mb_strimwidth($helper::get_tool_config($pagerow, 'question'), 0, 40, '...'), ]; - - $pageupdatedat = $helper->get_page_last_update_time($temppages['pageid'], 'settings'); - $maxtimecreated = max($maxtimecreated, $pageupdatedat); - $pagenumber++; } - $temppages['dataset']['pagelisttime'] = $maxtimecreated; - \mod_mootimeter\local\mootimeterstate::add_mootimeterstate('pagelisttime', $maxtimecreated); - // We have to distinguish from which page the request comes. - // We differentiate between the standard content page (question page) and other pages (eg. results and overview page). - if (empty($dataset->r) && empty($dataset->o)) { - $temppages['dataset']['contentchangedat'] = $helper->get_page_last_update_time($temppages['pageid'], '', true); - } else { - $temppages['dataset']['contentchangedat'] = $helper->get_page_last_update_time($temppages['pageid'], ''); - } - \mod_mootimeter\local\mootimeterstate::add_mootimeterstate('contentchangedat', $temppages['dataset']['contentchangedat']); + $temppages['dataset']['pagelistlastupdated'] = $helper->get_data_changed($cm, 'pagelist'); $temppages['dataset']['refreshinterval'] = get_config('mod_mootimeter', 'refreshinterval'); \mod_mootimeter\local\mootimeterstate::add_mootimeterstate('refreshinterval', $temppages['dataset']['refreshinterval']); - $temppages['dataset']['teacherpermissiontoview'] = $helper->get_teacherpermission_to_view( - $helper->get_page($temppages['pageid']) - ); - \mod_mootimeter\local\mootimeterstate::add_mootimeterstate( - 'teacherpermissiontoview', - $temppages['dataset']['teacherpermissiontoview'] - ); return $temppages; } @@ -197,5 +177,6 @@ public function permutate_sortorder(int $pageid, int $targetposition) { } // Finally store the new positioned page. $helper->store_page($page); + $helper->notify_data_changed($helper->get_cm_by_instance($instance), 'pagelist'); } } diff --git a/db/services.php b/db/services.php index f771892b..689e74f7 100644 --- a/db/services.php +++ b/db/services.php @@ -114,4 +114,12 @@ 'ajax' => true, 'capabilities' => 'mod/mootimeter:view', ], + 'mod_mootimeter_get_mootimeterstate' => [ + 'classname' => 'mod_mootimeter\external\get_mootimeterstate', + 'methodname' => 'execute', + 'description' => 'Get the params to set the mootimeterstate', + 'type' => 'read', + 'ajax' => true, + 'capabilities' => 'mod/mootimeter:view', + ], ]; diff --git a/lib.php b/lib.php index f18351c2..83ad1026 100644 --- a/lib.php +++ b/lib.php @@ -238,5 +238,8 @@ function mootimeter_inplace_editable($itemtype, $itemid, $newvalue) { $toolhelper = new $classname(); - return $toolhelper->handle_inplace_edit($type, $itemid, $newvalue); + $inplaceedit = $toolhelper->handle_inplace_edit($type, $itemid, $newvalue); + $helper = new \mod_mootimeter\helper(); + $helper->notify_data_changed($helper->get_page($pageid), 'answers'); + return $inplaceedit; } diff --git a/templates/elements/snippet_mootimeter_state.mustache b/templates/elements/snippet_mootimeter_state.mustache index 129009d0..4806806b 100644 --- a/templates/elements/snippet_mootimeter_state.mustache +++ b/templates/elements/snippet_mootimeter_state.mustache @@ -1 +1,5 @@ - \ No newline at end of file + + +{{#js}} +require(['mod_mootimeter/get_mootimeterstate'], (module) => module.init("{{refreshinterval}}")); +{{/js}} diff --git a/tests/generator/lib.php b/tests/generator/lib.php index 3d88fffa..59c7f27f 100644 --- a/tests/generator/lib.php +++ b/tests/generator/lib.php @@ -71,6 +71,7 @@ public function create_page(advanced_testcase $atc, $record = []): stdClass { 'title' => 'Test ' . $tool . " page", 'timemodified' => time(), 'sortorder' => $mtmhelper->get_page_next_sortorder($record['instance']), + 'visible' => $mtmhelper::PAGE_VISIBLE, ]; $atc->setAdminUser(); diff --git a/tests/helper_test.php b/tests/helper_test.php index dc653765..d0db5153 100644 --- a/tests/helper_test.php +++ b/tests/helper_test.php @@ -170,10 +170,10 @@ public function test_store_page_detail_sortorder(): void { $helper = new \mod_mootimeter\helper(); $this->setUser($this->users['teacher']); - $page1 = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id]); - $page2 = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id]); - $page3 = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id]); - $page4 = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id]); + $page1 = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id, 'visible' => helper::PAGE_VISIBLE]); + $page2 = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id, 'visible' => helper::PAGE_VISIBLE]); + $page3 = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id, 'visible' => helper::PAGE_VISIBLE]); + $page4 = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id, 'visible' => helper::PAGE_VISIBLE]); // Sort to the beginning of the list. $helper->store_page_detail($page3->id, 'sortorder', 0); @@ -248,7 +248,7 @@ public function test_set_get_tool_config(): void { $helper = new \mod_mootimeter\helper(); $mtmgenerator = $this->getDataGenerator()->get_plugin_generator('mod_mootimeter'); - $page = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id]); + $page = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id, 'visible' => helper::PAGE_VISIBLE]); $helper->set_tool_config($page, 'question', self::TEST_QUESTION_TITLE); @@ -273,7 +273,7 @@ public function test_toggle_state(): void { $helper = new \mod_mootimeter\helper(); $mtmgenerator = $this->getDataGenerator()->get_plugin_generator('mod_mootimeter'); - $page = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id]); + $page = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id, 'visible' => helper::PAGE_VISIBLE]); $this->setUser($this->users['teacher']); $helper->toggle_state($page, 'teststate'); @@ -306,7 +306,11 @@ public function test_store_answer_exception_missing_pageid(): void { $this->resetAfterTest(); $mtmgenerator = $this->getDataGenerator()->get_plugin_generator('mod_mootimeter'); - $page = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id, 'tool' => 'wordcloud']); + $page = $mtmgenerator->create_page($this, [ + 'instance' => $this->mootimeter->id, + 'tool' => 'wordcloud', + 'visible' => helper::PAGE_VISIBLE, + ]); $this->setUser($this->users['student']); @@ -340,12 +344,16 @@ public function test_store_answer_update_existing_and_multiple_answers(): void { $this->resetAfterTest(); $mtmgenerator = $this->getDataGenerator()->get_plugin_generator('mod_mootimeter'); - $page = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id, 'tool' => 'wordcloud', - 'visible' => helper::PAGE_VISIBLE]); + $page = $mtmgenerator->create_page($this, [ + 'instance' => $this->mootimeter->id, + 'tool' => 'wordcloud', + 'visible' => helper::PAGE_VISIBLE, + ]); $this->setAdminUser(); $helper = new \mod_mootimeter\helper(); + $helper->toggle_state($page, 'page_visibility'); $helper->set_tool_config($page, 'multipleanswers', 0); @@ -403,13 +411,16 @@ public function test_store_answer_multiple_answers(): void { $this->resetAfterTest(); $mtmgenerator = $this->getDataGenerator()->get_plugin_generator('mod_mootimeter'); - $page = $mtmgenerator->create_page($this, ['instance' => $this->mootimeter->id, 'tool' => 'wordcloud', - 'visible' => helper::PAGE_VISIBLE]); - + $page = $mtmgenerator->create_page($this, [ + 'instance' => $this->mootimeter->id, + 'tool' => 'wordcloud', + 'visible' => helper::PAGE_VISIBLE, + ]); $helper = new \mod_mootimeter\helper(); $this->setAdminUser(); $helper->set_tool_config($page, 'multipleanswers', 1); + $helper->toggle_state($page, 'page_visibility'); $this->setUser($this->users['student']); $record = new \stdClass(); diff --git a/tests/privacy/provider_test.php b/tests/privacy/provider_test.php index d198a5c4..993f7eb6 100644 --- a/tests/privacy/provider_test.php +++ b/tests/privacy/provider_test.php @@ -114,6 +114,7 @@ public function setup(): void { $record = ['instance' => $this->mootimeter[1]['instance']->id, 'tool' => 'quiz', 'visible' => helper::PAGE_VISIBLE]; $this->mootimeter[1]['pages'][1]['page'] = $helper->get_page($helper->store_page((object) $record)); $pageid = $this->mootimeter[1]['pages'][1]['page']->id; + $helper->toggle_state($this->mootimeter[1]['pages'][1]['page'], 'page_visibility'); // Insert some answeroption text. $answeroptions = $mtmthelper->get_answer_options($pageid); @@ -131,6 +132,7 @@ public function setup(): void { $record = ['instance' => $this->mootimeter[2]['instance']->id, 'tool' => 'poll', 'visible' => helper::PAGE_VISIBLE]; $this->mootimeter[2]['pages'][1]['page'] = $helper->get_page($helper->store_page((object) $record)); $pageid = $this->mootimeter[2]['pages'][1]['page']->id; + $helper->toggle_state($this->mootimeter[2]['pages'][1]['page'], 'page_visibility'); // Insert some answeroption text. $answeroptions = $mtmthelper->get_answer_options($pageid); @@ -148,6 +150,7 @@ public function setup(): void { $this->mootimeter[3]['instance'] = $this->generator->create_module('mootimeter', ['course' => $this->courses[3]]); $record = ['instance' => $this->mootimeter[3]['instance']->id, 'tool' => 'wordcloud', 'visible' => helper::PAGE_VISIBLE]; $this->mootimeter[3]['pages'][1]['page'] = $helper->get_page($helper->store_page((object) $record)); + $helper->toggle_state($this->mootimeter[3]['pages'][1]['page'], 'page_visibility'); $this->generator->enrol_user($this->users['teacher']->id, $this->courses[1]->id, 'teacher'); $this->generator->enrol_user($this->users['teacher']->id, $this->courses[2]->id, 'teacher'); diff --git a/tools/quiz/amd/build/chart_draw.min.js b/tools/quiz/amd/build/chart_draw.min.js index 9787a2b2..7458cc88 100644 --- a/tools/quiz/amd/build/chart_draw.min.js +++ b/tools/quiz/amd/build/chart_draw.min.js @@ -1,3 +1,3 @@ -define("mootimetertool_quiz/chart_draw",["exports","mootimetertool_quiz/chart.umd","core/ajax","mod_mootimeter/reload_page"],(function(_exports,_chart,_ajax,_reload_page){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_chart=(obj=_chart)&&obj.__esModule?obj:{default:obj};_exports.init=id=>{if(!document.getElementById(id))return;const pageid=document.getElementById("mootimeterstate").dataset.pageid;!async function(pageid,id){await getAnswers(pageid,id)}(pageid,id),setTimeout((()=>{const intervalms=document.getElementById("mootimeterstate").dataset.refreshinterval,interval=setInterval((()=>{document.getElementById(id)?getAnswers(pageid,id):clearInterval(interval)}),intervalms)}),2e3)};const getAnswers=async(pageid,id)=>{const mtmstate=document.getElementById("mootimeterstate");if(mtmstate.dataset.lastupdated==mtmstate.dataset.contentchangedat)return;const response=await(pageid=>(0,_ajax.call)([{methodname:"mootimetertool_quiz_get_answers",args:{pageid:pageid}}])[0])(pageid);if(!document.getElementById(id))return void window.console.log("Canvas not found");mtmstate.setAttribute("data-lastupdated",response.lastupdated);let nodecanvas=document.getElementById(id);nodecanvas.setAttribute("data-labels",response.labels),nodecanvas.setAttribute("data-values",response.values),nodecanvas.setAttribute("data-chartsettings",response.chartsettings);var config={type:JSON.parse(response.chartsettings).charttype,data:{labels:JSON.parse(response.labels),datasets:[{label:response.question,data:JSON.parse(response.values),backgroundColor:JSON.parse(response.chartsettings).backgroundColor,borderRadius:JSON.parse(response.chartsettings).borderRadius,pointStyle:JSON.parse(response.chartsettings).pointStyle,pointRadius:JSON.parse(response.chartsettings).pointRadius,pointHoverRadius:JSON.parse(response.chartsettings).pointHoverRadius}]},options:JSON.parse(response.chartsettings).options};let chartStatus=_chart.default.getChart(id);null!=chartStatus&&chartStatus.destroy(),new _chart.default(document.getElementById(id),config),_chart.default.defaults.font.size=25,_chart.default.defaults.stepSize=1}})); +define("mootimetertool_quiz/chart_draw",["exports","mootimetertool_quiz/chart.umd","core/ajax"],(function(_exports,_chart,_ajax){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_chart=(obj=_chart)&&obj.__esModule?obj:{default:obj};_exports.init=id=>{if(!document.getElementById(id))return;const pageid=document.getElementById("mootimeterstate").dataset.pageid;!async function(pageid,id){await getAnswers(pageid,id)}(pageid,id),setTimeout((()=>{const intervalms=document.getElementById("mootimeterstate").dataset.refreshinterval,interval=setInterval((()=>{document.getElementById(id)?getAnswers(pageid,id):clearInterval(interval)}),intervalms)}),2e3);document.getElementById("mootimeterstate").setAttribute("data-quizlastupdated",0)};const getAnswers=async(pageid,id)=>{const mtmstate=document.getElementById("mootimeterstate");if(mtmstate.dataset.contentlastupdated==mtmstate.dataset.contentchangedat)return;const response=await(pageid=>(0,_ajax.call)([{methodname:"mootimetertool_quiz_get_answers",args:{pageid:pageid}}])[0])(pageid);if(!document.getElementById(id))return void window.console.log("Canvas not found");if(mtmstate.dataset.quizlastupdated&&mtmstate.dataset.quizlastupdated==mtmstate.dataset.contentchangedat)return;let nodecanvas=document.getElementById(id);nodecanvas.setAttribute("data-labels",response.labels),nodecanvas.setAttribute("data-values",response.values),nodecanvas.setAttribute("data-chartsettings",response.chartsettings);var config={type:JSON.parse(response.chartsettings).charttype,data:{labels:JSON.parse(response.labels),datasets:[{label:response.question,data:JSON.parse(response.values),backgroundColor:JSON.parse(response.chartsettings).backgroundColor,borderRadius:JSON.parse(response.chartsettings).borderRadius,pointStyle:JSON.parse(response.chartsettings).pointStyle,pointRadius:JSON.parse(response.chartsettings).pointRadius,pointHoverRadius:JSON.parse(response.chartsettings).pointHoverRadius}]},options:JSON.parse(response.chartsettings).options};let chartStatus=_chart.default.getChart(id);null!=chartStatus&&chartStatus.destroy(),new _chart.default(document.getElementById(id),config),_chart.default.defaults.font.size=25,_chart.default.defaults.stepSize=1,mtmstate.setAttribute("data-quizlastupdated",mtmstate.dataset.contentchangedat)}})); //# sourceMappingURL=chart_draw.min.js.map \ No newline at end of file diff --git a/tools/quiz/amd/build/chart_draw.min.js.map b/tools/quiz/amd/build/chart_draw.min.js.map index a94090bf..82bb7961 100644 --- a/tools/quiz/amd/build/chart_draw.min.js.map +++ b/tools/quiz/amd/build/chart_draw.min.js.map @@ -1 +1 @@ -{"version":3,"file":"chart_draw.min.js","sources":["../src/chart_draw.js"],"sourcesContent":["import ChartJS from 'mootimetertool_quiz/chart.umd';\nimport {call as fetchMany} from 'core/ajax';\nimport {execReloadPage as reloadPage} from 'mod_mootimeter/reload_page';\n\nexport const init = (id) => {\n\n if (!document.getElementById(id)) {\n return;\n }\n\n const pageid = document.getElementById('mootimeterstate').dataset.pageid;\n\n getAnswersAsync(pageid, id);\n\n setTimeout(() => {\n const intervalms = document.getElementById('mootimeterstate').dataset.refreshinterval;\n const interval = setInterval(() => {\n if (!document.getElementById(id)) {\n clearInterval(interval);\n return;\n }\n getAnswers(pageid, id);\n }, intervalms);\n }, 2000);\n\n};\n\n/**\n * This is because the execution should be finished befor proceeding.\n * @param {int} pageid\n * @param {string} id\n */\nasync function getAnswersAsync(pageid, id) {\n await getAnswers(pageid, id);\n}\n\n/**\n * Execute the ajax call to get the aswers and more important data.\n * @param {int} pageid\n * @returns {mixed}\n */\nconst execGetAnswers = (\n pageid,\n) => fetchMany([{\n methodname: 'mootimetertool_quiz_get_answers',\n args: {\n pageid,\n },\n}])[0];\n\n/**\n * Get the answers and other important data, as well as processing them.\n * @param {int} pageid\n * @param {string} id\n * @returns {mixed}\n */\nconst getAnswers = async (pageid, id) => {\n\n const mtmstate = document.getElementById('mootimeterstate');\n\n // Early exit if there are no changes.\n if (mtmstate.dataset.lastupdated == mtmstate.dataset.contentchangedat) {\n return;\n }\n\n const response = await execGetAnswers(pageid);\n\n if (!document.getElementById(id)) {\n window.console.log(\"Canvas not found\");\n return;\n }\n\n // Write the new data to the canvas data attributes.\n mtmstate.setAttribute('data-lastupdated', response.lastupdated);\n\n let nodecanvas = document.getElementById(id);\n nodecanvas.setAttribute('data-labels', response.labels);\n nodecanvas.setAttribute('data-values', response.values);\n nodecanvas.setAttribute('data-chartsettings', response.chartsettings);\n\n // (Re-)Draw the chart.\n var config = {\n type: JSON.parse(response.chartsettings).charttype,\n data: {\n labels: JSON.parse(response.labels),\n datasets: [{\n label: response.question,\n data: JSON.parse(response.values),\n backgroundColor: JSON.parse(response.chartsettings).backgroundColor,\n borderRadius: JSON.parse(response.chartsettings).borderRadius,\n pointStyle: JSON.parse(response.chartsettings).pointStyle,\n pointRadius: JSON.parse(response.chartsettings).pointRadius,\n pointHoverRadius: JSON.parse(response.chartsettings).pointHoverRadius,\n }]\n },\n options: JSON.parse(response.chartsettings).options\n };\n\n let chartStatus = ChartJS.getChart(id); // id\n if (chartStatus != undefined) {\n chartStatus.destroy();\n }\n\n new ChartJS(document.getElementById(id), config);\n ChartJS.defaults.font.size = 25;\n ChartJS.defaults.stepSize = 1;\n};\n"],"names":["id","document","getElementById","pageid","dataset","getAnswers","getAnswersAsync","setTimeout","intervalms","refreshinterval","interval","setInterval","clearInterval","async","mtmstate","lastupdated","contentchangedat","response","methodname","args","execGetAnswers","window","console","log","setAttribute","nodecanvas","labels","values","chartsettings","config","type","JSON","parse","charttype","data","datasets","label","question","backgroundColor","borderRadius","pointStyle","pointRadius","pointHoverRadius","options","chartStatus","ChartJS","getChart","undefined","destroy","defaults","font","size","stepSize"],"mappings":"oUAIqBA,SAEZC,SAASC,eAAeF,iBAIvBG,OAASF,SAASC,eAAe,mBAAmBE,QAAQD,uBAsBvCA,OAAQH,UAC7BK,WAAWF,OAAQH,IArBzBM,CAAgBH,OAAQH,IAExBO,YAAW,WACDC,WAAaP,SAASC,eAAe,mBAAmBE,QAAQK,gBAChEC,SAAWC,aAAY,KACpBV,SAASC,eAAeF,IAI7BK,WAAWF,OAAQH,IAHfY,cAAcF,YAInBF,cACJ,YAiCDH,WAAaQ,MAAOV,OAAQH,YAExBc,SAAWb,SAASC,eAAe,sBAGrCY,SAASV,QAAQW,aAAeD,SAASV,QAAQY,8BAI/CC,cAvBNd,CAAAA,SACC,cAAU,CAAC,CACZe,WAAY,kCACZC,KAAM,CACFhB,OAAAA,WAEJ,GAiBuBiB,CAAejB,YAEjCF,SAASC,eAAeF,gBACzBqB,OAAOC,QAAQC,IAAI,oBAKvBT,SAASU,aAAa,mBAAoBP,SAASF,iBAE/CU,WAAaxB,SAASC,eAAeF,IACzCyB,WAAWD,aAAa,cAAeP,SAASS,QAChDD,WAAWD,aAAa,cAAeP,SAASU,QAChDF,WAAWD,aAAa,qBAAsBP,SAASW,mBAGnDC,OAAS,CACTC,KAAMC,KAAKC,MAAMf,SAASW,eAAeK,UACzCC,KAAM,CACFR,OAAQK,KAAKC,MAAMf,SAASS,QAC5BS,SAAU,CAAC,CACPC,MAAOnB,SAASoB,SAChBH,KAAMH,KAAKC,MAAMf,SAASU,QAC1BW,gBAAiBP,KAAKC,MAAMf,SAASW,eAAeU,gBACpDC,aAAcR,KAAKC,MAAMf,SAASW,eAAeW,aACjDC,WAAYT,KAAKC,MAAMf,SAASW,eAAeY,WAC/CC,YAAaV,KAAKC,MAAMf,SAASW,eAAea,YAChDC,iBAAkBX,KAAKC,MAAMf,SAASW,eAAec,oBAG7DC,QAASZ,KAAKC,MAAMf,SAASW,eAAee,aAG5CC,YAAcC,eAAQC,SAAS9C,IAChB+C,MAAfH,aACAA,YAAYI,cAGZH,eAAQ5C,SAASC,eAAeF,IAAK6B,uBACjCoB,SAASC,KAAKC,KAAO,kBACrBF,SAASG,SAAW"} \ No newline at end of file +{"version":3,"file":"chart_draw.min.js","sources":["../src/chart_draw.js"],"sourcesContent":["import ChartJS from 'mootimetertool_quiz/chart.umd';\nimport {call as fetchMany} from 'core/ajax';\n\nexport const init = (id) => {\n\n if (!document.getElementById(id)) {\n return;\n }\n\n const pageid = document.getElementById('mootimeterstate').dataset.pageid;\n\n getAnswersAsync(pageid, id);\n\n setTimeout(() => {\n const intervalms = document.getElementById('mootimeterstate').dataset.refreshinterval;\n const interval = setInterval(() => {\n if (!document.getElementById(id)) {\n clearInterval(interval);\n return;\n }\n getAnswers(pageid, id);\n }, intervalms);\n }, 2000);\n\n const mtmstate = document.getElementById('mootimeterstate');\n mtmstate.setAttribute('data-quizlastupdated', 0);\n\n};\n\n/**\n * This is because the execution should be finished befor proceeding.\n * @param {int} pageid\n * @param {string} id\n */\nasync function getAnswersAsync(pageid, id) {\n await getAnswers(pageid, id);\n}\n\n/**\n * Execute the ajax call to get the aswers and more important data.\n * @param {int} pageid\n * @returns {mixed}\n */\nconst execGetAnswers = (\n pageid,\n) => fetchMany([{\n methodname: 'mootimetertool_quiz_get_answers',\n args: {\n pageid,\n },\n}])[0];\n\n/**\n * Get the answers and other important data, as well as processing them.\n * @param {int} pageid\n * @param {string} id\n * @returns {mixed}\n */\nconst getAnswers = async (pageid, id) => {\n\n const mtmstate = document.getElementById('mootimeterstate');\n\n // Early exit if there are no changes.\n if (mtmstate.dataset.contentlastupdated == mtmstate.dataset.contentchangedat) {\n return;\n }\n\n const response = await execGetAnswers(pageid);\n\n if (!document.getElementById(id)) {\n window.console.log(\"Canvas not found\");\n return;\n }\n\n if (mtmstate.dataset.quizlastupdated && mtmstate.dataset.quizlastupdated == mtmstate.dataset.contentchangedat) {\n return;\n }\n\n // Write the new data to the canvas data attributes.\n\n let nodecanvas = document.getElementById(id);\n nodecanvas.setAttribute('data-labels', response.labels);\n nodecanvas.setAttribute('data-values', response.values);\n nodecanvas.setAttribute('data-chartsettings', response.chartsettings);\n\n // (Re-)Draw the chart.\n var config = {\n type: JSON.parse(response.chartsettings).charttype,\n data: {\n labels: JSON.parse(response.labels),\n datasets: [{\n label: response.question,\n data: JSON.parse(response.values),\n backgroundColor: JSON.parse(response.chartsettings).backgroundColor,\n borderRadius: JSON.parse(response.chartsettings).borderRadius,\n pointStyle: JSON.parse(response.chartsettings).pointStyle,\n pointRadius: JSON.parse(response.chartsettings).pointRadius,\n pointHoverRadius: JSON.parse(response.chartsettings).pointHoverRadius,\n }]\n },\n options: JSON.parse(response.chartsettings).options\n };\n\n let chartStatus = ChartJS.getChart(id); // id\n if (chartStatus != undefined) {\n chartStatus.destroy();\n }\n\n new ChartJS(document.getElementById(id), config);\n ChartJS.defaults.font.size = 25;\n ChartJS.defaults.stepSize = 1;\n\n // Set quizlastupdated.\n mtmstate.setAttribute('data-quizlastupdated', mtmstate.dataset.contentchangedat);\n};\n"],"names":["id","document","getElementById","pageid","dataset","getAnswers","getAnswersAsync","setTimeout","intervalms","refreshinterval","interval","setInterval","clearInterval","setAttribute","async","mtmstate","contentlastupdated","contentchangedat","response","methodname","args","execGetAnswers","window","console","log","quizlastupdated","nodecanvas","labels","values","chartsettings","config","type","JSON","parse","charttype","data","datasets","label","question","backgroundColor","borderRadius","pointStyle","pointRadius","pointHoverRadius","options","chartStatus","ChartJS","getChart","undefined","destroy","defaults","font","size","stepSize"],"mappings":"0RAGqBA,SAEZC,SAASC,eAAeF,iBAIvBG,OAASF,SAASC,eAAe,mBAAmBE,QAAQD,uBAyBvCA,OAAQH,UAC7BK,WAAWF,OAAQH,IAxBzBM,CAAgBH,OAAQH,IAExBO,YAAW,WACDC,WAAaP,SAASC,eAAe,mBAAmBE,QAAQK,gBAChEC,SAAWC,aAAY,KACpBV,SAASC,eAAeF,IAI7BK,WAAWF,OAAQH,IAHfY,cAAcF,YAInBF,cACJ,KAEcP,SAASC,eAAe,mBAChCW,aAAa,uBAAwB,UAiC5CR,WAAaS,MAAOX,OAAQH,YAExBe,SAAWd,SAASC,eAAe,sBAGrCa,SAASX,QAAQY,oBAAsBD,SAASX,QAAQa,8BAItDC,cAvBNf,CAAAA,SACC,cAAU,CAAC,CACZgB,WAAY,kCACZC,KAAM,CACFjB,OAAAA,WAEJ,GAiBuBkB,CAAelB,YAEjCF,SAASC,eAAeF,gBACzBsB,OAAOC,QAAQC,IAAI,uBAInBT,SAASX,QAAQqB,iBAAmBV,SAASX,QAAQqB,iBAAmBV,SAASX,QAAQa,4BAMzFS,WAAazB,SAASC,eAAeF,IACzC0B,WAAWb,aAAa,cAAeK,SAASS,QAChDD,WAAWb,aAAa,cAAeK,SAASU,QAChDF,WAAWb,aAAa,qBAAsBK,SAASW,mBAGnDC,OAAS,CACTC,KAAMC,KAAKC,MAAMf,SAASW,eAAeK,UACzCC,KAAM,CACFR,OAAQK,KAAKC,MAAMf,SAASS,QAC5BS,SAAU,CAAC,CACPC,MAAOnB,SAASoB,SAChBH,KAAMH,KAAKC,MAAMf,SAASU,QAC1BW,gBAAiBP,KAAKC,MAAMf,SAASW,eAAeU,gBACpDC,aAAcR,KAAKC,MAAMf,SAASW,eAAeW,aACjDC,WAAYT,KAAKC,MAAMf,SAASW,eAAeY,WAC/CC,YAAaV,KAAKC,MAAMf,SAASW,eAAea,YAChDC,iBAAkBX,KAAKC,MAAMf,SAASW,eAAec,oBAG7DC,QAASZ,KAAKC,MAAMf,SAASW,eAAee,aAG5CC,YAAcC,eAAQC,SAAS/C,IAChBgD,MAAfH,aACAA,YAAYI,cAGZH,eAAQ7C,SAASC,eAAeF,IAAK8B,uBACjCoB,SAASC,KAAKC,KAAO,kBACrBF,SAASG,SAAW,EAG5BtC,SAASF,aAAa,uBAAwBE,SAASX,QAAQa"} \ No newline at end of file diff --git a/tools/quiz/amd/src/chart_draw.js b/tools/quiz/amd/src/chart_draw.js index 9386b2ed..ebd1bd97 100644 --- a/tools/quiz/amd/src/chart_draw.js +++ b/tools/quiz/amd/src/chart_draw.js @@ -1,6 +1,5 @@ import ChartJS from 'mootimetertool_quiz/chart.umd'; import {call as fetchMany} from 'core/ajax'; -import {execReloadPage as reloadPage} from 'mod_mootimeter/reload_page'; export const init = (id) => { @@ -23,6 +22,9 @@ export const init = (id) => { }, intervalms); }, 2000); + const mtmstate = document.getElementById('mootimeterstate'); + mtmstate.setAttribute('data-quizlastupdated', 0); + }; /** @@ -59,7 +61,7 @@ const getAnswers = async (pageid, id) => { const mtmstate = document.getElementById('mootimeterstate'); // Early exit if there are no changes. - if (mtmstate.dataset.lastupdated == mtmstate.dataset.contentchangedat) { + if (mtmstate.dataset.contentlastupdated == mtmstate.dataset.contentchangedat) { return; } @@ -70,8 +72,11 @@ const getAnswers = async (pageid, id) => { return; } + if (mtmstate.dataset.quizlastupdated && mtmstate.dataset.quizlastupdated == mtmstate.dataset.contentchangedat) { + return; + } + // Write the new data to the canvas data attributes. - mtmstate.setAttribute('data-lastupdated', response.lastupdated); let nodecanvas = document.getElementById(id); nodecanvas.setAttribute('data-labels', response.labels); @@ -104,4 +109,7 @@ const getAnswers = async (pageid, id) => { new ChartJS(document.getElementById(id), config); ChartJS.defaults.font.size = 25; ChartJS.defaults.stepSize = 1; + + // Set quizlastupdated. + mtmstate.setAttribute('data-quizlastupdated', mtmstate.dataset.contentchangedat); }; diff --git a/tools/quiz/classes/external/get_answers.php b/tools/quiz/classes/external/get_answers.php index bb832e48..f95d7c0a 100644 --- a/tools/quiz/classes/external/get_answers.php +++ b/tools/quiz/classes/external/get_answers.php @@ -87,8 +87,6 @@ public static function execute_returns(): external_single_structure { 'labels' => new external_value(PARAM_TEXT, 'Answer options text'), 'chartsettings' => new external_value(PARAM_TEXT, 'chartsettings'), 'question' => new external_value(PARAM_TEXT, 'Question text'), - 'lastupdated' => new external_value(PARAM_INT, 'Timestamp of last updated'), - 'teacherpermissiontoview' => new external_value(PARAM_TEXT, 'Timestamp of last updated'), ], 'Information to redraw quiz' ); diff --git a/tools/quiz/classes/quiz.php b/tools/quiz/classes/quiz.php index 97e6c7f3..d2623b49 100644 --- a/tools/quiz/classes/quiz.php +++ b/tools/quiz/classes/quiz.php @@ -324,10 +324,13 @@ public function store_answer_option(object $record): int { $origrecord->timemodified = time(); $DB->update_record($this->get_answer_option_table(), $origrecord); + $this->notify_data_changed($this->get_page($record->pageid), 'settings'); return $origrecord->id; } - return $DB->insert_record($this->get_answer_option_table(), $record, true); + $insertreturn = $DB->insert_record($this->get_answer_option_table(), $record, true); + $this->notify_data_changed($this->get_page($record->pageid), 'settings'); + return $insertreturn; } /** @@ -408,6 +411,7 @@ public function remove_answer_option(int $pageid, int $aoid): array { $transaction->rollback($e); $return = ['code' => 500, 'string' => $e->getMessage()]; } + $this->notify_data_changed($this->get_page($pageid), 'settings'); return $return; } @@ -773,8 +777,6 @@ public function get_result_params_chartjs(int|object $pageorid): array { 'labels' => json_encode($labels), 'values' => json_encode($values), 'question' => self::get_tool_config($page, 'question'), - 'lastupdated' => $this->get_page_last_update_time($page->id, ''), - 'teacherpermissiontoview' => $this->get_teacherpermission_to_view($page), ]; return $params; @@ -962,4 +964,5 @@ public function get_answer_overview(object $cm, object $page): string { $params = $this->get_answer_overview($cm, $page); return $OUTPUT->render_from_template("mod_mootimeter/answers_overview", $params); } + } diff --git a/tools/quiz/templates/view_content.mustache b/tools/quiz/templates/view_content.mustache index b8c93b33..438f6700 100644 --- a/tools/quiz/templates/view_content.mustache +++ b/tools/quiz/templates/view_content.mustache @@ -44,7 +44,3 @@ {{#withwrapper}} {{/withwrapper}} - -{{#js}} -require(['mod_mootimeter/reload_page_on_state_change'], (module) => module.init("mtmt_quiz_overview_{{uniqid}}")); -{{/js}} diff --git a/tools/quiz/templates/view_overview.mustache b/tools/quiz/templates/view_overview.mustache index fd0217f1..4f5ae013 100644 --- a/tools/quiz/templates/view_overview.mustache +++ b/tools/quiz/templates/view_overview.mustache @@ -30,7 +30,3 @@ - -{{#js}} -require(['mod_mootimeter/reload_page_on_state_change'], (module) => module.init("mtmt_quiz_overview_{{uniqid}}")); -{{/js}} diff --git a/tools/quiz/templates/view_results.mustache b/tools/quiz/templates/view_results.mustache index 56fa62c1..38e88d1b 100644 --- a/tools/quiz/templates/view_results.mustache +++ b/tools/quiz/templates/view_results.mustache @@ -4,9 +4,6 @@ > {{#str}}no_answer_due_to_showteacherpermission, mootimetertool_quiz{{/str}} - {{#js}} - require(['mod_mootimeter/reload_page_on_state_change'], (module) => module.init("mtmt_quiz_no_answer_wrapper_{{uniqid}}")); - {{/js}} {{/teacherpermissiontoview}} {{#teacherpermissiontoview}} diff --git a/tools/wordcloud/amd/build/redraw_wordcloud.min.js b/tools/wordcloud/amd/build/redraw_wordcloud.min.js index 7163cd30..71b55e45 100644 --- a/tools/wordcloud/amd/build/redraw_wordcloud.min.js +++ b/tools/wordcloud/amd/build/redraw_wordcloud.min.js @@ -1,3 +1,3 @@ -define("mootimetertool_wordcloud/redraw_wordcloud",["exports","core/ajax","mootimetertool_wordcloud/wordcloud2"],(function(_exports,_ajax,_wordcloud){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_wordcloud=(obj=_wordcloud)&&obj.__esModule?obj:{default:obj};_exports.init=id=>{document.getElementById(id)&&(!async function(id){await getAnswers(id)}(id),setTimeout((()=>{const intervalms=document.getElementById("mootimeterstate").dataset.refreshinterval,interval=setInterval((()=>{document.getElementById(id)?getAnswers(id):clearInterval(interval)}),intervalms)}),2e3))};const getAnswers=async id=>{if(!document.getElementById(id))return;var pageid=document.getElementById(id).dataset.pageid;const mtmstate=document.getElementById("mootimeterstate");if(mtmstate.dataset.lastupdated==mtmstate.dataset.contentchangedat)return;var lastposttimestamp=0;document.getElementById("mootimeterstate").dataset.lastupdated&&(lastposttimestamp=document.getElementById("mootimeterstate").dataset.lastupdated);const response=await((pageid,lastupdated)=>(0,_ajax.call)([{methodname:"mootimetertool_wordcloud_get_answers",args:{pageid:pageid,lastupdated:lastupdated}}])[0])(pageid,lastposttimestamp);document.getElementById("mootimeterstate").setAttribute("data-lastupdated",response.lastupdated),document.getElementById(id).setAttribute("data-answers",JSON.stringify(response.answerlist)),function(id){let mtmtcanvas=document.getElementById(id),answers=JSON.parse(mtmtcanvas.dataset.answers);(0,_wordcloud.default)(mtmtcanvas,{list:answers,weightFactor:24,color:"#f98012",fontFamily:"OpenSans"})}(id)}})); +define("mootimetertool_wordcloud/redraw_wordcloud",["exports","core/ajax","mootimetertool_wordcloud/wordcloud2"],(function(_exports,_ajax,_wordcloud){var obj;Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_wordcloud=(obj=_wordcloud)&&obj.__esModule?obj:{default:obj};_exports.init=id=>{if(!document.getElementById(id))return;!async function(id){await getAnswers(id)}(id),setTimeout((()=>{const intervalms=document.getElementById("mootimeterstate").dataset.refreshinterval,interval=setInterval((()=>{document.getElementById(id)?getAnswers(id):clearInterval(interval)}),intervalms)}),2e3);document.getElementById("mootimeterstate").setAttribute("data-wclastupdated",0)};const getAnswers=async id=>{if(!document.getElementById(id))return;var pageid=document.getElementById(id).dataset.pageid;const mtmstate=document.getElementById("mootimeterstate");if(mtmstate.dataset.wclastupdated&&mtmstate.dataset.wclastupdated==mtmstate.dataset.contentchangedat)return;const response=await((pageid,lastupdated)=>(0,_ajax.call)([{methodname:"mootimetertool_wordcloud_get_answers",args:{pageid:pageid,lastupdated:lastupdated}}])[0])(pageid);mtmstate.setAttribute("data-wclastupdated",mtmstate.dataset.contentchangedat),document.getElementById(id).setAttribute("data-answers",JSON.stringify(response.answerlist)),function(id){let mtmtcanvas=document.getElementById(id),answers=JSON.parse(mtmtcanvas.dataset.answers);(0,_wordcloud.default)(mtmtcanvas,{list:answers,weightFactor:24,color:"#f98012",fontFamily:"OpenSans"})}(id)}})); //# sourceMappingURL=redraw_wordcloud.min.js.map \ No newline at end of file diff --git a/tools/wordcloud/amd/build/redraw_wordcloud.min.js.map b/tools/wordcloud/amd/build/redraw_wordcloud.min.js.map index 6744cfe5..00cfd59d 100644 --- a/tools/wordcloud/amd/build/redraw_wordcloud.min.js.map +++ b/tools/wordcloud/amd/build/redraw_wordcloud.min.js.map @@ -1 +1 @@ -{"version":3,"file":"redraw_wordcloud.min.js","sources":["../src/redraw_wordcloud.js"],"sourcesContent":["import { call as fetchMany } from 'core/ajax';\nimport WordCloud from 'mootimetertool_wordcloud/wordcloud2';\n\nexport const init = (id) => {\n\n if (!document.getElementById(id)) {\n return;\n }\n\n // Initially getAnswers.\n getAnswersAsync(id);\n\n setTimeout(() => {\n const intervalms = document.getElementById('mootimeterstate').dataset.refreshinterval;\n const interval = setInterval(() => {\n if (!document.getElementById(id)) {\n clearInterval(interval);\n return;\n }\n getAnswers(id);\n }, intervalms);\n }, 2000);\n\n};\n\n/**\n * This is because the execution should be finished befor proceeding.\n * @param {string} id\n */\nasync function getAnswersAsync(id) {\n await getAnswers(id);\n}\n\n/**\n * Call to get all answers\n * @param {int} pageid\n * @param {int} lastupdated\n * @returns {array}\n */\nconst execGetAnswers = (\n pageid,\n lastupdated\n) => fetchMany([{\n methodname: 'mootimetertool_wordcloud_get_answers',\n args: {\n pageid,\n lastupdated\n },\n}])[0];\n\n/**\n * Executes the call to get all answers.\n *\n * @param {string} id\n * @returns {mixed}\n */\nconst getAnswers = async (id) => {\n\n if (!document.getElementById(id)) {\n return;\n }\n\n var pageid = document.getElementById(id).dataset.pageid;\n\n const mtmstate = document.getElementById('mootimeterstate');\n\n // Early exit if there are no changes.\n if (mtmstate.dataset.lastupdated == mtmstate.dataset.contentchangedat) {\n return;\n }\n\n var lastposttimestamp = 0;\n if (document.getElementById('mootimeterstate').dataset.lastupdated) {\n lastposttimestamp = document.getElementById('mootimeterstate').dataset.lastupdated;\n }\n // Get the answer list.\n const response = await execGetAnswers(pageid, lastposttimestamp);\n\n // Set lastupdated.\n let nodelastupdated = document.getElementById('mootimeterstate');\n nodelastupdated.setAttribute('data-lastupdated', response.lastupdated);\n\n // Redraw wordcloud.\n document.getElementById(id).setAttribute('data-answers', JSON.stringify(response.answerlist));\n redrawwordcloud(id);\n\n return;\n};\n\n/**\n * Redraw the wordcloud.\n * @param {string} id\n */\nfunction redrawwordcloud(id) {\n let mtmtcanvas = document.getElementById(id);\n let answers = JSON.parse(mtmtcanvas.dataset.answers);\n\n WordCloud(mtmtcanvas, { list: answers, weightFactor: 24, color: '#f98012', fontFamily: 'OpenSans' });\n}\n"],"names":["id","document","getElementById","getAnswers","getAnswersAsync","setTimeout","intervalms","dataset","refreshinterval","interval","setInterval","clearInterval","async","pageid","mtmstate","lastupdated","contentchangedat","lastposttimestamp","response","methodname","args","execGetAnswers","setAttribute","JSON","stringify","answerlist","mtmtcanvas","answers","parse","list","weightFactor","color","fontFamily","redrawwordcloud"],"mappings":"uTAGqBA,KAEZC,SAASC,eAAeF,sBAwBFA,UACrBG,WAAWH,IApBjBI,CAAgBJ,IAEhBK,YAAW,WACDC,WAAaL,SAASC,eAAe,mBAAmBK,QAAQC,gBAChEC,SAAWC,aAAY,KACpBT,SAASC,eAAeF,IAI7BG,WAAWH,IAHPW,cAAcF,YAInBH,cACJ,aAmCDH,WAAaS,MAAAA,SAEVX,SAASC,eAAeF,eAIzBa,OAASZ,SAASC,eAAeF,IAAIO,QAAQM,aAE3CC,SAAWb,SAASC,eAAe,sBAGrCY,SAASP,QAAQQ,aAAeD,SAASP,QAAQS,4BAIjDC,kBAAoB,EACpBhB,SAASC,eAAe,mBAAmBK,QAAQQ,cACnDE,kBAAoBhB,SAASC,eAAe,mBAAmBK,QAAQQ,mBAGrEG,cArCa,EACnBL,OACAE,eACC,cAAU,CAAC,CACZI,WAAY,uCACZC,KAAM,CACFP,OAAAA,OACAE,YAAAA,gBAEJ,GA4BuBM,CAAeR,OAAQI,mBAGxBhB,SAASC,eAAe,mBAC9BoB,aAAa,mBAAoBJ,SAASH,aAG1Dd,SAASC,eAAeF,IAAIsB,aAAa,eAAgBC,KAAKC,UAAUN,SAASO,sBAU5DzB,QACjB0B,WAAazB,SAASC,eAAeF,IACrC2B,QAAUJ,KAAKK,MAAMF,WAAWnB,QAAQoB,gCAElCD,WAAY,CAAEG,KAAMF,QAASG,aAAc,GAAIC,MAAO,UAAWC,WAAY,aAbvFC,CAAgBjC"} \ No newline at end of file +{"version":3,"file":"redraw_wordcloud.min.js","sources":["../src/redraw_wordcloud.js"],"sourcesContent":["import { call as fetchMany } from 'core/ajax';\nimport WordCloud from 'mootimetertool_wordcloud/wordcloud2';\n\nexport const init = (id) => {\n\n if (!document.getElementById(id)) {\n return;\n }\n\n // Initially getAnswers.\n getAnswersAsync(id);\n\n setTimeout(() => {\n const intervalms = document.getElementById('mootimeterstate').dataset.refreshinterval;\n const interval = setInterval(() => {\n if (!document.getElementById(id)) {\n clearInterval(interval);\n return;\n }\n getAnswers(id);\n }, intervalms);\n }, 2000);\n\n const mtmstate = document.getElementById('mootimeterstate');\n mtmstate.setAttribute('data-wclastupdated', 0);\n};\n\n/**\n * This is because the execution should be finished befor proceeding.\n * @param {string} id\n */\nasync function getAnswersAsync(id) {\n await getAnswers(id);\n}\n\n/**\n * Call to get all answers\n * @param {int} pageid\n * @param {int} lastupdated\n * @returns {array}\n */\nconst execGetAnswers = (\n pageid,\n lastupdated\n) => fetchMany([{\n methodname: 'mootimetertool_wordcloud_get_answers',\n args: {\n pageid,\n lastupdated\n },\n}])[0];\n\n/**\n * Executes the call to get all answers.\n *\n * @param {string} id\n * @returns {mixed}\n */\nconst getAnswers = async (id) => {\n\n if (!document.getElementById(id)) {\n return;\n }\n\n var pageid = document.getElementById(id).dataset.pageid;\n\n const mtmstate = document.getElementById('mootimeterstate');\n\n // Early exit if there are no changes.\n if (mtmstate.dataset.wclastupdated && mtmstate.dataset.wclastupdated == mtmstate.dataset.contentchangedat) {\n return;\n }\n\n // Get the answer list.\n const response = await execGetAnswers(pageid);\n\n // Set wclastupdated.\n mtmstate.setAttribute('data-wclastupdated', mtmstate.dataset.contentchangedat);\n\n // Redraw wordcloud.\n document.getElementById(id).setAttribute('data-answers', JSON.stringify(response.answerlist));\n redrawwordcloud(id);\n\n return;\n};\n\n/**\n * Redraw the wordcloud.\n * @param {string} id\n */\nfunction redrawwordcloud(id) {\n let mtmtcanvas = document.getElementById(id);\n let answers = JSON.parse(mtmtcanvas.dataset.answers);\n\n WordCloud(mtmtcanvas, { list: answers, weightFactor: 24, color: '#f98012', fontFamily: 'OpenSans' });\n}\n"],"names":["id","document","getElementById","getAnswers","getAnswersAsync","setTimeout","intervalms","dataset","refreshinterval","interval","setInterval","clearInterval","setAttribute","async","pageid","mtmstate","wclastupdated","contentchangedat","response","lastupdated","methodname","args","execGetAnswers","JSON","stringify","answerlist","mtmtcanvas","answers","parse","list","weightFactor","color","fontFamily","redrawwordcloud"],"mappings":"uTAGqBA,SAEZC,SAASC,eAAeF,2BA0BFA,UACrBG,WAAWH,IAtBjBI,CAAgBJ,IAEhBK,YAAW,WACDC,WAAaL,SAASC,eAAe,mBAAmBK,QAAQC,gBAChEC,SAAWC,aAAY,KACpBT,SAASC,eAAeF,IAI7BG,WAAWH,IAHPW,cAAcF,YAInBH,cACJ,KAEcL,SAASC,eAAe,mBAChCU,aAAa,qBAAsB,UAkC1CT,WAAaU,MAAAA,SAEVZ,SAASC,eAAeF,eAIzBc,OAASb,SAASC,eAAeF,IAAIO,QAAQO,aAE3CC,SAAWd,SAASC,eAAe,sBAGrCa,SAASR,QAAQS,eAAiBD,SAASR,QAAQS,eAAiBD,SAASR,QAAQU,8BAKnFC,cAjCa,EACnBJ,OACAK,eACC,cAAU,CAAC,CACZC,WAAY,uCACZC,KAAM,CACFP,OAAAA,OACAK,YAAAA,gBAEJ,GAwBuBG,CAAeR,QAGtCC,SAASH,aAAa,qBAAsBG,SAASR,QAAQU,kBAG7DhB,SAASC,eAAeF,IAAIY,aAAa,eAAgBW,KAAKC,UAAUN,SAASO,sBAU5DzB,QACjB0B,WAAazB,SAASC,eAAeF,IACrC2B,QAAUJ,KAAKK,MAAMF,WAAWnB,QAAQoB,gCAElCD,WAAY,CAAEG,KAAMF,QAASG,aAAc,GAAIC,MAAO,UAAWC,WAAY,aAbvFC,CAAgBjC"} \ No newline at end of file diff --git a/tools/wordcloud/amd/src/redraw_wordcloud.js b/tools/wordcloud/amd/src/redraw_wordcloud.js index 1737ef36..72e340f5 100644 --- a/tools/wordcloud/amd/src/redraw_wordcloud.js +++ b/tools/wordcloud/amd/src/redraw_wordcloud.js @@ -21,6 +21,8 @@ export const init = (id) => { }, intervalms); }, 2000); + const mtmstate = document.getElementById('mootimeterstate'); + mtmstate.setAttribute('data-wclastupdated', 0); }; /** @@ -65,20 +67,15 @@ const getAnswers = async (id) => { const mtmstate = document.getElementById('mootimeterstate'); // Early exit if there are no changes. - if (mtmstate.dataset.lastupdated == mtmstate.dataset.contentchangedat) { + if (mtmstate.dataset.wclastupdated && mtmstate.dataset.wclastupdated == mtmstate.dataset.contentchangedat) { return; } - var lastposttimestamp = 0; - if (document.getElementById('mootimeterstate').dataset.lastupdated) { - lastposttimestamp = document.getElementById('mootimeterstate').dataset.lastupdated; - } // Get the answer list. - const response = await execGetAnswers(pageid, lastposttimestamp); + const response = await execGetAnswers(pageid); - // Set lastupdated. - let nodelastupdated = document.getElementById('mootimeterstate'); - nodelastupdated.setAttribute('data-lastupdated', response.lastupdated); + // Set wclastupdated. + mtmstate.setAttribute('data-wclastupdated', mtmstate.dataset.contentchangedat); // Redraw wordcloud. document.getElementById(id).setAttribute('data-answers', JSON.stringify(response.answerlist)); diff --git a/tools/wordcloud/classes/external/get_answers.php b/tools/wordcloud/classes/external/get_answers.php index 3d34d501..63bcb0ea 100644 --- a/tools/wordcloud/classes/external/get_answers.php +++ b/tools/wordcloud/classes/external/get_answers.php @@ -50,7 +50,6 @@ class get_answers extends external_api { public static function execute_parameters(): external_function_parameters { return new external_function_parameters([ 'pageid' => new external_value(PARAM_INT, 'The page id to obtain results for.', VALUE_REQUIRED), - 'lastupdated' => new external_value(PARAM_INT, 'The timestamp the last answer were added at.', VALUE_REQUIRED), ]); } @@ -58,16 +57,13 @@ public static function execute_parameters(): external_function_parameters { * Execute the service. * * @param int $pageid - * @param int $lastupdated * @return array */ - public static function execute(int $pageid, int $lastupdated): array { + public static function execute(int $pageid): array { [ 'pageid' => $pageid, - 'lastupdated' => $lastupdated, ] = self::validate_parameters(self::execute_parameters(), [ 'pageid' => $pageid, - 'lastupdated' => $lastupdated, ]); $cm = helper::get_cm_by_pageid($pageid); $cmcontext = \context_module::instance($cm->id); @@ -75,11 +71,9 @@ public static function execute(int $pageid, int $lastupdated): array { require_capability('mod/mootimeter:view', $cmcontext); $wordcloud = new wordcloud(); - $lastupdatednew = $wordcloud->get_page_last_update_time($pageid, 'answers'); - $answerlist = $wordcloud->get_answerlist_wordcloud($pageid); - return ['answerlist' => $answerlist, 'lastupdated' => $lastupdatednew]; + return ['answerlist' => $answerlist]; } /** @@ -97,8 +91,6 @@ public static function execute_returns(): external_single_structure { ), 'The answerslist.', ), - 'lastupdated' => new external_value(PARAM_INT, 'Timestamp of last updated'), - ], 'Information to redraw wordcloud' ); diff --git a/tools/wordcloud/classes/wordcloud.php b/tools/wordcloud/classes/wordcloud.php index 18a4337f..2fb72d2d 100644 --- a/tools/wordcloud/classes/wordcloud.php +++ b/tools/wordcloud/classes/wordcloud.php @@ -475,7 +475,7 @@ public function get_content_menu_tool_params(object $page, array $params) { */ public function get_tool_result_page_params(object $page, array $params = []): array { $params['answerslist'] = ""; - $params['lastupdated'] = 0; + $params['lastupdated'] = $this->get_data_changed($page, 'answers'); $params['pageid'] = $page->id; $params['template'] = "mootimetertool_wordcloud/view_results"; return $params; diff --git a/tools/wordcloud/templates/view_content.mustache b/tools/wordcloud/templates/view_content.mustache index d6fa7aa0..7f115d1f 100644 --- a/tools/wordcloud/templates/view_content.mustache +++ b/tools/wordcloud/templates/view_content.mustache @@ -41,7 +41,3 @@ {{#withwrapper}} {{/withwrapper}} - -{{#js}} -require(['mod_mootimeter/reload_page_on_state_change'], (module) => module.init("mtmt_wordcloud_overview_{{uniqid}}")); -{{/js}} diff --git a/tools/wordcloud/templates/view_overview.mustache b/tools/wordcloud/templates/view_overview.mustache index 4181d943..d0e2ff23 100644 --- a/tools/wordcloud/templates/view_overview.mustache +++ b/tools/wordcloud/templates/view_overview.mustache @@ -28,7 +28,3 @@ {{/answers}} - -{{#js}} -require(['mod_mootimeter/reload_page_on_state_change'], (module) => module.init("mtmt_wordcloud_overview_{{uniqid}}")); -{{/js}} diff --git a/tools/wordcloud/templates/view_results.mustache b/tools/wordcloud/templates/view_results.mustache index 79c89217..7cb99f5f 100644 --- a/tools/wordcloud/templates/view_results.mustache +++ b/tools/wordcloud/templates/view_results.mustache @@ -1,5 +1,14 @@ +{{^teacherpermissiontoview}} +
+ {{#str}}no_answer_due_to_showteacherpermission, mootimetertool_quiz{{/str}} +
+{{/teacherpermissiontoview}} + +{{#teacherpermissiontoview}}
module.init("wordcloudcanvas_{{uniqid}}")); {{/js}} +{{/teacherpermissiontoview}} diff --git a/version.php b/version.php index c269e757..cdf777fd 100644 --- a/version.php +++ b/version.php @@ -27,7 +27,7 @@ $plugin->component = 'mod_mootimeter'; $plugin->release = '0.2.0'; -$plugin->version = 20240050901; +$plugin->version = 20240050902; $plugin->requires = 2022112800; $plugin->maturity = MATURITY_ALPHA; $plugin->supported = [403, 404]; // A range of branch numbers of supported moodle versions. diff --git a/view.php b/view.php index 9b455680..a1af9ddc 100644 --- a/view.php +++ b/view.php @@ -66,7 +66,8 @@ // Check if this page is in the recent mootimeter instance. if (!empty($pageid) && !$helper::validate_page_belongs_to_instance($pageid, $pages)) { - throw new moodle_exception('generalexceptionmessage', 'error', '', get_string("pageaccessexception", "mootimeter")); + $page = array_pop($pages); + redirect(new moodle_url('/mod/mootimeter/view.php', ['id' => $cm->id, 'pageid' => $page->id])); } // If there is only one page. Redirect to this page if there is no pageid set.