diff --git a/amd/build/usersettings_save.min.js b/amd/build/usersettings_save.min.js index b8c1c21..ff6e923 100644 --- a/amd/build/usersettings_save.min.js +++ b/amd/build/usersettings_save.min.js @@ -5,7 +5,7 @@ define("block_townsquare/usersettings_save",["exports","core/ajax"],(function(_e * This file implements 1 functionality: * - If the "save settings" button is pressed, store the settings in the database. * - * @module block_townsquare/timefilter + * @module block_townsquare/usersettings_save * @copyright 2024 Tamaro Walter * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=function(userid,settingsfromdb){settingsfromdb&&function(settingsfromdb){let futurebuttonid=converttimetoid(settingsfromdb.timefilterfuture,!0),pastbuttonid=converttimetoid(settingsfromdb.timefilterpast,!1);"ts_time_all"!==futurebuttonid?(futureradiobuttons.forEach((function(button){button.id===futurebuttonid&&(button.parentNode.classList.add("active"),button.checked=!0,button.dispatchEvent(new Event("change")),alltimebutton.forEach((function(alltimebutton){alltimebutton.checked=!1,alltimebutton.parentNode.classList.remove("active")})))})),pastradiobuttons.forEach((function(button){button.id===pastbuttonid&&(button.parentNode.classList.add("active"),button.checked=!0,button.dispatchEvent(new Event("change")),alltimebutton.forEach((function(alltimebutton){alltimebutton.checked=!1,alltimebutton.parentNode.classList.remove("active")})))}))):alltimebutton.forEach((function(button){button.parentNode.classList.add("active"),button.checked=!0,button.dispatchEvent(new Event("change"))}));checkboxes.forEach((function(checkbox){let basiclettercheck="basicletter"===checkbox.id&&""===settingsfromdb.basicletter,completionlettercheck="completionletter"===checkbox.id&&"0"===settingsfromdb.completionletter,postlettercheck="postletter"===checkbox.id&&"0"===settingsfromdb.postletter;(basiclettercheck||completionlettercheck||postlettercheck)&&checkbox.click()}))}(settingsfromdb);savebutton.addEventListener("click",(async function(){let timespans=function(){let settings={timepast:0,timefuture:0},settingsset=!1;if(alltimebutton.forEach((function(button){button.parentNode.classList.contains("active")&&(settings.timepast=convertidtotime(button.id),settings.timefuture=convertidtotime(button.id),settingsset=!0)})),settingsset)return settings;return futureradiobuttons.forEach((function(button){button.parentNode.classList.contains("active")&&(settings.timefuture=convertidtotime(button.id))})),pastradiobuttons.forEach((function(button){button.parentNode.classList.contains("active")&&(settings.timepast=convertidtotime(button.id))})),settings}(),letterfilter=function(){let settings={basicletter:0,completionletter:0,postletter:0};return checkboxes.forEach((function(checkbox){if(checkbox.checked)switch(checkbox.id){case"basicletter":settings.basicletter=1;break;case"completionletter":settings.completionletter=1;break;case"postletter":settings.postletter=1}})),settings}();!function(userid,timefilterpast,timefilterfuture,basicletter,completionletter,postletter){let result;const data={methodname:"block_townsquare_record_usersettings",args:{userid:userid,timefilterpast:timefilterpast,timefilterfuture:timefilterfuture,basicletter:basicletter,completionletter:completionletter,postletter:postletter}};result=_ajax.default.call([data]);let el=document.getElementById("ts_usersettings_successlabel");el.style.display="block",el.style.opacity=1,el.fadeOutTimer&&clearInterval(el.fadeOutTimer);setTimeout((function(){el.fadeOutTimer=setInterval((function(){el.style.opacity>.4?el.style.opacity-=.1:el.style.opacity>0?el.style.opacity-=.2:(clearInterval(el.fadeOutTimer),el.style.display="none")}),100)}),3e3)}(userid,timespans.timepast,timespans.timefuture,letterfilter.basicletter,letterfilter.completionletter,letterfilter.postletter)}))},_ajax=(obj=_ajax)&&obj.__esModule?obj:{default:obj};const savebutton=document.getElementById("ts_usersettings_savebutton"),alltimebutton=document.querySelectorAll(".ts_all_time_button"),futureradiobuttons=document.querySelectorAll(".ts_future_time_button"),pastradiobuttons=document.querySelectorAll(".ts_past_time_button"),checkboxes=document.querySelectorAll(".ts_letter_checkbox");function convertidtotime(id){switch(id){case"ts_time_all":return 15778463;case"ts_time_next_twodays":case"ts_time_last_twodays":return 172800;case"ts_time_next_fivedays":case"ts_time_last_fivedays":return 432e3;case"ts_time_next_week":case"ts_time_last_week":return 604800;case"ts_time_next_month":case"ts_time_last_month":return 2592e3}}function converttimetoid(time,future){switch(time){case"15778463":return"ts_time_all";case"172800":return future?"ts_time_next_twodays":"ts_time_past_twodays";case"432000":return future?"ts_time_next_fivedays":"ts_time_last_fivedays";case"604800":return future?"ts_time_next_week":"ts_time_last_week";case"2592000":return future?"ts_time_next_month":"ts_time_last_month"}}})); diff --git a/amd/build/usersettings_save.min.js.map b/amd/build/usersettings_save.min.js.map index ccf8a70..f83e831 100644 --- a/amd/build/usersettings_save.min.js.map +++ b/amd/build/usersettings_save.min.js.map @@ -1 +1 @@ -{"version":3,"file":"usersettings_save.min.js","sources":["../src/usersettings_save.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Javascript to save the user settings in the database.\n *\n * This file implements 1 functionality:\n * - If the \"save settings\" button is pressed, store the settings in the database.\n *\n * @module block_townsquare/timefilter\n * @copyright 2024 Tamaro Walter\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\n\n// Get the save button for the user settings.\nconst savebutton = document.getElementById('ts_usersettings_savebutton');\n\n// Get the buttons from the time filter.\nconst alltimebutton = document.querySelectorAll('.ts_all_time_button');\nconst futureradiobuttons = document.querySelectorAll('.ts_future_time_button');\nconst pastradiobuttons = document.querySelectorAll('.ts_past_time_button');\n\n// Get the checkboxes from the letter filter.\nconst checkboxes = document.querySelectorAll('.ts_letter_checkbox');\n\n/**\n * Init function\n *\n * @param {number} userid The id of the current user.\n * @param {object} settingsfromdb The settings from the database, if there are any.\n */\nexport function init(userid, settingsfromdb) {\n // When the page is loaded, set the settings from the database.\n if (settingsfromdb) {\n executeusersettings(settingsfromdb);\n }\n\n // Add event listener to the save button.\n savebutton.addEventListener('click', async function() {\n\n // First step: collect the current settings.\n // Get the relevant time spans of the time filter and the setting of the letter filter checkboxes.\n let timespans = collecttimefiltersettings();\n let letterfilter = collectletterfiltersettings();\n\n // Second step: store the usersettings in the database.\n saveusersettings(userid, timespans['timepast'], timespans['timefuture'], letterfilter['basicletter'],\n letterfilter['completionletter'], letterfilter['postletter']);\n });\n}\n\n/**\n * Function to save the user settings in the database.\n * @param {number} userid\n * @param {number} timefilterpast\n * @param {number} timefilterfuture\n * @param {number} basicletter\n * @param {number} completionletter\n * @param {number} postletter\n * @returns {Promise<*>}\n */\nfunction saveusersettings(userid, timefilterpast, timefilterfuture, basicletter, completionletter, postletter) {\n let result;\n\n const data = {\n methodname: 'block_townsquare_record_usersettings',\n args: {\n userid: userid,\n timefilterpast: timefilterpast,\n timefilterfuture: timefilterfuture,\n basicletter: basicletter,\n completionletter: completionletter,\n postletter: postletter,\n },\n };\n //console.log(data);\n result = Ajax.call([data]);\n\n //console.log(\"The result [0] object \",result[0]);\n\n // Show a success message.\n let el = document.getElementById('ts_usersettings_successlabel');\n el.style.display = 'block';\n el.style.opacity = 1.0;\n\n // Start a new setInterval timer to gradually fade out the label.\n if (el.fadeOutTimer) {\n clearInterval(el.fadeOutTimer);\n }\n setTimeout(function () {\n el.fadeOutTimer = setInterval(function () {\n if (el.style.opacity > 0.4) {\n el.style.opacity -= 0.1;\n } else if (el.style.opacity > 0) {\n el.style.opacity -= 0.2;\n } else {\n // Once opacity reaches 0, clear the timer and hide the label.\n clearInterval(el.fadeOutTimer);\n el.style.display = 'none';\n }\n }, 100);\n }, 3000);\n return result;\n\n}\n\n/**\n * Function to execute existing user settings when loading the townsquare.\n * @param {Object} settingsfromdb\n */\nfunction executeusersettings(settingsfromdb) {\n\n // First step: set the time filter settings.\n // Change the time into the correct radio button id.\n let futurebuttonid = converttimetoid(settingsfromdb['timefilterfuture'], true);\n let pastbuttonid = converttimetoid(settingsfromdb['timefilterpast'], false);\n\n // If the time span is a combination of past and future, go through the two radio buttons and activate the filter.\n if (futurebuttonid !== \"ts_time_all\") {\n futureradiobuttons.forEach(function(button) {\n if (button.id === futurebuttonid) {\n button.parentNode.classList.add('active');\n button.checked = true;\n button.dispatchEvent(new Event('change'));\n alltimebutton.forEach(function(alltimebutton) {\n alltimebutton.checked = false;\n alltimebutton.parentNode.classList.remove('active');\n });\n }\n });\n pastradiobuttons.forEach(function(button) {\n if (button.id === pastbuttonid) {\n button.parentNode.classList.add('active');\n button.checked = true;\n button.dispatchEvent(new Event('change'));\n alltimebutton.forEach(function(alltimebutton) {\n alltimebutton.checked = false;\n alltimebutton.parentNode.classList.remove('active');\n });\n }\n });\n } else {\n // If the time span is set to all time, activate the all time button.\n alltimebutton.forEach(function(button) {\n button.parentNode.classList.add('active');\n button.checked = true;\n button.dispatchEvent(new Event('change'));\n });\n }\n\n // Second step: set the letter filter settings.\n // Per default all checkboxes are checked. If the setting is 0, uncheck the checkbox.\n checkboxes.forEach(function(checkbox) {\n let basiclettercheck = checkbox.id === 'basicletter' && settingsfromdb['basicletter'] === \"\";\n let completionlettercheck = checkbox.id === 'completionletter' && settingsfromdb['completionletter'] === \"0\";\n let postlettercheck = checkbox.id === 'postletter' && settingsfromdb['postletter'] === \"0\";\n\n if (basiclettercheck || completionlettercheck || postlettercheck) {\n checkbox.click();\n }\n });\n}\n\n/**\n * Function to collect the letter filter settings.\n * @returns {{basicletter: number, completionletter: number, postletter: number}}\n */\nfunction collectletterfiltersettings() {\n let settings = {'basicletter': 0, 'completionletter': 0, 'postletter': 0 };\n\n checkboxes.forEach(function(checkbox) {\n if (checkbox.checked) {\n switch(checkbox.id) {\n case \"basicletter\":\n settings['basicletter'] = 1;\n break;\n case \"completionletter\":\n settings['completionletter'] = 1;\n break;\n case \"postletter\":\n settings['postletter'] = 1;\n break;\n\n }\n }\n });\n // Calculate the setting number. It is a number between 0 and 7, and each letter represents a bit.\n return settings;\n}\n\n/**\n * Function to collect the time filter settings.\n * @returns {{timepast: number, timefuture: number}}\n */\nfunction collecttimefiltersettings() {\n let settings = { timepast: 0, timefuture: 0};\n let settingsset = false;\n\n // Get the relevant time spans of the time filter.\n // Check if the alltimebutton is set.\n alltimebutton.forEach(function(button) {\n if (button.parentNode.classList.contains('active')) {\n // Get the timespan.\n settings['timepast'] = convertidtotime(button.id);\n settings['timefuture'] = convertidtotime(button.id);\n settingsset = true;\n }\n });\n\n if (settingsset) {\n return settings;\n }\n\n // If the alltimebutton is not set, check which of the future/past buttons is set.\n futureradiobuttons.forEach(function(button) {\n if (button.parentNode.classList.contains('active')) {\n // Get the timespan.\n settings['timefuture'] = convertidtotime(button.id);\n }\n });\n\n pastradiobuttons.forEach(function(button) {\n if (button.parentNode.classList.contains('active')) {\n // Get the timespan.\n settings['timepast'] = convertidtotime(button.id);\n }\n });\n return settings;\n}\n\n\n/**\n * Function to convert the radio button id to a useable time span.\n * @param {string} id The id of the radio button\n * @returns {number}\n */\nfunction convertidtotime(id) {\n // TODO: Please use global functions if possible.\n switch(id) {\n case \"ts_time_all\":\n return 15778463;\n case \"ts_time_next_twodays\":\n case \"ts_time_last_twodays\":\n return 172800;\n case \"ts_time_next_fivedays\":\n case \"ts_time_last_fivedays\":\n return 432000;\n case \"ts_time_next_week\":\n case \"ts_time_last_week\":\n return 604800;\n case \"ts_time_next_month\":\n case \"ts_time_last_month\":\n return 2592000;\n }\n}\n\n/**\n * Function to convert the time span to a radio button id.\n * @param {string} time\n * @param {boolean} future\n * @returns {string}\n */\nfunction converttimetoid(time, future) {\n switch (time) {\n case \"15778463\":\n return \"ts_time_all\";\n case \"172800\":\n if (future) {\n return \"ts_time_next_twodays\";\n }\n return \"ts_time_past_twodays\";\n case \"432000\":\n if (future) {\n return \"ts_time_next_fivedays\";\n }\n return \"ts_time_last_fivedays\";\n case \"604800\":\n if (future) {\n return \"ts_time_next_week\";\n }\n return \"ts_time_last_week\";\n case \"2592000\":\n if (future) {\n return \"ts_time_next_month\";\n\n }\n return \"ts_time_last_month\";\n }\n}\n"],"names":["obj","userid","settingsfromdb","futurebuttonid","converttimetoid","pastbuttonid","futureradiobuttons","forEach","button","id","parentNode","classList","add","checked","dispatchEvent","Event","alltimebutton","remove","pastradiobuttons","checkboxes","checkbox","basiclettercheck","completionlettercheck","postlettercheck","click","executeusersettings","savebutton","addEventListener","async","timespans","settings","timepast","timefuture","settingsset","contains","convertidtotime","collecttimefiltersettings","letterfilter","basicletter","completionletter","postletter","collectletterfiltersettings","timefilterpast","timefilterfuture","result","data","methodname","args","Ajax","call","el","document","getElementById","style","display","opacity","fadeOutTimer","clearInterval","setTimeout","setInterval","saveusersettings","_ajax","__esModule","default","querySelectorAll","time","future"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"usersettings_save.min.js","sources":["../src/usersettings_save.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Javascript to save the user settings in the database.\n *\n * This file implements 1 functionality:\n * - If the \"save settings\" button is pressed, store the settings in the database.\n *\n * @module block_townsquare/usersettings_save\n * @copyright 2024 Tamaro Walter\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Ajax from 'core/ajax';\n\n// Get the save button for the user settings.\nconst savebutton = document.getElementById('ts_usersettings_savebutton');\n\n// Get the buttons from the time filter.\nconst alltimebutton = document.querySelectorAll('.ts_all_time_button');\nconst futureradiobuttons = document.querySelectorAll('.ts_future_time_button');\nconst pastradiobuttons = document.querySelectorAll('.ts_past_time_button');\n\n// Get the checkboxes from the letter filter.\nconst checkboxes = document.querySelectorAll('.ts_letter_checkbox');\n\n/**\n * Init function\n *\n * @param {number} userid The id of the current user.\n * @param {object} settingsfromdb The settings from the database, if there are any.\n */\nexport function init(userid, settingsfromdb) {\n // When the page is loaded, set the settings from the database.\n if (settingsfromdb) {\n executeusersettings(settingsfromdb);\n }\n\n // Add event listener to the save button.\n\n savebutton.addEventListener('click', async function() {\n\n // First step: collect the current settings.\n // Get the relevant time spans of the time filter and the setting of the letter filter checkboxes.\n let timespans = collecttimefiltersettings();\n let letterfilter = collectletterfiltersettings();\n\n // Second step: store the usersettings in the database.\n saveusersettings(userid, timespans['timepast'], timespans['timefuture'], letterfilter['basicletter'],\n letterfilter['completionletter'], letterfilter['postletter']);\n });\n}\n\n/**\n * Function to save the user settings in the database.\n * @param {number} userid\n * @param {number} timefilterpast\n * @param {number} timefilterfuture\n * @param {number} basicletter\n * @param {number} completionletter\n * @param {number} postletter\n * @returns {Promise<*>}\n */\nfunction saveusersettings(userid, timefilterpast, timefilterfuture, basicletter, completionletter, postletter) {\n let result;\n\n const data = {\n methodname: 'block_townsquare_record_usersettings',\n args: {\n userid: userid,\n timefilterpast: timefilterpast,\n timefilterfuture: timefilterfuture,\n basicletter: basicletter,\n completionletter: completionletter,\n postletter: postletter,\n },\n };\n //console.log(data);\n result = Ajax.call([data]);\n\n //console.log(\"The result [0] object \",result[0]);\n\n // Show a success message.\n let el = document.getElementById('ts_usersettings_successlabel');\n el.style.display = 'block';\n el.style.opacity = 1.0;\n\n // Start a new setInterval timer to gradually fade out the label.\n if (el.fadeOutTimer) {\n clearInterval(el.fadeOutTimer);\n }\n setTimeout(function () {\n el.fadeOutTimer = setInterval(function () {\n if (el.style.opacity > 0.4) {\n el.style.opacity -= 0.1;\n } else if (el.style.opacity > 0) {\n el.style.opacity -= 0.2;\n } else {\n // Once opacity reaches 0, clear the timer and hide the label.\n clearInterval(el.fadeOutTimer);\n el.style.display = 'none';\n }\n }, 100);\n }, 3000);\n return result;\n\n}\n\n/**\n * Function to execute existing user settings when loading the townsquare.\n * @param {Object} settingsfromdb\n */\nfunction executeusersettings(settingsfromdb) {\n\n // First step: set the time filter settings.\n // Change the time into the correct radio button id.\n let futurebuttonid = converttimetoid(settingsfromdb['timefilterfuture'], true);\n let pastbuttonid = converttimetoid(settingsfromdb['timefilterpast'], false);\n\n // If the time span is a combination of past and future, go through the two radio buttons and activate the filter.\n if (futurebuttonid !== \"ts_time_all\") {\n futureradiobuttons.forEach(function(button) {\n if (button.id === futurebuttonid) {\n button.parentNode.classList.add('active');\n button.checked = true;\n button.dispatchEvent(new Event('change'));\n alltimebutton.forEach(function(alltimebutton) {\n alltimebutton.checked = false;\n alltimebutton.parentNode.classList.remove('active');\n });\n }\n });\n pastradiobuttons.forEach(function(button) {\n if (button.id === pastbuttonid) {\n button.parentNode.classList.add('active');\n button.checked = true;\n button.dispatchEvent(new Event('change'));\n alltimebutton.forEach(function(alltimebutton) {\n alltimebutton.checked = false;\n alltimebutton.parentNode.classList.remove('active');\n });\n }\n });\n } else {\n // If the time span is set to all time, activate the all time button.\n alltimebutton.forEach(function(button) {\n button.parentNode.classList.add('active');\n button.checked = true;\n button.dispatchEvent(new Event('change'));\n });\n }\n\n // Second step: set the letter filter settings.\n // Per default all checkboxes are checked. If the setting is 0, uncheck the checkbox.\n checkboxes.forEach(function(checkbox) {\n let basiclettercheck = checkbox.id === 'basicletter' && settingsfromdb['basicletter'] === \"\";\n let completionlettercheck = checkbox.id === 'completionletter' && settingsfromdb['completionletter'] === \"0\";\n let postlettercheck = checkbox.id === 'postletter' && settingsfromdb['postletter'] === \"0\";\n\n if (basiclettercheck || completionlettercheck || postlettercheck) {\n checkbox.click();\n }\n });\n}\n\n/**\n * Function to collect the letter filter settings.\n * @returns {{basicletter: number, completionletter: number, postletter: number}}\n */\nfunction collectletterfiltersettings() {\n let settings = {'basicletter': 0, 'completionletter': 0, 'postletter': 0 };\n\n checkboxes.forEach(function(checkbox) {\n if (checkbox.checked) {\n switch(checkbox.id) {\n case \"basicletter\":\n settings['basicletter'] = 1;\n break;\n case \"completionletter\":\n settings['completionletter'] = 1;\n break;\n case \"postletter\":\n settings['postletter'] = 1;\n break;\n\n }\n }\n });\n // Calculate the setting number. It is a number between 0 and 7, and each letter represents a bit.\n return settings;\n}\n\n/**\n * Function to collect the time filter settings.\n * @returns {{timepast: number, timefuture: number}}\n */\nfunction collecttimefiltersettings() {\n let settings = { timepast: 0, timefuture: 0};\n let settingsset = false;\n\n // Get the relevant time spans of the time filter.\n // Check if the alltimebutton is set.\n alltimebutton.forEach(function(button) {\n if (button.parentNode.classList.contains('active')) {\n // Get the timespan.\n settings['timepast'] = convertidtotime(button.id);\n settings['timefuture'] = convertidtotime(button.id);\n settingsset = true;\n }\n });\n\n if (settingsset) {\n return settings;\n }\n\n // If the alltimebutton is not set, check which of the future/past buttons is set.\n futureradiobuttons.forEach(function(button) {\n if (button.parentNode.classList.contains('active')) {\n // Get the timespan.\n settings['timefuture'] = convertidtotime(button.id);\n }\n });\n\n pastradiobuttons.forEach(function(button) {\n if (button.parentNode.classList.contains('active')) {\n // Get the timespan.\n settings['timepast'] = convertidtotime(button.id);\n }\n });\n return settings;\n}\n\n\n/**\n * Function to convert the radio button id to a useable time span.\n * @param {string} id The id of the radio button\n * @returns {number}\n */\nfunction convertidtotime(id) {\n // TODO: Please use global functions if possible.\n switch(id) {\n case \"ts_time_all\":\n return 15778463;\n case \"ts_time_next_twodays\":\n case \"ts_time_last_twodays\":\n return 172800;\n case \"ts_time_next_fivedays\":\n case \"ts_time_last_fivedays\":\n return 432000;\n case \"ts_time_next_week\":\n case \"ts_time_last_week\":\n return 604800;\n case \"ts_time_next_month\":\n case \"ts_time_last_month\":\n return 2592000;\n }\n}\n\n/**\n * Function to convert the time span to a radio button id.\n * @param {string} time\n * @param {boolean} future\n * @returns {string}\n */\nfunction converttimetoid(time, future) {\n switch (time) {\n case \"15778463\":\n return \"ts_time_all\";\n case \"172800\":\n if (future) {\n return \"ts_time_next_twodays\";\n }\n return \"ts_time_past_twodays\";\n case \"432000\":\n if (future) {\n return \"ts_time_next_fivedays\";\n }\n return \"ts_time_last_fivedays\";\n case \"604800\":\n if (future) {\n return \"ts_time_next_week\";\n }\n return \"ts_time_last_week\";\n case \"2592000\":\n if (future) {\n return \"ts_time_next_month\";\n\n }\n return \"ts_time_last_month\";\n }\n}\n"],"names":["obj","userid","settingsfromdb","futurebuttonid","converttimetoid","pastbuttonid","futureradiobuttons","forEach","button","id","parentNode","classList","add","checked","dispatchEvent","Event","alltimebutton","remove","pastradiobuttons","checkboxes","checkbox","basiclettercheck","completionlettercheck","postlettercheck","click","executeusersettings","savebutton","addEventListener","async","timespans","settings","timepast","timefuture","settingsset","contains","convertidtotime","collecttimefiltersettings","letterfilter","basicletter","completionletter","postletter","collectletterfiltersettings","timefilterpast","timefilterfuture","result","data","methodname","args","Ajax","call","el","document","getElementById","style","display","opacity","fadeOutTimer","clearInterval","setTimeout","setInterval","saveusersettings","_ajax","__esModule","default","querySelectorAll","time","future"],"mappings":"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"} \ No newline at end of file diff --git a/amd/src/usersettings_save.js b/amd/src/usersettings_save.js index 8b1172f..2136743 100644 --- a/amd/src/usersettings_save.js +++ b/amd/src/usersettings_save.js @@ -19,7 +19,7 @@ * This file implements 1 functionality: * - If the "save settings" button is pressed, store the settings in the database. * - * @module block_townsquare/timefilter + * @module block_townsquare/usersettings_save * @copyright 2024 Tamaro Walter * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ @@ -58,7 +58,7 @@ export function init(userid, settingsfromdb) { let letterfilter = collectletterfiltersettings(); // Second step: store the usersettings in the database. - saveusersettings(userid, timespans['timepast'], timespans['timefuture'], letterfilter['basicletter'], + await saveusersettings(userid, timespans['timepast'], timespans['timefuture'], letterfilter['basicletter'], letterfilter['completionletter'], letterfilter['postletter']); }); } @@ -87,11 +87,8 @@ function saveusersettings(userid, timefilterpast, timefilterfuture, basicletter, postletter: postletter, }, }; - //console.log(data); result = Ajax.call([data]); - //console.log("The result [0] object ",result[0]); - // Show a success message. let el = document.getElementById('ts_usersettings_successlabel'); el.style.display = 'block'; diff --git a/externallib.php b/classes/external.php similarity index 78% rename from externallib.php rename to classes/external.php index c95dd55..fc9ed3a 100644 --- a/externallib.php +++ b/classes/external.php @@ -40,7 +40,7 @@ * @copyright 2024 Tamaro Walter * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class block_townsquare_external extends external_api { +class external extends external_api { /** * Returns description of method parameters @@ -81,6 +81,17 @@ public static function record_usersettings_returns(): external_value { public static function record_usersettings($userid, $timefilterpast, $timefilterfuture, $basicletter, $completionletter, $postletter): bool { global $DB; + + // Parameter validation. + $params = self::validate_parameters(self::record_usersettings_parameters(), [ + 'userid' => $userid, + 'timefilterpast' => $timefilterpast, + 'timefilterfuture' => $timefilterfuture, + 'basicletter' => $basicletter, + 'completionletter' => $completionletter, + 'postletter' => $postletter, + ]); + // Check if the user already has a record in the database. if ($records = $DB->get_records('block_townsquare_preferences', ['userid' => $userid])) { // If there more than a record (it only should be only one), delete all of them and insert the new one. @@ -96,24 +107,23 @@ public static function record_usersettings($userid, $timefilterpast, $timefilter } else { // Upgrade the existing record. $record = reset($records); - $record->timefilterpast = $timefilterpast; - $record->timefilterfuture = $timefilterfuture; - $record->basicletter = $basicletter; - $record->completionletter = $completionletter; - $record->postletter = $postletter; + $record->timefilterpast = $params['timefilterpast']; + $record->timefilterfuture = $params['timefilterfuture']; + $record->basicletter = $params['basicletter']; + $record->completionletter = $params['completionletter']; + $record->postletter = $params['postletter']; $DB->update_record('block_townsquare_preferences', $record); return true; } } $record = new stdClass(); - $record->userid = $userid; - $record->timefilterpast = $timefilterpast; - $record->timefilterfuture = $timefilterfuture; - $record->basicletter = $basicletter; - $record->completionletter = $completionletter; - $record->postletter = $postletter; + $record->userid = $params['userid']; + $record->timefilterpast = $params['timefilterpast']; + $record->timefilterfuture = $params['timefilterfuture']; + $record->basicletter = $params['basicletter']; + $record->completionletter = $params['completionletter']; + $record->postletter = $params['postletter']; $DB->insert_record('block_townsquare_preferences', $record); return true; } - } diff --git a/db/services.php b/db/services.php index fbba3b4..87b6096 100644 --- a/db/services.php +++ b/db/services.php @@ -26,11 +26,11 @@ $functions = [ 'block_townsquare_record_usersettings' => [ - 'classname' => 'block_townsquare_external', + 'classname' => 'block_townsquare\external', 'methodname' => 'record_usersettings', - 'classpath' => 'blocks/townsquare/externallib.php', + 'classpath' => 'blocks/townsquare/classes/external.php', 'description' => 'Records the user settings for the townsquare block', - 'type' => 'write', + 'type' => 'read', 'ajax' => true, ], ]; diff --git a/tests/externallib_test.php b/tests/external_test.php similarity index 84% rename from tests/externallib_test.php rename to tests/external_test.php index f360582..b2ed162 100644 --- a/tests/externallib_test.php +++ b/tests/external_test.php @@ -36,13 +36,11 @@ * @copyright 2024 Tamaro Walter * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * - * @covers block_townsquare_external::record_usersettings + * @covers \block_townsquare\external::record_usersettings */ -class externallib_test extends \advanced_testcase { +class external_test extends \advanced_testcase { public function setUp(): void { - global $CFG; - require_once($CFG->dirroot . '/blocks/townsquare/externallib.php'); $this->resetAfterTest(); } @@ -68,10 +66,10 @@ public function test_record_usersettings(): void { $this->assertEquals(false, $record); // Call the function to record the user settings and check, if the record is created. - $result = block_townsquare_external::record_usersettings($usersetting->userid, - $usersetting->timefilterpast, - $usersetting->timefilterfuture, $usersetting->basicletter, - $usersetting->completionletter, $usersetting->postletter); + $result = \block_townsquare\external::record_usersettings($usersetting->userid, + $usersetting->timefilterpast, + $usersetting->timefilterfuture, $usersetting->basicletter, + $usersetting->completionletter, $usersetting->postletter); $this->assertEquals(true, $result); $record = $DB->get_record('block_townsquare_preferences', ['userid' => $usersetting->userid]); @@ -91,9 +89,9 @@ public function test_record_usersettings(): void { $usersetting->postletter = 0; // Call the function to record the user settings and check, if the record is created. - $result = block_townsquare_external::record_usersettings($usersetting->userid, $usersetting->timefilterpast, - $usersetting->timefilterfuture, $usersetting->basicletter, - $usersetting->completionletter, $usersetting->postletter); + $result = \block_townsquare\external::record_usersettings($usersetting->userid, $usersetting->timefilterpast, + $usersetting->timefilterfuture, $usersetting->basicletter, + $usersetting->completionletter, $usersetting->postletter); $this->assertEquals(true, $result); $record = $DB->get_record('block_townsquare_preferences', ['userid' => $usersetting->userid]); diff --git a/version.php b/version.php index bfb54b8..1e19259 100644 --- a/version.php +++ b/version.php @@ -25,6 +25,6 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'block_townsquare'; $plugin->release = '0.1.0'; -$plugin->version = 2024032201; +$plugin->version = 2024051701; $plugin->requires = 2022041900; $plugin->maturity = MATURITY_ALPHA;