From 2389eec39542da147cc747d72764968e271db782 Mon Sep 17 00:00:00 2001 From: Tobias Goltz Date: Fri, 11 Mar 2022 14:47:43 +0100 Subject: [PATCH 1/5] Updated minified js file to fix broken pipeline --- amd/build/mod_form.min.js | 2 +- amd/build/mod_form.min.js.map | 2 +- version.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/amd/build/mod_form.min.js b/amd/build/mod_form.min.js index aed9d79..94ed465 100644 --- a/amd/build/mod_form.min.js +++ b/amd/build/mod_form.min.js @@ -1,3 +1,3 @@ -define("mod_mumie/mod_form",["jquery","core/templates","core/modal_factory","auth_mumie/mumie_server_config","core/ajax"],(function(){var lmsSelectorUrl,systemLanguage,serverStructure,serverDropDown,languageElem,propertySelectionInputs,selectedTaskProperties,selectedTaskProp,taskSelectionInputs,selectedTasks,selectedTaskIds,sectionInputs,addServerButton=document.getElementById("id_add_server_button"),missingConfig=document.getElementsByName("mumie_missing_config")[0],serverController=(serverDropDown=document.getElementById("id_server"),{init:function(structure){serverStructure=structure},getSelectedServer:function(){var selectedServerName=serverDropDown.options[serverDropDown.selectedIndex].text;return serverStructure.find((function(server){return server.name===selectedServerName}))},disable:function(){serverDropDown.disabled=!0,function(elem){for(;elem.firstChild;)elem.removeChild(elem.firstChild)}(serverDropDown)},getAllServers:function(){return serverStructure}}),problemSelectorController=function(){var problemSelectorWindow,problemSelectorButton=document.getElementById("id_prb_selector_btn"),mumieOrg=document.getElementsByName("mumie_org")[0].value;function sendResponse(response){problemSelectorWindow&&problemSelectorWindow.postMessage(JSON.stringify(response),lmsSelectorUrl)}function sendSuccess(){var message=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";sendResponse({success:!0,message:message})}function addMessageListener(){window.addEventListener("message",(function(event){if(event.origin===lmsSelectorUrl){var importObj=JSON.parse(event.data),isGraded=!1!==importObj.isGraded;try{courseController.setCourse(importObj.path_to_coursefile),langController.setLanguage(importObj.language),taskController.setSelection(importObj.link+"?lang="+importObj.language),taskController.setIsGraded(isGraded),sendSuccess(),window.focus(),require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:"mumie_form_updated_selection",component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0],type:"info"})})).fail(notification.exception)}))}catch(error){!function(){sendResponse({success:!1,message:arguments.length>0&&void 0!==arguments[0]?arguments[0]:""})}(error.message)}}}),!1)}return{init:function(){var gradingType=taskController.getGradingType();problemSelectorButton.onclick=function(){problemSelectorWindow=window.open(lmsSelectorUrl+"/lms-problem-selector?org="+mumieOrg+"&serverUrl="+encodeURIComponent(serverController.getSelectedServer().urlprefix)+"&problemLang="+langController.getSelectedLanguage()+"&origin="+encodeURIComponent(window.location.origin)+"&uiLang="+systemLanguage+"&gradingType="+gradingType+"&multiCourse=true","_blank")},window.onclose=function(){sendSuccess()},window.addEventListener("beforeunload",(function(){sendSuccess()}),!1),addMessageListener()},disable:function(){problemSelectorButton.disabled=!0}}}(),courseController=function(){var courseNameElem=document.getElementById("id_mumie_course"),coursefileElem=document.getElementsByName("mumie_coursefile")[0];function _updateCourseName(){var _selectedCourse$name$,selectedCourse=courseController.getSelectedCourse(),selectedLanguage=langController.getSelectedLanguage();selectedCourse&&selectedLanguage&&(courseNameElem.value=null===(_selectedCourse$name$=selectedCourse.name.find((function(translation){return translation.language===selectedLanguage})))||void 0===_selectedCourse$name$?void 0:_selectedCourse$name$.value)}return{init:function(){_updateCourseName()},getSelectedCourse:function(){return serverController.getSelectedServer().courses.find((function(course){return course.coursefile===coursefileElem.value}))},updateCourseName:function(){_updateCourseName()},setCourse:function(courseFile){var coursefile;coursefile=courseFile,coursefileElem.value=coursefile,_updateCourseName()}}}(),langController=(languageElem=document.getElementById("id_language"),{getSelectedLanguage:function(){return languageElem.value},setLanguage:function(lang){if(!function(lang){return courseController.getSelectedCourse().languages.includes(lang)}(lang))throw new Error("Selected language not available");languageElem.value=lang,courseController.updateCourseName()}}),taskController=function(){var taskSelectionInput=document.getElementsByName("taskurl")[0],nameElem=document.getElementById("id_name"),taskDisplayElement=document.getElementById("id_task_display_element"),isGradedElem=document.getElementById("id_mumie_isgraded");function updateName(){var newHeadline=function(task){if(!task)return null;var selectedLanguage=langController.getSelectedLanguage(),headlineWrapper=task.headline.find((function(localHeadline){return localHeadline.language===selectedLanguage}));return headlineWrapper?headlineWrapper.name:null}(taskController.getSelectedTask());(function(){if(0===nameElem.value.length)return!1;return!serverController.getAllServers().flatMap((function(server){return server.courses})).flatMap((function(course){return course.tasks})).flatMap((function(task){return task.headline})).map((function(headline){return headline.name})).concat(courseController.getSelectedCourse().name.map((function(n){return n.value}))).includes(nameElem.value)})()||(nameElem.value=newHeadline),taskDisplayElement.value=newHeadline}function getLocalizedLinkFromTask(task){return task.link+"?lang="+langController.getSelectedLanguage()}return{init:function(){updateName()},getSelectedTask:function(){var selectedLink=taskSelectionInput.value,selectedCourse=courseController.getSelectedCourse();if(!selectedCourse)return null;var tasks=selectedCourse.tasks.slice();return tasks.push(function(course){var headline=[];for(var i in course.name){var name=course.name[i];headline.push({name:name.value,language:name.language})}return{link:course.link,headline:headline}}(selectedCourse)),tasks.find((function(task){return getLocalizedLinkFromTask(task)===selectedLink}))},setSelection:function(newSelection){taskSelectionInput.value=newSelection,updateName()},setIsGraded:function(isGraded){var disabled;null===isGraded&&(isGradedElem.value=null),isGradedElem.value=isGraded?"1":"0",disabled="0"===isGradedElem.value,document.getElementById("id_points").disabled=disabled,document.getElementById("id_gradepass").disabled=disabled,document.getElementById("id_duedate_enabled").disabled=disabled,document.getElementById("id_gradecat").disabled=disabled},getGradingType:function(){var isGraded=isGradedElem.value;return"1"===isGraded?"graded":"0"===isGraded?"ungraded":"all"}}}(),multiTaskEditController=(propertySelectionInputs=document.getElementsByName("mumie_multi_edit_property"),selectedTaskProperties=document.getElementsByName("mumie_selected_task_properties")[0],selectedTaskProp=[],taskSelectionInputs=document.getElementsByName("mumie_multi_edit_task"),selectedTasks=document.getElementsByName("mumie_selected_tasks")[0],selectedTaskIds=[],sectionInputs=document.getElementsByName("mumie_multi_edit_section"),{init:function(){taskSelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskIds.push(checkbox.value):selectedTaskIds=selectedTaskIds.filter((function(elem){return elem!==checkbox.value})),selectedTasks.value=JSON.stringify(selectedTaskIds)}})),propertySelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskProp.push(checkbox.value):selectedTaskProp=selectedTaskProp.filter((function(elem){return elem!==checkbox.value})),selectedTaskProperties.value=JSON.stringify(selectedTaskProp)}})),sectionInputs.forEach((function(sectionCheckbox){sectionCheckbox.onchange=function(){sectionCheckbox.checked?taskSelectionInputs.forEach((function(taskCheckbox){var array,element;taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!0,array=selectedTaskIds,element=taskCheckbox.value,array.includes(element)||array.push(element))})):taskSelectionInputs.forEach((function(taskCheckbox){taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!1,selectedTaskIds=selectedTaskIds.filter((function(elem){return taskCheckbox.value!==elem})))})),selectedTasks.value=JSON.stringify(selectedTaskIds)}}))}});function disableDropDownMenus(errorKey){require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:errorKey,component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0]+""+missingConfig.getAttribute("value")+"",type:"problem"})})).fail(notification.exception)})),serverController.disable(),problemSelectorController.disable()}return{init:function(contextid,prbSelectorUrl,lang){lmsSelectorUrl=prbSelectorUrl,systemLanguage=lang;var isEdit=document.getElementById("id_name").getAttribute("value"),serverStructure=JSON.parse(document.getElementsByName("mumie_server_structure")[0].value);isEdit&&""!==document.getElementsByName("mumie_missing_config")[0].getAttribute("value")?disableDropDownMenus("mumie_form_missing_server"):serverStructure.length?(serverController.init(serverStructure),courseController.init(),taskController.init(isEdit),multiTaskEditController.init(),problemSelectorController.init()):disableDropDownMenus("mumie_form_no_server_conf"),multiTaskEditController.init(),addServerButton&&require(["auth_mumie/mumie_server_config"],(function(MumieServer){MumieServer.init(addServerButton,contextid)}))}}})); +define("mod_mumie/mod_form",["jquery","core/templates","core/modal_factory","auth_mumie/mumie_server_config","core/ajax"],(function(){const addServerButton=document.getElementById("id_add_server_button"),missingConfig=document.getElementsByName("mumie_missing_config")[0];let lmsSelectorUrl,systemLanguage;const serverController=function(){let serverStructure;const serverDropDown=document.getElementById("id_server");return{init:function(structure){serverStructure=structure},getSelectedServer:function(){const selectedServerName=serverDropDown.options[serverDropDown.selectedIndex].text;return serverStructure.find((server=>server.name===selectedServerName))},disable:function(){serverDropDown.disabled=!0,function(elem){for(;elem.firstChild;)elem.removeChild(elem.firstChild)}(serverDropDown)},getAllServers:function(){return serverStructure}}}(),problemSelectorController=function(){const problemSelectorButton=document.getElementById("id_prb_selector_btn");let problemSelectorWindow;const mumieOrg=document.getElementsByName("mumie_org")[0].value;function sendResponse(response){problemSelectorWindow&&problemSelectorWindow.postMessage(JSON.stringify(response),lmsSelectorUrl)}function sendSuccess(){let message=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";sendResponse({success:!0,message:message})}function addMessageListener(){window.addEventListener("message",(event=>{if(event.origin!==lmsSelectorUrl)return;const importObj=JSON.parse(event.data),isGraded=!1!==importObj.isGraded;try{courseController.setCourse(importObj.path_to_coursefile),langController.setLanguage(importObj.language),taskController.setSelection(importObj.link+"?lang="+importObj.language),taskController.setIsGraded(isGraded),sendSuccess(),window.focus(),require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:"mumie_form_updated_selection",component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0],type:"info"})})).fail(notification.exception)}))}catch(error){!function(){sendResponse({success:!1,message:arguments.length>0&&void 0!==arguments[0]?arguments[0]:""})}(error.message)}}),!1)}return{init:function(){const gradingType=taskController.getGradingType();problemSelectorButton.onclick=function(){problemSelectorWindow=window.open(lmsSelectorUrl+"/lms-problem-selector?org="+mumieOrg+"&serverUrl="+encodeURIComponent(serverController.getSelectedServer().urlprefix)+"&problemLang="+langController.getSelectedLanguage()+"&origin="+encodeURIComponent(window.location.origin)+"&uiLang="+systemLanguage+"&gradingType="+gradingType+"&multiCourse=true","_blank")},window.onclose=function(){sendSuccess()},window.addEventListener("beforeunload",(function(){sendSuccess()}),!1),addMessageListener()},disable:function(){problemSelectorButton.disabled=!0}}}(),courseController=function(){const courseNameElem=document.getElementById("id_mumie_course"),coursefileElem=document.getElementsByName("mumie_coursefile")[0];function updateCourseName(){var _selectedCourse$name$;const selectedCourse=courseController.getSelectedCourse(),selectedLanguage=langController.getSelectedLanguage();selectedCourse&&selectedLanguage&&(courseNameElem.value=null===(_selectedCourse$name$=selectedCourse.name.find((translation=>translation.language===selectedLanguage)))||void 0===_selectedCourse$name$?void 0:_selectedCourse$name$.value)}return{init:function(){updateCourseName()},getSelectedCourse:function(){return serverController.getSelectedServer().courses.find((course=>course.coursefile===coursefileElem.value))},updateCourseName:function(){updateCourseName()},setCourse:function(courseFile){var coursefile;coursefile=courseFile,coursefileElem.value=coursefile,updateCourseName()}}}(),langController=function(){const languageElem=document.getElementById("id_language");return{getSelectedLanguage:function(){return languageElem.value},setLanguage:function(lang){if(!function(lang){return courseController.getSelectedCourse().languages.includes(lang)}(lang))throw new Error("Selected language not available");languageElem.value=lang,courseController.updateCourseName()}}}(),taskController=function(){const taskSelectionInput=document.getElementsByName("taskurl")[0],nameElem=document.getElementById("id_name"),taskDisplayElement=document.getElementById("id_task_display_element"),isGradedElem=document.getElementById("id_mumie_isgraded");function updateName(){const newHeadline=function(task){if(!task)return null;const selectedLanguage=langController.getSelectedLanguage(),headlineWrapper=task.headline.find((localHeadline=>localHeadline.language===selectedLanguage));return headlineWrapper?headlineWrapper.name:null}(taskController.getSelectedTask());(function(){if(0===nameElem.value.length)return!1;return!serverController.getAllServers().flatMap((server=>server.courses)).flatMap((course=>course.tasks)).flatMap((task=>task.headline)).map((headline=>headline.name)).concat(courseController.getSelectedCourse().name.map((n=>n.value))).includes(nameElem.value)})()||(nameElem.value=newHeadline),taskDisplayElement.value=newHeadline}function getLocalizedLinkFromTask(task){return task.link+"?lang="+langController.getSelectedLanguage()}return{init:function(){updateName()},getSelectedTask:function(){const selectedLink=taskSelectionInput.value,selectedCourse=courseController.getSelectedCourse();if(!selectedCourse)return null;const tasks=selectedCourse.tasks.slice();return tasks.push(function(course){var headline=[];for(var i in course.name){var name=course.name[i];headline.push({name:name.value,language:name.language})}return{link:course.link,headline:headline}}(selectedCourse)),tasks.find((task=>getLocalizedLinkFromTask(task)===selectedLink))},setSelection:function(newSelection){taskSelectionInput.value=newSelection,updateName()},setIsGraded:function(isGraded){null===isGraded&&(isGradedElem.value=null),isGradedElem.value=isGraded?"1":"0",function(){const disabled="0"===isGradedElem.value;document.getElementById("id_points").disabled=disabled,document.getElementById("id_gradepass").disabled=disabled,document.getElementById("id_duedate_enabled").disabled=disabled,document.getElementById("id_gradecat").disabled=disabled}()},getGradingType:function(){const isGraded=isGradedElem.value;return"1"===isGraded?"graded":"0"===isGraded?"ungraded":"all"}}}(),multiTaskEditController=function(){const propertySelectionInputs=document.getElementsByName("mumie_multi_edit_property"),selectedTaskProperties=document.getElementsByName("mumie_selected_task_properties")[0];let selectedTaskProp=[];const taskSelectionInputs=document.getElementsByName("mumie_multi_edit_task"),selectedTasks=document.getElementsByName("mumie_selected_tasks")[0];let selectedTaskIds=[];const sectionInputs=document.getElementsByName("mumie_multi_edit_section");return{init:function(){taskSelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskIds.push(checkbox.value):selectedTaskIds=selectedTaskIds.filter((elem=>elem!==checkbox.value)),selectedTasks.value=JSON.stringify(selectedTaskIds)}})),propertySelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskProp.push(checkbox.value):selectedTaskProp=selectedTaskProp.filter((elem=>elem!==checkbox.value)),selectedTaskProperties.value=JSON.stringify(selectedTaskProp)}})),sectionInputs.forEach((function(sectionCheckbox){sectionCheckbox.onchange=function(){sectionCheckbox.checked?taskSelectionInputs.forEach((function(taskCheckbox){var array,element;taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!0,array=selectedTaskIds,element=taskCheckbox.value,array.includes(element)||array.push(element))})):taskSelectionInputs.forEach((function(taskCheckbox){taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!1,selectedTaskIds=selectedTaskIds.filter((elem=>taskCheckbox.value!==elem)))})),selectedTasks.value=JSON.stringify(selectedTaskIds)}}))}}}();function disableDropDownMenus(errorKey){require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:errorKey,component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0]+""+missingConfig.getAttribute("value")+"",type:"problem"})})).fail(notification.exception)})),serverController.disable(),problemSelectorController.disable()}return{init:function(contextid,prbSelectorUrl,lang){lmsSelectorUrl=prbSelectorUrl,systemLanguage=lang;const isEdit=document.getElementById("id_name").getAttribute("value"),serverStructure=JSON.parse(document.getElementsByName("mumie_server_structure")[0].value);isEdit&&""!==document.getElementsByName("mumie_missing_config")[0].getAttribute("value")?disableDropDownMenus("mumie_form_missing_server"):serverStructure.length?(serverController.init(serverStructure),courseController.init(),taskController.init(isEdit),multiTaskEditController.init(),problemSelectorController.init()):disableDropDownMenus("mumie_form_no_server_conf"),multiTaskEditController.init(),addServerButton&&require(["auth_mumie/mumie_server_config"],(function(MumieServer){MumieServer.init(addServerButton,contextid)}))}}})); //# sourceMappingURL=mod_form.min.js.map \ No newline at end of file diff --git a/amd/build/mod_form.min.js.map b/amd/build/mod_form.min.js.map index 6848302..add6d4f 100644 --- a/amd/build/mod_form.min.js.map +++ b/amd/build/mod_form.min.js.map @@ -1 +1 @@ -{"version":3,"file":"mod_form.min.js","sources":["../src/mod_form.js"],"sourcesContent":["define(['jquery', 'core/templates', 'core/modal_factory', 'auth_mumie/mumie_server_config', 'core/ajax'],\n function() {\n const addServerButton = document.getElementById(\"id_add_server_button\");\n const missingConfig = document.getElementsByName(\"mumie_missing_config\")[0];\n let lmsSelectorUrl;\n let systemLanguage;\n const serverController = (function() {\n let serverStructure;\n const serverDropDown = document.getElementById(\"id_server\");\n\n return {\n init: function(structure) {\n serverStructure = structure;\n },\n getSelectedServer: function() {\n const selectedServerName = serverDropDown.options[serverDropDown.selectedIndex].text;\n return serverStructure.find(server => server.name === selectedServerName);\n },\n disable: function() {\n serverDropDown.disabled = true;\n removeChildElems(serverDropDown);\n },\n getAllServers: function() {\n return serverStructure;\n }\n };\n })();\n\n const problemSelectorController = (function() {\n const problemSelectorButton = document.getElementById('id_prb_selector_btn');\n let problemSelectorWindow;\n const mumieOrg = document.getElementsByName('mumie_org')[0].value;\n\n /**\n * Send a message to the problem selector window.\n *\n * Don't do anything, if there is no problem selector window.\n * @param {Object} response\n */\n function sendResponse(response) {\n if (!problemSelectorWindow) {\n return;\n }\n problemSelectorWindow.postMessage(JSON.stringify(response), lmsSelectorUrl);\n }\n\n /**\n * Send a success message to problem selector window\n * @param {string} message\n */\n function sendSuccess(message = '') {\n sendResponse({\n success: true,\n message: message\n });\n }\n\n /**\n * Send a failure message to problem selector window\n * @param {string} message\n */\n function sendFailure(message = '') {\n sendResponse({\n success: false,\n message: message\n });\n }\n\n /**\n * Add an event listener that accepts messages from LMS-Browser and updates the selected problem.\n */\n function addMessageListener() {\n window.addEventListener('message', (event) => {\n if (event.origin !== lmsSelectorUrl) {\n return;\n }\n const importObj = JSON.parse(event.data);\n const isGraded = importObj.isGraded !== false;\n try {\n courseController.setCourse(importObj.path_to_coursefile);\n langController.setLanguage(importObj.language);\n taskController.setSelection(importObj.link + '?lang=' + importObj.language);\n taskController.setIsGraded(isGraded);\n sendSuccess();\n window.focus();\n displayProblemSelectedMessage();\n } catch (error) {\n sendFailure(error.message);\n }\n }, false);\n }\n\n /**\n * Display a success message in Moodle that a problem was successfully selected.\n */\n function displayProblemSelectedMessage() {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': 'mumie_form_updated_selection',\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0],\n type: \"info\"\n });\n }).fail(notification.exception);\n });\n }\n\n return {\n init: function() {\n const gradingType = taskController.getGradingType();\n problemSelectorButton.onclick = function() {\n problemSelectorWindow = window.open(\n lmsSelectorUrl\n + '/lms-problem-selector?'\n + 'org='\n + mumieOrg\n + '&serverUrl='\n + encodeURIComponent(serverController.getSelectedServer().urlprefix)\n + '&problemLang='\n + langController.getSelectedLanguage()\n + '&origin=' + encodeURIComponent(window.location.origin)\n + '&uiLang=' + systemLanguage\n + '&gradingType=' + gradingType\n + '&multiCourse=true'\n , '_blank'\n );\n };\n\n window.onclose = function() {\n sendSuccess();\n };\n\n window.addEventListener(\"beforeunload\", function() {\n sendSuccess();\n }, false);\n\n addMessageListener();\n },\n disable: function() {\n problemSelectorButton.disabled = true;\n }\n };\n })();\n\n const courseController = (function() {\n const courseNameElem = document.getElementById(\"id_mumie_course\");\n const coursefileElem = document.getElementsByName(\"mumie_coursefile\")[0];\n\n\n /**\n * Update the hidden input field with the selected course's course file path\n *\n * @param {string} coursefile\n */\n function updateCoursefilePath(coursefile) {\n coursefileElem.value = coursefile;\n updateCourseName();\n }\n\n /**\n * Update displayed course name.\n */\n function updateCourseName() {\n const selectedCourse = courseController.getSelectedCourse();\n const selectedLanguage = langController.getSelectedLanguage();\n if (!selectedCourse || !selectedLanguage) {\n return;\n }\n courseNameElem.value = selectedCourse.name\n .find(translation => translation.language === selectedLanguage)?.value;\n }\n\n return {\n init: function() {\n updateCourseName();\n },\n getSelectedCourse: function() {\n const courses = serverController.getSelectedServer().courses;\n return courses.find(course => course.coursefile === coursefileElem.value);\n },\n updateCourseName: function() {\n updateCourseName();\n },\n setCourse: function(courseFile) {\n updateCoursefilePath(courseFile);\n }\n };\n })();\n\n const langController = (function() {\n const languageElem = document.getElementById(\"id_language\");\n\n /**\n * Check if the given language exists in the currently selected course.\n * @param {string} lang\n * @returns {boolean} Whether the language exists\n */\n function languageExists(lang) {\n return courseController.getSelectedCourse().languages.includes(lang);\n }\n return {\n getSelectedLanguage: function() {\n return languageElem.value;\n },\n setLanguage: function(lang) {\n if (!languageExists(lang)) {\n throw new Error(\"Selected language not available\");\n }\n languageElem.value = lang;\n courseController.updateCourseName();\n }\n };\n })();\n\n const taskController = (function() {\n const taskSelectionInput = document.getElementsByName(\"taskurl\")[0];\n const nameElem = document.getElementById(\"id_name\");\n const taskDisplayElement = document.getElementById(\"id_task_display_element\");\n const isGradedElem = document.getElementById('id_mumie_isgraded');\n\n\n /**\n * Update the activity's name in the input field\n */\n function updateName() {\n const newHeadline = getHeadline(taskController.getSelectedTask());\n if (!isCustomName()) {\n nameElem.value = newHeadline;\n }\n taskDisplayElement.value = newHeadline;\n }\n\n /**\n * Check whether the activity has a custom name\n *\n * @return {boolean} True, if there is no headline with that name in all tasks\n */\n function isCustomName() {\n if (nameElem.value.length === 0) {\n return false;\n }\n return !getAllHeadlines().includes(nameElem.value);\n }\n\n /**\n * Get the task's headline for the currently selected language\n * @param {Object} task\n * @returns {string|null} the headline\n */\n function getHeadline(task) {\n if (!task) {\n return null;\n }\n const selectedLanguage = langController.getSelectedLanguage();\n const headlineWrapper = task.headline.find(localHeadline => localHeadline.language === selectedLanguage);\n return headlineWrapper ? headlineWrapper.name : null;\n }\n\n /**\n * Get all tasks that are available on all servers\n *\n * @return {Object} Array containing all available tasks\n */\n function getAllTasks() {\n return serverController.getAllServers()\n .flatMap(server => server.courses)\n .flatMap(course => course.tasks);\n }\n\n /**\n * Get all possible headlines in all languages\n * @returns {Object} Array containing all headlines\n */\n function getAllHeadlines() {\n return getAllTasks().flatMap(task => task.headline)\n .map(headline => headline.name)\n .concat(courseController.getSelectedCourse().name.map(n => n.value));\n }\n\n /**\n * Add language parameter to the task's link to display content in the selected language\n * @param {Object} task\n * @returns {string}\n */\n function getLocalizedLinkFromTask(task) {\n return getLocalizedLink(task.link);\n }\n\n /**\n * Add language parameter to link\n * @param {string} link\n * @returns {string}\n */\n function getLocalizedLink(link) {\n return link + \"?lang=\" + langController.getSelectedLanguage();\n }\n\n /**\n * Form inputs related to grades should be disabled, if the MUMIE Task is not graded.\n */\n function updateGradeEditability() {\n const disabled = isGradedElem.value === '0';\n document.getElementById('id_points').disabled = disabled;\n document.getElementById('id_gradepass').disabled = disabled;\n document.getElementById('id_duedate_enabled').disabled = disabled;\n document.getElementById('id_gradecat').disabled = disabled;\n }\n\n /**\n * Get a task that links to a course's overview page\n * @param {Object} course\n * @returns {Object} task\n */\n function getPseudoTaskFromCourse(course) {\n var headline = [];\n for (var i in course.name) {\n var name = course.name[i];\n headline.push({\n \"name\": name.value,\n \"language\": name.language\n });\n }\n return {\n \"link\": course.link,\n \"headline\": headline\n };\n }\n\n return {\n init: function() {\n updateName();\n },\n getSelectedTask: function() {\n const selectedLink = taskSelectionInput.value;\n const selectedCourse = courseController.getSelectedCourse();\n if (!selectedCourse) {\n return null;\n }\n const tasks = selectedCourse\n .tasks\n .slice();\n tasks.push(getPseudoTaskFromCourse(selectedCourse));\n return tasks\n .find(task => getLocalizedLinkFromTask(task) === selectedLink);\n },\n setSelection: function(newSelection) {\n taskSelectionInput.value = newSelection;\n updateName();\n },\n setIsGraded: function(isGraded) {\n if (isGraded === null) {\n isGradedElem.value = null;\n }\n isGradedElem.value = isGraded ? '1' : '0';\n updateGradeEditability();\n },\n getGradingType: function() {\n const isGraded = isGradedElem.value;\n if (isGraded === '1') {\n return 'graded';\n } else if (isGraded === '0') {\n return 'ungraded';\n }\n return 'all';\n }\n };\n })();\n\n\n const multiTaskEditController = (function() {\n const propertySelectionInputs = document.getElementsByName(\"mumie_multi_edit_property\");\n const selectedTaskProperties = document.getElementsByName(\"mumie_selected_task_properties\")[0];\n let selectedTaskProp = [];\n const taskSelectionInputs = document.getElementsByName(\"mumie_multi_edit_task\");\n const selectedTasks = document.getElementsByName(\"mumie_selected_tasks\")[0];\n let selectedTaskIds = [];\n const sectionInputs = document.getElementsByName(\"mumie_multi_edit_section\");\n\n /**\n * Push an element to an array, if it's not already included.\n *\n * @param {string[]} array\n * @param {string} element\n */\n function pushIfNotExists(array, element) {\n if (!array.includes(element)) {\n array.push(element);\n }\n }\n\n /**\n * Set selection listeners for other MUMIE Tasks in the course.\n */\n function setTaskSelectionListeners() {\n taskSelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskIds = selectedTaskIds.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskIds.push(checkbox.value);\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n /**\n * Set selection listeners for properties to apply to MUMIE Tasks in the course.\n */\n function setPropertySelectionListeners() {\n propertySelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskProp = selectedTaskProp.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskProp.push(checkbox.value);\n }\n selectedTaskProperties.value = JSON.stringify(selectedTaskProp);\n };\n });\n }\n\n /**\n * Set selection listeners for entire section of MUMIE Tasks in the course\n */\n function setSectionSelectionListeners() {\n sectionInputs.forEach(function(sectionCheckbox) {\n sectionCheckbox.onchange = function() {\n if (!sectionCheckbox.checked) {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = false;\n selectedTaskIds = selectedTaskIds.filter(elem => taskCheckbox.value !== elem);\n }\n });\n } else {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = true;\n pushIfNotExists(selectedTaskIds, taskCheckbox.value);\n }\n });\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n return {\n init: function() {\n setTaskSelectionListeners();\n setPropertySelectionListeners();\n setSectionSelectionListeners();\n },\n };\n })();\n\n /**\n * Disable all dropdown menus and show notification\n * @param {string} errorKey\n */\n function disableDropDownMenus(errorKey) {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': errorKey,\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0] + \"\" + missingConfig.getAttribute(\"value\") + \"\",\n type: \"problem\"\n });\n }).fail(notification.exception);\n });\n serverController.disable();\n problemSelectorController.disable();\n }\n\n return {\n init: function(contextid, prbSelectorUrl, lang) {\n lmsSelectorUrl = prbSelectorUrl;\n systemLanguage = lang;\n const isEdit = document.getElementById(\"id_name\").getAttribute('value');\n const serverStructure = JSON.parse(document.getElementsByName('mumie_server_structure')[0].value);\n if (isEdit && !serverConfigExists()) {\n disableDropDownMenus('mumie_form_missing_server');\n } else if (!serverStructure.length) {\n disableDropDownMenus('mumie_form_no_server_conf');\n } else {\n serverController.init(serverStructure);\n courseController.init();\n taskController.init(isEdit);\n multiTaskEditController.init();\n problemSelectorController.init();\n }\n multiTaskEditController.init();\n if (addServerButton) {\n require(['auth_mumie/mumie_server_config'], function(MumieServer) {\n MumieServer.init(addServerButton, contextid);\n });\n }\n }\n };\n\n /**\n * Remove all child elements of a given html element\n * @param {Object} elem\n */\n function removeChildElems(elem) {\n while (elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n }\n\n /**\n * Check, if the flag for an existing config is set\n * @returns {boolean}\n */\n function serverConfigExists() {\n return document.getElementsByName(\"mumie_missing_config\")[0].getAttribute(\"value\") === \"\";\n }\n });\n"],"names":["define","lmsSelectorUrl","systemLanguage","serverStructure","serverDropDown","languageElem","propertySelectionInputs","selectedTaskProperties","selectedTaskProp","taskSelectionInputs","selectedTasks","selectedTaskIds","sectionInputs","addServerButton","document","getElementById","missingConfig","getElementsByName","serverController","init","structure","getSelectedServer","selectedServerName","options","selectedIndex","text","find","server","name","disable","disabled","elem","firstChild","removeChild","removeChildElems","getAllServers","problemSelectorController","problemSelectorWindow","problemSelectorButton","mumieOrg","value","sendResponse","response","postMessage","JSON","stringify","sendSuccess","message","success","addMessageListener","window","addEventListener","event","origin","importObj","parse","data","isGraded","courseController","setCourse","path_to_coursefile","langController","setLanguage","language","taskController","setSelection","link","setIsGraded","focus","require","str","notification","get_strings","component","done","s","addNotification","type","fail","exception","error","sendFailure","gradingType","getGradingType","onclick","open","encodeURIComponent","urlprefix","getSelectedLanguage","location","onclose","courseNameElem","coursefileElem","updateCourseName","selectedCourse","getSelectedCourse","selectedLanguage","translation","_selectedCourse$name$","courses","course","coursefile","courseFile","lang","languages","includes","languageExists","Error","taskSelectionInput","nameElem","taskDisplayElement","isGradedElem","updateName","newHeadline","task","headlineWrapper","headline","localHeadline","getHeadline","getSelectedTask","length","flatMap","tasks","map","concat","n","isCustomName","getLocalizedLinkFromTask","selectedLink","slice","push","i","getPseudoTaskFromCourse","newSelection","multiTaskEditController","forEach","checkbox","onchange","checked","filter","sectionCheckbox","taskCheckbox","array","element","getAttribute","disableDropDownMenus","errorKey","contextid","prbSelectorUrl","isEdit","MumieServer"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"mod_form.min.js","sources":["../src/mod_form.js"],"sourcesContent":["define(['jquery', 'core/templates', 'core/modal_factory', 'auth_mumie/mumie_server_config', 'core/ajax'],\n function() {\n const addServerButton = document.getElementById(\"id_add_server_button\");\n const missingConfig = document.getElementsByName(\"mumie_missing_config\")[0];\n let lmsSelectorUrl;\n let systemLanguage;\n const serverController = (function() {\n let serverStructure;\n const serverDropDown = document.getElementById(\"id_server\");\n\n return {\n init: function(structure) {\n serverStructure = structure;\n },\n getSelectedServer: function() {\n const selectedServerName = serverDropDown.options[serverDropDown.selectedIndex].text;\n return serverStructure.find(server => server.name === selectedServerName);\n },\n disable: function() {\n serverDropDown.disabled = true;\n removeChildElems(serverDropDown);\n },\n getAllServers: function() {\n return serverStructure;\n }\n };\n })();\n\n const problemSelectorController = (function() {\n const problemSelectorButton = document.getElementById('id_prb_selector_btn');\n let problemSelectorWindow;\n const mumieOrg = document.getElementsByName('mumie_org')[0].value;\n\n /**\n * Send a message to the problem selector window.\n *\n * Don't do anything, if there is no problem selector window.\n * @param {Object} response\n */\n function sendResponse(response) {\n if (!problemSelectorWindow) {\n return;\n }\n problemSelectorWindow.postMessage(JSON.stringify(response), lmsSelectorUrl);\n }\n\n /**\n * Send a success message to problem selector window\n * @param {string} message\n */\n function sendSuccess(message = '') {\n sendResponse({\n success: true,\n message: message\n });\n }\n\n /**\n * Send a failure message to problem selector window\n * @param {string} message\n */\n function sendFailure(message = '') {\n sendResponse({\n success: false,\n message: message\n });\n }\n\n /**\n * Add an event listener that accepts messages from LMS-Browser and updates the selected problem.\n */\n function addMessageListener() {\n window.addEventListener('message', (event) => {\n if (event.origin !== lmsSelectorUrl) {\n return;\n }\n const importObj = JSON.parse(event.data);\n const isGraded = importObj.isGraded !== false;\n try {\n courseController.setCourse(importObj.path_to_coursefile);\n langController.setLanguage(importObj.language);\n taskController.setSelection(importObj.link + '?lang=' + importObj.language);\n taskController.setIsGraded(isGraded);\n sendSuccess();\n window.focus();\n displayProblemSelectedMessage();\n } catch (error) {\n sendFailure(error.message);\n }\n }, false);\n }\n\n /**\n * Display a success message in Moodle that a problem was successfully selected.\n */\n function displayProblemSelectedMessage() {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': 'mumie_form_updated_selection',\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0],\n type: \"info\"\n });\n }).fail(notification.exception);\n });\n }\n\n return {\n init: function() {\n const gradingType = taskController.getGradingType();\n problemSelectorButton.onclick = function() {\n problemSelectorWindow = window.open(\n lmsSelectorUrl\n + '/lms-problem-selector?'\n + 'org='\n + mumieOrg\n + '&serverUrl='\n + encodeURIComponent(serverController.getSelectedServer().urlprefix)\n + '&problemLang='\n + langController.getSelectedLanguage()\n + '&origin=' + encodeURIComponent(window.location.origin)\n + '&uiLang=' + systemLanguage\n + '&gradingType=' + gradingType\n + '&multiCourse=true'\n , '_blank'\n );\n };\n\n window.onclose = function() {\n sendSuccess();\n };\n\n window.addEventListener(\"beforeunload\", function() {\n sendSuccess();\n }, false);\n\n addMessageListener();\n },\n disable: function() {\n problemSelectorButton.disabled = true;\n }\n };\n })();\n\n const courseController = (function() {\n const courseNameElem = document.getElementById(\"id_mumie_course\");\n const coursefileElem = document.getElementsByName(\"mumie_coursefile\")[0];\n\n\n /**\n * Update the hidden input field with the selected course's course file path\n *\n * @param {string} coursefile\n */\n function updateCoursefilePath(coursefile) {\n coursefileElem.value = coursefile;\n updateCourseName();\n }\n\n /**\n * Update displayed course name.\n */\n function updateCourseName() {\n const selectedCourse = courseController.getSelectedCourse();\n const selectedLanguage = langController.getSelectedLanguage();\n if (!selectedCourse || !selectedLanguage) {\n return;\n }\n courseNameElem.value = selectedCourse.name\n .find(translation => translation.language === selectedLanguage)?.value;\n }\n\n return {\n init: function() {\n updateCourseName();\n },\n getSelectedCourse: function() {\n const courses = serverController.getSelectedServer().courses;\n return courses.find(course => course.coursefile === coursefileElem.value);\n },\n updateCourseName: function() {\n updateCourseName();\n },\n setCourse: function(courseFile) {\n updateCoursefilePath(courseFile);\n }\n };\n })();\n\n const langController = (function() {\n const languageElem = document.getElementById(\"id_language\");\n\n /**\n * Check if the given language exists in the currently selected course.\n * @param {string} lang\n * @returns {boolean} Whether the language exists\n */\n function languageExists(lang) {\n return courseController.getSelectedCourse().languages.includes(lang);\n }\n return {\n getSelectedLanguage: function() {\n return languageElem.value;\n },\n setLanguage: function(lang) {\n if (!languageExists(lang)) {\n throw new Error(\"Selected language not available\");\n }\n languageElem.value = lang;\n courseController.updateCourseName();\n }\n };\n })();\n\n const taskController = (function() {\n const taskSelectionInput = document.getElementsByName(\"taskurl\")[0];\n const nameElem = document.getElementById(\"id_name\");\n const taskDisplayElement = document.getElementById(\"id_task_display_element\");\n const isGradedElem = document.getElementById('id_mumie_isgraded');\n\n\n /**\n * Update the activity's name in the input field\n */\n function updateName() {\n const newHeadline = getHeadline(taskController.getSelectedTask());\n if (!isCustomName()) {\n nameElem.value = newHeadline;\n }\n taskDisplayElement.value = newHeadline;\n }\n\n /**\n * Check whether the activity has a custom name\n *\n * @return {boolean} True, if there is no headline with that name in all tasks\n */\n function isCustomName() {\n if (nameElem.value.length === 0) {\n return false;\n }\n return !getAllHeadlines().includes(nameElem.value);\n }\n\n /**\n * Get the task's headline for the currently selected language\n * @param {Object} task\n * @returns {string|null} the headline\n */\n function getHeadline(task) {\n if (!task) {\n return null;\n }\n const selectedLanguage = langController.getSelectedLanguage();\n const headlineWrapper = task.headline.find(localHeadline => localHeadline.language === selectedLanguage);\n return headlineWrapper ? headlineWrapper.name : null;\n }\n\n /**\n * Get all tasks that are available on all servers\n *\n * @return {Object} Array containing all available tasks\n */\n function getAllTasks() {\n return serverController.getAllServers()\n .flatMap(server => server.courses)\n .flatMap(course => course.tasks);\n }\n\n /**\n * Get all possible headlines in all languages\n * @returns {Object} Array containing all headlines\n */\n function getAllHeadlines() {\n return getAllTasks().flatMap(task => task.headline)\n .map(headline => headline.name)\n .concat(courseController.getSelectedCourse().name.map(n => n.value));\n }\n\n /**\n * Add language parameter to the task's link to display content in the selected language\n * @param {Object} task\n * @returns {string}\n */\n function getLocalizedLinkFromTask(task) {\n return getLocalizedLink(task.link);\n }\n\n /**\n * Add language parameter to link\n * @param {string} link\n * @returns {string}\n */\n function getLocalizedLink(link) {\n return link + \"?lang=\" + langController.getSelectedLanguage();\n }\n\n /**\n * Form inputs related to grades should be disabled, if the MUMIE Task is not graded.\n */\n function updateGradeEditability() {\n const disabled = isGradedElem.value === '0';\n document.getElementById('id_points').disabled = disabled;\n document.getElementById('id_gradepass').disabled = disabled;\n document.getElementById('id_duedate_enabled').disabled = disabled;\n document.getElementById('id_gradecat').disabled = disabled;\n }\n\n /**\n * Get a task that links to a course's overview page\n * @param {Object} course\n * @returns {Object} task\n */\n function getPseudoTaskFromCourse(course) {\n var headline = [];\n for (var i in course.name) {\n var name = course.name[i];\n headline.push({\n \"name\": name.value,\n \"language\": name.language\n });\n }\n return {\n \"link\": course.link,\n \"headline\": headline\n };\n }\n\n return {\n init: function() {\n updateName();\n },\n getSelectedTask: function() {\n const selectedLink = taskSelectionInput.value;\n const selectedCourse = courseController.getSelectedCourse();\n if (!selectedCourse) {\n return null;\n }\n const tasks = selectedCourse\n .tasks\n .slice();\n tasks.push(getPseudoTaskFromCourse(selectedCourse));\n return tasks\n .find(task => getLocalizedLinkFromTask(task) === selectedLink);\n },\n setSelection: function(newSelection) {\n taskSelectionInput.value = newSelection;\n updateName();\n },\n setIsGraded: function(isGraded) {\n if (isGraded === null) {\n isGradedElem.value = null;\n }\n isGradedElem.value = isGraded ? '1' : '0';\n updateGradeEditability();\n },\n getGradingType: function() {\n const isGraded = isGradedElem.value;\n if (isGraded === '1') {\n return 'graded';\n } else if (isGraded === '0') {\n return 'ungraded';\n }\n return 'all';\n }\n };\n })();\n\n\n const multiTaskEditController = (function() {\n const propertySelectionInputs = document.getElementsByName(\"mumie_multi_edit_property\");\n const selectedTaskProperties = document.getElementsByName(\"mumie_selected_task_properties\")[0];\n let selectedTaskProp = [];\n const taskSelectionInputs = document.getElementsByName(\"mumie_multi_edit_task\");\n const selectedTasks = document.getElementsByName(\"mumie_selected_tasks\")[0];\n let selectedTaskIds = [];\n const sectionInputs = document.getElementsByName(\"mumie_multi_edit_section\");\n\n /**\n * Push an element to an array, if it's not already included.\n *\n * @param {string[]} array\n * @param {string} element\n */\n function pushIfNotExists(array, element) {\n if (!array.includes(element)) {\n array.push(element);\n }\n }\n\n /**\n * Set selection listeners for other MUMIE Tasks in the course.\n */\n function setTaskSelectionListeners() {\n taskSelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskIds = selectedTaskIds.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskIds.push(checkbox.value);\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n /**\n * Set selection listeners for properties to apply to MUMIE Tasks in the course.\n */\n function setPropertySelectionListeners() {\n propertySelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskProp = selectedTaskProp.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskProp.push(checkbox.value);\n }\n selectedTaskProperties.value = JSON.stringify(selectedTaskProp);\n };\n });\n }\n\n /**\n * Set selection listeners for entire section of MUMIE Tasks in the course\n */\n function setSectionSelectionListeners() {\n sectionInputs.forEach(function(sectionCheckbox) {\n sectionCheckbox.onchange = function() {\n if (!sectionCheckbox.checked) {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = false;\n selectedTaskIds = selectedTaskIds.filter(elem => taskCheckbox.value !== elem);\n }\n });\n } else {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = true;\n pushIfNotExists(selectedTaskIds, taskCheckbox.value);\n }\n });\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n return {\n init: function() {\n setTaskSelectionListeners();\n setPropertySelectionListeners();\n setSectionSelectionListeners();\n },\n };\n })();\n\n /**\n * Disable all dropdown menus and show notification\n * @param {string} errorKey\n */\n function disableDropDownMenus(errorKey) {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': errorKey,\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0] + \"\" + missingConfig.getAttribute(\"value\") + \"\",\n type: \"problem\"\n });\n }).fail(notification.exception);\n });\n serverController.disable();\n problemSelectorController.disable();\n }\n\n return {\n init: function(contextid, prbSelectorUrl, lang) {\n lmsSelectorUrl = prbSelectorUrl;\n systemLanguage = lang;\n const isEdit = document.getElementById(\"id_name\").getAttribute('value');\n const serverStructure = JSON.parse(document.getElementsByName('mumie_server_structure')[0].value);\n if (isEdit && !serverConfigExists()) {\n disableDropDownMenus('mumie_form_missing_server');\n } else if (!serverStructure.length) {\n disableDropDownMenus('mumie_form_no_server_conf');\n } else {\n serverController.init(serverStructure);\n courseController.init();\n taskController.init(isEdit);\n multiTaskEditController.init();\n problemSelectorController.init();\n }\n multiTaskEditController.init();\n if (addServerButton) {\n require(['auth_mumie/mumie_server_config'], function(MumieServer) {\n MumieServer.init(addServerButton, contextid);\n });\n }\n }\n };\n\n /**\n * Remove all child elements of a given html element\n * @param {Object} elem\n */\n function removeChildElems(elem) {\n while (elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n }\n\n /**\n * Check, if the flag for an existing config is set\n * @returns {boolean}\n */\n function serverConfigExists() {\n return document.getElementsByName(\"mumie_missing_config\")[0].getAttribute(\"value\") === \"\";\n }\n });\n"],"names":["define","addServerButton","document","getElementById","missingConfig","getElementsByName","lmsSelectorUrl","systemLanguage","serverController","serverStructure","serverDropDown","init","structure","getSelectedServer","selectedServerName","options","selectedIndex","text","find","server","name","disable","disabled","elem","firstChild","removeChild","removeChildElems","getAllServers","problemSelectorController","problemSelectorButton","problemSelectorWindow","mumieOrg","value","sendResponse","response","postMessage","JSON","stringify","sendSuccess","message","success","addMessageListener","window","addEventListener","event","origin","importObj","parse","data","isGraded","courseController","setCourse","path_to_coursefile","langController","setLanguage","language","taskController","setSelection","link","setIsGraded","focus","require","str","notification","get_strings","component","done","s","addNotification","type","fail","exception","error","sendFailure","gradingType","getGradingType","onclick","open","encodeURIComponent","urlprefix","getSelectedLanguage","location","onclose","courseNameElem","coursefileElem","updateCourseName","selectedCourse","getSelectedCourse","selectedLanguage","translation","_selectedCourse$name$","courses","course","coursefile","courseFile","languageElem","lang","languages","includes","languageExists","Error","taskSelectionInput","nameElem","taskDisplayElement","isGradedElem","updateName","newHeadline","task","headlineWrapper","headline","localHeadline","getHeadline","getSelectedTask","length","flatMap","tasks","map","concat","n","isCustomName","getLocalizedLinkFromTask","selectedLink","slice","push","i","getPseudoTaskFromCourse","newSelection","updateGradeEditability","multiTaskEditController","propertySelectionInputs","selectedTaskProperties","selectedTaskProp","taskSelectionInputs","selectedTasks","selectedTaskIds","sectionInputs","forEach","checkbox","onchange","checked","filter","sectionCheckbox","taskCheckbox","array","element","getAttribute","disableDropDownMenus","errorKey","contextid","prbSelectorUrl","isEdit","MumieServer"],"mappings":"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"} \ No newline at end of file diff --git a/version.php b/version.php index 9a44b5a..061363f 100644 --- a/version.php +++ b/version.php @@ -25,7 +25,7 @@ defined('MOODLE_INTERNAL') || die; -$plugin->version = 2022031101; // The current module version (Date: YYYYMMDDXX). +$plugin->version = 2022031102; // The current module version (Date: YYYYMMDDXX). $plugin->component = 'mod_mumie'; // Full name of the plugin (used for diagnostics). $plugin->requires = 2020061500; $plugin->release = "v1.4.6"; From 28ca59a67a906dc050d2ba2b983489762c47a5c2 Mon Sep 17 00:00:00 2001 From: Tobias Goltz Date: Fri, 11 Mar 2022 14:55:45 +0100 Subject: [PATCH 2/5] Reverting earlier change that didn't fix the pipeline. --- amd/build/mod_form.min.js | 2 +- amd/build/mod_form.min.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/amd/build/mod_form.min.js b/amd/build/mod_form.min.js index 94ed465..aed9d79 100644 --- a/amd/build/mod_form.min.js +++ b/amd/build/mod_form.min.js @@ -1,3 +1,3 @@ -define("mod_mumie/mod_form",["jquery","core/templates","core/modal_factory","auth_mumie/mumie_server_config","core/ajax"],(function(){const addServerButton=document.getElementById("id_add_server_button"),missingConfig=document.getElementsByName("mumie_missing_config")[0];let lmsSelectorUrl,systemLanguage;const serverController=function(){let serverStructure;const serverDropDown=document.getElementById("id_server");return{init:function(structure){serverStructure=structure},getSelectedServer:function(){const selectedServerName=serverDropDown.options[serverDropDown.selectedIndex].text;return serverStructure.find((server=>server.name===selectedServerName))},disable:function(){serverDropDown.disabled=!0,function(elem){for(;elem.firstChild;)elem.removeChild(elem.firstChild)}(serverDropDown)},getAllServers:function(){return serverStructure}}}(),problemSelectorController=function(){const problemSelectorButton=document.getElementById("id_prb_selector_btn");let problemSelectorWindow;const mumieOrg=document.getElementsByName("mumie_org")[0].value;function sendResponse(response){problemSelectorWindow&&problemSelectorWindow.postMessage(JSON.stringify(response),lmsSelectorUrl)}function sendSuccess(){let message=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";sendResponse({success:!0,message:message})}function addMessageListener(){window.addEventListener("message",(event=>{if(event.origin!==lmsSelectorUrl)return;const importObj=JSON.parse(event.data),isGraded=!1!==importObj.isGraded;try{courseController.setCourse(importObj.path_to_coursefile),langController.setLanguage(importObj.language),taskController.setSelection(importObj.link+"?lang="+importObj.language),taskController.setIsGraded(isGraded),sendSuccess(),window.focus(),require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:"mumie_form_updated_selection",component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0],type:"info"})})).fail(notification.exception)}))}catch(error){!function(){sendResponse({success:!1,message:arguments.length>0&&void 0!==arguments[0]?arguments[0]:""})}(error.message)}}),!1)}return{init:function(){const gradingType=taskController.getGradingType();problemSelectorButton.onclick=function(){problemSelectorWindow=window.open(lmsSelectorUrl+"/lms-problem-selector?org="+mumieOrg+"&serverUrl="+encodeURIComponent(serverController.getSelectedServer().urlprefix)+"&problemLang="+langController.getSelectedLanguage()+"&origin="+encodeURIComponent(window.location.origin)+"&uiLang="+systemLanguage+"&gradingType="+gradingType+"&multiCourse=true","_blank")},window.onclose=function(){sendSuccess()},window.addEventListener("beforeunload",(function(){sendSuccess()}),!1),addMessageListener()},disable:function(){problemSelectorButton.disabled=!0}}}(),courseController=function(){const courseNameElem=document.getElementById("id_mumie_course"),coursefileElem=document.getElementsByName("mumie_coursefile")[0];function updateCourseName(){var _selectedCourse$name$;const selectedCourse=courseController.getSelectedCourse(),selectedLanguage=langController.getSelectedLanguage();selectedCourse&&selectedLanguage&&(courseNameElem.value=null===(_selectedCourse$name$=selectedCourse.name.find((translation=>translation.language===selectedLanguage)))||void 0===_selectedCourse$name$?void 0:_selectedCourse$name$.value)}return{init:function(){updateCourseName()},getSelectedCourse:function(){return serverController.getSelectedServer().courses.find((course=>course.coursefile===coursefileElem.value))},updateCourseName:function(){updateCourseName()},setCourse:function(courseFile){var coursefile;coursefile=courseFile,coursefileElem.value=coursefile,updateCourseName()}}}(),langController=function(){const languageElem=document.getElementById("id_language");return{getSelectedLanguage:function(){return languageElem.value},setLanguage:function(lang){if(!function(lang){return courseController.getSelectedCourse().languages.includes(lang)}(lang))throw new Error("Selected language not available");languageElem.value=lang,courseController.updateCourseName()}}}(),taskController=function(){const taskSelectionInput=document.getElementsByName("taskurl")[0],nameElem=document.getElementById("id_name"),taskDisplayElement=document.getElementById("id_task_display_element"),isGradedElem=document.getElementById("id_mumie_isgraded");function updateName(){const newHeadline=function(task){if(!task)return null;const selectedLanguage=langController.getSelectedLanguage(),headlineWrapper=task.headline.find((localHeadline=>localHeadline.language===selectedLanguage));return headlineWrapper?headlineWrapper.name:null}(taskController.getSelectedTask());(function(){if(0===nameElem.value.length)return!1;return!serverController.getAllServers().flatMap((server=>server.courses)).flatMap((course=>course.tasks)).flatMap((task=>task.headline)).map((headline=>headline.name)).concat(courseController.getSelectedCourse().name.map((n=>n.value))).includes(nameElem.value)})()||(nameElem.value=newHeadline),taskDisplayElement.value=newHeadline}function getLocalizedLinkFromTask(task){return task.link+"?lang="+langController.getSelectedLanguage()}return{init:function(){updateName()},getSelectedTask:function(){const selectedLink=taskSelectionInput.value,selectedCourse=courseController.getSelectedCourse();if(!selectedCourse)return null;const tasks=selectedCourse.tasks.slice();return tasks.push(function(course){var headline=[];for(var i in course.name){var name=course.name[i];headline.push({name:name.value,language:name.language})}return{link:course.link,headline:headline}}(selectedCourse)),tasks.find((task=>getLocalizedLinkFromTask(task)===selectedLink))},setSelection:function(newSelection){taskSelectionInput.value=newSelection,updateName()},setIsGraded:function(isGraded){null===isGraded&&(isGradedElem.value=null),isGradedElem.value=isGraded?"1":"0",function(){const disabled="0"===isGradedElem.value;document.getElementById("id_points").disabled=disabled,document.getElementById("id_gradepass").disabled=disabled,document.getElementById("id_duedate_enabled").disabled=disabled,document.getElementById("id_gradecat").disabled=disabled}()},getGradingType:function(){const isGraded=isGradedElem.value;return"1"===isGraded?"graded":"0"===isGraded?"ungraded":"all"}}}(),multiTaskEditController=function(){const propertySelectionInputs=document.getElementsByName("mumie_multi_edit_property"),selectedTaskProperties=document.getElementsByName("mumie_selected_task_properties")[0];let selectedTaskProp=[];const taskSelectionInputs=document.getElementsByName("mumie_multi_edit_task"),selectedTasks=document.getElementsByName("mumie_selected_tasks")[0];let selectedTaskIds=[];const sectionInputs=document.getElementsByName("mumie_multi_edit_section");return{init:function(){taskSelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskIds.push(checkbox.value):selectedTaskIds=selectedTaskIds.filter((elem=>elem!==checkbox.value)),selectedTasks.value=JSON.stringify(selectedTaskIds)}})),propertySelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskProp.push(checkbox.value):selectedTaskProp=selectedTaskProp.filter((elem=>elem!==checkbox.value)),selectedTaskProperties.value=JSON.stringify(selectedTaskProp)}})),sectionInputs.forEach((function(sectionCheckbox){sectionCheckbox.onchange=function(){sectionCheckbox.checked?taskSelectionInputs.forEach((function(taskCheckbox){var array,element;taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!0,array=selectedTaskIds,element=taskCheckbox.value,array.includes(element)||array.push(element))})):taskSelectionInputs.forEach((function(taskCheckbox){taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!1,selectedTaskIds=selectedTaskIds.filter((elem=>taskCheckbox.value!==elem)))})),selectedTasks.value=JSON.stringify(selectedTaskIds)}}))}}}();function disableDropDownMenus(errorKey){require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:errorKey,component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0]+""+missingConfig.getAttribute("value")+"",type:"problem"})})).fail(notification.exception)})),serverController.disable(),problemSelectorController.disable()}return{init:function(contextid,prbSelectorUrl,lang){lmsSelectorUrl=prbSelectorUrl,systemLanguage=lang;const isEdit=document.getElementById("id_name").getAttribute("value"),serverStructure=JSON.parse(document.getElementsByName("mumie_server_structure")[0].value);isEdit&&""!==document.getElementsByName("mumie_missing_config")[0].getAttribute("value")?disableDropDownMenus("mumie_form_missing_server"):serverStructure.length?(serverController.init(serverStructure),courseController.init(),taskController.init(isEdit),multiTaskEditController.init(),problemSelectorController.init()):disableDropDownMenus("mumie_form_no_server_conf"),multiTaskEditController.init(),addServerButton&&require(["auth_mumie/mumie_server_config"],(function(MumieServer){MumieServer.init(addServerButton,contextid)}))}}})); +define("mod_mumie/mod_form",["jquery","core/templates","core/modal_factory","auth_mumie/mumie_server_config","core/ajax"],(function(){var lmsSelectorUrl,systemLanguage,serverStructure,serverDropDown,languageElem,propertySelectionInputs,selectedTaskProperties,selectedTaskProp,taskSelectionInputs,selectedTasks,selectedTaskIds,sectionInputs,addServerButton=document.getElementById("id_add_server_button"),missingConfig=document.getElementsByName("mumie_missing_config")[0],serverController=(serverDropDown=document.getElementById("id_server"),{init:function(structure){serverStructure=structure},getSelectedServer:function(){var selectedServerName=serverDropDown.options[serverDropDown.selectedIndex].text;return serverStructure.find((function(server){return server.name===selectedServerName}))},disable:function(){serverDropDown.disabled=!0,function(elem){for(;elem.firstChild;)elem.removeChild(elem.firstChild)}(serverDropDown)},getAllServers:function(){return serverStructure}}),problemSelectorController=function(){var problemSelectorWindow,problemSelectorButton=document.getElementById("id_prb_selector_btn"),mumieOrg=document.getElementsByName("mumie_org")[0].value;function sendResponse(response){problemSelectorWindow&&problemSelectorWindow.postMessage(JSON.stringify(response),lmsSelectorUrl)}function sendSuccess(){var message=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";sendResponse({success:!0,message:message})}function addMessageListener(){window.addEventListener("message",(function(event){if(event.origin===lmsSelectorUrl){var importObj=JSON.parse(event.data),isGraded=!1!==importObj.isGraded;try{courseController.setCourse(importObj.path_to_coursefile),langController.setLanguage(importObj.language),taskController.setSelection(importObj.link+"?lang="+importObj.language),taskController.setIsGraded(isGraded),sendSuccess(),window.focus(),require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:"mumie_form_updated_selection",component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0],type:"info"})})).fail(notification.exception)}))}catch(error){!function(){sendResponse({success:!1,message:arguments.length>0&&void 0!==arguments[0]?arguments[0]:""})}(error.message)}}}),!1)}return{init:function(){var gradingType=taskController.getGradingType();problemSelectorButton.onclick=function(){problemSelectorWindow=window.open(lmsSelectorUrl+"/lms-problem-selector?org="+mumieOrg+"&serverUrl="+encodeURIComponent(serverController.getSelectedServer().urlprefix)+"&problemLang="+langController.getSelectedLanguage()+"&origin="+encodeURIComponent(window.location.origin)+"&uiLang="+systemLanguage+"&gradingType="+gradingType+"&multiCourse=true","_blank")},window.onclose=function(){sendSuccess()},window.addEventListener("beforeunload",(function(){sendSuccess()}),!1),addMessageListener()},disable:function(){problemSelectorButton.disabled=!0}}}(),courseController=function(){var courseNameElem=document.getElementById("id_mumie_course"),coursefileElem=document.getElementsByName("mumie_coursefile")[0];function _updateCourseName(){var _selectedCourse$name$,selectedCourse=courseController.getSelectedCourse(),selectedLanguage=langController.getSelectedLanguage();selectedCourse&&selectedLanguage&&(courseNameElem.value=null===(_selectedCourse$name$=selectedCourse.name.find((function(translation){return translation.language===selectedLanguage})))||void 0===_selectedCourse$name$?void 0:_selectedCourse$name$.value)}return{init:function(){_updateCourseName()},getSelectedCourse:function(){return serverController.getSelectedServer().courses.find((function(course){return course.coursefile===coursefileElem.value}))},updateCourseName:function(){_updateCourseName()},setCourse:function(courseFile){var coursefile;coursefile=courseFile,coursefileElem.value=coursefile,_updateCourseName()}}}(),langController=(languageElem=document.getElementById("id_language"),{getSelectedLanguage:function(){return languageElem.value},setLanguage:function(lang){if(!function(lang){return courseController.getSelectedCourse().languages.includes(lang)}(lang))throw new Error("Selected language not available");languageElem.value=lang,courseController.updateCourseName()}}),taskController=function(){var taskSelectionInput=document.getElementsByName("taskurl")[0],nameElem=document.getElementById("id_name"),taskDisplayElement=document.getElementById("id_task_display_element"),isGradedElem=document.getElementById("id_mumie_isgraded");function updateName(){var newHeadline=function(task){if(!task)return null;var selectedLanguage=langController.getSelectedLanguage(),headlineWrapper=task.headline.find((function(localHeadline){return localHeadline.language===selectedLanguage}));return headlineWrapper?headlineWrapper.name:null}(taskController.getSelectedTask());(function(){if(0===nameElem.value.length)return!1;return!serverController.getAllServers().flatMap((function(server){return server.courses})).flatMap((function(course){return course.tasks})).flatMap((function(task){return task.headline})).map((function(headline){return headline.name})).concat(courseController.getSelectedCourse().name.map((function(n){return n.value}))).includes(nameElem.value)})()||(nameElem.value=newHeadline),taskDisplayElement.value=newHeadline}function getLocalizedLinkFromTask(task){return task.link+"?lang="+langController.getSelectedLanguage()}return{init:function(){updateName()},getSelectedTask:function(){var selectedLink=taskSelectionInput.value,selectedCourse=courseController.getSelectedCourse();if(!selectedCourse)return null;var tasks=selectedCourse.tasks.slice();return tasks.push(function(course){var headline=[];for(var i in course.name){var name=course.name[i];headline.push({name:name.value,language:name.language})}return{link:course.link,headline:headline}}(selectedCourse)),tasks.find((function(task){return getLocalizedLinkFromTask(task)===selectedLink}))},setSelection:function(newSelection){taskSelectionInput.value=newSelection,updateName()},setIsGraded:function(isGraded){var disabled;null===isGraded&&(isGradedElem.value=null),isGradedElem.value=isGraded?"1":"0",disabled="0"===isGradedElem.value,document.getElementById("id_points").disabled=disabled,document.getElementById("id_gradepass").disabled=disabled,document.getElementById("id_duedate_enabled").disabled=disabled,document.getElementById("id_gradecat").disabled=disabled},getGradingType:function(){var isGraded=isGradedElem.value;return"1"===isGraded?"graded":"0"===isGraded?"ungraded":"all"}}}(),multiTaskEditController=(propertySelectionInputs=document.getElementsByName("mumie_multi_edit_property"),selectedTaskProperties=document.getElementsByName("mumie_selected_task_properties")[0],selectedTaskProp=[],taskSelectionInputs=document.getElementsByName("mumie_multi_edit_task"),selectedTasks=document.getElementsByName("mumie_selected_tasks")[0],selectedTaskIds=[],sectionInputs=document.getElementsByName("mumie_multi_edit_section"),{init:function(){taskSelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskIds.push(checkbox.value):selectedTaskIds=selectedTaskIds.filter((function(elem){return elem!==checkbox.value})),selectedTasks.value=JSON.stringify(selectedTaskIds)}})),propertySelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskProp.push(checkbox.value):selectedTaskProp=selectedTaskProp.filter((function(elem){return elem!==checkbox.value})),selectedTaskProperties.value=JSON.stringify(selectedTaskProp)}})),sectionInputs.forEach((function(sectionCheckbox){sectionCheckbox.onchange=function(){sectionCheckbox.checked?taskSelectionInputs.forEach((function(taskCheckbox){var array,element;taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!0,array=selectedTaskIds,element=taskCheckbox.value,array.includes(element)||array.push(element))})):taskSelectionInputs.forEach((function(taskCheckbox){taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!1,selectedTaskIds=selectedTaskIds.filter((function(elem){return taskCheckbox.value!==elem})))})),selectedTasks.value=JSON.stringify(selectedTaskIds)}}))}});function disableDropDownMenus(errorKey){require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:errorKey,component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0]+""+missingConfig.getAttribute("value")+"",type:"problem"})})).fail(notification.exception)})),serverController.disable(),problemSelectorController.disable()}return{init:function(contextid,prbSelectorUrl,lang){lmsSelectorUrl=prbSelectorUrl,systemLanguage=lang;var isEdit=document.getElementById("id_name").getAttribute("value"),serverStructure=JSON.parse(document.getElementsByName("mumie_server_structure")[0].value);isEdit&&""!==document.getElementsByName("mumie_missing_config")[0].getAttribute("value")?disableDropDownMenus("mumie_form_missing_server"):serverStructure.length?(serverController.init(serverStructure),courseController.init(),taskController.init(isEdit),multiTaskEditController.init(),problemSelectorController.init()):disableDropDownMenus("mumie_form_no_server_conf"),multiTaskEditController.init(),addServerButton&&require(["auth_mumie/mumie_server_config"],(function(MumieServer){MumieServer.init(addServerButton,contextid)}))}}})); //# sourceMappingURL=mod_form.min.js.map \ No newline at end of file diff --git a/amd/build/mod_form.min.js.map b/amd/build/mod_form.min.js.map index add6d4f..6848302 100644 --- a/amd/build/mod_form.min.js.map +++ b/amd/build/mod_form.min.js.map @@ -1 +1 @@ -{"version":3,"file":"mod_form.min.js","sources":["../src/mod_form.js"],"sourcesContent":["define(['jquery', 'core/templates', 'core/modal_factory', 'auth_mumie/mumie_server_config', 'core/ajax'],\n function() {\n const addServerButton = document.getElementById(\"id_add_server_button\");\n const missingConfig = document.getElementsByName(\"mumie_missing_config\")[0];\n let lmsSelectorUrl;\n let systemLanguage;\n const serverController = (function() {\n let serverStructure;\n const serverDropDown = document.getElementById(\"id_server\");\n\n return {\n init: function(structure) {\n serverStructure = structure;\n },\n getSelectedServer: function() {\n const selectedServerName = serverDropDown.options[serverDropDown.selectedIndex].text;\n return serverStructure.find(server => server.name === selectedServerName);\n },\n disable: function() {\n serverDropDown.disabled = true;\n removeChildElems(serverDropDown);\n },\n getAllServers: function() {\n return serverStructure;\n }\n };\n })();\n\n const problemSelectorController = (function() {\n const problemSelectorButton = document.getElementById('id_prb_selector_btn');\n let problemSelectorWindow;\n const mumieOrg = document.getElementsByName('mumie_org')[0].value;\n\n /**\n * Send a message to the problem selector window.\n *\n * Don't do anything, if there is no problem selector window.\n * @param {Object} response\n */\n function sendResponse(response) {\n if (!problemSelectorWindow) {\n return;\n }\n problemSelectorWindow.postMessage(JSON.stringify(response), lmsSelectorUrl);\n }\n\n /**\n * Send a success message to problem selector window\n * @param {string} message\n */\n function sendSuccess(message = '') {\n sendResponse({\n success: true,\n message: message\n });\n }\n\n /**\n * Send a failure message to problem selector window\n * @param {string} message\n */\n function sendFailure(message = '') {\n sendResponse({\n success: false,\n message: message\n });\n }\n\n /**\n * Add an event listener that accepts messages from LMS-Browser and updates the selected problem.\n */\n function addMessageListener() {\n window.addEventListener('message', (event) => {\n if (event.origin !== lmsSelectorUrl) {\n return;\n }\n const importObj = JSON.parse(event.data);\n const isGraded = importObj.isGraded !== false;\n try {\n courseController.setCourse(importObj.path_to_coursefile);\n langController.setLanguage(importObj.language);\n taskController.setSelection(importObj.link + '?lang=' + importObj.language);\n taskController.setIsGraded(isGraded);\n sendSuccess();\n window.focus();\n displayProblemSelectedMessage();\n } catch (error) {\n sendFailure(error.message);\n }\n }, false);\n }\n\n /**\n * Display a success message in Moodle that a problem was successfully selected.\n */\n function displayProblemSelectedMessage() {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': 'mumie_form_updated_selection',\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0],\n type: \"info\"\n });\n }).fail(notification.exception);\n });\n }\n\n return {\n init: function() {\n const gradingType = taskController.getGradingType();\n problemSelectorButton.onclick = function() {\n problemSelectorWindow = window.open(\n lmsSelectorUrl\n + '/lms-problem-selector?'\n + 'org='\n + mumieOrg\n + '&serverUrl='\n + encodeURIComponent(serverController.getSelectedServer().urlprefix)\n + '&problemLang='\n + langController.getSelectedLanguage()\n + '&origin=' + encodeURIComponent(window.location.origin)\n + '&uiLang=' + systemLanguage\n + '&gradingType=' + gradingType\n + '&multiCourse=true'\n , '_blank'\n );\n };\n\n window.onclose = function() {\n sendSuccess();\n };\n\n window.addEventListener(\"beforeunload\", function() {\n sendSuccess();\n }, false);\n\n addMessageListener();\n },\n disable: function() {\n problemSelectorButton.disabled = true;\n }\n };\n })();\n\n const courseController = (function() {\n const courseNameElem = document.getElementById(\"id_mumie_course\");\n const coursefileElem = document.getElementsByName(\"mumie_coursefile\")[0];\n\n\n /**\n * Update the hidden input field with the selected course's course file path\n *\n * @param {string} coursefile\n */\n function updateCoursefilePath(coursefile) {\n coursefileElem.value = coursefile;\n updateCourseName();\n }\n\n /**\n * Update displayed course name.\n */\n function updateCourseName() {\n const selectedCourse = courseController.getSelectedCourse();\n const selectedLanguage = langController.getSelectedLanguage();\n if (!selectedCourse || !selectedLanguage) {\n return;\n }\n courseNameElem.value = selectedCourse.name\n .find(translation => translation.language === selectedLanguage)?.value;\n }\n\n return {\n init: function() {\n updateCourseName();\n },\n getSelectedCourse: function() {\n const courses = serverController.getSelectedServer().courses;\n return courses.find(course => course.coursefile === coursefileElem.value);\n },\n updateCourseName: function() {\n updateCourseName();\n },\n setCourse: function(courseFile) {\n updateCoursefilePath(courseFile);\n }\n };\n })();\n\n const langController = (function() {\n const languageElem = document.getElementById(\"id_language\");\n\n /**\n * Check if the given language exists in the currently selected course.\n * @param {string} lang\n * @returns {boolean} Whether the language exists\n */\n function languageExists(lang) {\n return courseController.getSelectedCourse().languages.includes(lang);\n }\n return {\n getSelectedLanguage: function() {\n return languageElem.value;\n },\n setLanguage: function(lang) {\n if (!languageExists(lang)) {\n throw new Error(\"Selected language not available\");\n }\n languageElem.value = lang;\n courseController.updateCourseName();\n }\n };\n })();\n\n const taskController = (function() {\n const taskSelectionInput = document.getElementsByName(\"taskurl\")[0];\n const nameElem = document.getElementById(\"id_name\");\n const taskDisplayElement = document.getElementById(\"id_task_display_element\");\n const isGradedElem = document.getElementById('id_mumie_isgraded');\n\n\n /**\n * Update the activity's name in the input field\n */\n function updateName() {\n const newHeadline = getHeadline(taskController.getSelectedTask());\n if (!isCustomName()) {\n nameElem.value = newHeadline;\n }\n taskDisplayElement.value = newHeadline;\n }\n\n /**\n * Check whether the activity has a custom name\n *\n * @return {boolean} True, if there is no headline with that name in all tasks\n */\n function isCustomName() {\n if (nameElem.value.length === 0) {\n return false;\n }\n return !getAllHeadlines().includes(nameElem.value);\n }\n\n /**\n * Get the task's headline for the currently selected language\n * @param {Object} task\n * @returns {string|null} the headline\n */\n function getHeadline(task) {\n if (!task) {\n return null;\n }\n const selectedLanguage = langController.getSelectedLanguage();\n const headlineWrapper = task.headline.find(localHeadline => localHeadline.language === selectedLanguage);\n return headlineWrapper ? headlineWrapper.name : null;\n }\n\n /**\n * Get all tasks that are available on all servers\n *\n * @return {Object} Array containing all available tasks\n */\n function getAllTasks() {\n return serverController.getAllServers()\n .flatMap(server => server.courses)\n .flatMap(course => course.tasks);\n }\n\n /**\n * Get all possible headlines in all languages\n * @returns {Object} Array containing all headlines\n */\n function getAllHeadlines() {\n return getAllTasks().flatMap(task => task.headline)\n .map(headline => headline.name)\n .concat(courseController.getSelectedCourse().name.map(n => n.value));\n }\n\n /**\n * Add language parameter to the task's link to display content in the selected language\n * @param {Object} task\n * @returns {string}\n */\n function getLocalizedLinkFromTask(task) {\n return getLocalizedLink(task.link);\n }\n\n /**\n * Add language parameter to link\n * @param {string} link\n * @returns {string}\n */\n function getLocalizedLink(link) {\n return link + \"?lang=\" + langController.getSelectedLanguage();\n }\n\n /**\n * Form inputs related to grades should be disabled, if the MUMIE Task is not graded.\n */\n function updateGradeEditability() {\n const disabled = isGradedElem.value === '0';\n document.getElementById('id_points').disabled = disabled;\n document.getElementById('id_gradepass').disabled = disabled;\n document.getElementById('id_duedate_enabled').disabled = disabled;\n document.getElementById('id_gradecat').disabled = disabled;\n }\n\n /**\n * Get a task that links to a course's overview page\n * @param {Object} course\n * @returns {Object} task\n */\n function getPseudoTaskFromCourse(course) {\n var headline = [];\n for (var i in course.name) {\n var name = course.name[i];\n headline.push({\n \"name\": name.value,\n \"language\": name.language\n });\n }\n return {\n \"link\": course.link,\n \"headline\": headline\n };\n }\n\n return {\n init: function() {\n updateName();\n },\n getSelectedTask: function() {\n const selectedLink = taskSelectionInput.value;\n const selectedCourse = courseController.getSelectedCourse();\n if (!selectedCourse) {\n return null;\n }\n const tasks = selectedCourse\n .tasks\n .slice();\n tasks.push(getPseudoTaskFromCourse(selectedCourse));\n return tasks\n .find(task => getLocalizedLinkFromTask(task) === selectedLink);\n },\n setSelection: function(newSelection) {\n taskSelectionInput.value = newSelection;\n updateName();\n },\n setIsGraded: function(isGraded) {\n if (isGraded === null) {\n isGradedElem.value = null;\n }\n isGradedElem.value = isGraded ? '1' : '0';\n updateGradeEditability();\n },\n getGradingType: function() {\n const isGraded = isGradedElem.value;\n if (isGraded === '1') {\n return 'graded';\n } else if (isGraded === '0') {\n return 'ungraded';\n }\n return 'all';\n }\n };\n })();\n\n\n const multiTaskEditController = (function() {\n const propertySelectionInputs = document.getElementsByName(\"mumie_multi_edit_property\");\n const selectedTaskProperties = document.getElementsByName(\"mumie_selected_task_properties\")[0];\n let selectedTaskProp = [];\n const taskSelectionInputs = document.getElementsByName(\"mumie_multi_edit_task\");\n const selectedTasks = document.getElementsByName(\"mumie_selected_tasks\")[0];\n let selectedTaskIds = [];\n const sectionInputs = document.getElementsByName(\"mumie_multi_edit_section\");\n\n /**\n * Push an element to an array, if it's not already included.\n *\n * @param {string[]} array\n * @param {string} element\n */\n function pushIfNotExists(array, element) {\n if (!array.includes(element)) {\n array.push(element);\n }\n }\n\n /**\n * Set selection listeners for other MUMIE Tasks in the course.\n */\n function setTaskSelectionListeners() {\n taskSelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskIds = selectedTaskIds.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskIds.push(checkbox.value);\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n /**\n * Set selection listeners for properties to apply to MUMIE Tasks in the course.\n */\n function setPropertySelectionListeners() {\n propertySelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskProp = selectedTaskProp.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskProp.push(checkbox.value);\n }\n selectedTaskProperties.value = JSON.stringify(selectedTaskProp);\n };\n });\n }\n\n /**\n * Set selection listeners for entire section of MUMIE Tasks in the course\n */\n function setSectionSelectionListeners() {\n sectionInputs.forEach(function(sectionCheckbox) {\n sectionCheckbox.onchange = function() {\n if (!sectionCheckbox.checked) {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = false;\n selectedTaskIds = selectedTaskIds.filter(elem => taskCheckbox.value !== elem);\n }\n });\n } else {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = true;\n pushIfNotExists(selectedTaskIds, taskCheckbox.value);\n }\n });\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n return {\n init: function() {\n setTaskSelectionListeners();\n setPropertySelectionListeners();\n setSectionSelectionListeners();\n },\n };\n })();\n\n /**\n * Disable all dropdown menus and show notification\n * @param {string} errorKey\n */\n function disableDropDownMenus(errorKey) {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': errorKey,\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0] + \"\" + missingConfig.getAttribute(\"value\") + \"\",\n type: \"problem\"\n });\n }).fail(notification.exception);\n });\n serverController.disable();\n problemSelectorController.disable();\n }\n\n return {\n init: function(contextid, prbSelectorUrl, lang) {\n lmsSelectorUrl = prbSelectorUrl;\n systemLanguage = lang;\n const isEdit = document.getElementById(\"id_name\").getAttribute('value');\n const serverStructure = JSON.parse(document.getElementsByName('mumie_server_structure')[0].value);\n if (isEdit && !serverConfigExists()) {\n disableDropDownMenus('mumie_form_missing_server');\n } else if (!serverStructure.length) {\n disableDropDownMenus('mumie_form_no_server_conf');\n } else {\n serverController.init(serverStructure);\n courseController.init();\n taskController.init(isEdit);\n multiTaskEditController.init();\n problemSelectorController.init();\n }\n multiTaskEditController.init();\n if (addServerButton) {\n require(['auth_mumie/mumie_server_config'], function(MumieServer) {\n MumieServer.init(addServerButton, contextid);\n });\n }\n }\n };\n\n /**\n * Remove all child elements of a given html element\n * @param {Object} elem\n */\n function removeChildElems(elem) {\n while (elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n }\n\n /**\n * Check, if the flag for an existing config is set\n * @returns {boolean}\n */\n function serverConfigExists() {\n return document.getElementsByName(\"mumie_missing_config\")[0].getAttribute(\"value\") === \"\";\n }\n });\n"],"names":["define","addServerButton","document","getElementById","missingConfig","getElementsByName","lmsSelectorUrl","systemLanguage","serverController","serverStructure","serverDropDown","init","structure","getSelectedServer","selectedServerName","options","selectedIndex","text","find","server","name","disable","disabled","elem","firstChild","removeChild","removeChildElems","getAllServers","problemSelectorController","problemSelectorButton","problemSelectorWindow","mumieOrg","value","sendResponse","response","postMessage","JSON","stringify","sendSuccess","message","success","addMessageListener","window","addEventListener","event","origin","importObj","parse","data","isGraded","courseController","setCourse","path_to_coursefile","langController","setLanguage","language","taskController","setSelection","link","setIsGraded","focus","require","str","notification","get_strings","component","done","s","addNotification","type","fail","exception","error","sendFailure","gradingType","getGradingType","onclick","open","encodeURIComponent","urlprefix","getSelectedLanguage","location","onclose","courseNameElem","coursefileElem","updateCourseName","selectedCourse","getSelectedCourse","selectedLanguage","translation","_selectedCourse$name$","courses","course","coursefile","courseFile","languageElem","lang","languages","includes","languageExists","Error","taskSelectionInput","nameElem","taskDisplayElement","isGradedElem","updateName","newHeadline","task","headlineWrapper","headline","localHeadline","getHeadline","getSelectedTask","length","flatMap","tasks","map","concat","n","isCustomName","getLocalizedLinkFromTask","selectedLink","slice","push","i","getPseudoTaskFromCourse","newSelection","updateGradeEditability","multiTaskEditController","propertySelectionInputs","selectedTaskProperties","selectedTaskProp","taskSelectionInputs","selectedTasks","selectedTaskIds","sectionInputs","forEach","checkbox","onchange","checked","filter","sectionCheckbox","taskCheckbox","array","element","getAttribute","disableDropDownMenus","errorKey","contextid","prbSelectorUrl","isEdit","MumieServer"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"mod_form.min.js","sources":["../src/mod_form.js"],"sourcesContent":["define(['jquery', 'core/templates', 'core/modal_factory', 'auth_mumie/mumie_server_config', 'core/ajax'],\n function() {\n const addServerButton = document.getElementById(\"id_add_server_button\");\n const missingConfig = document.getElementsByName(\"mumie_missing_config\")[0];\n let lmsSelectorUrl;\n let systemLanguage;\n const serverController = (function() {\n let serverStructure;\n const serverDropDown = document.getElementById(\"id_server\");\n\n return {\n init: function(structure) {\n serverStructure = structure;\n },\n getSelectedServer: function() {\n const selectedServerName = serverDropDown.options[serverDropDown.selectedIndex].text;\n return serverStructure.find(server => server.name === selectedServerName);\n },\n disable: function() {\n serverDropDown.disabled = true;\n removeChildElems(serverDropDown);\n },\n getAllServers: function() {\n return serverStructure;\n }\n };\n })();\n\n const problemSelectorController = (function() {\n const problemSelectorButton = document.getElementById('id_prb_selector_btn');\n let problemSelectorWindow;\n const mumieOrg = document.getElementsByName('mumie_org')[0].value;\n\n /**\n * Send a message to the problem selector window.\n *\n * Don't do anything, if there is no problem selector window.\n * @param {Object} response\n */\n function sendResponse(response) {\n if (!problemSelectorWindow) {\n return;\n }\n problemSelectorWindow.postMessage(JSON.stringify(response), lmsSelectorUrl);\n }\n\n /**\n * Send a success message to problem selector window\n * @param {string} message\n */\n function sendSuccess(message = '') {\n sendResponse({\n success: true,\n message: message\n });\n }\n\n /**\n * Send a failure message to problem selector window\n * @param {string} message\n */\n function sendFailure(message = '') {\n sendResponse({\n success: false,\n message: message\n });\n }\n\n /**\n * Add an event listener that accepts messages from LMS-Browser and updates the selected problem.\n */\n function addMessageListener() {\n window.addEventListener('message', (event) => {\n if (event.origin !== lmsSelectorUrl) {\n return;\n }\n const importObj = JSON.parse(event.data);\n const isGraded = importObj.isGraded !== false;\n try {\n courseController.setCourse(importObj.path_to_coursefile);\n langController.setLanguage(importObj.language);\n taskController.setSelection(importObj.link + '?lang=' + importObj.language);\n taskController.setIsGraded(isGraded);\n sendSuccess();\n window.focus();\n displayProblemSelectedMessage();\n } catch (error) {\n sendFailure(error.message);\n }\n }, false);\n }\n\n /**\n * Display a success message in Moodle that a problem was successfully selected.\n */\n function displayProblemSelectedMessage() {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': 'mumie_form_updated_selection',\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0],\n type: \"info\"\n });\n }).fail(notification.exception);\n });\n }\n\n return {\n init: function() {\n const gradingType = taskController.getGradingType();\n problemSelectorButton.onclick = function() {\n problemSelectorWindow = window.open(\n lmsSelectorUrl\n + '/lms-problem-selector?'\n + 'org='\n + mumieOrg\n + '&serverUrl='\n + encodeURIComponent(serverController.getSelectedServer().urlprefix)\n + '&problemLang='\n + langController.getSelectedLanguage()\n + '&origin=' + encodeURIComponent(window.location.origin)\n + '&uiLang=' + systemLanguage\n + '&gradingType=' + gradingType\n + '&multiCourse=true'\n , '_blank'\n );\n };\n\n window.onclose = function() {\n sendSuccess();\n };\n\n window.addEventListener(\"beforeunload\", function() {\n sendSuccess();\n }, false);\n\n addMessageListener();\n },\n disable: function() {\n problemSelectorButton.disabled = true;\n }\n };\n })();\n\n const courseController = (function() {\n const courseNameElem = document.getElementById(\"id_mumie_course\");\n const coursefileElem = document.getElementsByName(\"mumie_coursefile\")[0];\n\n\n /**\n * Update the hidden input field with the selected course's course file path\n *\n * @param {string} coursefile\n */\n function updateCoursefilePath(coursefile) {\n coursefileElem.value = coursefile;\n updateCourseName();\n }\n\n /**\n * Update displayed course name.\n */\n function updateCourseName() {\n const selectedCourse = courseController.getSelectedCourse();\n const selectedLanguage = langController.getSelectedLanguage();\n if (!selectedCourse || !selectedLanguage) {\n return;\n }\n courseNameElem.value = selectedCourse.name\n .find(translation => translation.language === selectedLanguage)?.value;\n }\n\n return {\n init: function() {\n updateCourseName();\n },\n getSelectedCourse: function() {\n const courses = serverController.getSelectedServer().courses;\n return courses.find(course => course.coursefile === coursefileElem.value);\n },\n updateCourseName: function() {\n updateCourseName();\n },\n setCourse: function(courseFile) {\n updateCoursefilePath(courseFile);\n }\n };\n })();\n\n const langController = (function() {\n const languageElem = document.getElementById(\"id_language\");\n\n /**\n * Check if the given language exists in the currently selected course.\n * @param {string} lang\n * @returns {boolean} Whether the language exists\n */\n function languageExists(lang) {\n return courseController.getSelectedCourse().languages.includes(lang);\n }\n return {\n getSelectedLanguage: function() {\n return languageElem.value;\n },\n setLanguage: function(lang) {\n if (!languageExists(lang)) {\n throw new Error(\"Selected language not available\");\n }\n languageElem.value = lang;\n courseController.updateCourseName();\n }\n };\n })();\n\n const taskController = (function() {\n const taskSelectionInput = document.getElementsByName(\"taskurl\")[0];\n const nameElem = document.getElementById(\"id_name\");\n const taskDisplayElement = document.getElementById(\"id_task_display_element\");\n const isGradedElem = document.getElementById('id_mumie_isgraded');\n\n\n /**\n * Update the activity's name in the input field\n */\n function updateName() {\n const newHeadline = getHeadline(taskController.getSelectedTask());\n if (!isCustomName()) {\n nameElem.value = newHeadline;\n }\n taskDisplayElement.value = newHeadline;\n }\n\n /**\n * Check whether the activity has a custom name\n *\n * @return {boolean} True, if there is no headline with that name in all tasks\n */\n function isCustomName() {\n if (nameElem.value.length === 0) {\n return false;\n }\n return !getAllHeadlines().includes(nameElem.value);\n }\n\n /**\n * Get the task's headline for the currently selected language\n * @param {Object} task\n * @returns {string|null} the headline\n */\n function getHeadline(task) {\n if (!task) {\n return null;\n }\n const selectedLanguage = langController.getSelectedLanguage();\n const headlineWrapper = task.headline.find(localHeadline => localHeadline.language === selectedLanguage);\n return headlineWrapper ? headlineWrapper.name : null;\n }\n\n /**\n * Get all tasks that are available on all servers\n *\n * @return {Object} Array containing all available tasks\n */\n function getAllTasks() {\n return serverController.getAllServers()\n .flatMap(server => server.courses)\n .flatMap(course => course.tasks);\n }\n\n /**\n * Get all possible headlines in all languages\n * @returns {Object} Array containing all headlines\n */\n function getAllHeadlines() {\n return getAllTasks().flatMap(task => task.headline)\n .map(headline => headline.name)\n .concat(courseController.getSelectedCourse().name.map(n => n.value));\n }\n\n /**\n * Add language parameter to the task's link to display content in the selected language\n * @param {Object} task\n * @returns {string}\n */\n function getLocalizedLinkFromTask(task) {\n return getLocalizedLink(task.link);\n }\n\n /**\n * Add language parameter to link\n * @param {string} link\n * @returns {string}\n */\n function getLocalizedLink(link) {\n return link + \"?lang=\" + langController.getSelectedLanguage();\n }\n\n /**\n * Form inputs related to grades should be disabled, if the MUMIE Task is not graded.\n */\n function updateGradeEditability() {\n const disabled = isGradedElem.value === '0';\n document.getElementById('id_points').disabled = disabled;\n document.getElementById('id_gradepass').disabled = disabled;\n document.getElementById('id_duedate_enabled').disabled = disabled;\n document.getElementById('id_gradecat').disabled = disabled;\n }\n\n /**\n * Get a task that links to a course's overview page\n * @param {Object} course\n * @returns {Object} task\n */\n function getPseudoTaskFromCourse(course) {\n var headline = [];\n for (var i in course.name) {\n var name = course.name[i];\n headline.push({\n \"name\": name.value,\n \"language\": name.language\n });\n }\n return {\n \"link\": course.link,\n \"headline\": headline\n };\n }\n\n return {\n init: function() {\n updateName();\n },\n getSelectedTask: function() {\n const selectedLink = taskSelectionInput.value;\n const selectedCourse = courseController.getSelectedCourse();\n if (!selectedCourse) {\n return null;\n }\n const tasks = selectedCourse\n .tasks\n .slice();\n tasks.push(getPseudoTaskFromCourse(selectedCourse));\n return tasks\n .find(task => getLocalizedLinkFromTask(task) === selectedLink);\n },\n setSelection: function(newSelection) {\n taskSelectionInput.value = newSelection;\n updateName();\n },\n setIsGraded: function(isGraded) {\n if (isGraded === null) {\n isGradedElem.value = null;\n }\n isGradedElem.value = isGraded ? '1' : '0';\n updateGradeEditability();\n },\n getGradingType: function() {\n const isGraded = isGradedElem.value;\n if (isGraded === '1') {\n return 'graded';\n } else if (isGraded === '0') {\n return 'ungraded';\n }\n return 'all';\n }\n };\n })();\n\n\n const multiTaskEditController = (function() {\n const propertySelectionInputs = document.getElementsByName(\"mumie_multi_edit_property\");\n const selectedTaskProperties = document.getElementsByName(\"mumie_selected_task_properties\")[0];\n let selectedTaskProp = [];\n const taskSelectionInputs = document.getElementsByName(\"mumie_multi_edit_task\");\n const selectedTasks = document.getElementsByName(\"mumie_selected_tasks\")[0];\n let selectedTaskIds = [];\n const sectionInputs = document.getElementsByName(\"mumie_multi_edit_section\");\n\n /**\n * Push an element to an array, if it's not already included.\n *\n * @param {string[]} array\n * @param {string} element\n */\n function pushIfNotExists(array, element) {\n if (!array.includes(element)) {\n array.push(element);\n }\n }\n\n /**\n * Set selection listeners for other MUMIE Tasks in the course.\n */\n function setTaskSelectionListeners() {\n taskSelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskIds = selectedTaskIds.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskIds.push(checkbox.value);\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n /**\n * Set selection listeners for properties to apply to MUMIE Tasks in the course.\n */\n function setPropertySelectionListeners() {\n propertySelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskProp = selectedTaskProp.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskProp.push(checkbox.value);\n }\n selectedTaskProperties.value = JSON.stringify(selectedTaskProp);\n };\n });\n }\n\n /**\n * Set selection listeners for entire section of MUMIE Tasks in the course\n */\n function setSectionSelectionListeners() {\n sectionInputs.forEach(function(sectionCheckbox) {\n sectionCheckbox.onchange = function() {\n if (!sectionCheckbox.checked) {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = false;\n selectedTaskIds = selectedTaskIds.filter(elem => taskCheckbox.value !== elem);\n }\n });\n } else {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = true;\n pushIfNotExists(selectedTaskIds, taskCheckbox.value);\n }\n });\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n return {\n init: function() {\n setTaskSelectionListeners();\n setPropertySelectionListeners();\n setSectionSelectionListeners();\n },\n };\n })();\n\n /**\n * Disable all dropdown menus and show notification\n * @param {string} errorKey\n */\n function disableDropDownMenus(errorKey) {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': errorKey,\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0] + \"\" + missingConfig.getAttribute(\"value\") + \"\",\n type: \"problem\"\n });\n }).fail(notification.exception);\n });\n serverController.disable();\n problemSelectorController.disable();\n }\n\n return {\n init: function(contextid, prbSelectorUrl, lang) {\n lmsSelectorUrl = prbSelectorUrl;\n systemLanguage = lang;\n const isEdit = document.getElementById(\"id_name\").getAttribute('value');\n const serverStructure = JSON.parse(document.getElementsByName('mumie_server_structure')[0].value);\n if (isEdit && !serverConfigExists()) {\n disableDropDownMenus('mumie_form_missing_server');\n } else if (!serverStructure.length) {\n disableDropDownMenus('mumie_form_no_server_conf');\n } else {\n serverController.init(serverStructure);\n courseController.init();\n taskController.init(isEdit);\n multiTaskEditController.init();\n problemSelectorController.init();\n }\n multiTaskEditController.init();\n if (addServerButton) {\n require(['auth_mumie/mumie_server_config'], function(MumieServer) {\n MumieServer.init(addServerButton, contextid);\n });\n }\n }\n };\n\n /**\n * Remove all child elements of a given html element\n * @param {Object} elem\n */\n function removeChildElems(elem) {\n while (elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n }\n\n /**\n * Check, if the flag for an existing config is set\n * @returns {boolean}\n */\n function serverConfigExists() {\n return document.getElementsByName(\"mumie_missing_config\")[0].getAttribute(\"value\") === \"\";\n }\n });\n"],"names":["define","lmsSelectorUrl","systemLanguage","serverStructure","serverDropDown","languageElem","propertySelectionInputs","selectedTaskProperties","selectedTaskProp","taskSelectionInputs","selectedTasks","selectedTaskIds","sectionInputs","addServerButton","document","getElementById","missingConfig","getElementsByName","serverController","init","structure","getSelectedServer","selectedServerName","options","selectedIndex","text","find","server","name","disable","disabled","elem","firstChild","removeChild","removeChildElems","getAllServers","problemSelectorController","problemSelectorWindow","problemSelectorButton","mumieOrg","value","sendResponse","response","postMessage","JSON","stringify","sendSuccess","message","success","addMessageListener","window","addEventListener","event","origin","importObj","parse","data","isGraded","courseController","setCourse","path_to_coursefile","langController","setLanguage","language","taskController","setSelection","link","setIsGraded","focus","require","str","notification","get_strings","component","done","s","addNotification","type","fail","exception","error","sendFailure","gradingType","getGradingType","onclick","open","encodeURIComponent","urlprefix","getSelectedLanguage","location","onclose","courseNameElem","coursefileElem","updateCourseName","selectedCourse","getSelectedCourse","selectedLanguage","translation","_selectedCourse$name$","courses","course","coursefile","courseFile","lang","languages","includes","languageExists","Error","taskSelectionInput","nameElem","taskDisplayElement","isGradedElem","updateName","newHeadline","task","headlineWrapper","headline","localHeadline","getHeadline","getSelectedTask","length","flatMap","tasks","map","concat","n","isCustomName","getLocalizedLinkFromTask","selectedLink","slice","push","i","getPseudoTaskFromCourse","newSelection","multiTaskEditController","forEach","checkbox","onchange","checked","filter","sectionCheckbox","taskCheckbox","array","element","getAttribute","disableDropDownMenus","errorKey","contextid","prbSelectorUrl","isEdit","MumieServer"],"mappings":"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"} \ No newline at end of file From d1b864c844f922c9563586193ca590f85935570b Mon Sep 17 00:00:00 2001 From: Tobias Goltz Date: Wed, 23 Mar 2022 10:48:30 +0100 Subject: [PATCH 3/5] Use dynamically defined role ids for graded roles --- amd/build/mod_form.min.js | 2 +- amd/build/mod_form.min.js.map | 2 +- classes/mumie_grader.php | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/amd/build/mod_form.min.js b/amd/build/mod_form.min.js index aed9d79..94ed465 100644 --- a/amd/build/mod_form.min.js +++ b/amd/build/mod_form.min.js @@ -1,3 +1,3 @@ -define("mod_mumie/mod_form",["jquery","core/templates","core/modal_factory","auth_mumie/mumie_server_config","core/ajax"],(function(){var lmsSelectorUrl,systemLanguage,serverStructure,serverDropDown,languageElem,propertySelectionInputs,selectedTaskProperties,selectedTaskProp,taskSelectionInputs,selectedTasks,selectedTaskIds,sectionInputs,addServerButton=document.getElementById("id_add_server_button"),missingConfig=document.getElementsByName("mumie_missing_config")[0],serverController=(serverDropDown=document.getElementById("id_server"),{init:function(structure){serverStructure=structure},getSelectedServer:function(){var selectedServerName=serverDropDown.options[serverDropDown.selectedIndex].text;return serverStructure.find((function(server){return server.name===selectedServerName}))},disable:function(){serverDropDown.disabled=!0,function(elem){for(;elem.firstChild;)elem.removeChild(elem.firstChild)}(serverDropDown)},getAllServers:function(){return serverStructure}}),problemSelectorController=function(){var problemSelectorWindow,problemSelectorButton=document.getElementById("id_prb_selector_btn"),mumieOrg=document.getElementsByName("mumie_org")[0].value;function sendResponse(response){problemSelectorWindow&&problemSelectorWindow.postMessage(JSON.stringify(response),lmsSelectorUrl)}function sendSuccess(){var message=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";sendResponse({success:!0,message:message})}function addMessageListener(){window.addEventListener("message",(function(event){if(event.origin===lmsSelectorUrl){var importObj=JSON.parse(event.data),isGraded=!1!==importObj.isGraded;try{courseController.setCourse(importObj.path_to_coursefile),langController.setLanguage(importObj.language),taskController.setSelection(importObj.link+"?lang="+importObj.language),taskController.setIsGraded(isGraded),sendSuccess(),window.focus(),require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:"mumie_form_updated_selection",component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0],type:"info"})})).fail(notification.exception)}))}catch(error){!function(){sendResponse({success:!1,message:arguments.length>0&&void 0!==arguments[0]?arguments[0]:""})}(error.message)}}}),!1)}return{init:function(){var gradingType=taskController.getGradingType();problemSelectorButton.onclick=function(){problemSelectorWindow=window.open(lmsSelectorUrl+"/lms-problem-selector?org="+mumieOrg+"&serverUrl="+encodeURIComponent(serverController.getSelectedServer().urlprefix)+"&problemLang="+langController.getSelectedLanguage()+"&origin="+encodeURIComponent(window.location.origin)+"&uiLang="+systemLanguage+"&gradingType="+gradingType+"&multiCourse=true","_blank")},window.onclose=function(){sendSuccess()},window.addEventListener("beforeunload",(function(){sendSuccess()}),!1),addMessageListener()},disable:function(){problemSelectorButton.disabled=!0}}}(),courseController=function(){var courseNameElem=document.getElementById("id_mumie_course"),coursefileElem=document.getElementsByName("mumie_coursefile")[0];function _updateCourseName(){var _selectedCourse$name$,selectedCourse=courseController.getSelectedCourse(),selectedLanguage=langController.getSelectedLanguage();selectedCourse&&selectedLanguage&&(courseNameElem.value=null===(_selectedCourse$name$=selectedCourse.name.find((function(translation){return translation.language===selectedLanguage})))||void 0===_selectedCourse$name$?void 0:_selectedCourse$name$.value)}return{init:function(){_updateCourseName()},getSelectedCourse:function(){return serverController.getSelectedServer().courses.find((function(course){return course.coursefile===coursefileElem.value}))},updateCourseName:function(){_updateCourseName()},setCourse:function(courseFile){var coursefile;coursefile=courseFile,coursefileElem.value=coursefile,_updateCourseName()}}}(),langController=(languageElem=document.getElementById("id_language"),{getSelectedLanguage:function(){return languageElem.value},setLanguage:function(lang){if(!function(lang){return courseController.getSelectedCourse().languages.includes(lang)}(lang))throw new Error("Selected language not available");languageElem.value=lang,courseController.updateCourseName()}}),taskController=function(){var taskSelectionInput=document.getElementsByName("taskurl")[0],nameElem=document.getElementById("id_name"),taskDisplayElement=document.getElementById("id_task_display_element"),isGradedElem=document.getElementById("id_mumie_isgraded");function updateName(){var newHeadline=function(task){if(!task)return null;var selectedLanguage=langController.getSelectedLanguage(),headlineWrapper=task.headline.find((function(localHeadline){return localHeadline.language===selectedLanguage}));return headlineWrapper?headlineWrapper.name:null}(taskController.getSelectedTask());(function(){if(0===nameElem.value.length)return!1;return!serverController.getAllServers().flatMap((function(server){return server.courses})).flatMap((function(course){return course.tasks})).flatMap((function(task){return task.headline})).map((function(headline){return headline.name})).concat(courseController.getSelectedCourse().name.map((function(n){return n.value}))).includes(nameElem.value)})()||(nameElem.value=newHeadline),taskDisplayElement.value=newHeadline}function getLocalizedLinkFromTask(task){return task.link+"?lang="+langController.getSelectedLanguage()}return{init:function(){updateName()},getSelectedTask:function(){var selectedLink=taskSelectionInput.value,selectedCourse=courseController.getSelectedCourse();if(!selectedCourse)return null;var tasks=selectedCourse.tasks.slice();return tasks.push(function(course){var headline=[];for(var i in course.name){var name=course.name[i];headline.push({name:name.value,language:name.language})}return{link:course.link,headline:headline}}(selectedCourse)),tasks.find((function(task){return getLocalizedLinkFromTask(task)===selectedLink}))},setSelection:function(newSelection){taskSelectionInput.value=newSelection,updateName()},setIsGraded:function(isGraded){var disabled;null===isGraded&&(isGradedElem.value=null),isGradedElem.value=isGraded?"1":"0",disabled="0"===isGradedElem.value,document.getElementById("id_points").disabled=disabled,document.getElementById("id_gradepass").disabled=disabled,document.getElementById("id_duedate_enabled").disabled=disabled,document.getElementById("id_gradecat").disabled=disabled},getGradingType:function(){var isGraded=isGradedElem.value;return"1"===isGraded?"graded":"0"===isGraded?"ungraded":"all"}}}(),multiTaskEditController=(propertySelectionInputs=document.getElementsByName("mumie_multi_edit_property"),selectedTaskProperties=document.getElementsByName("mumie_selected_task_properties")[0],selectedTaskProp=[],taskSelectionInputs=document.getElementsByName("mumie_multi_edit_task"),selectedTasks=document.getElementsByName("mumie_selected_tasks")[0],selectedTaskIds=[],sectionInputs=document.getElementsByName("mumie_multi_edit_section"),{init:function(){taskSelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskIds.push(checkbox.value):selectedTaskIds=selectedTaskIds.filter((function(elem){return elem!==checkbox.value})),selectedTasks.value=JSON.stringify(selectedTaskIds)}})),propertySelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskProp.push(checkbox.value):selectedTaskProp=selectedTaskProp.filter((function(elem){return elem!==checkbox.value})),selectedTaskProperties.value=JSON.stringify(selectedTaskProp)}})),sectionInputs.forEach((function(sectionCheckbox){sectionCheckbox.onchange=function(){sectionCheckbox.checked?taskSelectionInputs.forEach((function(taskCheckbox){var array,element;taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!0,array=selectedTaskIds,element=taskCheckbox.value,array.includes(element)||array.push(element))})):taskSelectionInputs.forEach((function(taskCheckbox){taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!1,selectedTaskIds=selectedTaskIds.filter((function(elem){return taskCheckbox.value!==elem})))})),selectedTasks.value=JSON.stringify(selectedTaskIds)}}))}});function disableDropDownMenus(errorKey){require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:errorKey,component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0]+""+missingConfig.getAttribute("value")+"",type:"problem"})})).fail(notification.exception)})),serverController.disable(),problemSelectorController.disable()}return{init:function(contextid,prbSelectorUrl,lang){lmsSelectorUrl=prbSelectorUrl,systemLanguage=lang;var isEdit=document.getElementById("id_name").getAttribute("value"),serverStructure=JSON.parse(document.getElementsByName("mumie_server_structure")[0].value);isEdit&&""!==document.getElementsByName("mumie_missing_config")[0].getAttribute("value")?disableDropDownMenus("mumie_form_missing_server"):serverStructure.length?(serverController.init(serverStructure),courseController.init(),taskController.init(isEdit),multiTaskEditController.init(),problemSelectorController.init()):disableDropDownMenus("mumie_form_no_server_conf"),multiTaskEditController.init(),addServerButton&&require(["auth_mumie/mumie_server_config"],(function(MumieServer){MumieServer.init(addServerButton,contextid)}))}}})); +define("mod_mumie/mod_form",["jquery","core/templates","core/modal_factory","auth_mumie/mumie_server_config","core/ajax"],(function(){const addServerButton=document.getElementById("id_add_server_button"),missingConfig=document.getElementsByName("mumie_missing_config")[0];let lmsSelectorUrl,systemLanguage;const serverController=function(){let serverStructure;const serverDropDown=document.getElementById("id_server");return{init:function(structure){serverStructure=structure},getSelectedServer:function(){const selectedServerName=serverDropDown.options[serverDropDown.selectedIndex].text;return serverStructure.find((server=>server.name===selectedServerName))},disable:function(){serverDropDown.disabled=!0,function(elem){for(;elem.firstChild;)elem.removeChild(elem.firstChild)}(serverDropDown)},getAllServers:function(){return serverStructure}}}(),problemSelectorController=function(){const problemSelectorButton=document.getElementById("id_prb_selector_btn");let problemSelectorWindow;const mumieOrg=document.getElementsByName("mumie_org")[0].value;function sendResponse(response){problemSelectorWindow&&problemSelectorWindow.postMessage(JSON.stringify(response),lmsSelectorUrl)}function sendSuccess(){let message=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";sendResponse({success:!0,message:message})}function addMessageListener(){window.addEventListener("message",(event=>{if(event.origin!==lmsSelectorUrl)return;const importObj=JSON.parse(event.data),isGraded=!1!==importObj.isGraded;try{courseController.setCourse(importObj.path_to_coursefile),langController.setLanguage(importObj.language),taskController.setSelection(importObj.link+"?lang="+importObj.language),taskController.setIsGraded(isGraded),sendSuccess(),window.focus(),require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:"mumie_form_updated_selection",component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0],type:"info"})})).fail(notification.exception)}))}catch(error){!function(){sendResponse({success:!1,message:arguments.length>0&&void 0!==arguments[0]?arguments[0]:""})}(error.message)}}),!1)}return{init:function(){const gradingType=taskController.getGradingType();problemSelectorButton.onclick=function(){problemSelectorWindow=window.open(lmsSelectorUrl+"/lms-problem-selector?org="+mumieOrg+"&serverUrl="+encodeURIComponent(serverController.getSelectedServer().urlprefix)+"&problemLang="+langController.getSelectedLanguage()+"&origin="+encodeURIComponent(window.location.origin)+"&uiLang="+systemLanguage+"&gradingType="+gradingType+"&multiCourse=true","_blank")},window.onclose=function(){sendSuccess()},window.addEventListener("beforeunload",(function(){sendSuccess()}),!1),addMessageListener()},disable:function(){problemSelectorButton.disabled=!0}}}(),courseController=function(){const courseNameElem=document.getElementById("id_mumie_course"),coursefileElem=document.getElementsByName("mumie_coursefile")[0];function updateCourseName(){var _selectedCourse$name$;const selectedCourse=courseController.getSelectedCourse(),selectedLanguage=langController.getSelectedLanguage();selectedCourse&&selectedLanguage&&(courseNameElem.value=null===(_selectedCourse$name$=selectedCourse.name.find((translation=>translation.language===selectedLanguage)))||void 0===_selectedCourse$name$?void 0:_selectedCourse$name$.value)}return{init:function(){updateCourseName()},getSelectedCourse:function(){return serverController.getSelectedServer().courses.find((course=>course.coursefile===coursefileElem.value))},updateCourseName:function(){updateCourseName()},setCourse:function(courseFile){var coursefile;coursefile=courseFile,coursefileElem.value=coursefile,updateCourseName()}}}(),langController=function(){const languageElem=document.getElementById("id_language");return{getSelectedLanguage:function(){return languageElem.value},setLanguage:function(lang){if(!function(lang){return courseController.getSelectedCourse().languages.includes(lang)}(lang))throw new Error("Selected language not available");languageElem.value=lang,courseController.updateCourseName()}}}(),taskController=function(){const taskSelectionInput=document.getElementsByName("taskurl")[0],nameElem=document.getElementById("id_name"),taskDisplayElement=document.getElementById("id_task_display_element"),isGradedElem=document.getElementById("id_mumie_isgraded");function updateName(){const newHeadline=function(task){if(!task)return null;const selectedLanguage=langController.getSelectedLanguage(),headlineWrapper=task.headline.find((localHeadline=>localHeadline.language===selectedLanguage));return headlineWrapper?headlineWrapper.name:null}(taskController.getSelectedTask());(function(){if(0===nameElem.value.length)return!1;return!serverController.getAllServers().flatMap((server=>server.courses)).flatMap((course=>course.tasks)).flatMap((task=>task.headline)).map((headline=>headline.name)).concat(courseController.getSelectedCourse().name.map((n=>n.value))).includes(nameElem.value)})()||(nameElem.value=newHeadline),taskDisplayElement.value=newHeadline}function getLocalizedLinkFromTask(task){return task.link+"?lang="+langController.getSelectedLanguage()}return{init:function(){updateName()},getSelectedTask:function(){const selectedLink=taskSelectionInput.value,selectedCourse=courseController.getSelectedCourse();if(!selectedCourse)return null;const tasks=selectedCourse.tasks.slice();return tasks.push(function(course){var headline=[];for(var i in course.name){var name=course.name[i];headline.push({name:name.value,language:name.language})}return{link:course.link,headline:headline}}(selectedCourse)),tasks.find((task=>getLocalizedLinkFromTask(task)===selectedLink))},setSelection:function(newSelection){taskSelectionInput.value=newSelection,updateName()},setIsGraded:function(isGraded){null===isGraded&&(isGradedElem.value=null),isGradedElem.value=isGraded?"1":"0",function(){const disabled="0"===isGradedElem.value;document.getElementById("id_points").disabled=disabled,document.getElementById("id_gradepass").disabled=disabled,document.getElementById("id_duedate_enabled").disabled=disabled,document.getElementById("id_gradecat").disabled=disabled}()},getGradingType:function(){const isGraded=isGradedElem.value;return"1"===isGraded?"graded":"0"===isGraded?"ungraded":"all"}}}(),multiTaskEditController=function(){const propertySelectionInputs=document.getElementsByName("mumie_multi_edit_property"),selectedTaskProperties=document.getElementsByName("mumie_selected_task_properties")[0];let selectedTaskProp=[];const taskSelectionInputs=document.getElementsByName("mumie_multi_edit_task"),selectedTasks=document.getElementsByName("mumie_selected_tasks")[0];let selectedTaskIds=[];const sectionInputs=document.getElementsByName("mumie_multi_edit_section");return{init:function(){taskSelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskIds.push(checkbox.value):selectedTaskIds=selectedTaskIds.filter((elem=>elem!==checkbox.value)),selectedTasks.value=JSON.stringify(selectedTaskIds)}})),propertySelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskProp.push(checkbox.value):selectedTaskProp=selectedTaskProp.filter((elem=>elem!==checkbox.value)),selectedTaskProperties.value=JSON.stringify(selectedTaskProp)}})),sectionInputs.forEach((function(sectionCheckbox){sectionCheckbox.onchange=function(){sectionCheckbox.checked?taskSelectionInputs.forEach((function(taskCheckbox){var array,element;taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!0,array=selectedTaskIds,element=taskCheckbox.value,array.includes(element)||array.push(element))})):taskSelectionInputs.forEach((function(taskCheckbox){taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!1,selectedTaskIds=selectedTaskIds.filter((elem=>taskCheckbox.value!==elem)))})),selectedTasks.value=JSON.stringify(selectedTaskIds)}}))}}}();function disableDropDownMenus(errorKey){require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:errorKey,component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0]+""+missingConfig.getAttribute("value")+"",type:"problem"})})).fail(notification.exception)})),serverController.disable(),problemSelectorController.disable()}return{init:function(contextid,prbSelectorUrl,lang){lmsSelectorUrl=prbSelectorUrl,systemLanguage=lang;const isEdit=document.getElementById("id_name").getAttribute("value"),serverStructure=JSON.parse(document.getElementsByName("mumie_server_structure")[0].value);isEdit&&""!==document.getElementsByName("mumie_missing_config")[0].getAttribute("value")?disableDropDownMenus("mumie_form_missing_server"):serverStructure.length?(serverController.init(serverStructure),courseController.init(),taskController.init(isEdit),multiTaskEditController.init(),problemSelectorController.init()):disableDropDownMenus("mumie_form_no_server_conf"),multiTaskEditController.init(),addServerButton&&require(["auth_mumie/mumie_server_config"],(function(MumieServer){MumieServer.init(addServerButton,contextid)}))}}})); //# sourceMappingURL=mod_form.min.js.map \ No newline at end of file diff --git a/amd/build/mod_form.min.js.map b/amd/build/mod_form.min.js.map index 6848302..add6d4f 100644 --- a/amd/build/mod_form.min.js.map +++ b/amd/build/mod_form.min.js.map @@ -1 +1 @@ -{"version":3,"file":"mod_form.min.js","sources":["../src/mod_form.js"],"sourcesContent":["define(['jquery', 'core/templates', 'core/modal_factory', 'auth_mumie/mumie_server_config', 'core/ajax'],\n function() {\n const addServerButton = document.getElementById(\"id_add_server_button\");\n const missingConfig = document.getElementsByName(\"mumie_missing_config\")[0];\n let lmsSelectorUrl;\n let systemLanguage;\n const serverController = (function() {\n let serverStructure;\n const serverDropDown = document.getElementById(\"id_server\");\n\n return {\n init: function(structure) {\n serverStructure = structure;\n },\n getSelectedServer: function() {\n const selectedServerName = serverDropDown.options[serverDropDown.selectedIndex].text;\n return serverStructure.find(server => server.name === selectedServerName);\n },\n disable: function() {\n serverDropDown.disabled = true;\n removeChildElems(serverDropDown);\n },\n getAllServers: function() {\n return serverStructure;\n }\n };\n })();\n\n const problemSelectorController = (function() {\n const problemSelectorButton = document.getElementById('id_prb_selector_btn');\n let problemSelectorWindow;\n const mumieOrg = document.getElementsByName('mumie_org')[0].value;\n\n /**\n * Send a message to the problem selector window.\n *\n * Don't do anything, if there is no problem selector window.\n * @param {Object} response\n */\n function sendResponse(response) {\n if (!problemSelectorWindow) {\n return;\n }\n problemSelectorWindow.postMessage(JSON.stringify(response), lmsSelectorUrl);\n }\n\n /**\n * Send a success message to problem selector window\n * @param {string} message\n */\n function sendSuccess(message = '') {\n sendResponse({\n success: true,\n message: message\n });\n }\n\n /**\n * Send a failure message to problem selector window\n * @param {string} message\n */\n function sendFailure(message = '') {\n sendResponse({\n success: false,\n message: message\n });\n }\n\n /**\n * Add an event listener that accepts messages from LMS-Browser and updates the selected problem.\n */\n function addMessageListener() {\n window.addEventListener('message', (event) => {\n if (event.origin !== lmsSelectorUrl) {\n return;\n }\n const importObj = JSON.parse(event.data);\n const isGraded = importObj.isGraded !== false;\n try {\n courseController.setCourse(importObj.path_to_coursefile);\n langController.setLanguage(importObj.language);\n taskController.setSelection(importObj.link + '?lang=' + importObj.language);\n taskController.setIsGraded(isGraded);\n sendSuccess();\n window.focus();\n displayProblemSelectedMessage();\n } catch (error) {\n sendFailure(error.message);\n }\n }, false);\n }\n\n /**\n * Display a success message in Moodle that a problem was successfully selected.\n */\n function displayProblemSelectedMessage() {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': 'mumie_form_updated_selection',\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0],\n type: \"info\"\n });\n }).fail(notification.exception);\n });\n }\n\n return {\n init: function() {\n const gradingType = taskController.getGradingType();\n problemSelectorButton.onclick = function() {\n problemSelectorWindow = window.open(\n lmsSelectorUrl\n + '/lms-problem-selector?'\n + 'org='\n + mumieOrg\n + '&serverUrl='\n + encodeURIComponent(serverController.getSelectedServer().urlprefix)\n + '&problemLang='\n + langController.getSelectedLanguage()\n + '&origin=' + encodeURIComponent(window.location.origin)\n + '&uiLang=' + systemLanguage\n + '&gradingType=' + gradingType\n + '&multiCourse=true'\n , '_blank'\n );\n };\n\n window.onclose = function() {\n sendSuccess();\n };\n\n window.addEventListener(\"beforeunload\", function() {\n sendSuccess();\n }, false);\n\n addMessageListener();\n },\n disable: function() {\n problemSelectorButton.disabled = true;\n }\n };\n })();\n\n const courseController = (function() {\n const courseNameElem = document.getElementById(\"id_mumie_course\");\n const coursefileElem = document.getElementsByName(\"mumie_coursefile\")[0];\n\n\n /**\n * Update the hidden input field with the selected course's course file path\n *\n * @param {string} coursefile\n */\n function updateCoursefilePath(coursefile) {\n coursefileElem.value = coursefile;\n updateCourseName();\n }\n\n /**\n * Update displayed course name.\n */\n function updateCourseName() {\n const selectedCourse = courseController.getSelectedCourse();\n const selectedLanguage = langController.getSelectedLanguage();\n if (!selectedCourse || !selectedLanguage) {\n return;\n }\n courseNameElem.value = selectedCourse.name\n .find(translation => translation.language === selectedLanguage)?.value;\n }\n\n return {\n init: function() {\n updateCourseName();\n },\n getSelectedCourse: function() {\n const courses = serverController.getSelectedServer().courses;\n return courses.find(course => course.coursefile === coursefileElem.value);\n },\n updateCourseName: function() {\n updateCourseName();\n },\n setCourse: function(courseFile) {\n updateCoursefilePath(courseFile);\n }\n };\n })();\n\n const langController = (function() {\n const languageElem = document.getElementById(\"id_language\");\n\n /**\n * Check if the given language exists in the currently selected course.\n * @param {string} lang\n * @returns {boolean} Whether the language exists\n */\n function languageExists(lang) {\n return courseController.getSelectedCourse().languages.includes(lang);\n }\n return {\n getSelectedLanguage: function() {\n return languageElem.value;\n },\n setLanguage: function(lang) {\n if (!languageExists(lang)) {\n throw new Error(\"Selected language not available\");\n }\n languageElem.value = lang;\n courseController.updateCourseName();\n }\n };\n })();\n\n const taskController = (function() {\n const taskSelectionInput = document.getElementsByName(\"taskurl\")[0];\n const nameElem = document.getElementById(\"id_name\");\n const taskDisplayElement = document.getElementById(\"id_task_display_element\");\n const isGradedElem = document.getElementById('id_mumie_isgraded');\n\n\n /**\n * Update the activity's name in the input field\n */\n function updateName() {\n const newHeadline = getHeadline(taskController.getSelectedTask());\n if (!isCustomName()) {\n nameElem.value = newHeadline;\n }\n taskDisplayElement.value = newHeadline;\n }\n\n /**\n * Check whether the activity has a custom name\n *\n * @return {boolean} True, if there is no headline with that name in all tasks\n */\n function isCustomName() {\n if (nameElem.value.length === 0) {\n return false;\n }\n return !getAllHeadlines().includes(nameElem.value);\n }\n\n /**\n * Get the task's headline for the currently selected language\n * @param {Object} task\n * @returns {string|null} the headline\n */\n function getHeadline(task) {\n if (!task) {\n return null;\n }\n const selectedLanguage = langController.getSelectedLanguage();\n const headlineWrapper = task.headline.find(localHeadline => localHeadline.language === selectedLanguage);\n return headlineWrapper ? headlineWrapper.name : null;\n }\n\n /**\n * Get all tasks that are available on all servers\n *\n * @return {Object} Array containing all available tasks\n */\n function getAllTasks() {\n return serverController.getAllServers()\n .flatMap(server => server.courses)\n .flatMap(course => course.tasks);\n }\n\n /**\n * Get all possible headlines in all languages\n * @returns {Object} Array containing all headlines\n */\n function getAllHeadlines() {\n return getAllTasks().flatMap(task => task.headline)\n .map(headline => headline.name)\n .concat(courseController.getSelectedCourse().name.map(n => n.value));\n }\n\n /**\n * Add language parameter to the task's link to display content in the selected language\n * @param {Object} task\n * @returns {string}\n */\n function getLocalizedLinkFromTask(task) {\n return getLocalizedLink(task.link);\n }\n\n /**\n * Add language parameter to link\n * @param {string} link\n * @returns {string}\n */\n function getLocalizedLink(link) {\n return link + \"?lang=\" + langController.getSelectedLanguage();\n }\n\n /**\n * Form inputs related to grades should be disabled, if the MUMIE Task is not graded.\n */\n function updateGradeEditability() {\n const disabled = isGradedElem.value === '0';\n document.getElementById('id_points').disabled = disabled;\n document.getElementById('id_gradepass').disabled = disabled;\n document.getElementById('id_duedate_enabled').disabled = disabled;\n document.getElementById('id_gradecat').disabled = disabled;\n }\n\n /**\n * Get a task that links to a course's overview page\n * @param {Object} course\n * @returns {Object} task\n */\n function getPseudoTaskFromCourse(course) {\n var headline = [];\n for (var i in course.name) {\n var name = course.name[i];\n headline.push({\n \"name\": name.value,\n \"language\": name.language\n });\n }\n return {\n \"link\": course.link,\n \"headline\": headline\n };\n }\n\n return {\n init: function() {\n updateName();\n },\n getSelectedTask: function() {\n const selectedLink = taskSelectionInput.value;\n const selectedCourse = courseController.getSelectedCourse();\n if (!selectedCourse) {\n return null;\n }\n const tasks = selectedCourse\n .tasks\n .slice();\n tasks.push(getPseudoTaskFromCourse(selectedCourse));\n return tasks\n .find(task => getLocalizedLinkFromTask(task) === selectedLink);\n },\n setSelection: function(newSelection) {\n taskSelectionInput.value = newSelection;\n updateName();\n },\n setIsGraded: function(isGraded) {\n if (isGraded === null) {\n isGradedElem.value = null;\n }\n isGradedElem.value = isGraded ? '1' : '0';\n updateGradeEditability();\n },\n getGradingType: function() {\n const isGraded = isGradedElem.value;\n if (isGraded === '1') {\n return 'graded';\n } else if (isGraded === '0') {\n return 'ungraded';\n }\n return 'all';\n }\n };\n })();\n\n\n const multiTaskEditController = (function() {\n const propertySelectionInputs = document.getElementsByName(\"mumie_multi_edit_property\");\n const selectedTaskProperties = document.getElementsByName(\"mumie_selected_task_properties\")[0];\n let selectedTaskProp = [];\n const taskSelectionInputs = document.getElementsByName(\"mumie_multi_edit_task\");\n const selectedTasks = document.getElementsByName(\"mumie_selected_tasks\")[0];\n let selectedTaskIds = [];\n const sectionInputs = document.getElementsByName(\"mumie_multi_edit_section\");\n\n /**\n * Push an element to an array, if it's not already included.\n *\n * @param {string[]} array\n * @param {string} element\n */\n function pushIfNotExists(array, element) {\n if (!array.includes(element)) {\n array.push(element);\n }\n }\n\n /**\n * Set selection listeners for other MUMIE Tasks in the course.\n */\n function setTaskSelectionListeners() {\n taskSelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskIds = selectedTaskIds.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskIds.push(checkbox.value);\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n /**\n * Set selection listeners for properties to apply to MUMIE Tasks in the course.\n */\n function setPropertySelectionListeners() {\n propertySelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskProp = selectedTaskProp.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskProp.push(checkbox.value);\n }\n selectedTaskProperties.value = JSON.stringify(selectedTaskProp);\n };\n });\n }\n\n /**\n * Set selection listeners for entire section of MUMIE Tasks in the course\n */\n function setSectionSelectionListeners() {\n sectionInputs.forEach(function(sectionCheckbox) {\n sectionCheckbox.onchange = function() {\n if (!sectionCheckbox.checked) {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = false;\n selectedTaskIds = selectedTaskIds.filter(elem => taskCheckbox.value !== elem);\n }\n });\n } else {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = true;\n pushIfNotExists(selectedTaskIds, taskCheckbox.value);\n }\n });\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n return {\n init: function() {\n setTaskSelectionListeners();\n setPropertySelectionListeners();\n setSectionSelectionListeners();\n },\n };\n })();\n\n /**\n * Disable all dropdown menus and show notification\n * @param {string} errorKey\n */\n function disableDropDownMenus(errorKey) {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': errorKey,\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0] + \"\" + missingConfig.getAttribute(\"value\") + \"\",\n type: \"problem\"\n });\n }).fail(notification.exception);\n });\n serverController.disable();\n problemSelectorController.disable();\n }\n\n return {\n init: function(contextid, prbSelectorUrl, lang) {\n lmsSelectorUrl = prbSelectorUrl;\n systemLanguage = lang;\n const isEdit = document.getElementById(\"id_name\").getAttribute('value');\n const serverStructure = JSON.parse(document.getElementsByName('mumie_server_structure')[0].value);\n if (isEdit && !serverConfigExists()) {\n disableDropDownMenus('mumie_form_missing_server');\n } else if (!serverStructure.length) {\n disableDropDownMenus('mumie_form_no_server_conf');\n } else {\n serverController.init(serverStructure);\n courseController.init();\n taskController.init(isEdit);\n multiTaskEditController.init();\n problemSelectorController.init();\n }\n multiTaskEditController.init();\n if (addServerButton) {\n require(['auth_mumie/mumie_server_config'], function(MumieServer) {\n MumieServer.init(addServerButton, contextid);\n });\n }\n }\n };\n\n /**\n * Remove all child elements of a given html element\n * @param {Object} elem\n */\n function removeChildElems(elem) {\n while (elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n }\n\n /**\n * Check, if the flag for an existing config is set\n * @returns {boolean}\n */\n function serverConfigExists() {\n return document.getElementsByName(\"mumie_missing_config\")[0].getAttribute(\"value\") === \"\";\n }\n });\n"],"names":["define","lmsSelectorUrl","systemLanguage","serverStructure","serverDropDown","languageElem","propertySelectionInputs","selectedTaskProperties","selectedTaskProp","taskSelectionInputs","selectedTasks","selectedTaskIds","sectionInputs","addServerButton","document","getElementById","missingConfig","getElementsByName","serverController","init","structure","getSelectedServer","selectedServerName","options","selectedIndex","text","find","server","name","disable","disabled","elem","firstChild","removeChild","removeChildElems","getAllServers","problemSelectorController","problemSelectorWindow","problemSelectorButton","mumieOrg","value","sendResponse","response","postMessage","JSON","stringify","sendSuccess","message","success","addMessageListener","window","addEventListener","event","origin","importObj","parse","data","isGraded","courseController","setCourse","path_to_coursefile","langController","setLanguage","language","taskController","setSelection","link","setIsGraded","focus","require","str","notification","get_strings","component","done","s","addNotification","type","fail","exception","error","sendFailure","gradingType","getGradingType","onclick","open","encodeURIComponent","urlprefix","getSelectedLanguage","location","onclose","courseNameElem","coursefileElem","updateCourseName","selectedCourse","getSelectedCourse","selectedLanguage","translation","_selectedCourse$name$","courses","course","coursefile","courseFile","lang","languages","includes","languageExists","Error","taskSelectionInput","nameElem","taskDisplayElement","isGradedElem","updateName","newHeadline","task","headlineWrapper","headline","localHeadline","getHeadline","getSelectedTask","length","flatMap","tasks","map","concat","n","isCustomName","getLocalizedLinkFromTask","selectedLink","slice","push","i","getPseudoTaskFromCourse","newSelection","multiTaskEditController","forEach","checkbox","onchange","checked","filter","sectionCheckbox","taskCheckbox","array","element","getAttribute","disableDropDownMenus","errorKey","contextid","prbSelectorUrl","isEdit","MumieServer"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"mod_form.min.js","sources":["../src/mod_form.js"],"sourcesContent":["define(['jquery', 'core/templates', 'core/modal_factory', 'auth_mumie/mumie_server_config', 'core/ajax'],\n function() {\n const addServerButton = document.getElementById(\"id_add_server_button\");\n const missingConfig = document.getElementsByName(\"mumie_missing_config\")[0];\n let lmsSelectorUrl;\n let systemLanguage;\n const serverController = (function() {\n let serverStructure;\n const serverDropDown = document.getElementById(\"id_server\");\n\n return {\n init: function(structure) {\n serverStructure = structure;\n },\n getSelectedServer: function() {\n const selectedServerName = serverDropDown.options[serverDropDown.selectedIndex].text;\n return serverStructure.find(server => server.name === selectedServerName);\n },\n disable: function() {\n serverDropDown.disabled = true;\n removeChildElems(serverDropDown);\n },\n getAllServers: function() {\n return serverStructure;\n }\n };\n })();\n\n const problemSelectorController = (function() {\n const problemSelectorButton = document.getElementById('id_prb_selector_btn');\n let problemSelectorWindow;\n const mumieOrg = document.getElementsByName('mumie_org')[0].value;\n\n /**\n * Send a message to the problem selector window.\n *\n * Don't do anything, if there is no problem selector window.\n * @param {Object} response\n */\n function sendResponse(response) {\n if (!problemSelectorWindow) {\n return;\n }\n problemSelectorWindow.postMessage(JSON.stringify(response), lmsSelectorUrl);\n }\n\n /**\n * Send a success message to problem selector window\n * @param {string} message\n */\n function sendSuccess(message = '') {\n sendResponse({\n success: true,\n message: message\n });\n }\n\n /**\n * Send a failure message to problem selector window\n * @param {string} message\n */\n function sendFailure(message = '') {\n sendResponse({\n success: false,\n message: message\n });\n }\n\n /**\n * Add an event listener that accepts messages from LMS-Browser and updates the selected problem.\n */\n function addMessageListener() {\n window.addEventListener('message', (event) => {\n if (event.origin !== lmsSelectorUrl) {\n return;\n }\n const importObj = JSON.parse(event.data);\n const isGraded = importObj.isGraded !== false;\n try {\n courseController.setCourse(importObj.path_to_coursefile);\n langController.setLanguage(importObj.language);\n taskController.setSelection(importObj.link + '?lang=' + importObj.language);\n taskController.setIsGraded(isGraded);\n sendSuccess();\n window.focus();\n displayProblemSelectedMessage();\n } catch (error) {\n sendFailure(error.message);\n }\n }, false);\n }\n\n /**\n * Display a success message in Moodle that a problem was successfully selected.\n */\n function displayProblemSelectedMessage() {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': 'mumie_form_updated_selection',\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0],\n type: \"info\"\n });\n }).fail(notification.exception);\n });\n }\n\n return {\n init: function() {\n const gradingType = taskController.getGradingType();\n problemSelectorButton.onclick = function() {\n problemSelectorWindow = window.open(\n lmsSelectorUrl\n + '/lms-problem-selector?'\n + 'org='\n + mumieOrg\n + '&serverUrl='\n + encodeURIComponent(serverController.getSelectedServer().urlprefix)\n + '&problemLang='\n + langController.getSelectedLanguage()\n + '&origin=' + encodeURIComponent(window.location.origin)\n + '&uiLang=' + systemLanguage\n + '&gradingType=' + gradingType\n + '&multiCourse=true'\n , '_blank'\n );\n };\n\n window.onclose = function() {\n sendSuccess();\n };\n\n window.addEventListener(\"beforeunload\", function() {\n sendSuccess();\n }, false);\n\n addMessageListener();\n },\n disable: function() {\n problemSelectorButton.disabled = true;\n }\n };\n })();\n\n const courseController = (function() {\n const courseNameElem = document.getElementById(\"id_mumie_course\");\n const coursefileElem = document.getElementsByName(\"mumie_coursefile\")[0];\n\n\n /**\n * Update the hidden input field with the selected course's course file path\n *\n * @param {string} coursefile\n */\n function updateCoursefilePath(coursefile) {\n coursefileElem.value = coursefile;\n updateCourseName();\n }\n\n /**\n * Update displayed course name.\n */\n function updateCourseName() {\n const selectedCourse = courseController.getSelectedCourse();\n const selectedLanguage = langController.getSelectedLanguage();\n if (!selectedCourse || !selectedLanguage) {\n return;\n }\n courseNameElem.value = selectedCourse.name\n .find(translation => translation.language === selectedLanguage)?.value;\n }\n\n return {\n init: function() {\n updateCourseName();\n },\n getSelectedCourse: function() {\n const courses = serverController.getSelectedServer().courses;\n return courses.find(course => course.coursefile === coursefileElem.value);\n },\n updateCourseName: function() {\n updateCourseName();\n },\n setCourse: function(courseFile) {\n updateCoursefilePath(courseFile);\n }\n };\n })();\n\n const langController = (function() {\n const languageElem = document.getElementById(\"id_language\");\n\n /**\n * Check if the given language exists in the currently selected course.\n * @param {string} lang\n * @returns {boolean} Whether the language exists\n */\n function languageExists(lang) {\n return courseController.getSelectedCourse().languages.includes(lang);\n }\n return {\n getSelectedLanguage: function() {\n return languageElem.value;\n },\n setLanguage: function(lang) {\n if (!languageExists(lang)) {\n throw new Error(\"Selected language not available\");\n }\n languageElem.value = lang;\n courseController.updateCourseName();\n }\n };\n })();\n\n const taskController = (function() {\n const taskSelectionInput = document.getElementsByName(\"taskurl\")[0];\n const nameElem = document.getElementById(\"id_name\");\n const taskDisplayElement = document.getElementById(\"id_task_display_element\");\n const isGradedElem = document.getElementById('id_mumie_isgraded');\n\n\n /**\n * Update the activity's name in the input field\n */\n function updateName() {\n const newHeadline = getHeadline(taskController.getSelectedTask());\n if (!isCustomName()) {\n nameElem.value = newHeadline;\n }\n taskDisplayElement.value = newHeadline;\n }\n\n /**\n * Check whether the activity has a custom name\n *\n * @return {boolean} True, if there is no headline with that name in all tasks\n */\n function isCustomName() {\n if (nameElem.value.length === 0) {\n return false;\n }\n return !getAllHeadlines().includes(nameElem.value);\n }\n\n /**\n * Get the task's headline for the currently selected language\n * @param {Object} task\n * @returns {string|null} the headline\n */\n function getHeadline(task) {\n if (!task) {\n return null;\n }\n const selectedLanguage = langController.getSelectedLanguage();\n const headlineWrapper = task.headline.find(localHeadline => localHeadline.language === selectedLanguage);\n return headlineWrapper ? headlineWrapper.name : null;\n }\n\n /**\n * Get all tasks that are available on all servers\n *\n * @return {Object} Array containing all available tasks\n */\n function getAllTasks() {\n return serverController.getAllServers()\n .flatMap(server => server.courses)\n .flatMap(course => course.tasks);\n }\n\n /**\n * Get all possible headlines in all languages\n * @returns {Object} Array containing all headlines\n */\n function getAllHeadlines() {\n return getAllTasks().flatMap(task => task.headline)\n .map(headline => headline.name)\n .concat(courseController.getSelectedCourse().name.map(n => n.value));\n }\n\n /**\n * Add language parameter to the task's link to display content in the selected language\n * @param {Object} task\n * @returns {string}\n */\n function getLocalizedLinkFromTask(task) {\n return getLocalizedLink(task.link);\n }\n\n /**\n * Add language parameter to link\n * @param {string} link\n * @returns {string}\n */\n function getLocalizedLink(link) {\n return link + \"?lang=\" + langController.getSelectedLanguage();\n }\n\n /**\n * Form inputs related to grades should be disabled, if the MUMIE Task is not graded.\n */\n function updateGradeEditability() {\n const disabled = isGradedElem.value === '0';\n document.getElementById('id_points').disabled = disabled;\n document.getElementById('id_gradepass').disabled = disabled;\n document.getElementById('id_duedate_enabled').disabled = disabled;\n document.getElementById('id_gradecat').disabled = disabled;\n }\n\n /**\n * Get a task that links to a course's overview page\n * @param {Object} course\n * @returns {Object} task\n */\n function getPseudoTaskFromCourse(course) {\n var headline = [];\n for (var i in course.name) {\n var name = course.name[i];\n headline.push({\n \"name\": name.value,\n \"language\": name.language\n });\n }\n return {\n \"link\": course.link,\n \"headline\": headline\n };\n }\n\n return {\n init: function() {\n updateName();\n },\n getSelectedTask: function() {\n const selectedLink = taskSelectionInput.value;\n const selectedCourse = courseController.getSelectedCourse();\n if (!selectedCourse) {\n return null;\n }\n const tasks = selectedCourse\n .tasks\n .slice();\n tasks.push(getPseudoTaskFromCourse(selectedCourse));\n return tasks\n .find(task => getLocalizedLinkFromTask(task) === selectedLink);\n },\n setSelection: function(newSelection) {\n taskSelectionInput.value = newSelection;\n updateName();\n },\n setIsGraded: function(isGraded) {\n if (isGraded === null) {\n isGradedElem.value = null;\n }\n isGradedElem.value = isGraded ? '1' : '0';\n updateGradeEditability();\n },\n getGradingType: function() {\n const isGraded = isGradedElem.value;\n if (isGraded === '1') {\n return 'graded';\n } else if (isGraded === '0') {\n return 'ungraded';\n }\n return 'all';\n }\n };\n })();\n\n\n const multiTaskEditController = (function() {\n const propertySelectionInputs = document.getElementsByName(\"mumie_multi_edit_property\");\n const selectedTaskProperties = document.getElementsByName(\"mumie_selected_task_properties\")[0];\n let selectedTaskProp = [];\n const taskSelectionInputs = document.getElementsByName(\"mumie_multi_edit_task\");\n const selectedTasks = document.getElementsByName(\"mumie_selected_tasks\")[0];\n let selectedTaskIds = [];\n const sectionInputs = document.getElementsByName(\"mumie_multi_edit_section\");\n\n /**\n * Push an element to an array, if it's not already included.\n *\n * @param {string[]} array\n * @param {string} element\n */\n function pushIfNotExists(array, element) {\n if (!array.includes(element)) {\n array.push(element);\n }\n }\n\n /**\n * Set selection listeners for other MUMIE Tasks in the course.\n */\n function setTaskSelectionListeners() {\n taskSelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskIds = selectedTaskIds.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskIds.push(checkbox.value);\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n /**\n * Set selection listeners for properties to apply to MUMIE Tasks in the course.\n */\n function setPropertySelectionListeners() {\n propertySelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskProp = selectedTaskProp.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskProp.push(checkbox.value);\n }\n selectedTaskProperties.value = JSON.stringify(selectedTaskProp);\n };\n });\n }\n\n /**\n * Set selection listeners for entire section of MUMIE Tasks in the course\n */\n function setSectionSelectionListeners() {\n sectionInputs.forEach(function(sectionCheckbox) {\n sectionCheckbox.onchange = function() {\n if (!sectionCheckbox.checked) {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = false;\n selectedTaskIds = selectedTaskIds.filter(elem => taskCheckbox.value !== elem);\n }\n });\n } else {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = true;\n pushIfNotExists(selectedTaskIds, taskCheckbox.value);\n }\n });\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n return {\n init: function() {\n setTaskSelectionListeners();\n setPropertySelectionListeners();\n setSectionSelectionListeners();\n },\n };\n })();\n\n /**\n * Disable all dropdown menus and show notification\n * @param {string} errorKey\n */\n function disableDropDownMenus(errorKey) {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': errorKey,\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0] + \"\" + missingConfig.getAttribute(\"value\") + \"\",\n type: \"problem\"\n });\n }).fail(notification.exception);\n });\n serverController.disable();\n problemSelectorController.disable();\n }\n\n return {\n init: function(contextid, prbSelectorUrl, lang) {\n lmsSelectorUrl = prbSelectorUrl;\n systemLanguage = lang;\n const isEdit = document.getElementById(\"id_name\").getAttribute('value');\n const serverStructure = JSON.parse(document.getElementsByName('mumie_server_structure')[0].value);\n if (isEdit && !serverConfigExists()) {\n disableDropDownMenus('mumie_form_missing_server');\n } else if (!serverStructure.length) {\n disableDropDownMenus('mumie_form_no_server_conf');\n } else {\n serverController.init(serverStructure);\n courseController.init();\n taskController.init(isEdit);\n multiTaskEditController.init();\n problemSelectorController.init();\n }\n multiTaskEditController.init();\n if (addServerButton) {\n require(['auth_mumie/mumie_server_config'], function(MumieServer) {\n MumieServer.init(addServerButton, contextid);\n });\n }\n }\n };\n\n /**\n * Remove all child elements of a given html element\n * @param {Object} elem\n */\n function removeChildElems(elem) {\n while (elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n }\n\n /**\n * Check, if the flag for an existing config is set\n * @returns {boolean}\n */\n function serverConfigExists() {\n return document.getElementsByName(\"mumie_missing_config\")[0].getAttribute(\"value\") === \"\";\n }\n });\n"],"names":["define","addServerButton","document","getElementById","missingConfig","getElementsByName","lmsSelectorUrl","systemLanguage","serverController","serverStructure","serverDropDown","init","structure","getSelectedServer","selectedServerName","options","selectedIndex","text","find","server","name","disable","disabled","elem","firstChild","removeChild","removeChildElems","getAllServers","problemSelectorController","problemSelectorButton","problemSelectorWindow","mumieOrg","value","sendResponse","response","postMessage","JSON","stringify","sendSuccess","message","success","addMessageListener","window","addEventListener","event","origin","importObj","parse","data","isGraded","courseController","setCourse","path_to_coursefile","langController","setLanguage","language","taskController","setSelection","link","setIsGraded","focus","require","str","notification","get_strings","component","done","s","addNotification","type","fail","exception","error","sendFailure","gradingType","getGradingType","onclick","open","encodeURIComponent","urlprefix","getSelectedLanguage","location","onclose","courseNameElem","coursefileElem","updateCourseName","selectedCourse","getSelectedCourse","selectedLanguage","translation","_selectedCourse$name$","courses","course","coursefile","courseFile","languageElem","lang","languages","includes","languageExists","Error","taskSelectionInput","nameElem","taskDisplayElement","isGradedElem","updateName","newHeadline","task","headlineWrapper","headline","localHeadline","getHeadline","getSelectedTask","length","flatMap","tasks","map","concat","n","isCustomName","getLocalizedLinkFromTask","selectedLink","slice","push","i","getPseudoTaskFromCourse","newSelection","updateGradeEditability","multiTaskEditController","propertySelectionInputs","selectedTaskProperties","selectedTaskProp","taskSelectionInputs","selectedTasks","selectedTaskIds","sectionInputs","forEach","checkbox","onchange","checked","filter","sectionCheckbox","taskCheckbox","array","element","getAttribute","disableDropDownMenus","errorKey","contextid","prbSelectorUrl","isEdit","MumieServer"],"mappings":"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"} \ No newline at end of file diff --git a/classes/mumie_grader.php b/classes/mumie_grader.php index 3adef8e..0b43a38 100644 --- a/classes/mumie_grader.php +++ b/classes/mumie_grader.php @@ -85,9 +85,11 @@ public function view_grading_table() { global $PAGE, $CFG; $output = ""; + $gradedroles = array_map('intval', explode(',', $CFG->gradebookroles)); + $filterset = new participants_filterset(); $filterset->add_filter(new integer_filter('courseid', filter::JOINTYPE_DEFAULT, [(int)$this->course->id])); - $filterset->add_filter(new integer_filter('roles', filter::JOINTYPE_DEFAULT, [5])); + $filterset->add_filter(new integer_filter('roles', filter::JOINTYPE_DEFAULT, $gradedroles)); require_once($CFG->dirroot . "/mod/mumie/classes/mumie_participants.php"); From 77d2d7a2ffbe02d3c351cda452b06fc6703f09da Mon Sep 17 00:00:00 2001 From: Tobias Goltz Date: Wed, 23 Mar 2022 14:31:37 +0100 Subject: [PATCH 4/5] returning to minification style of version 311 --- amd/build/mod_form.min.js | 2 +- amd/build/mod_form.min.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/amd/build/mod_form.min.js b/amd/build/mod_form.min.js index 94ed465..aed9d79 100644 --- a/amd/build/mod_form.min.js +++ b/amd/build/mod_form.min.js @@ -1,3 +1,3 @@ -define("mod_mumie/mod_form",["jquery","core/templates","core/modal_factory","auth_mumie/mumie_server_config","core/ajax"],(function(){const addServerButton=document.getElementById("id_add_server_button"),missingConfig=document.getElementsByName("mumie_missing_config")[0];let lmsSelectorUrl,systemLanguage;const serverController=function(){let serverStructure;const serverDropDown=document.getElementById("id_server");return{init:function(structure){serverStructure=structure},getSelectedServer:function(){const selectedServerName=serverDropDown.options[serverDropDown.selectedIndex].text;return serverStructure.find((server=>server.name===selectedServerName))},disable:function(){serverDropDown.disabled=!0,function(elem){for(;elem.firstChild;)elem.removeChild(elem.firstChild)}(serverDropDown)},getAllServers:function(){return serverStructure}}}(),problemSelectorController=function(){const problemSelectorButton=document.getElementById("id_prb_selector_btn");let problemSelectorWindow;const mumieOrg=document.getElementsByName("mumie_org")[0].value;function sendResponse(response){problemSelectorWindow&&problemSelectorWindow.postMessage(JSON.stringify(response),lmsSelectorUrl)}function sendSuccess(){let message=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";sendResponse({success:!0,message:message})}function addMessageListener(){window.addEventListener("message",(event=>{if(event.origin!==lmsSelectorUrl)return;const importObj=JSON.parse(event.data),isGraded=!1!==importObj.isGraded;try{courseController.setCourse(importObj.path_to_coursefile),langController.setLanguage(importObj.language),taskController.setSelection(importObj.link+"?lang="+importObj.language),taskController.setIsGraded(isGraded),sendSuccess(),window.focus(),require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:"mumie_form_updated_selection",component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0],type:"info"})})).fail(notification.exception)}))}catch(error){!function(){sendResponse({success:!1,message:arguments.length>0&&void 0!==arguments[0]?arguments[0]:""})}(error.message)}}),!1)}return{init:function(){const gradingType=taskController.getGradingType();problemSelectorButton.onclick=function(){problemSelectorWindow=window.open(lmsSelectorUrl+"/lms-problem-selector?org="+mumieOrg+"&serverUrl="+encodeURIComponent(serverController.getSelectedServer().urlprefix)+"&problemLang="+langController.getSelectedLanguage()+"&origin="+encodeURIComponent(window.location.origin)+"&uiLang="+systemLanguage+"&gradingType="+gradingType+"&multiCourse=true","_blank")},window.onclose=function(){sendSuccess()},window.addEventListener("beforeunload",(function(){sendSuccess()}),!1),addMessageListener()},disable:function(){problemSelectorButton.disabled=!0}}}(),courseController=function(){const courseNameElem=document.getElementById("id_mumie_course"),coursefileElem=document.getElementsByName("mumie_coursefile")[0];function updateCourseName(){var _selectedCourse$name$;const selectedCourse=courseController.getSelectedCourse(),selectedLanguage=langController.getSelectedLanguage();selectedCourse&&selectedLanguage&&(courseNameElem.value=null===(_selectedCourse$name$=selectedCourse.name.find((translation=>translation.language===selectedLanguage)))||void 0===_selectedCourse$name$?void 0:_selectedCourse$name$.value)}return{init:function(){updateCourseName()},getSelectedCourse:function(){return serverController.getSelectedServer().courses.find((course=>course.coursefile===coursefileElem.value))},updateCourseName:function(){updateCourseName()},setCourse:function(courseFile){var coursefile;coursefile=courseFile,coursefileElem.value=coursefile,updateCourseName()}}}(),langController=function(){const languageElem=document.getElementById("id_language");return{getSelectedLanguage:function(){return languageElem.value},setLanguage:function(lang){if(!function(lang){return courseController.getSelectedCourse().languages.includes(lang)}(lang))throw new Error("Selected language not available");languageElem.value=lang,courseController.updateCourseName()}}}(),taskController=function(){const taskSelectionInput=document.getElementsByName("taskurl")[0],nameElem=document.getElementById("id_name"),taskDisplayElement=document.getElementById("id_task_display_element"),isGradedElem=document.getElementById("id_mumie_isgraded");function updateName(){const newHeadline=function(task){if(!task)return null;const selectedLanguage=langController.getSelectedLanguage(),headlineWrapper=task.headline.find((localHeadline=>localHeadline.language===selectedLanguage));return headlineWrapper?headlineWrapper.name:null}(taskController.getSelectedTask());(function(){if(0===nameElem.value.length)return!1;return!serverController.getAllServers().flatMap((server=>server.courses)).flatMap((course=>course.tasks)).flatMap((task=>task.headline)).map((headline=>headline.name)).concat(courseController.getSelectedCourse().name.map((n=>n.value))).includes(nameElem.value)})()||(nameElem.value=newHeadline),taskDisplayElement.value=newHeadline}function getLocalizedLinkFromTask(task){return task.link+"?lang="+langController.getSelectedLanguage()}return{init:function(){updateName()},getSelectedTask:function(){const selectedLink=taskSelectionInput.value,selectedCourse=courseController.getSelectedCourse();if(!selectedCourse)return null;const tasks=selectedCourse.tasks.slice();return tasks.push(function(course){var headline=[];for(var i in course.name){var name=course.name[i];headline.push({name:name.value,language:name.language})}return{link:course.link,headline:headline}}(selectedCourse)),tasks.find((task=>getLocalizedLinkFromTask(task)===selectedLink))},setSelection:function(newSelection){taskSelectionInput.value=newSelection,updateName()},setIsGraded:function(isGraded){null===isGraded&&(isGradedElem.value=null),isGradedElem.value=isGraded?"1":"0",function(){const disabled="0"===isGradedElem.value;document.getElementById("id_points").disabled=disabled,document.getElementById("id_gradepass").disabled=disabled,document.getElementById("id_duedate_enabled").disabled=disabled,document.getElementById("id_gradecat").disabled=disabled}()},getGradingType:function(){const isGraded=isGradedElem.value;return"1"===isGraded?"graded":"0"===isGraded?"ungraded":"all"}}}(),multiTaskEditController=function(){const propertySelectionInputs=document.getElementsByName("mumie_multi_edit_property"),selectedTaskProperties=document.getElementsByName("mumie_selected_task_properties")[0];let selectedTaskProp=[];const taskSelectionInputs=document.getElementsByName("mumie_multi_edit_task"),selectedTasks=document.getElementsByName("mumie_selected_tasks")[0];let selectedTaskIds=[];const sectionInputs=document.getElementsByName("mumie_multi_edit_section");return{init:function(){taskSelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskIds.push(checkbox.value):selectedTaskIds=selectedTaskIds.filter((elem=>elem!==checkbox.value)),selectedTasks.value=JSON.stringify(selectedTaskIds)}})),propertySelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskProp.push(checkbox.value):selectedTaskProp=selectedTaskProp.filter((elem=>elem!==checkbox.value)),selectedTaskProperties.value=JSON.stringify(selectedTaskProp)}})),sectionInputs.forEach((function(sectionCheckbox){sectionCheckbox.onchange=function(){sectionCheckbox.checked?taskSelectionInputs.forEach((function(taskCheckbox){var array,element;taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!0,array=selectedTaskIds,element=taskCheckbox.value,array.includes(element)||array.push(element))})):taskSelectionInputs.forEach((function(taskCheckbox){taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!1,selectedTaskIds=selectedTaskIds.filter((elem=>taskCheckbox.value!==elem)))})),selectedTasks.value=JSON.stringify(selectedTaskIds)}}))}}}();function disableDropDownMenus(errorKey){require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:errorKey,component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0]+""+missingConfig.getAttribute("value")+"",type:"problem"})})).fail(notification.exception)})),serverController.disable(),problemSelectorController.disable()}return{init:function(contextid,prbSelectorUrl,lang){lmsSelectorUrl=prbSelectorUrl,systemLanguage=lang;const isEdit=document.getElementById("id_name").getAttribute("value"),serverStructure=JSON.parse(document.getElementsByName("mumie_server_structure")[0].value);isEdit&&""!==document.getElementsByName("mumie_missing_config")[0].getAttribute("value")?disableDropDownMenus("mumie_form_missing_server"):serverStructure.length?(serverController.init(serverStructure),courseController.init(),taskController.init(isEdit),multiTaskEditController.init(),problemSelectorController.init()):disableDropDownMenus("mumie_form_no_server_conf"),multiTaskEditController.init(),addServerButton&&require(["auth_mumie/mumie_server_config"],(function(MumieServer){MumieServer.init(addServerButton,contextid)}))}}})); +define("mod_mumie/mod_form",["jquery","core/templates","core/modal_factory","auth_mumie/mumie_server_config","core/ajax"],(function(){var lmsSelectorUrl,systemLanguage,serverStructure,serverDropDown,languageElem,propertySelectionInputs,selectedTaskProperties,selectedTaskProp,taskSelectionInputs,selectedTasks,selectedTaskIds,sectionInputs,addServerButton=document.getElementById("id_add_server_button"),missingConfig=document.getElementsByName("mumie_missing_config")[0],serverController=(serverDropDown=document.getElementById("id_server"),{init:function(structure){serverStructure=structure},getSelectedServer:function(){var selectedServerName=serverDropDown.options[serverDropDown.selectedIndex].text;return serverStructure.find((function(server){return server.name===selectedServerName}))},disable:function(){serverDropDown.disabled=!0,function(elem){for(;elem.firstChild;)elem.removeChild(elem.firstChild)}(serverDropDown)},getAllServers:function(){return serverStructure}}),problemSelectorController=function(){var problemSelectorWindow,problemSelectorButton=document.getElementById("id_prb_selector_btn"),mumieOrg=document.getElementsByName("mumie_org")[0].value;function sendResponse(response){problemSelectorWindow&&problemSelectorWindow.postMessage(JSON.stringify(response),lmsSelectorUrl)}function sendSuccess(){var message=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";sendResponse({success:!0,message:message})}function addMessageListener(){window.addEventListener("message",(function(event){if(event.origin===lmsSelectorUrl){var importObj=JSON.parse(event.data),isGraded=!1!==importObj.isGraded;try{courseController.setCourse(importObj.path_to_coursefile),langController.setLanguage(importObj.language),taskController.setSelection(importObj.link+"?lang="+importObj.language),taskController.setIsGraded(isGraded),sendSuccess(),window.focus(),require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:"mumie_form_updated_selection",component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0],type:"info"})})).fail(notification.exception)}))}catch(error){!function(){sendResponse({success:!1,message:arguments.length>0&&void 0!==arguments[0]?arguments[0]:""})}(error.message)}}}),!1)}return{init:function(){var gradingType=taskController.getGradingType();problemSelectorButton.onclick=function(){problemSelectorWindow=window.open(lmsSelectorUrl+"/lms-problem-selector?org="+mumieOrg+"&serverUrl="+encodeURIComponent(serverController.getSelectedServer().urlprefix)+"&problemLang="+langController.getSelectedLanguage()+"&origin="+encodeURIComponent(window.location.origin)+"&uiLang="+systemLanguage+"&gradingType="+gradingType+"&multiCourse=true","_blank")},window.onclose=function(){sendSuccess()},window.addEventListener("beforeunload",(function(){sendSuccess()}),!1),addMessageListener()},disable:function(){problemSelectorButton.disabled=!0}}}(),courseController=function(){var courseNameElem=document.getElementById("id_mumie_course"),coursefileElem=document.getElementsByName("mumie_coursefile")[0];function _updateCourseName(){var _selectedCourse$name$,selectedCourse=courseController.getSelectedCourse(),selectedLanguage=langController.getSelectedLanguage();selectedCourse&&selectedLanguage&&(courseNameElem.value=null===(_selectedCourse$name$=selectedCourse.name.find((function(translation){return translation.language===selectedLanguage})))||void 0===_selectedCourse$name$?void 0:_selectedCourse$name$.value)}return{init:function(){_updateCourseName()},getSelectedCourse:function(){return serverController.getSelectedServer().courses.find((function(course){return course.coursefile===coursefileElem.value}))},updateCourseName:function(){_updateCourseName()},setCourse:function(courseFile){var coursefile;coursefile=courseFile,coursefileElem.value=coursefile,_updateCourseName()}}}(),langController=(languageElem=document.getElementById("id_language"),{getSelectedLanguage:function(){return languageElem.value},setLanguage:function(lang){if(!function(lang){return courseController.getSelectedCourse().languages.includes(lang)}(lang))throw new Error("Selected language not available");languageElem.value=lang,courseController.updateCourseName()}}),taskController=function(){var taskSelectionInput=document.getElementsByName("taskurl")[0],nameElem=document.getElementById("id_name"),taskDisplayElement=document.getElementById("id_task_display_element"),isGradedElem=document.getElementById("id_mumie_isgraded");function updateName(){var newHeadline=function(task){if(!task)return null;var selectedLanguage=langController.getSelectedLanguage(),headlineWrapper=task.headline.find((function(localHeadline){return localHeadline.language===selectedLanguage}));return headlineWrapper?headlineWrapper.name:null}(taskController.getSelectedTask());(function(){if(0===nameElem.value.length)return!1;return!serverController.getAllServers().flatMap((function(server){return server.courses})).flatMap((function(course){return course.tasks})).flatMap((function(task){return task.headline})).map((function(headline){return headline.name})).concat(courseController.getSelectedCourse().name.map((function(n){return n.value}))).includes(nameElem.value)})()||(nameElem.value=newHeadline),taskDisplayElement.value=newHeadline}function getLocalizedLinkFromTask(task){return task.link+"?lang="+langController.getSelectedLanguage()}return{init:function(){updateName()},getSelectedTask:function(){var selectedLink=taskSelectionInput.value,selectedCourse=courseController.getSelectedCourse();if(!selectedCourse)return null;var tasks=selectedCourse.tasks.slice();return tasks.push(function(course){var headline=[];for(var i in course.name){var name=course.name[i];headline.push({name:name.value,language:name.language})}return{link:course.link,headline:headline}}(selectedCourse)),tasks.find((function(task){return getLocalizedLinkFromTask(task)===selectedLink}))},setSelection:function(newSelection){taskSelectionInput.value=newSelection,updateName()},setIsGraded:function(isGraded){var disabled;null===isGraded&&(isGradedElem.value=null),isGradedElem.value=isGraded?"1":"0",disabled="0"===isGradedElem.value,document.getElementById("id_points").disabled=disabled,document.getElementById("id_gradepass").disabled=disabled,document.getElementById("id_duedate_enabled").disabled=disabled,document.getElementById("id_gradecat").disabled=disabled},getGradingType:function(){var isGraded=isGradedElem.value;return"1"===isGraded?"graded":"0"===isGraded?"ungraded":"all"}}}(),multiTaskEditController=(propertySelectionInputs=document.getElementsByName("mumie_multi_edit_property"),selectedTaskProperties=document.getElementsByName("mumie_selected_task_properties")[0],selectedTaskProp=[],taskSelectionInputs=document.getElementsByName("mumie_multi_edit_task"),selectedTasks=document.getElementsByName("mumie_selected_tasks")[0],selectedTaskIds=[],sectionInputs=document.getElementsByName("mumie_multi_edit_section"),{init:function(){taskSelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskIds.push(checkbox.value):selectedTaskIds=selectedTaskIds.filter((function(elem){return elem!==checkbox.value})),selectedTasks.value=JSON.stringify(selectedTaskIds)}})),propertySelectionInputs.forEach((function(checkbox){checkbox.onchange=function(){checkbox.checked?selectedTaskProp.push(checkbox.value):selectedTaskProp=selectedTaskProp.filter((function(elem){return elem!==checkbox.value})),selectedTaskProperties.value=JSON.stringify(selectedTaskProp)}})),sectionInputs.forEach((function(sectionCheckbox){sectionCheckbox.onchange=function(){sectionCheckbox.checked?taskSelectionInputs.forEach((function(taskCheckbox){var array,element;taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!0,array=selectedTaskIds,element=taskCheckbox.value,array.includes(element)||array.push(element))})):taskSelectionInputs.forEach((function(taskCheckbox){taskCheckbox.getAttribute("section")===sectionCheckbox.value&&(taskCheckbox.checked=!1,selectedTaskIds=selectedTaskIds.filter((function(elem){return taskCheckbox.value!==elem})))})),selectedTasks.value=JSON.stringify(selectedTaskIds)}}))}});function disableDropDownMenus(errorKey){require(["core/str","core/notification"],(function(str,notification){str.get_strings([{key:errorKey,component:"mod_mumie"}]).done((function(s){notification.addNotification({message:s[0]+""+missingConfig.getAttribute("value")+"",type:"problem"})})).fail(notification.exception)})),serverController.disable(),problemSelectorController.disable()}return{init:function(contextid,prbSelectorUrl,lang){lmsSelectorUrl=prbSelectorUrl,systemLanguage=lang;var isEdit=document.getElementById("id_name").getAttribute("value"),serverStructure=JSON.parse(document.getElementsByName("mumie_server_structure")[0].value);isEdit&&""!==document.getElementsByName("mumie_missing_config")[0].getAttribute("value")?disableDropDownMenus("mumie_form_missing_server"):serverStructure.length?(serverController.init(serverStructure),courseController.init(),taskController.init(isEdit),multiTaskEditController.init(),problemSelectorController.init()):disableDropDownMenus("mumie_form_no_server_conf"),multiTaskEditController.init(),addServerButton&&require(["auth_mumie/mumie_server_config"],(function(MumieServer){MumieServer.init(addServerButton,contextid)}))}}})); //# sourceMappingURL=mod_form.min.js.map \ No newline at end of file diff --git a/amd/build/mod_form.min.js.map b/amd/build/mod_form.min.js.map index add6d4f..6848302 100644 --- a/amd/build/mod_form.min.js.map +++ b/amd/build/mod_form.min.js.map @@ -1 +1 @@ -{"version":3,"file":"mod_form.min.js","sources":["../src/mod_form.js"],"sourcesContent":["define(['jquery', 'core/templates', 'core/modal_factory', 'auth_mumie/mumie_server_config', 'core/ajax'],\n function() {\n const addServerButton = document.getElementById(\"id_add_server_button\");\n const missingConfig = document.getElementsByName(\"mumie_missing_config\")[0];\n let lmsSelectorUrl;\n let systemLanguage;\n const serverController = (function() {\n let serverStructure;\n const serverDropDown = document.getElementById(\"id_server\");\n\n return {\n init: function(structure) {\n serverStructure = structure;\n },\n getSelectedServer: function() {\n const selectedServerName = serverDropDown.options[serverDropDown.selectedIndex].text;\n return serverStructure.find(server => server.name === selectedServerName);\n },\n disable: function() {\n serverDropDown.disabled = true;\n removeChildElems(serverDropDown);\n },\n getAllServers: function() {\n return serverStructure;\n }\n };\n })();\n\n const problemSelectorController = (function() {\n const problemSelectorButton = document.getElementById('id_prb_selector_btn');\n let problemSelectorWindow;\n const mumieOrg = document.getElementsByName('mumie_org')[0].value;\n\n /**\n * Send a message to the problem selector window.\n *\n * Don't do anything, if there is no problem selector window.\n * @param {Object} response\n */\n function sendResponse(response) {\n if (!problemSelectorWindow) {\n return;\n }\n problemSelectorWindow.postMessage(JSON.stringify(response), lmsSelectorUrl);\n }\n\n /**\n * Send a success message to problem selector window\n * @param {string} message\n */\n function sendSuccess(message = '') {\n sendResponse({\n success: true,\n message: message\n });\n }\n\n /**\n * Send a failure message to problem selector window\n * @param {string} message\n */\n function sendFailure(message = '') {\n sendResponse({\n success: false,\n message: message\n });\n }\n\n /**\n * Add an event listener that accepts messages from LMS-Browser and updates the selected problem.\n */\n function addMessageListener() {\n window.addEventListener('message', (event) => {\n if (event.origin !== lmsSelectorUrl) {\n return;\n }\n const importObj = JSON.parse(event.data);\n const isGraded = importObj.isGraded !== false;\n try {\n courseController.setCourse(importObj.path_to_coursefile);\n langController.setLanguage(importObj.language);\n taskController.setSelection(importObj.link + '?lang=' + importObj.language);\n taskController.setIsGraded(isGraded);\n sendSuccess();\n window.focus();\n displayProblemSelectedMessage();\n } catch (error) {\n sendFailure(error.message);\n }\n }, false);\n }\n\n /**\n * Display a success message in Moodle that a problem was successfully selected.\n */\n function displayProblemSelectedMessage() {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': 'mumie_form_updated_selection',\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0],\n type: \"info\"\n });\n }).fail(notification.exception);\n });\n }\n\n return {\n init: function() {\n const gradingType = taskController.getGradingType();\n problemSelectorButton.onclick = function() {\n problemSelectorWindow = window.open(\n lmsSelectorUrl\n + '/lms-problem-selector?'\n + 'org='\n + mumieOrg\n + '&serverUrl='\n + encodeURIComponent(serverController.getSelectedServer().urlprefix)\n + '&problemLang='\n + langController.getSelectedLanguage()\n + '&origin=' + encodeURIComponent(window.location.origin)\n + '&uiLang=' + systemLanguage\n + '&gradingType=' + gradingType\n + '&multiCourse=true'\n , '_blank'\n );\n };\n\n window.onclose = function() {\n sendSuccess();\n };\n\n window.addEventListener(\"beforeunload\", function() {\n sendSuccess();\n }, false);\n\n addMessageListener();\n },\n disable: function() {\n problemSelectorButton.disabled = true;\n }\n };\n })();\n\n const courseController = (function() {\n const courseNameElem = document.getElementById(\"id_mumie_course\");\n const coursefileElem = document.getElementsByName(\"mumie_coursefile\")[0];\n\n\n /**\n * Update the hidden input field with the selected course's course file path\n *\n * @param {string} coursefile\n */\n function updateCoursefilePath(coursefile) {\n coursefileElem.value = coursefile;\n updateCourseName();\n }\n\n /**\n * Update displayed course name.\n */\n function updateCourseName() {\n const selectedCourse = courseController.getSelectedCourse();\n const selectedLanguage = langController.getSelectedLanguage();\n if (!selectedCourse || !selectedLanguage) {\n return;\n }\n courseNameElem.value = selectedCourse.name\n .find(translation => translation.language === selectedLanguage)?.value;\n }\n\n return {\n init: function() {\n updateCourseName();\n },\n getSelectedCourse: function() {\n const courses = serverController.getSelectedServer().courses;\n return courses.find(course => course.coursefile === coursefileElem.value);\n },\n updateCourseName: function() {\n updateCourseName();\n },\n setCourse: function(courseFile) {\n updateCoursefilePath(courseFile);\n }\n };\n })();\n\n const langController = (function() {\n const languageElem = document.getElementById(\"id_language\");\n\n /**\n * Check if the given language exists in the currently selected course.\n * @param {string} lang\n * @returns {boolean} Whether the language exists\n */\n function languageExists(lang) {\n return courseController.getSelectedCourse().languages.includes(lang);\n }\n return {\n getSelectedLanguage: function() {\n return languageElem.value;\n },\n setLanguage: function(lang) {\n if (!languageExists(lang)) {\n throw new Error(\"Selected language not available\");\n }\n languageElem.value = lang;\n courseController.updateCourseName();\n }\n };\n })();\n\n const taskController = (function() {\n const taskSelectionInput = document.getElementsByName(\"taskurl\")[0];\n const nameElem = document.getElementById(\"id_name\");\n const taskDisplayElement = document.getElementById(\"id_task_display_element\");\n const isGradedElem = document.getElementById('id_mumie_isgraded');\n\n\n /**\n * Update the activity's name in the input field\n */\n function updateName() {\n const newHeadline = getHeadline(taskController.getSelectedTask());\n if (!isCustomName()) {\n nameElem.value = newHeadline;\n }\n taskDisplayElement.value = newHeadline;\n }\n\n /**\n * Check whether the activity has a custom name\n *\n * @return {boolean} True, if there is no headline with that name in all tasks\n */\n function isCustomName() {\n if (nameElem.value.length === 0) {\n return false;\n }\n return !getAllHeadlines().includes(nameElem.value);\n }\n\n /**\n * Get the task's headline for the currently selected language\n * @param {Object} task\n * @returns {string|null} the headline\n */\n function getHeadline(task) {\n if (!task) {\n return null;\n }\n const selectedLanguage = langController.getSelectedLanguage();\n const headlineWrapper = task.headline.find(localHeadline => localHeadline.language === selectedLanguage);\n return headlineWrapper ? headlineWrapper.name : null;\n }\n\n /**\n * Get all tasks that are available on all servers\n *\n * @return {Object} Array containing all available tasks\n */\n function getAllTasks() {\n return serverController.getAllServers()\n .flatMap(server => server.courses)\n .flatMap(course => course.tasks);\n }\n\n /**\n * Get all possible headlines in all languages\n * @returns {Object} Array containing all headlines\n */\n function getAllHeadlines() {\n return getAllTasks().flatMap(task => task.headline)\n .map(headline => headline.name)\n .concat(courseController.getSelectedCourse().name.map(n => n.value));\n }\n\n /**\n * Add language parameter to the task's link to display content in the selected language\n * @param {Object} task\n * @returns {string}\n */\n function getLocalizedLinkFromTask(task) {\n return getLocalizedLink(task.link);\n }\n\n /**\n * Add language parameter to link\n * @param {string} link\n * @returns {string}\n */\n function getLocalizedLink(link) {\n return link + \"?lang=\" + langController.getSelectedLanguage();\n }\n\n /**\n * Form inputs related to grades should be disabled, if the MUMIE Task is not graded.\n */\n function updateGradeEditability() {\n const disabled = isGradedElem.value === '0';\n document.getElementById('id_points').disabled = disabled;\n document.getElementById('id_gradepass').disabled = disabled;\n document.getElementById('id_duedate_enabled').disabled = disabled;\n document.getElementById('id_gradecat').disabled = disabled;\n }\n\n /**\n * Get a task that links to a course's overview page\n * @param {Object} course\n * @returns {Object} task\n */\n function getPseudoTaskFromCourse(course) {\n var headline = [];\n for (var i in course.name) {\n var name = course.name[i];\n headline.push({\n \"name\": name.value,\n \"language\": name.language\n });\n }\n return {\n \"link\": course.link,\n \"headline\": headline\n };\n }\n\n return {\n init: function() {\n updateName();\n },\n getSelectedTask: function() {\n const selectedLink = taskSelectionInput.value;\n const selectedCourse = courseController.getSelectedCourse();\n if (!selectedCourse) {\n return null;\n }\n const tasks = selectedCourse\n .tasks\n .slice();\n tasks.push(getPseudoTaskFromCourse(selectedCourse));\n return tasks\n .find(task => getLocalizedLinkFromTask(task) === selectedLink);\n },\n setSelection: function(newSelection) {\n taskSelectionInput.value = newSelection;\n updateName();\n },\n setIsGraded: function(isGraded) {\n if (isGraded === null) {\n isGradedElem.value = null;\n }\n isGradedElem.value = isGraded ? '1' : '0';\n updateGradeEditability();\n },\n getGradingType: function() {\n const isGraded = isGradedElem.value;\n if (isGraded === '1') {\n return 'graded';\n } else if (isGraded === '0') {\n return 'ungraded';\n }\n return 'all';\n }\n };\n })();\n\n\n const multiTaskEditController = (function() {\n const propertySelectionInputs = document.getElementsByName(\"mumie_multi_edit_property\");\n const selectedTaskProperties = document.getElementsByName(\"mumie_selected_task_properties\")[0];\n let selectedTaskProp = [];\n const taskSelectionInputs = document.getElementsByName(\"mumie_multi_edit_task\");\n const selectedTasks = document.getElementsByName(\"mumie_selected_tasks\")[0];\n let selectedTaskIds = [];\n const sectionInputs = document.getElementsByName(\"mumie_multi_edit_section\");\n\n /**\n * Push an element to an array, if it's not already included.\n *\n * @param {string[]} array\n * @param {string} element\n */\n function pushIfNotExists(array, element) {\n if (!array.includes(element)) {\n array.push(element);\n }\n }\n\n /**\n * Set selection listeners for other MUMIE Tasks in the course.\n */\n function setTaskSelectionListeners() {\n taskSelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskIds = selectedTaskIds.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskIds.push(checkbox.value);\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n /**\n * Set selection listeners for properties to apply to MUMIE Tasks in the course.\n */\n function setPropertySelectionListeners() {\n propertySelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskProp = selectedTaskProp.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskProp.push(checkbox.value);\n }\n selectedTaskProperties.value = JSON.stringify(selectedTaskProp);\n };\n });\n }\n\n /**\n * Set selection listeners for entire section of MUMIE Tasks in the course\n */\n function setSectionSelectionListeners() {\n sectionInputs.forEach(function(sectionCheckbox) {\n sectionCheckbox.onchange = function() {\n if (!sectionCheckbox.checked) {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = false;\n selectedTaskIds = selectedTaskIds.filter(elem => taskCheckbox.value !== elem);\n }\n });\n } else {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = true;\n pushIfNotExists(selectedTaskIds, taskCheckbox.value);\n }\n });\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n return {\n init: function() {\n setTaskSelectionListeners();\n setPropertySelectionListeners();\n setSectionSelectionListeners();\n },\n };\n })();\n\n /**\n * Disable all dropdown menus and show notification\n * @param {string} errorKey\n */\n function disableDropDownMenus(errorKey) {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': errorKey,\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0] + \"\" + missingConfig.getAttribute(\"value\") + \"\",\n type: \"problem\"\n });\n }).fail(notification.exception);\n });\n serverController.disable();\n problemSelectorController.disable();\n }\n\n return {\n init: function(contextid, prbSelectorUrl, lang) {\n lmsSelectorUrl = prbSelectorUrl;\n systemLanguage = lang;\n const isEdit = document.getElementById(\"id_name\").getAttribute('value');\n const serverStructure = JSON.parse(document.getElementsByName('mumie_server_structure')[0].value);\n if (isEdit && !serverConfigExists()) {\n disableDropDownMenus('mumie_form_missing_server');\n } else if (!serverStructure.length) {\n disableDropDownMenus('mumie_form_no_server_conf');\n } else {\n serverController.init(serverStructure);\n courseController.init();\n taskController.init(isEdit);\n multiTaskEditController.init();\n problemSelectorController.init();\n }\n multiTaskEditController.init();\n if (addServerButton) {\n require(['auth_mumie/mumie_server_config'], function(MumieServer) {\n MumieServer.init(addServerButton, contextid);\n });\n }\n }\n };\n\n /**\n * Remove all child elements of a given html element\n * @param {Object} elem\n */\n function removeChildElems(elem) {\n while (elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n }\n\n /**\n * Check, if the flag for an existing config is set\n * @returns {boolean}\n */\n function serverConfigExists() {\n return document.getElementsByName(\"mumie_missing_config\")[0].getAttribute(\"value\") === \"\";\n }\n });\n"],"names":["define","addServerButton","document","getElementById","missingConfig","getElementsByName","lmsSelectorUrl","systemLanguage","serverController","serverStructure","serverDropDown","init","structure","getSelectedServer","selectedServerName","options","selectedIndex","text","find","server","name","disable","disabled","elem","firstChild","removeChild","removeChildElems","getAllServers","problemSelectorController","problemSelectorButton","problemSelectorWindow","mumieOrg","value","sendResponse","response","postMessage","JSON","stringify","sendSuccess","message","success","addMessageListener","window","addEventListener","event","origin","importObj","parse","data","isGraded","courseController","setCourse","path_to_coursefile","langController","setLanguage","language","taskController","setSelection","link","setIsGraded","focus","require","str","notification","get_strings","component","done","s","addNotification","type","fail","exception","error","sendFailure","gradingType","getGradingType","onclick","open","encodeURIComponent","urlprefix","getSelectedLanguage","location","onclose","courseNameElem","coursefileElem","updateCourseName","selectedCourse","getSelectedCourse","selectedLanguage","translation","_selectedCourse$name$","courses","course","coursefile","courseFile","languageElem","lang","languages","includes","languageExists","Error","taskSelectionInput","nameElem","taskDisplayElement","isGradedElem","updateName","newHeadline","task","headlineWrapper","headline","localHeadline","getHeadline","getSelectedTask","length","flatMap","tasks","map","concat","n","isCustomName","getLocalizedLinkFromTask","selectedLink","slice","push","i","getPseudoTaskFromCourse","newSelection","updateGradeEditability","multiTaskEditController","propertySelectionInputs","selectedTaskProperties","selectedTaskProp","taskSelectionInputs","selectedTasks","selectedTaskIds","sectionInputs","forEach","checkbox","onchange","checked","filter","sectionCheckbox","taskCheckbox","array","element","getAttribute","disableDropDownMenus","errorKey","contextid","prbSelectorUrl","isEdit","MumieServer"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"mod_form.min.js","sources":["../src/mod_form.js"],"sourcesContent":["define(['jquery', 'core/templates', 'core/modal_factory', 'auth_mumie/mumie_server_config', 'core/ajax'],\n function() {\n const addServerButton = document.getElementById(\"id_add_server_button\");\n const missingConfig = document.getElementsByName(\"mumie_missing_config\")[0];\n let lmsSelectorUrl;\n let systemLanguage;\n const serverController = (function() {\n let serverStructure;\n const serverDropDown = document.getElementById(\"id_server\");\n\n return {\n init: function(structure) {\n serverStructure = structure;\n },\n getSelectedServer: function() {\n const selectedServerName = serverDropDown.options[serverDropDown.selectedIndex].text;\n return serverStructure.find(server => server.name === selectedServerName);\n },\n disable: function() {\n serverDropDown.disabled = true;\n removeChildElems(serverDropDown);\n },\n getAllServers: function() {\n return serverStructure;\n }\n };\n })();\n\n const problemSelectorController = (function() {\n const problemSelectorButton = document.getElementById('id_prb_selector_btn');\n let problemSelectorWindow;\n const mumieOrg = document.getElementsByName('mumie_org')[0].value;\n\n /**\n * Send a message to the problem selector window.\n *\n * Don't do anything, if there is no problem selector window.\n * @param {Object} response\n */\n function sendResponse(response) {\n if (!problemSelectorWindow) {\n return;\n }\n problemSelectorWindow.postMessage(JSON.stringify(response), lmsSelectorUrl);\n }\n\n /**\n * Send a success message to problem selector window\n * @param {string} message\n */\n function sendSuccess(message = '') {\n sendResponse({\n success: true,\n message: message\n });\n }\n\n /**\n * Send a failure message to problem selector window\n * @param {string} message\n */\n function sendFailure(message = '') {\n sendResponse({\n success: false,\n message: message\n });\n }\n\n /**\n * Add an event listener that accepts messages from LMS-Browser and updates the selected problem.\n */\n function addMessageListener() {\n window.addEventListener('message', (event) => {\n if (event.origin !== lmsSelectorUrl) {\n return;\n }\n const importObj = JSON.parse(event.data);\n const isGraded = importObj.isGraded !== false;\n try {\n courseController.setCourse(importObj.path_to_coursefile);\n langController.setLanguage(importObj.language);\n taskController.setSelection(importObj.link + '?lang=' + importObj.language);\n taskController.setIsGraded(isGraded);\n sendSuccess();\n window.focus();\n displayProblemSelectedMessage();\n } catch (error) {\n sendFailure(error.message);\n }\n }, false);\n }\n\n /**\n * Display a success message in Moodle that a problem was successfully selected.\n */\n function displayProblemSelectedMessage() {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': 'mumie_form_updated_selection',\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0],\n type: \"info\"\n });\n }).fail(notification.exception);\n });\n }\n\n return {\n init: function() {\n const gradingType = taskController.getGradingType();\n problemSelectorButton.onclick = function() {\n problemSelectorWindow = window.open(\n lmsSelectorUrl\n + '/lms-problem-selector?'\n + 'org='\n + mumieOrg\n + '&serverUrl='\n + encodeURIComponent(serverController.getSelectedServer().urlprefix)\n + '&problemLang='\n + langController.getSelectedLanguage()\n + '&origin=' + encodeURIComponent(window.location.origin)\n + '&uiLang=' + systemLanguage\n + '&gradingType=' + gradingType\n + '&multiCourse=true'\n , '_blank'\n );\n };\n\n window.onclose = function() {\n sendSuccess();\n };\n\n window.addEventListener(\"beforeunload\", function() {\n sendSuccess();\n }, false);\n\n addMessageListener();\n },\n disable: function() {\n problemSelectorButton.disabled = true;\n }\n };\n })();\n\n const courseController = (function() {\n const courseNameElem = document.getElementById(\"id_mumie_course\");\n const coursefileElem = document.getElementsByName(\"mumie_coursefile\")[0];\n\n\n /**\n * Update the hidden input field with the selected course's course file path\n *\n * @param {string} coursefile\n */\n function updateCoursefilePath(coursefile) {\n coursefileElem.value = coursefile;\n updateCourseName();\n }\n\n /**\n * Update displayed course name.\n */\n function updateCourseName() {\n const selectedCourse = courseController.getSelectedCourse();\n const selectedLanguage = langController.getSelectedLanguage();\n if (!selectedCourse || !selectedLanguage) {\n return;\n }\n courseNameElem.value = selectedCourse.name\n .find(translation => translation.language === selectedLanguage)?.value;\n }\n\n return {\n init: function() {\n updateCourseName();\n },\n getSelectedCourse: function() {\n const courses = serverController.getSelectedServer().courses;\n return courses.find(course => course.coursefile === coursefileElem.value);\n },\n updateCourseName: function() {\n updateCourseName();\n },\n setCourse: function(courseFile) {\n updateCoursefilePath(courseFile);\n }\n };\n })();\n\n const langController = (function() {\n const languageElem = document.getElementById(\"id_language\");\n\n /**\n * Check if the given language exists in the currently selected course.\n * @param {string} lang\n * @returns {boolean} Whether the language exists\n */\n function languageExists(lang) {\n return courseController.getSelectedCourse().languages.includes(lang);\n }\n return {\n getSelectedLanguage: function() {\n return languageElem.value;\n },\n setLanguage: function(lang) {\n if (!languageExists(lang)) {\n throw new Error(\"Selected language not available\");\n }\n languageElem.value = lang;\n courseController.updateCourseName();\n }\n };\n })();\n\n const taskController = (function() {\n const taskSelectionInput = document.getElementsByName(\"taskurl\")[0];\n const nameElem = document.getElementById(\"id_name\");\n const taskDisplayElement = document.getElementById(\"id_task_display_element\");\n const isGradedElem = document.getElementById('id_mumie_isgraded');\n\n\n /**\n * Update the activity's name in the input field\n */\n function updateName() {\n const newHeadline = getHeadline(taskController.getSelectedTask());\n if (!isCustomName()) {\n nameElem.value = newHeadline;\n }\n taskDisplayElement.value = newHeadline;\n }\n\n /**\n * Check whether the activity has a custom name\n *\n * @return {boolean} True, if there is no headline with that name in all tasks\n */\n function isCustomName() {\n if (nameElem.value.length === 0) {\n return false;\n }\n return !getAllHeadlines().includes(nameElem.value);\n }\n\n /**\n * Get the task's headline for the currently selected language\n * @param {Object} task\n * @returns {string|null} the headline\n */\n function getHeadline(task) {\n if (!task) {\n return null;\n }\n const selectedLanguage = langController.getSelectedLanguage();\n const headlineWrapper = task.headline.find(localHeadline => localHeadline.language === selectedLanguage);\n return headlineWrapper ? headlineWrapper.name : null;\n }\n\n /**\n * Get all tasks that are available on all servers\n *\n * @return {Object} Array containing all available tasks\n */\n function getAllTasks() {\n return serverController.getAllServers()\n .flatMap(server => server.courses)\n .flatMap(course => course.tasks);\n }\n\n /**\n * Get all possible headlines in all languages\n * @returns {Object} Array containing all headlines\n */\n function getAllHeadlines() {\n return getAllTasks().flatMap(task => task.headline)\n .map(headline => headline.name)\n .concat(courseController.getSelectedCourse().name.map(n => n.value));\n }\n\n /**\n * Add language parameter to the task's link to display content in the selected language\n * @param {Object} task\n * @returns {string}\n */\n function getLocalizedLinkFromTask(task) {\n return getLocalizedLink(task.link);\n }\n\n /**\n * Add language parameter to link\n * @param {string} link\n * @returns {string}\n */\n function getLocalizedLink(link) {\n return link + \"?lang=\" + langController.getSelectedLanguage();\n }\n\n /**\n * Form inputs related to grades should be disabled, if the MUMIE Task is not graded.\n */\n function updateGradeEditability() {\n const disabled = isGradedElem.value === '0';\n document.getElementById('id_points').disabled = disabled;\n document.getElementById('id_gradepass').disabled = disabled;\n document.getElementById('id_duedate_enabled').disabled = disabled;\n document.getElementById('id_gradecat').disabled = disabled;\n }\n\n /**\n * Get a task that links to a course's overview page\n * @param {Object} course\n * @returns {Object} task\n */\n function getPseudoTaskFromCourse(course) {\n var headline = [];\n for (var i in course.name) {\n var name = course.name[i];\n headline.push({\n \"name\": name.value,\n \"language\": name.language\n });\n }\n return {\n \"link\": course.link,\n \"headline\": headline\n };\n }\n\n return {\n init: function() {\n updateName();\n },\n getSelectedTask: function() {\n const selectedLink = taskSelectionInput.value;\n const selectedCourse = courseController.getSelectedCourse();\n if (!selectedCourse) {\n return null;\n }\n const tasks = selectedCourse\n .tasks\n .slice();\n tasks.push(getPseudoTaskFromCourse(selectedCourse));\n return tasks\n .find(task => getLocalizedLinkFromTask(task) === selectedLink);\n },\n setSelection: function(newSelection) {\n taskSelectionInput.value = newSelection;\n updateName();\n },\n setIsGraded: function(isGraded) {\n if (isGraded === null) {\n isGradedElem.value = null;\n }\n isGradedElem.value = isGraded ? '1' : '0';\n updateGradeEditability();\n },\n getGradingType: function() {\n const isGraded = isGradedElem.value;\n if (isGraded === '1') {\n return 'graded';\n } else if (isGraded === '0') {\n return 'ungraded';\n }\n return 'all';\n }\n };\n })();\n\n\n const multiTaskEditController = (function() {\n const propertySelectionInputs = document.getElementsByName(\"mumie_multi_edit_property\");\n const selectedTaskProperties = document.getElementsByName(\"mumie_selected_task_properties\")[0];\n let selectedTaskProp = [];\n const taskSelectionInputs = document.getElementsByName(\"mumie_multi_edit_task\");\n const selectedTasks = document.getElementsByName(\"mumie_selected_tasks\")[0];\n let selectedTaskIds = [];\n const sectionInputs = document.getElementsByName(\"mumie_multi_edit_section\");\n\n /**\n * Push an element to an array, if it's not already included.\n *\n * @param {string[]} array\n * @param {string} element\n */\n function pushIfNotExists(array, element) {\n if (!array.includes(element)) {\n array.push(element);\n }\n }\n\n /**\n * Set selection listeners for other MUMIE Tasks in the course.\n */\n function setTaskSelectionListeners() {\n taskSelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskIds = selectedTaskIds.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskIds.push(checkbox.value);\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n /**\n * Set selection listeners for properties to apply to MUMIE Tasks in the course.\n */\n function setPropertySelectionListeners() {\n propertySelectionInputs.forEach(function(checkbox) {\n checkbox.onchange = function() {\n if (!checkbox.checked) {\n selectedTaskProp = selectedTaskProp.filter(elem => elem !== checkbox.value);\n } else {\n selectedTaskProp.push(checkbox.value);\n }\n selectedTaskProperties.value = JSON.stringify(selectedTaskProp);\n };\n });\n }\n\n /**\n * Set selection listeners for entire section of MUMIE Tasks in the course\n */\n function setSectionSelectionListeners() {\n sectionInputs.forEach(function(sectionCheckbox) {\n sectionCheckbox.onchange = function() {\n if (!sectionCheckbox.checked) {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = false;\n selectedTaskIds = selectedTaskIds.filter(elem => taskCheckbox.value !== elem);\n }\n });\n } else {\n taskSelectionInputs.forEach(function(taskCheckbox) {\n if (taskCheckbox.getAttribute('section') === sectionCheckbox.value) {\n taskCheckbox.checked = true;\n pushIfNotExists(selectedTaskIds, taskCheckbox.value);\n }\n });\n }\n selectedTasks.value = JSON.stringify(selectedTaskIds);\n };\n });\n }\n\n return {\n init: function() {\n setTaskSelectionListeners();\n setPropertySelectionListeners();\n setSectionSelectionListeners();\n },\n };\n })();\n\n /**\n * Disable all dropdown menus and show notification\n * @param {string} errorKey\n */\n function disableDropDownMenus(errorKey) {\n require(['core/str', \"core/notification\"], function(str, notification) {\n str.get_strings([{\n 'key': errorKey,\n component: 'mod_mumie'\n }]).done(function(s) {\n notification.addNotification({\n message: s[0] + \"\" + missingConfig.getAttribute(\"value\") + \"\",\n type: \"problem\"\n });\n }).fail(notification.exception);\n });\n serverController.disable();\n problemSelectorController.disable();\n }\n\n return {\n init: function(contextid, prbSelectorUrl, lang) {\n lmsSelectorUrl = prbSelectorUrl;\n systemLanguage = lang;\n const isEdit = document.getElementById(\"id_name\").getAttribute('value');\n const serverStructure = JSON.parse(document.getElementsByName('mumie_server_structure')[0].value);\n if (isEdit && !serverConfigExists()) {\n disableDropDownMenus('mumie_form_missing_server');\n } else if (!serverStructure.length) {\n disableDropDownMenus('mumie_form_no_server_conf');\n } else {\n serverController.init(serverStructure);\n courseController.init();\n taskController.init(isEdit);\n multiTaskEditController.init();\n problemSelectorController.init();\n }\n multiTaskEditController.init();\n if (addServerButton) {\n require(['auth_mumie/mumie_server_config'], function(MumieServer) {\n MumieServer.init(addServerButton, contextid);\n });\n }\n }\n };\n\n /**\n * Remove all child elements of a given html element\n * @param {Object} elem\n */\n function removeChildElems(elem) {\n while (elem.firstChild) {\n elem.removeChild(elem.firstChild);\n }\n }\n\n /**\n * Check, if the flag for an existing config is set\n * @returns {boolean}\n */\n function serverConfigExists() {\n return document.getElementsByName(\"mumie_missing_config\")[0].getAttribute(\"value\") === \"\";\n }\n });\n"],"names":["define","lmsSelectorUrl","systemLanguage","serverStructure","serverDropDown","languageElem","propertySelectionInputs","selectedTaskProperties","selectedTaskProp","taskSelectionInputs","selectedTasks","selectedTaskIds","sectionInputs","addServerButton","document","getElementById","missingConfig","getElementsByName","serverController","init","structure","getSelectedServer","selectedServerName","options","selectedIndex","text","find","server","name","disable","disabled","elem","firstChild","removeChild","removeChildElems","getAllServers","problemSelectorController","problemSelectorWindow","problemSelectorButton","mumieOrg","value","sendResponse","response","postMessage","JSON","stringify","sendSuccess","message","success","addMessageListener","window","addEventListener","event","origin","importObj","parse","data","isGraded","courseController","setCourse","path_to_coursefile","langController","setLanguage","language","taskController","setSelection","link","setIsGraded","focus","require","str","notification","get_strings","component","done","s","addNotification","type","fail","exception","error","sendFailure","gradingType","getGradingType","onclick","open","encodeURIComponent","urlprefix","getSelectedLanguage","location","onclose","courseNameElem","coursefileElem","updateCourseName","selectedCourse","getSelectedCourse","selectedLanguage","translation","_selectedCourse$name$","courses","course","coursefile","courseFile","lang","languages","includes","languageExists","Error","taskSelectionInput","nameElem","taskDisplayElement","isGradedElem","updateName","newHeadline","task","headlineWrapper","headline","localHeadline","getHeadline","getSelectedTask","length","flatMap","tasks","map","concat","n","isCustomName","getLocalizedLinkFromTask","selectedLink","slice","push","i","getPseudoTaskFromCourse","newSelection","multiTaskEditController","forEach","checkbox","onchange","checked","filter","sectionCheckbox","taskCheckbox","array","element","getAttribute","disableDropDownMenus","errorKey","contextid","prbSelectorUrl","isEdit","MumieServer"],"mappings":"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"} \ No newline at end of file From 698eb32e8e0f6601851b949c1e513f271656898f Mon Sep 17 00:00:00 2001 From: Tobias Goltz Date: Wed, 23 Mar 2022 14:42:57 +0100 Subject: [PATCH 5/5] Updated version and changelog for new release --- changelog.md | 5 +++++ version.php | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/changelog.md b/changelog.md index ad8ea8e..61670c3 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,11 @@ All important changes to this plugin will be documented in this file. +## [v1.4.7] - 2022-03-23 + +## Fixed +- Fixed an issue where only participants with default student role were listed on the individual grading settings page. Now every participant with a graded role will be listed. + ## [v1.4.6] - 2022-03-11 ## Added diff --git a/version.php b/version.php index 061363f..0661add 100644 --- a/version.php +++ b/version.php @@ -25,10 +25,10 @@ defined('MOODLE_INTERNAL') || die; -$plugin->version = 2022031102; // The current module version (Date: YYYYMMDDXX). +$plugin->version = 2022032300; // The current module version (Date: YYYYMMDDXX). $plugin->component = 'mod_mumie'; // Full name of the plugin (used for diagnostics). $plugin->requires = 2020061500; -$plugin->release = "v1.4.6"; +$plugin->release = "v1.4.7"; $plugin->maturity = MATURITY_STABLE; $plugin->dependencies = array( 'auth_mumie' => 2021031200,