MDL-82373 core_grades: Address random failures when editing gradebook

This commit is contained in:
Andrew Nicols 2024-07-11 14:54:41 +08:00
parent 78ccdc9939
commit 1f0d1e60a0
No known key found for this signature in database
GPG Key ID: 6D1E3157C8CFBF14
4 changed files with 60 additions and 33 deletions

View File

@ -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 <mathew.solutions>
* @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

File diff suppressed because one or more lines are too long

View File

@ -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.

View File

@ -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));