From 783477d51ba95531e8158a7db2600a2a40b92b3f Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Thu, 11 Jul 2024 14:54:41 +0800 Subject: [PATCH] MDL-82373 core_grades: Address random failures when editing gradebook --- grade/amd/build/gradebooksetup_forms.min.js | 4 +- .../amd/build/gradebooksetup_forms.min.js.map | 2 +- grade/amd/src/gradebooksetup_forms.js | 78 ++++++++++++------- grade/tests/behat/behat_grade.php | 9 ++- 4 files changed, 60 insertions(+), 33 deletions(-) diff --git a/grade/amd/build/gradebooksetup_forms.min.js b/grade/amd/build/gradebooksetup_forms.min.js index b01ba8e52c4..496d308e9b0 100644 --- a/grade/amd/build/gradebooksetup_forms.min.js +++ b/grade/amd/build/gradebooksetup_forms.min.js @@ -1,10 +1,10 @@ -define("core_grades/gradebooksetup_forms",["exports","core_form/modalform","core/str","core/notification","core_form/changechecker"],(function(_exports,_modalform,_str,_notification,FormChangeChecker){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +define("core_grades/gradebooksetup_forms",["exports","core_form/modalform","core/str","core/notification","core_form/changechecker","core/pending"],(function(_exports,_modalform,_str,_notification,FormChangeChecker,_pending){function _getRequireWildcardCache(nodeInterop){if("function"!=typeof WeakMap)return null;var cacheBabelInterop=new WeakMap,cacheNodeInterop=new WeakMap;return(_getRequireWildcardCache=function(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop})(nodeInterop)}function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} /** * Prints the add item gradebook form * * @module core_grades * @copyright 2023 Mathew May * @license http://www.gnu.org/copyleft/gpl.html GNU Public License - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_modalform=_interopRequireDefault(_modalform),_notification=_interopRequireDefault(_notification),FormChangeChecker=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(FormChangeChecker);const Selectors_advancedFormLink="a.showadvancedform";_exports.init=()=>{document.addEventListener("click",(event=>{const args={};let formClass=null,title=null,trigger=null;if(event.target.closest('[data-trigger="add-item-form"]')?(event.preventDefault(),trigger=event.target.closest('[data-trigger="add-item-form"]'),formClass="core_grades\\form\\add_item",title="-1"===trigger.getAttribute("data-itemid")?(0,_str.getString)("newitem","core_grades"):(0,_str.getString)("itemsedit","core_grades"),args.itemid=trigger.getAttribute("data-itemid")):event.target.closest('[data-trigger="add-category-form"]')?(event.preventDefault(),trigger=event.target.closest('[data-trigger="add-category-form"]'),formClass="core_grades\\form\\add_category",title="-1"===trigger.getAttribute("data-category")?(0,_str.getString)("newcategory","core_grades"):(0,_str.getString)("categoryedit","core_grades"),args.category=trigger.getAttribute("data-category")):event.target.closest('[data-trigger="add-outcome-form"]')&&(event.preventDefault(),trigger=event.target.closest('[data-trigger="add-outcome-form"]'),formClass="core_grades\\form\\add_outcome",title="-1"===trigger.getAttribute("data-itemid")?(0,_str.getString)("newoutcomeitem","core_grades"):(0,_str.getString)("outcomeitemsedit","core_grades"),args.itemid=trigger.getAttribute("data-itemid")),trigger){args.courseid=trigger.getAttribute("data-courseid"),args.gpr_plugin=trigger.getAttribute("data-gprplugin");const modalForm=new _modalform.default({modalConfig:{title:title},formClass:formClass,args:args,saveButtonText:(0,_str.getString)("save","core"),returnFocus:trigger});modalForm.addEventListener(modalForm.events.FORM_SUBMITTED,(event=>{event.detail.result?window.location.assign(event.detail.url):_notification.default.addNotification({type:"error",message:(0,_str.getString)("saving_failed","core_grades")})})),modalForm.show()}const showAdvancedForm=event.target.closest(Selectors_advancedFormLink);if(showAdvancedForm){event.preventDefault();const form=event.target.closest("form");form.action=showAdvancedForm.href,FormChangeChecker.disableAllChecks(),form.submit()}}))}})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_modalform=_interopRequireDefault(_modalform),_notification=_interopRequireDefault(_notification),FormChangeChecker=function(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule)return obj;if(null===obj||"object"!=typeof obj&&"function"!=typeof obj)return{default:obj};var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj))return cache.get(obj);var newObj={},hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj)if("default"!==key&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;desc&&(desc.get||desc.set)?Object.defineProperty(newObj,key,desc):newObj[key]=obj[key]}newObj.default=obj,cache&&cache.set(obj,newObj);return newObj}(FormChangeChecker),_pending=_interopRequireDefault(_pending);const Selectors_advancedFormLink="a.showadvancedform";_exports.init=()=>{document.addEventListener("click",(event=>{const triggerData=(event=>{if(event.target.closest('[data-trigger="add-item-form"]')){const trigger=event.target.closest('[data-trigger="add-item-form"]');return{trigger:trigger,formClass:"core_grades\\form\\add_item",titleKey:"-1"===trigger.getAttribute("data-itemid")?"newitem":"itemsedit",args:{itemid:trigger.getAttribute("data-itemid")}}}if(event.target.closest('[data-trigger="add-category-form"]')){const trigger=event.target.closest('[data-trigger="add-category-form"]');return{trigger:trigger,formClass:"core_grades\\form\\add_category",titleKey:"-1"===trigger.getAttribute("data-category")?"newcategory":"categoryedit",args:{category:trigger.getAttribute("data-category")}}}if(event.target.closest('[data-trigger="add-outcome-form"]')){const trigger=event.target.closest('[data-trigger="add-outcome-form"]');return{trigger:trigger,formClass:"core_grades\\form\\add_outcome",titleKey:"-1"===trigger.getAttribute("data-itemid")?"newoutcomeitem":"outcomeitemsedit",args:{itemid:trigger.getAttribute("data-itemid")}}}return null})(event);if(triggerData){event.preventDefault();const pendingPromise=new _pending.default("core_grades:add_item:".concat(triggerData.args.itemid)),{trigger:trigger,formClass:formClass,titleKey:titleKey,args:args}=triggerData;args.courseid=trigger.getAttribute("data-courseid"),args.gpr_plugin=trigger.getAttribute("data-gprplugin");const modalForm=new _modalform.default({modalConfig:{title:(0,_str.getString)(titleKey,"core_grades")},formClass:formClass,args:args,saveButtonText:(0,_str.getString)("save","core"),returnFocus:trigger});modalForm.addEventListener(modalForm.events.FORM_SUBMITTED,(event=>{event.detail.result?(new _pending.default("core_grades:form_submitted"),window.location.assign(event.detail.url)):_notification.default.addNotification({type:"error",message:(0,_str.getString)("saving_failed","core_grades")})})),modalForm.show(),pendingPromise.resolve()}const showAdvancedForm=event.target.closest(Selectors_advancedFormLink);if(showAdvancedForm){event.preventDefault(),new _pending.default("core_grades:show_advanced_form");const form=event.target.closest("form");form.action=showAdvancedForm.href,FormChangeChecker.disableAllChecks(),form.submit()}}))}})); //# sourceMappingURL=gradebooksetup_forms.min.js.map \ No newline at end of file diff --git a/grade/amd/build/gradebooksetup_forms.min.js.map b/grade/amd/build/gradebooksetup_forms.min.js.map index 779b03bcab3..b29254cd266 100644 --- a/grade/amd/build/gradebooksetup_forms.min.js.map +++ b/grade/amd/build/gradebooksetup_forms.min.js.map @@ -1 +1 @@ -{"version":3,"file":"gradebooksetup_forms.min.js","sources":["../src/gradebooksetup_forms.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Prints the add item gradebook form\n *\n * @module core_grades\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU Public License\n */\n\nimport ModalForm from 'core_form/modalform';\nimport {getString} from 'core/str';\nimport Notification from 'core/notification';\nimport * as FormChangeChecker from 'core_form/changechecker';\n\nconst Selectors = {\n advancedFormLink: 'a.showadvancedform'\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n // Sometimes the trigger does not exist, so lets conditionally add it.\n document.addEventListener('click', event => {\n const args = {};\n\n let formClass = null;\n let title = null;\n let trigger = null;\n if (event.target.closest('[data-trigger=\"add-item-form\"]')) {\n event.preventDefault();\n trigger = event.target.closest('[data-trigger=\"add-item-form\"]');\n formClass = 'core_grades\\\\form\\\\add_item';\n title = trigger.getAttribute('data-itemid') === '-1' ?\n getString('newitem', 'core_grades') : getString('itemsedit', 'core_grades');\n args.itemid = trigger.getAttribute('data-itemid');\n } else if (event.target.closest('[data-trigger=\"add-category-form\"]')) {\n event.preventDefault();\n trigger = event.target.closest('[data-trigger=\"add-category-form\"]');\n formClass = 'core_grades\\\\form\\\\add_category';\n title = trigger.getAttribute('data-category') === '-1' ?\n getString('newcategory', 'core_grades') : getString('categoryedit', 'core_grades');\n args.category = trigger.getAttribute('data-category');\n } else if (event.target.closest('[data-trigger=\"add-outcome-form\"]')) {\n event.preventDefault();\n trigger = event.target.closest('[data-trigger=\"add-outcome-form\"]');\n formClass = 'core_grades\\\\form\\\\add_outcome';\n title = trigger.getAttribute('data-itemid') === '-1' ?\n getString('newoutcomeitem', 'core_grades') : getString('outcomeitemsedit', 'core_grades');\n args.itemid = trigger.getAttribute('data-itemid');\n }\n\n if (trigger) {\n args.courseid = trigger.getAttribute('data-courseid');\n args.gpr_plugin = trigger.getAttribute('data-gprplugin');\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: title,\n },\n formClass: formClass,\n args: args,\n saveButtonText: getString('save', 'core'),\n returnFocus: trigger,\n });\n\n // Show a toast notification when the form is submitted.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n window.location.assign(event.detail.url);\n } else {\n Notification.addNotification({\n type: 'error',\n message: getString('saving_failed', 'core_grades')\n });\n }\n });\n\n modalForm.show();\n }\n\n const showAdvancedForm = event.target.closest(Selectors.advancedFormLink);\n if (showAdvancedForm) { // Navigate to the advanced form page and cary over any entered data.\n event.preventDefault();\n const form = event.target.closest('form');\n form.action = showAdvancedForm.href;\n // Disable the form change checker as we are going to carry over the data to the advanced form.\n FormChangeChecker.disableAllChecks();\n form.submit();\n }\n });\n};\n"],"names":["Selectors","document","addEventListener","event","args","formClass","title","trigger","target","closest","preventDefault","getAttribute","itemid","category","courseid","gpr_plugin","modalForm","ModalForm","modalConfig","saveButtonText","returnFocus","events","FORM_SUBMITTED","detail","result","window","location","assign","url","addNotification","type","message","show","showAdvancedForm","form","action","href","FormChangeChecker","disableAllChecks","submit"],"mappings":";;;;;;;42BA4BMA,2BACgB,mCAMF,KAEhBC,SAASC,iBAAiB,SAASC,cACzBC,KAAO,OAETC,UAAY,KACZC,MAAQ,KACRC,QAAU,QACVJ,MAAMK,OAAOC,QAAQ,mCACrBN,MAAMO,iBACNH,QAAUJ,MAAMK,OAAOC,QAAQ,kCAC/BJ,UAAY,8BACZC,MAAgD,OAAxCC,QAAQI,aAAa,gBACzB,kBAAU,UAAW,gBAAiB,kBAAU,YAAa,eACjEP,KAAKQ,OAASL,QAAQI,aAAa,gBAC5BR,MAAMK,OAAOC,QAAQ,uCAC5BN,MAAMO,iBACNH,QAAUJ,MAAMK,OAAOC,QAAQ,sCAC/BJ,UAAY,kCACZC,MAAkD,OAA1CC,QAAQI,aAAa,kBACzB,kBAAU,cAAe,gBAAiB,kBAAU,eAAgB,eACxEP,KAAKS,SAAWN,QAAQI,aAAa,kBAC9BR,MAAMK,OAAOC,QAAQ,uCAC5BN,MAAMO,iBACNH,QAAUJ,MAAMK,OAAOC,QAAQ,qCAC/BJ,UAAY,iCACZC,MAAgD,OAAxCC,QAAQI,aAAa,gBACzB,kBAAU,iBAAkB,gBAAiB,kBAAU,mBAAoB,eAC/EP,KAAKQ,OAASL,QAAQI,aAAa,gBAGnCJ,QAAS,CACTH,KAAKU,SAAWP,QAAQI,aAAa,iBACrCP,KAAKW,WAAaR,QAAQI,aAAa,wBAEjCK,UAAY,IAAIC,mBAAU,CAC5BC,YAAa,CACTZ,MAAOA,OAEXD,UAAWA,UACXD,KAAMA,KACNe,gBAAgB,kBAAU,OAAQ,QAClCC,YAAab,UAIjBS,UAAUd,iBAAiBc,UAAUK,OAAOC,gBAAgBnB,QACpDA,MAAMoB,OAAOC,OACbC,OAAOC,SAASC,OAAOxB,MAAMoB,OAAOK,2BAEvBC,gBAAgB,CACzBC,KAAM,QACNC,SAAS,kBAAU,gBAAiB,oBAKhDf,UAAUgB,aAGRC,iBAAmB9B,MAAMK,OAAOC,QAAQT,+BAC1CiC,iBAAkB,CAClB9B,MAAMO,uBACAwB,KAAO/B,MAAMK,OAAOC,QAAQ,QAClCyB,KAAKC,OAASF,iBAAiBG,KAE/BC,kBAAkBC,mBAClBJ,KAAKK"} \ No newline at end of file +{"version":3,"file":"gradebooksetup_forms.min.js","sources":["../src/gradebooksetup_forms.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle. If not, see .\n\n/**\n * Prints the add item gradebook form\n *\n * @module core_grades\n * @copyright 2023 Mathew May \n * @license http://www.gnu.org/copyleft/gpl.html GNU Public License\n */\n\nimport ModalForm from 'core_form/modalform';\nimport {getString} from 'core/str';\nimport Notification from 'core/notification';\nimport * as FormChangeChecker from 'core_form/changechecker';\nimport PendingPromise from 'core/pending';\n\nconst Selectors = {\n advancedFormLink: 'a.showadvancedform'\n};\n\nconst getDetailsFromEvent = (event) => {\n if (event.target.closest('[data-trigger=\"add-item-form\"]')) {\n const trigger = event.target.closest('[data-trigger=\"add-item-form\"]');\n\n return {\n trigger,\n formClass: 'core_grades\\\\form\\\\add_item',\n titleKey: trigger.getAttribute('data-itemid') === '-1' ? 'newitem' : 'itemsedit',\n args: {\n itemid: trigger.getAttribute('data-itemid'),\n },\n };\n } else if (event.target.closest('[data-trigger=\"add-category-form\"]')) {\n const trigger = event.target.closest('[data-trigger=\"add-category-form\"]');\n return {\n trigger,\n formClass: 'core_grades\\\\form\\\\add_category',\n titleKey: trigger.getAttribute('data-category') === '-1' ? 'newcategory' : 'categoryedit',\n args: {\n category: trigger.getAttribute('data-category'),\n },\n };\n } else if (event.target.closest('[data-trigger=\"add-outcome-form\"]')) {\n const trigger = event.target.closest('[data-trigger=\"add-outcome-form\"]');\n return {\n trigger,\n formClass: 'core_grades\\\\form\\\\add_outcome',\n titleKey: trigger.getAttribute('data-itemid') === '-1' ? 'newoutcomeitem' : 'outcomeitemsedit',\n args: {\n itemid: trigger.getAttribute('data-itemid'),\n },\n };\n }\n\n return null;\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n // Sometimes the trigger does not exist, so lets conditionally add it.\n document.addEventListener('click', event => {\n const triggerData = getDetailsFromEvent(event);\n\n if (triggerData) {\n event.preventDefault();\n const pendingPromise = new PendingPromise(`core_grades:add_item:${triggerData.args.itemid}`);\n\n const {trigger, formClass, titleKey, args} = triggerData;\n args.courseid = trigger.getAttribute('data-courseid');\n args.gpr_plugin = trigger.getAttribute('data-gprplugin');\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: getString(titleKey, 'core_grades'),\n },\n formClass: formClass,\n args: args,\n saveButtonText: getString('save', 'core'),\n returnFocus: trigger,\n });\n\n // Show a toast notification when the form is submitted.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n new PendingPromise('core_grades:form_submitted');\n window.location.assign(event.detail.url);\n } else {\n Notification.addNotification({\n type: 'error',\n message: getString('saving_failed', 'core_grades')\n });\n }\n });\n\n modalForm.show();\n pendingPromise.resolve();\n }\n\n const showAdvancedForm = event.target.closest(Selectors.advancedFormLink);\n if (showAdvancedForm) {\n // Navigate to the advanced form page and cary over any entered data.\n event.preventDefault();\n\n // Do not resolve this pendingPromise - it will be cleared when the page changes.\n new PendingPromise('core_grades:show_advanced_form');\n const form = event.target.closest('form');\n form.action = showAdvancedForm.href;\n // Disable the form change checker as we are going to carry over the data to the advanced form.\n FormChangeChecker.disableAllChecks();\n form.submit();\n }\n });\n};\n"],"names":["Selectors","document","addEventListener","event","triggerData","target","closest","trigger","formClass","titleKey","getAttribute","args","itemid","category","getDetailsFromEvent","preventDefault","pendingPromise","PendingPromise","courseid","gpr_plugin","modalForm","ModalForm","modalConfig","title","saveButtonText","returnFocus","events","FORM_SUBMITTED","detail","result","window","location","assign","url","addNotification","type","message","show","resolve","showAdvancedForm","form","action","href","FormChangeChecker","disableAllChecks","submit"],"mappings":";;;;;;;s5BA6BMA,2BACgB,mCA2CF,KAEhBC,SAASC,iBAAiB,SAASC,cACzBC,YA3CeD,CAAAA,WACrBA,MAAME,OAAOC,QAAQ,kCAAmC,OAClDC,QAAUJ,MAAME,OAAOC,QAAQ,wCAE9B,CACHC,QAAAA,QACAC,UAAW,8BACXC,SAAkD,OAAxCF,QAAQG,aAAa,eAA0B,UAAY,YACrEC,KAAM,CACFC,OAAQL,QAAQG,aAAa,iBAGlC,GAAIP,MAAME,OAAOC,QAAQ,sCAAuC,OAC7DC,QAAUJ,MAAME,OAAOC,QAAQ,4CAC9B,CACHC,QAAAA,QACAC,UAAW,kCACXC,SAAoD,OAA1CF,QAAQG,aAAa,iBAA4B,cAAgB,eAC3EC,KAAM,CACFE,SAAUN,QAAQG,aAAa,mBAGpC,GAAIP,MAAME,OAAOC,QAAQ,qCAAsC,OAC5DC,QAAUJ,MAAME,OAAOC,QAAQ,2CAC9B,CACHC,QAAAA,QACAC,UAAW,iCACXC,SAAkD,OAAxCF,QAAQG,aAAa,eAA0B,iBAAmB,mBAC5EC,KAAM,CACFC,OAAQL,QAAQG,aAAa,wBAKlC,MASiBI,CAAoBX,UAEpCC,YAAa,CACbD,MAAMY,uBACAC,eAAiB,IAAIC,gDAAuCb,YAAYO,KAAKC,UAE7EL,QAACA,QAADC,UAAUA,UAAVC,SAAqBA,SAArBE,KAA+BA,MAAQP,YAC7CO,KAAKO,SAAWX,QAAQG,aAAa,iBACrCC,KAAKQ,WAAaZ,QAAQG,aAAa,wBAEjCU,UAAY,IAAIC,mBAAU,CAC5BC,YAAa,CACTC,OAAO,kBAAUd,SAAU,gBAE/BD,UAAWA,UACXG,KAAMA,KACNa,gBAAgB,kBAAU,OAAQ,QAClCC,YAAalB,UAIjBa,UAAUlB,iBAAiBkB,UAAUM,OAAOC,gBAAgBxB,QACpDA,MAAMyB,OAAOC,YACTZ,iBAAe,8BACnBa,OAAOC,SAASC,OAAO7B,MAAMyB,OAAOK,4BAEvBC,gBAAgB,CACzBC,KAAM,QACNC,SAAS,kBAAU,gBAAiB,oBAKhDhB,UAAUiB,OACVrB,eAAesB,gBAGbC,iBAAmBpC,MAAME,OAAOC,QAAQN,+BAC1CuC,iBAAkB,CAElBpC,MAAMY,qBAGFE,iBAAe,wCACbuB,KAAOrC,MAAME,OAAOC,QAAQ,QAClCkC,KAAKC,OAASF,iBAAiBG,KAE/BC,kBAAkBC,mBAClBJ,KAAKK"} \ No newline at end of file diff --git a/grade/amd/src/gradebooksetup_forms.js b/grade/amd/src/gradebooksetup_forms.js index ea61fe7847e..b7da38a4237 100644 --- a/grade/amd/src/gradebooksetup_forms.js +++ b/grade/amd/src/gradebooksetup_forms.js @@ -25,52 +25,68 @@ import ModalForm from 'core_form/modalform'; import {getString} from 'core/str'; import Notification from 'core/notification'; import * as FormChangeChecker from 'core_form/changechecker'; +import PendingPromise from 'core/pending'; const Selectors = { advancedFormLink: 'a.showadvancedform' }; +const getDetailsFromEvent = (event) => { + if (event.target.closest('[data-trigger="add-item-form"]')) { + const trigger = event.target.closest('[data-trigger="add-item-form"]'); + + return { + trigger, + formClass: 'core_grades\\form\\add_item', + titleKey: trigger.getAttribute('data-itemid') === '-1' ? 'newitem' : 'itemsedit', + args: { + itemid: trigger.getAttribute('data-itemid'), + }, + }; + } else if (event.target.closest('[data-trigger="add-category-form"]')) { + const trigger = event.target.closest('[data-trigger="add-category-form"]'); + return { + trigger, + formClass: 'core_grades\\form\\add_category', + titleKey: trigger.getAttribute('data-category') === '-1' ? 'newcategory' : 'categoryedit', + args: { + category: trigger.getAttribute('data-category'), + }, + }; + } else if (event.target.closest('[data-trigger="add-outcome-form"]')) { + const trigger = event.target.closest('[data-trigger="add-outcome-form"]'); + return { + trigger, + formClass: 'core_grades\\form\\add_outcome', + titleKey: trigger.getAttribute('data-itemid') === '-1' ? 'newoutcomeitem' : 'outcomeitemsedit', + args: { + itemid: trigger.getAttribute('data-itemid'), + }, + }; + } + + return null; +}; + /** * Initialize module */ export const init = () => { // Sometimes the trigger does not exist, so lets conditionally add it. document.addEventListener('click', event => { - const args = {}; + const triggerData = getDetailsFromEvent(event); - let formClass = null; - let title = null; - let trigger = null; - if (event.target.closest('[data-trigger="add-item-form"]')) { + if (triggerData) { event.preventDefault(); - trigger = event.target.closest('[data-trigger="add-item-form"]'); - formClass = 'core_grades\\form\\add_item'; - title = trigger.getAttribute('data-itemid') === '-1' ? - getString('newitem', 'core_grades') : getString('itemsedit', 'core_grades'); - args.itemid = trigger.getAttribute('data-itemid'); - } else if (event.target.closest('[data-trigger="add-category-form"]')) { - event.preventDefault(); - trigger = event.target.closest('[data-trigger="add-category-form"]'); - formClass = 'core_grades\\form\\add_category'; - title = trigger.getAttribute('data-category') === '-1' ? - getString('newcategory', 'core_grades') : getString('categoryedit', 'core_grades'); - args.category = trigger.getAttribute('data-category'); - } else if (event.target.closest('[data-trigger="add-outcome-form"]')) { - event.preventDefault(); - trigger = event.target.closest('[data-trigger="add-outcome-form"]'); - formClass = 'core_grades\\form\\add_outcome'; - title = trigger.getAttribute('data-itemid') === '-1' ? - getString('newoutcomeitem', 'core_grades') : getString('outcomeitemsedit', 'core_grades'); - args.itemid = trigger.getAttribute('data-itemid'); - } + const pendingPromise = new PendingPromise(`core_grades:add_item:${triggerData.args.itemid}`); - if (trigger) { + const {trigger, formClass, titleKey, args} = triggerData; args.courseid = trigger.getAttribute('data-courseid'); args.gpr_plugin = trigger.getAttribute('data-gprplugin'); const modalForm = new ModalForm({ modalConfig: { - title: title, + title: getString(titleKey, 'core_grades'), }, formClass: formClass, args: args, @@ -81,6 +97,7 @@ export const init = () => { // Show a toast notification when the form is submitted. modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => { if (event.detail.result) { + new PendingPromise('core_grades:form_submitted'); window.location.assign(event.detail.url); } else { Notification.addNotification({ @@ -91,11 +108,16 @@ export const init = () => { }); modalForm.show(); + pendingPromise.resolve(); } const showAdvancedForm = event.target.closest(Selectors.advancedFormLink); - if (showAdvancedForm) { // Navigate to the advanced form page and cary over any entered data. + if (showAdvancedForm) { + // Navigate to the advanced form page and cary over any entered data. event.preventDefault(); + + // Do not resolve this pendingPromise - it will be cleared when the page changes. + new PendingPromise('core_grades:show_advanced_form'); const form = event.target.closest('form'); form.action = showAdvancedForm.href; // Disable the form change checker as we are going to carry over the data to the advanced form. diff --git a/grade/tests/behat/behat_grade.php b/grade/tests/behat/behat_grade.php index 42d3a0ae48d..424b7c39ef7 100644 --- a/grade/tests/behat/behat_grade.php +++ b/grade/tests/behat/behat_grade.php @@ -74,11 +74,16 @@ class behat_grade extends behat_base { 'link', '.modal-dialog', 'css_element']); } + $this->execute("behat_forms::i_set_the_following_fields_to_these_values", $data); if ($this->getSession()->getPage()->find('xpath', './/button[@data-action="save"]')) { $container = $this->get_selected_node("core_grades > gradeitem modal", "form"); - $node = $this->find('xpath', './/button[@data-action="save"]', false, $container); - $node->press(); + $this->execute('behat_general::i_click_on_in_the', [ + './/button[@data-action="save"]', + 'xpath', + $container, + 'NodeElement', + ]); } else { $savechanges = get_string('savechanges', 'grades'); $this->execute('behat_forms::press_button', $this->escape($savechanges));