From 2d4ce64dde6a6ec175ce9ec53c5d0fc59986c6c5 Mon Sep 17 00:00:00 2001 From: Shamim Rezaie Date: Wed, 28 Aug 2019 00:51:47 +1000 Subject: [PATCH] MDL-66489 enrol: Send all form data to WS and do all busines logic there It is discouraged to use JS Date functions. We should pass all raw data to PHP. --- enrol/externallib.php | 79 +++++++++++++ enrol/tests/externallib_test.php | 149 +++++++++++++++++++++++++ lib/db/services.php | 11 +- lib/upgrade.txt | 1 + user/amd/build/status_field.min.js | 2 +- user/amd/build/status_field.min.js.map | 2 +- user/amd/src/status_field.js | 46 +------- version.php | 2 +- 8 files changed, 247 insertions(+), 45 deletions(-) diff --git a/enrol/externallib.php b/enrol/externallib.php index 593541e131a..9bf1e5dd159 100644 --- a/enrol/externallib.php +++ b/enrol/externallib.php @@ -919,6 +919,7 @@ class core_enrol_external extends external_api { /** * Returns description of edit_user_enrolment() parameters * + * @deprecated since 3.8 * @return external_function_parameters */ public static function edit_user_enrolment_parameters() { @@ -936,6 +937,7 @@ class core_enrol_external extends external_api { /** * External function that updates a given user enrolment. * + * @deprecated since 3.8 * @param int $courseid The course ID. * @param int $ueid The user enrolment ID. * @param int $status The enrolment status. @@ -1002,6 +1004,7 @@ class core_enrol_external extends external_api { /** * Returns description of edit_user_enrolment() result value * + * @deprecated since 3.8 * @return external_description */ public static function edit_user_enrolment_returns() { @@ -1020,6 +1023,82 @@ class core_enrol_external extends external_api { ); } + /** + * Mark the edit_user_enrolment web service as deprecated. + * + * @return bool + */ + public static function edit_user_enrolment_is_deprecated() { + return true; + } + + /** + * Returns description of submit_user_enrolment_form parameters. + * + * @return external_function_parameters. + */ + public static function submit_user_enrolment_form_parameters() { + return new external_function_parameters([ + 'formdata' => new external_value(PARAM_RAW, 'The data from the event form'), + ]); + } + + /** + * External function that handles the user enrolment form submission. + * + * @param string $formdata The user enrolment form data in s URI encoded param string + * @return array An array consisting of the processing result and error flag, if available + */ + public static function submit_user_enrolment_form($formdata) { + global $CFG, $DB, $PAGE; + + // Parameter validation. + $params = self::validate_parameters(self::submit_user_enrolment_form_parameters(), ['formdata' => $formdata]); + + $data = []; + parse_str($params['formdata'], $data); + + $userenrolment = $DB->get_record('user_enrolments', ['id' => $data['ue']], '*', MUST_EXIST); + $instance = $DB->get_record('enrol', ['id' => $userenrolment->enrolid], '*', MUST_EXIST); + $plugin = enrol_get_plugin($instance->enrol); + $course = get_course($instance->courseid); + $context = context_course::instance($course->id); + self::validate_context($context); + + require_once("$CFG->dirroot/enrol/editenrolment_form.php"); + $customformdata = [ + 'ue' => $userenrolment, + 'modal' => true, + 'enrolinstancename' => $plugin->get_instance_name($instance) + ]; + $mform = new enrol_user_enrolment_form(null, $customformdata, 'post', '', null, true, $data); + + if ($validateddata = $mform->get_data()) { + if (!empty($validateddata->duration) && $validateddata->timeend == 0) { + $validateddata->timeend = $validateddata->timestart + $validateddata->duration; + } + require_once($CFG->dirroot . '/enrol/locallib.php'); + $manager = new course_enrolment_manager($PAGE, $course); + $result = $manager->edit_enrolment($userenrolment, $validateddata); + + return ['result' => $result]; + } else { + return ['result' => false, 'validationerror' => true]; + } + } + + /** + * Returns description of submit_user_enrolment_form() result value + * + * @return external_description + */ + public static function submit_user_enrolment_form_returns() { + return new external_single_structure([ + 'result' => new external_value(PARAM_BOOL, 'True if the user\'s enrolment was successfully updated'), + 'validationerror' => new external_value(PARAM_BOOL, 'Indicates invalid form data', VALUE_DEFAULT, false), + ]); + } + /** * Returns description of unenrol_user_enrolment() parameters * diff --git a/enrol/tests/externallib_test.php b/enrol/tests/externallib_test.php index da07c87ab97..8ae3b1b7566 100644 --- a/enrol/tests/externallib_test.php +++ b/enrol/tests/externallib_test.php @@ -958,6 +958,155 @@ class core_enrol_externallib_testcase extends externallib_advanced_testcase { $this->assertEquals(ENROL_USER_SUSPENDED, $ue->status); } + /** + * dataProvider for test_submit_user_enrolment_form(). + */ + public function submit_user_enrolment_form_provider() { + $now = new DateTime(); + + $nextmonth = clone($now); + $nextmonth->add(new DateInterval('P1M')); + + return [ + 'Invalid data' => [ + 'customdata' => [ + 'status' => ENROL_USER_ACTIVE, + 'timestart' => [ + 'day' => $now->format('j'), + 'month' => $now->format('n'), + 'year' => $now->format('Y'), + 'hour' => $now->format('G'), + 'minute' => 0, + 'enabled' => 1, + ], + 'timeend' => [ + 'day' => $now->format('j'), + 'month' => $now->format('n'), + 'year' => $now->format('Y'), + 'hour' => $now->format('G'), + 'minute' => 0, + 'enabled' => 1, + ], + ], + 'expectedresult' => false, + 'validationerror' => true, + ], + 'Valid data' => [ + 'customdata' => [ + 'status' => ENROL_USER_ACTIVE, + 'timestart' => [ + 'day' => $now->format('j'), + 'month' => $now->format('n'), + 'year' => $now->format('Y'), + 'hour' => $now->format('G'), + 'minute' => 0, + 'enabled' => 1, + ], + 'timeend' => [ + 'day' => $nextmonth->format('j'), + 'month' => $nextmonth->format('n'), + 'year' => $nextmonth->format('Y'), + 'hour' => $nextmonth->format('G'), + 'minute' => 0, + 'enabled' => 1, + ], + ], + 'expectedresult' => true, + 'validationerror' => false + ], + 'Suspend user' => [ + 'customdata' => [ + 'status' => ENROL_USER_SUSPENDED, + ], + 'expectedresult' => true, + 'validationerror' => false + ], + ]; + } + + /** + * @param array $customdata The data we are providing to the webservice. + * @param bool $expectedresult The result we are expecting to receive from the webservice. + * @param bool $validationerror The validationerror we are expecting to receive from the webservice. + * @dataProvider submit_user_enrolment_form_provider + */ + public function test_submit_user_enrolment_form($customdata, $expectedresult, $validationerror) { + global $CFG, $DB; + + $this->resetAfterTest(true); + $datagen = $this->getDataGenerator(); + + /** @var enrol_manual_plugin $manualplugin */ + $manualplugin = enrol_get_plugin('manual'); + + $studentroleid = $DB->get_field('role', 'id', ['shortname' => 'student'], MUST_EXIST); + $teacherroleid = $DB->get_field('role', 'id', ['shortname' => 'editingteacher'], MUST_EXIST); + $course = $datagen->create_course(); + $user = $datagen->create_user(); + $teacher = $datagen->create_user(); + + $instanceid = null; + $instances = enrol_get_instances($course->id, true); + foreach ($instances as $inst) { + if ($inst->enrol == 'manual') { + $instanceid = (int)$inst->id; + break; + } + } + if (empty($instanceid)) { + $instanceid = $manualplugin->add_default_instance($course); + if (empty($instanceid)) { + $instanceid = $manualplugin->add_instance($course); + } + } + $this->assertNotNull($instanceid); + + $instance = $DB->get_record('enrol', ['id' => $instanceid], '*', MUST_EXIST); + $manualplugin->enrol_user($instance, $user->id, $studentroleid, 0, 0, ENROL_USER_ACTIVE); + $manualplugin->enrol_user($instance, $teacher->id, $teacherroleid, 0, 0, ENROL_USER_ACTIVE); + $ueid = (int) $DB->get_field( + 'user_enrolments', + 'id', + ['enrolid' => $instance->id, 'userid' => $user->id], + MUST_EXIST + ); + + // Login as teacher. + $teacher->ignoresesskey = true; + $this->setUser($teacher); + + $formdata = [ + 'ue' => $ueid, + 'ifilter' => 0, + 'status' => null, + 'timestart' => null, + 'duration' => null, + 'timeend' => null, + ]; + + $formdata = array_merge($formdata, $customdata); + + require_once("$CFG->dirroot/enrol/editenrolment_form.php"); + $formdata = enrol_user_enrolment_form::mock_generate_submit_keys($formdata); + + $querystring = http_build_query($formdata, '', '&'); + + $result = external_api::clean_returnvalue( + core_enrol_external::submit_user_enrolment_form_returns(), + core_enrol_external::submit_user_enrolment_form($querystring) + ); + + $this->assertEquals( + ['result' => $expectedresult, 'validationerror' => $validationerror], + $result, + '', 0.0, 10, true); + + if ($result['result']) { + $ue = $DB->get_record('user_enrolments', ['id' => $ueid], '*', MUST_EXIST); + $this->assertEquals($formdata['status'], $ue->status); + } + } + /** * Test for core_enrol_external::unenrol_user_enrolment(). */ diff --git a/lib/db/services.php b/lib/db/services.php index d1dec991ca1..62b74b1db54 100644 --- a/lib/db/services.php +++ b/lib/db/services.php @@ -647,7 +647,16 @@ $functions = array( 'classname' => 'core_enrol_external', 'methodname' => 'edit_user_enrolment', 'classpath' => 'enrol/externallib.php', - 'description' => 'External function that updates a given user enrolment', + 'description' => '** DEPRECATED ** Please do not call this function any more. + External function that updates a given user enrolment', + 'type' => 'write', + 'ajax' => true, + ), + 'core_enrol_submit_user_enrolment_form' => array( + 'classname' => 'core_enrol_external', + 'methodname' => 'submit_user_enrolment_form', + 'classpath' => 'enrol/externallib.php', + 'description' => 'Submit form data for enrolment form', 'type' => 'write', 'ajax' => true, ), diff --git a/lib/upgrade.txt b/lib/upgrade.txt index c02d911edfb..683777c5980 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -53,6 +53,7 @@ validation against and defaults to null (so, no user needed) if not provided. * Following behat steps have been removed from core: - I go to "" in the course gradebook * A new admin setting widget 'core_admin\local\settings\filesize' is added. +* The core_enrol_edit_user_enrolment webservice has been deprecated. Please use core_enrol_submit_user_enrolment_form instead. === 3.7 === diff --git a/user/amd/build/status_field.min.js b/user/amd/build/status_field.min.js index faeb294976d..7a8a14cecee 100644 --- a/user/amd/build/status_field.min.js +++ b/user/amd/build/status_field.min.js @@ -1,2 +1,2 @@ -define ("core_user/status_field",["core/templates","jquery","core/str","core/config","core/notification","core/modal_factory","core/modal_events","core/fragment","core/ajax"],function(a,b,c,d,f,g,h,i,j){var k={EDIT_ENROLMENT:"[data-action=\"editenrolment\"]",SHOW_DETAILS:"[data-action=\"showdetails\"]",UNENROL:"[data-action=\"unenrol\"]"},l=function(a){this.contextid=a.contextid;this.courseid=a.courseid;this.bindEditEnrol();this.bindUnenrol();this.bindStatusDetails()};l.prototype.courseid=0;l.prototype.bindEditEnrol=function(){var a=this;b(k.EDIT_ENROLMENT).click(function(d){d.preventDefault();var e=b(this),i=e.parent(),j=i.data("fullname"),k=e.attr("rel");b.when(c.get_string("edituserenrolment","enrol",j)).then(function(a){return g.create({large:!0,title:a,type:g.types.SAVE_CANCEL})}).done(function(b){b.getRoot().on(h.save,function(c){c.preventDefault();a.submitEditFormAjax(b)});b.getRoot().on(h.hidden,function(){b.destroy()});b.setBody(a.getBody(k));b.show()}).fail(f.exception)})};l.prototype.bindUnenrol=function(){var a=this;b(k.UNENROL).click(function(d){d.preventDefault();var e=b(this),i=e.parent(),j=[{key:"unenrol",component:"enrol"},{key:"unenrolconfirm",component:"enrol",param:{user:i.data("fullname"),course:i.data("coursename"),enrolinstancename:i.data("enrolinstancename")}}],k=g.create({type:g.types.SAVE_CANCEL});b.when(c.get_strings(j),k).done(function(c,f){var g=c[0],i=c[1];f.setTitle(g);f.setBody(i);f.setSaveButtonText(g);f.getRoot().on(h.save,function(){var c={ueid:b(e).attr("rel")};d.preventDefault();a.submitUnenrolFormAjax(f,c)});f.getRoot().on(h.hidden,function(){f.destroy()});f.show()}).fail(f.exception)})};l.prototype.bindStatusDetails=function(){b(k.SHOW_DETAILS).click(function(d){d.preventDefault();var e=b(this),i=e.parent(),j={fullname:i.data("fullname"),coursename:i.data("coursename"),enrolinstancename:i.data("enrolinstancename"),status:i.data("status"),statusclass:i.find("span").attr("class"),timestart:i.data("timestart"),timeend:i.data("timeend"),timeenrolled:i.data("timeenrolled")},l=e.next(k.EDIT_ENROLMENT);if(l.length){j.editenrollink=b("
").append(l.clone()).html()}var m=c.get_strings([{key:"enroldetails",component:"enrol"}]),n=g.create({large:!0,type:g.types.CANCEL});b.when(m,n).done(function(c,d){var e=a.render("core_user/status_details",j);d.setTitle(c[0]);d.setBody(e);if(l.length){d.getRoot().on("click",k.EDIT_ENROLMENT,function(a){a.preventDefault();d.hide();b(l).trigger("click")})}d.show();d.getRoot().on(h.hidden,function(){d.destroy()})}).fail(f.exception)})};l.prototype.submitEditFormAjax=function(a){var c=this,d=a.getRoot().find("form"),e=b(d).find("[name=\"ue\"]").val(),g=b(d).find("[name=\"status\"]").val(),h={courseid:this.courseid,ueid:e,status:g},i=b(d).find("[name=\"timestart[enabled]\"]");if(i.is(":checked")){var k=b(d).find("[name=\"timestart[year]\"]").val(),l=b(d).find("[name=\"timestart[month]\"]").val()-1,m=b(d).find("[name=\"timestart[day]\"]").val(),n=b(d).find("[name=\"timestart[hour]\"]").val(),o=b(d).find("[name=\"timestart[minute]\"]").val(),p=new Date(k,l,m,n,o);h.timestart=p.getTime()/1e3}var q=b(d).find("[name=\"timeend[enabled]\"]");if(q.is(":checked")){var r=b(d).find("[name=\"timeend[year]\"]").val(),s=b(d).find("[name=\"timeend[month]\"]").val()-1,t=b(d).find("[name=\"timeend[day]\"]").val(),u=b(d).find("[name=\"timeend[hour]\"]").val(),v=b(d).find("[name=\"timeend[minute]\"]").val(),w=new Date(r,s,t,u,v);h.timeend=w.getTime()/1e3}var x=b(d).find("[name=\"duration\"]");if(x.is(":enabled")){h.timeend=h.timestart+parseInt(x.val())}j.call([{methodname:"core_enrol_edit_user_enrolment",args:h}])[0].done(function(b){if(b.result){a.hide();if("undefined"!=typeof window.M.core_formchangechecker){window.M.core_formchangechecker.reset_form_dirty_state()}window.location.reload()}else{var f=JSON.stringify(d.serialize());a.setBody(c.getBody(e,f))}}).fail(f.exception)};l.prototype.submitUnenrolFormAjax=function(a,b){j.call([{methodname:"core_enrol_unenrol_user_enrolment",args:b}])[0].done(function(b){if(b.result){a.hide();if("undefined"!=typeof window.M.core_formchangechecker){window.M.core_formchangechecker.reset_form_dirty_state()}window.location.reload()}else{f.alert(b.errors[0].key,b.errors[0].message)}}).fail(f.exception)};l.prototype.getBody=function(a,b){var c={ueid:a};if("undefined"!=typeof b){c.formdata=b}return i.loadFragment("enrol","user_enrolment_form",this.contextid,c).fail(f.exception)};return{init:function init(a){new l(a)}}}); +define ("core_user/status_field",["core/templates","jquery","core/str","core/config","core/notification","core/modal_factory","core/modal_events","core/fragment","core/ajax"],function(a,b,c,d,f,g,h,i,j){var k={EDIT_ENROLMENT:"[data-action=\"editenrolment\"]",SHOW_DETAILS:"[data-action=\"showdetails\"]",UNENROL:"[data-action=\"unenrol\"]"},l=function(a){this.contextid=a.contextid;this.courseid=a.courseid;this.bindEditEnrol();this.bindUnenrol();this.bindStatusDetails()};l.prototype.courseid=0;l.prototype.bindEditEnrol=function(){var a=this;b(k.EDIT_ENROLMENT).click(function(d){d.preventDefault();var e=b(this),i=e.parent(),j=i.data("fullname"),k=e.attr("rel");b.when(c.get_string("edituserenrolment","enrol",j)).then(function(a){return g.create({large:!0,title:a,type:g.types.SAVE_CANCEL})}).done(function(b){b.getRoot().on(h.save,function(c){c.preventDefault();a.submitEditFormAjax(b)});b.getRoot().on(h.hidden,function(){b.destroy()});b.setBody(a.getBody(k));b.show()}).fail(f.exception)})};l.prototype.bindUnenrol=function(){var a=this;b(k.UNENROL).click(function(d){d.preventDefault();var e=b(this),i=e.parent(),j=[{key:"unenrol",component:"enrol"},{key:"unenrolconfirm",component:"enrol",param:{user:i.data("fullname"),course:i.data("coursename"),enrolinstancename:i.data("enrolinstancename")}}],k=g.create({type:g.types.SAVE_CANCEL});b.when(c.get_strings(j),k).done(function(c,f){var g=c[0],i=c[1];f.setTitle(g);f.setBody(i);f.setSaveButtonText(g);f.getRoot().on(h.save,function(){var c={ueid:b(e).attr("rel")};d.preventDefault();a.submitUnenrolFormAjax(f,c)});f.getRoot().on(h.hidden,function(){f.destroy()});f.show()}).fail(f.exception)})};l.prototype.bindStatusDetails=function(){b(k.SHOW_DETAILS).click(function(d){d.preventDefault();var e=b(this),i=e.parent(),j={fullname:i.data("fullname"),coursename:i.data("coursename"),enrolinstancename:i.data("enrolinstancename"),status:i.data("status"),statusclass:i.find("span").attr("class"),timestart:i.data("timestart"),timeend:i.data("timeend"),timeenrolled:i.data("timeenrolled")},l=e.next(k.EDIT_ENROLMENT);if(l.length){j.editenrollink=b("
").append(l.clone()).html()}var m=c.get_strings([{key:"enroldetails",component:"enrol"}]),n=g.create({large:!0,type:g.types.CANCEL});b.when(m,n).done(function(c,d){var e=a.render("core_user/status_details",j);d.setTitle(c[0]);d.setBody(e);if(l.length){d.getRoot().on("click",k.EDIT_ENROLMENT,function(a){a.preventDefault();d.hide();b(l).trigger("click")})}d.show();d.getRoot().on(h.hidden,function(){d.destroy()})}).fail(f.exception)})};l.prototype.submitEditFormAjax=function(a){var c=this,d=a.getRoot().find("form"),e=b(d).find("[name=\"ue\"]").val(),g={methodname:"core_enrol_submit_user_enrolment_form",args:{formdata:d.serialize()}};j.call([g])[0].done(function(b){if(b.result){a.hide();if("undefined"!=typeof window.M.core_formchangechecker){window.M.core_formchangechecker.reset_form_dirty_state()}window.location.reload()}else{var f=JSON.stringify(d.serialize());a.setBody(c.getBody(e,f))}}).fail(f.exception)};l.prototype.submitUnenrolFormAjax=function(a,b){j.call([{methodname:"core_enrol_unenrol_user_enrolment",args:b}])[0].done(function(b){if(b.result){a.hide();if("undefined"!=typeof window.M.core_formchangechecker){window.M.core_formchangechecker.reset_form_dirty_state()}window.location.reload()}else{f.alert(b.errors[0].key,b.errors[0].message)}}).fail(f.exception)};l.prototype.getBody=function(a,b){var c={ueid:a};if("undefined"!=typeof b){c.formdata=b}return i.loadFragment("enrol","user_enrolment_form",this.contextid,c).fail(f.exception)};return{init:function init(a){new l(a)}}}); //# sourceMappingURL=status_field.min.js.map diff --git a/user/amd/build/status_field.min.js.map b/user/amd/build/status_field.min.js.map index e0fe66a33fc..5dd1fb95d57 100644 --- a/user/amd/build/status_field.min.js.map +++ b/user/amd/build/status_field.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/status_field.js"],"names":["define","Template","$","Str","Config","Notification","ModalFactory","ModalEvents","Fragment","Ajax","SELECTORS","EDIT_ENROLMENT","SHOW_DETAILS","UNENROL","StatusFieldActions","options","contextid","courseid","bindEditEnrol","bindUnenrol","bindStatusDetails","prototype","statusFieldInstsance","click","e","preventDefault","clickedEditTrigger","parentContainer","parent","fullname","data","ueid","attr","when","get_string","then","modalTitle","create","large","title","type","types","SAVE_CANCEL","done","modal","getRoot","on","save","submitEditFormAjax","hidden","destroy","setBody","getBody","show","fail","exception","unenrolLink","strings","key","component","param","user","course","enrolinstancename","deleteModalPromise","get_strings","results","confirmMessage","setTitle","setSaveButtonText","unenrolParams","submitUnenrolFormAjax","detailsButton","context","find","editEnrolLink","next","length","editenrollink","append","clone","html","modalStringsPromise","modalPromise","CANCEL","modalBodyPromise","render","hide","trigger","form","val","status","params","timeStartEnabled","is","timeStartYear","timeStartMonth","timeStartDay","timeStartHour","timeStartMinute","timeStart","Date","timestart","getTime","timeEndEnabled","timeEndYear","timeEndMonth","timeEndDay","timeEndHour","timeEndMinute","timeEnd","timeend","enrolDuration","parseInt","call","methodname","args","result","window","M","core_formchangechecker","reset_form_dirty_state","location","reload","formData","JSON","stringify","serialize","alert","errors","message","formdata","loadFragment","init","config"],"mappings":"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","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 * AMD module for the user enrolment status field in the course participants page.\n *\n * @module core_user/status_field\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/templates',\n 'jquery',\n 'core/str',\n 'core/config',\n 'core/notification',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/fragment',\n 'core/ajax'\n ],\n function(Template, $, Str, Config, Notification, ModalFactory, ModalEvents, Fragment, Ajax) {\n\n /**\n * Action selectors.\n *\n * @access private\n * @type {{EDIT_ENROLMENT: string, SHOW_DETAILS: string, UNENROL: string}}\n */\n var SELECTORS = {\n EDIT_ENROLMENT: '[data-action=\"editenrolment\"]',\n SHOW_DETAILS: '[data-action=\"showdetails\"]',\n UNENROL: '[data-action=\"unenrol\"]'\n };\n\n /**\n * Constructor\n *\n * @param {Object} options Object containing options. The only valid option at this time is contextid.\n * Each call to templates.render gets it's own instance of this class.\n */\n var StatusFieldActions = function(options) {\n this.contextid = options.contextid;\n this.courseid = options.courseid;\n\n // Bind click event to editenrol buttons.\n this.bindEditEnrol();\n\n // Bind click event to unenrol buttons.\n this.bindUnenrol();\n\n // Bind click event to status details buttons.\n this.bindStatusDetails();\n };\n // Class variables and functions.\n\n /** @var {number} courseid The course ID. */\n StatusFieldActions.prototype.courseid = 0;\n\n /**\n * Private method\n *\n * @method initModal\n * @private\n */\n StatusFieldActions.prototype.bindEditEnrol = function() {\n var statusFieldInstsance = this;\n\n $(SELECTORS.EDIT_ENROLMENT).click(function(e) {\n e.preventDefault();\n\n // The particular edit button that was clicked.\n var clickedEditTrigger = $(this);\n // Get the parent container (it contains the data attributes associated with the status field).\n var parentContainer = clickedEditTrigger.parent();\n // Get the name of the user whose enrolment status is being edited.\n var fullname = parentContainer.data('fullname');\n // Get the user enrolment ID.\n var ueid = clickedEditTrigger.attr('rel');\n\n $.when(Str.get_string('edituserenrolment', 'enrol', fullname)).then(function(modalTitle) {\n return ModalFactory.create({\n large: true,\n title: modalTitle,\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).done(function(modal) {\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function(e) {\n // Don't close the modal yet.\n e.preventDefault();\n // Submit form data.\n statusFieldInstsance.submitEditFormAjax(modal);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Set the modal body.\n modal.setBody(statusFieldInstsance.getBody(ueid));\n\n // Show the modal!\n modal.show();\n }).fail(Notification.exception);\n });\n };\n\n /**\n * Private method\n *\n * @method bindUnenrol\n * @private\n */\n StatusFieldActions.prototype.bindUnenrol = function() {\n var statusFieldInstsance = this;\n\n $(SELECTORS.UNENROL).click(function(e) {\n e.preventDefault();\n var unenrolLink = $(this);\n var parentContainer = unenrolLink.parent();\n var strings = [\n {\n key: 'unenrol',\n component: 'enrol'\n },\n {\n key: 'unenrolconfirm',\n component: 'enrol',\n param: {\n user: parentContainer.data('fullname'),\n course: parentContainer.data('coursename'),\n enrolinstancename: parentContainer.data('enrolinstancename')\n }\n }\n ];\n\n var deleteModalPromise = ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL\n });\n\n $.when(Str.get_strings(strings), deleteModalPromise).done(function(results, modal) {\n var title = results[0];\n var confirmMessage = results[1];\n modal.setTitle(title);\n modal.setBody(confirmMessage);\n modal.setSaveButtonText(title);\n\n // Handle confirm event.\n modal.getRoot().on(ModalEvents.save, function() {\n // Build params.\n var unenrolParams = {\n 'ueid': $(unenrolLink).attr('rel')\n };\n // Don't close the modal yet.\n e.preventDefault();\n // Submit data.\n statusFieldInstsance.submitUnenrolFormAjax(modal, unenrolParams);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Display the delete confirmation modal.\n modal.show();\n }).fail(Notification.exception);\n });\n };\n\n /**\n * Private method\n *\n * @method bindStatusDetails\n * @private\n */\n StatusFieldActions.prototype.bindStatusDetails = function() {\n $(SELECTORS.SHOW_DETAILS).click(function(e) {\n e.preventDefault();\n\n var detailsButton = $(this);\n var parentContainer = detailsButton.parent();\n var context = {\n \"fullname\": parentContainer.data('fullname'),\n \"coursename\": parentContainer.data('coursename'),\n \"enrolinstancename\": parentContainer.data('enrolinstancename'),\n \"status\": parentContainer.data('status'),\n \"statusclass\": parentContainer.find('span').attr('class'),\n \"timestart\": parentContainer.data('timestart'),\n \"timeend\": parentContainer.data('timeend'),\n \"timeenrolled\": parentContainer.data('timeenrolled')\n };\n\n // Get default string for the modal and modal type.\n var strings = [\n {\n key: 'enroldetails',\n component: 'enrol'\n }\n ];\n\n // Find the edit enrolment link.\n var editEnrolLink = detailsButton.next(SELECTORS.EDIT_ENROLMENT);\n if (editEnrolLink.length) {\n // If there's an edit enrolment link for this user, clone it into the context for the modal.\n context.editenrollink = $('
').append(editEnrolLink.clone()).html();\n }\n\n var modalStringsPromise = Str.get_strings(strings);\n var modalPromise = ModalFactory.create({large: true, type: ModalFactory.types.CANCEL});\n $.when(modalStringsPromise, modalPromise).done(function(strings, modal) {\n var modalBodyPromise = Template.render('core_user/status_details', context);\n modal.setTitle(strings[0]);\n modal.setBody(modalBodyPromise);\n\n if (editEnrolLink.length) {\n modal.getRoot().on('click', SELECTORS.EDIT_ENROLMENT, function(e) {\n e.preventDefault();\n modal.hide();\n // Trigger click event for the edit enrolment link to show the edit enrolment modal.\n $(editEnrolLink).trigger('click');\n });\n }\n\n modal.show();\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n }).fail(Notification.exception);\n });\n };\n\n /**\n * Private method\n *\n * @method submitEditFormAjax\n * @param {Object} modal The the AMD modal object containing the form.\n * @private\n */\n StatusFieldActions.prototype.submitEditFormAjax = function(modal) {\n var statusFieldInstsance = this;\n var form = modal.getRoot().find('form');\n\n // User enrolment ID.\n var ueid = $(form).find('[name=\"ue\"]').val();\n // Status.\n var status = $(form).find('[name=\"status\"]').val();\n\n var params = {\n 'courseid': this.courseid,\n 'ueid': ueid,\n 'status': status\n };\n\n // Enrol time start.\n var timeStartEnabled = $(form).find('[name=\"timestart[enabled]\"]');\n if (timeStartEnabled.is(':checked')) {\n var timeStartYear = $(form).find('[name=\"timestart[year]\"]').val();\n var timeStartMonth = $(form).find('[name=\"timestart[month]\"]').val() - 1;\n var timeStartDay = $(form).find('[name=\"timestart[day]\"]').val();\n var timeStartHour = $(form).find('[name=\"timestart[hour]\"]').val();\n var timeStartMinute = $(form).find('[name=\"timestart[minute]\"]').val();\n var timeStart = new Date(timeStartYear, timeStartMonth, timeStartDay, timeStartHour, timeStartMinute);\n params.timestart = timeStart.getTime() / 1000;\n }\n\n // Enrol time end.\n var timeEndEnabled = $(form).find('[name=\"timeend[enabled]\"]');\n if (timeEndEnabled.is(':checked')) {\n var timeEndYear = $(form).find('[name=\"timeend[year]\"]').val();\n var timeEndMonth = $(form).find('[name=\"timeend[month]\"]').val() - 1;\n var timeEndDay = $(form).find('[name=\"timeend[day]\"]').val();\n var timeEndHour = $(form).find('[name=\"timeend[hour]\"]').val();\n var timeEndMinute = $(form).find('[name=\"timeend[minute]\"]').val();\n var timeEnd = new Date(timeEndYear, timeEndMonth, timeEndDay, timeEndHour, timeEndMinute);\n params.timeend = timeEnd.getTime() / 1000;\n }\n\n // Enrol duration.\n var enrolDuration = $(form).find('[name=\"duration\"]');\n if (enrolDuration.is(':enabled')) {\n params.timeend = params.timestart + parseInt(enrolDuration.val());\n }\n\n var request = {\n methodname: 'core_enrol_edit_user_enrolment',\n args: params\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n // Dismiss the modal.\n modal.hide();\n\n // Reload the page, don't show changed data warnings.\n if (typeof window.M.core_formchangechecker !== \"undefined\") {\n window.M.core_formchangechecker.reset_form_dirty_state();\n }\n window.location.reload();\n } else {\n // Serialise the form data and reload the form fragment to show validation errors.\n var formData = JSON.stringify(form.serialize());\n modal.setBody(statusFieldInstsance.getBody(ueid, formData));\n }\n }).fail(Notification.exception);\n };\n\n /**\n * Private method\n *\n * @method submitUnenrolFormAjax\n * @param {Object} modal The the AMD modal object containing the form.\n * @param {Object} unenrolParams The unenrol parameters.\n * @private\n */\n StatusFieldActions.prototype.submitUnenrolFormAjax = function(modal, unenrolParams) {\n var request = {\n methodname: 'core_enrol_unenrol_user_enrolment',\n args: unenrolParams\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n // Dismiss the modal.\n modal.hide();\n\n // Reload the page, don't show changed data warnings.\n if (typeof window.M.core_formchangechecker !== \"undefined\") {\n window.M.core_formchangechecker.reset_form_dirty_state();\n }\n window.location.reload();\n } else {\n // Display an alert containing the error message\n Notification.alert(data.errors[0].key, data.errors[0].message);\n }\n }).fail(Notification.exception);\n };\n\n /**\n * Private method\n *\n * @method getBody\n * @private\n * @param {Number} ueid The user enrolment ID associated with the user.\n * @param {string} formData Serialized string of the edit enrolment form data.\n * @return {Promise}\n */\n StatusFieldActions.prototype.getBody = function(ueid, formData) {\n var params = {\n 'ueid': ueid\n };\n if (typeof formData !== 'undefined') {\n params.formdata = formData;\n }\n return Fragment.loadFragment('enrol', 'user_enrolment_form', this.contextid, params).fail(Notification.exception);\n };\n\n return /** @alias module:core_user/editenrolment */ {\n // Public variables and functions.\n /**\n * Every call to init creates a new instance of the class with it's own event listeners etc.\n *\n * @method init\n * @public\n * @param {object} config - config variables for the module.\n */\n init: function(config) {\n (new StatusFieldActions(config));\n }\n };\n });\n"],"file":"status_field.min.js"} \ No newline at end of file +{"version":3,"sources":["../src/status_field.js"],"names":["define","Template","$","Str","Config","Notification","ModalFactory","ModalEvents","Fragment","Ajax","SELECTORS","EDIT_ENROLMENT","SHOW_DETAILS","UNENROL","StatusFieldActions","options","contextid","courseid","bindEditEnrol","bindUnenrol","bindStatusDetails","prototype","statusFieldInstsance","click","e","preventDefault","clickedEditTrigger","parentContainer","parent","fullname","data","ueid","attr","when","get_string","then","modalTitle","create","large","title","type","types","SAVE_CANCEL","done","modal","getRoot","on","save","submitEditFormAjax","hidden","destroy","setBody","getBody","show","fail","exception","unenrolLink","strings","key","component","param","user","course","enrolinstancename","deleteModalPromise","get_strings","results","confirmMessage","setTitle","setSaveButtonText","unenrolParams","submitUnenrolFormAjax","detailsButton","context","find","editEnrolLink","next","length","editenrollink","append","clone","html","modalStringsPromise","modalPromise","CANCEL","modalBodyPromise","render","hide","trigger","form","val","request","methodname","args","formdata","serialize","call","result","window","M","core_formchangechecker","reset_form_dirty_state","location","reload","formData","JSON","stringify","alert","errors","message","params","loadFragment","init","config"],"mappings":"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","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 * AMD module for the user enrolment status field in the course participants page.\n *\n * @module core_user/status_field\n * @copyright 2017 Jun Pataleta\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\ndefine(['core/templates',\n 'jquery',\n 'core/str',\n 'core/config',\n 'core/notification',\n 'core/modal_factory',\n 'core/modal_events',\n 'core/fragment',\n 'core/ajax'\n ],\n function(Template, $, Str, Config, Notification, ModalFactory, ModalEvents, Fragment, Ajax) {\n\n /**\n * Action selectors.\n *\n * @access private\n * @type {{EDIT_ENROLMENT: string, SHOW_DETAILS: string, UNENROL: string}}\n */\n var SELECTORS = {\n EDIT_ENROLMENT: '[data-action=\"editenrolment\"]',\n SHOW_DETAILS: '[data-action=\"showdetails\"]',\n UNENROL: '[data-action=\"unenrol\"]'\n };\n\n /**\n * Constructor\n *\n * @param {Object} options Object containing options. The only valid option at this time is contextid.\n * Each call to templates.render gets it's own instance of this class.\n */\n var StatusFieldActions = function(options) {\n this.contextid = options.contextid;\n this.courseid = options.courseid;\n\n // Bind click event to editenrol buttons.\n this.bindEditEnrol();\n\n // Bind click event to unenrol buttons.\n this.bindUnenrol();\n\n // Bind click event to status details buttons.\n this.bindStatusDetails();\n };\n // Class variables and functions.\n\n /** @var {number} courseid The course ID. */\n StatusFieldActions.prototype.courseid = 0;\n\n /**\n * Private method\n *\n * @method initModal\n * @private\n */\n StatusFieldActions.prototype.bindEditEnrol = function() {\n var statusFieldInstsance = this;\n\n $(SELECTORS.EDIT_ENROLMENT).click(function(e) {\n e.preventDefault();\n\n // The particular edit button that was clicked.\n var clickedEditTrigger = $(this);\n // Get the parent container (it contains the data attributes associated with the status field).\n var parentContainer = clickedEditTrigger.parent();\n // Get the name of the user whose enrolment status is being edited.\n var fullname = parentContainer.data('fullname');\n // Get the user enrolment ID.\n var ueid = clickedEditTrigger.attr('rel');\n\n $.when(Str.get_string('edituserenrolment', 'enrol', fullname)).then(function(modalTitle) {\n return ModalFactory.create({\n large: true,\n title: modalTitle,\n type: ModalFactory.types.SAVE_CANCEL\n });\n }).done(function(modal) {\n // Handle save event.\n modal.getRoot().on(ModalEvents.save, function(e) {\n // Don't close the modal yet.\n e.preventDefault();\n // Submit form data.\n statusFieldInstsance.submitEditFormAjax(modal);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Set the modal body.\n modal.setBody(statusFieldInstsance.getBody(ueid));\n\n // Show the modal!\n modal.show();\n }).fail(Notification.exception);\n });\n };\n\n /**\n * Private method\n *\n * @method bindUnenrol\n * @private\n */\n StatusFieldActions.prototype.bindUnenrol = function() {\n var statusFieldInstsance = this;\n\n $(SELECTORS.UNENROL).click(function(e) {\n e.preventDefault();\n var unenrolLink = $(this);\n var parentContainer = unenrolLink.parent();\n var strings = [\n {\n key: 'unenrol',\n component: 'enrol'\n },\n {\n key: 'unenrolconfirm',\n component: 'enrol',\n param: {\n user: parentContainer.data('fullname'),\n course: parentContainer.data('coursename'),\n enrolinstancename: parentContainer.data('enrolinstancename')\n }\n }\n ];\n\n var deleteModalPromise = ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL\n });\n\n $.when(Str.get_strings(strings), deleteModalPromise).done(function(results, modal) {\n var title = results[0];\n var confirmMessage = results[1];\n modal.setTitle(title);\n modal.setBody(confirmMessage);\n modal.setSaveButtonText(title);\n\n // Handle confirm event.\n modal.getRoot().on(ModalEvents.save, function() {\n // Build params.\n var unenrolParams = {\n 'ueid': $(unenrolLink).attr('rel')\n };\n // Don't close the modal yet.\n e.preventDefault();\n // Submit data.\n statusFieldInstsance.submitUnenrolFormAjax(modal, unenrolParams);\n });\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n\n // Display the delete confirmation modal.\n modal.show();\n }).fail(Notification.exception);\n });\n };\n\n /**\n * Private method\n *\n * @method bindStatusDetails\n * @private\n */\n StatusFieldActions.prototype.bindStatusDetails = function() {\n $(SELECTORS.SHOW_DETAILS).click(function(e) {\n e.preventDefault();\n\n var detailsButton = $(this);\n var parentContainer = detailsButton.parent();\n var context = {\n \"fullname\": parentContainer.data('fullname'),\n \"coursename\": parentContainer.data('coursename'),\n \"enrolinstancename\": parentContainer.data('enrolinstancename'),\n \"status\": parentContainer.data('status'),\n \"statusclass\": parentContainer.find('span').attr('class'),\n \"timestart\": parentContainer.data('timestart'),\n \"timeend\": parentContainer.data('timeend'),\n \"timeenrolled\": parentContainer.data('timeenrolled')\n };\n\n // Get default string for the modal and modal type.\n var strings = [\n {\n key: 'enroldetails',\n component: 'enrol'\n }\n ];\n\n // Find the edit enrolment link.\n var editEnrolLink = detailsButton.next(SELECTORS.EDIT_ENROLMENT);\n if (editEnrolLink.length) {\n // If there's an edit enrolment link for this user, clone it into the context for the modal.\n context.editenrollink = $('
').append(editEnrolLink.clone()).html();\n }\n\n var modalStringsPromise = Str.get_strings(strings);\n var modalPromise = ModalFactory.create({large: true, type: ModalFactory.types.CANCEL});\n $.when(modalStringsPromise, modalPromise).done(function(strings, modal) {\n var modalBodyPromise = Template.render('core_user/status_details', context);\n modal.setTitle(strings[0]);\n modal.setBody(modalBodyPromise);\n\n if (editEnrolLink.length) {\n modal.getRoot().on('click', SELECTORS.EDIT_ENROLMENT, function(e) {\n e.preventDefault();\n modal.hide();\n // Trigger click event for the edit enrolment link to show the edit enrolment modal.\n $(editEnrolLink).trigger('click');\n });\n }\n\n modal.show();\n\n // Handle hidden event.\n modal.getRoot().on(ModalEvents.hidden, function() {\n // Destroy when hidden.\n modal.destroy();\n });\n }).fail(Notification.exception);\n });\n };\n\n /**\n * Private method\n *\n * @method submitEditFormAjax\n * @param {Object} modal The the AMD modal object containing the form.\n * @private\n */\n StatusFieldActions.prototype.submitEditFormAjax = function(modal) {\n var statusFieldInstsance = this;\n var form = modal.getRoot().find('form');\n\n // User enrolment ID.\n var ueid = $(form).find('[name=\"ue\"]').val();\n\n var request = {\n methodname: 'core_enrol_submit_user_enrolment_form',\n args: {\n formdata: form.serialize()\n }\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n // Dismiss the modal.\n modal.hide();\n\n // Reload the page, don't show changed data warnings.\n if (typeof window.M.core_formchangechecker !== \"undefined\") {\n window.M.core_formchangechecker.reset_form_dirty_state();\n }\n window.location.reload();\n } else {\n // Serialise the form data and reload the form fragment to show validation errors.\n var formData = JSON.stringify(form.serialize());\n modal.setBody(statusFieldInstsance.getBody(ueid, formData));\n }\n }).fail(Notification.exception);\n };\n\n /**\n * Private method\n *\n * @method submitUnenrolFormAjax\n * @param {Object} modal The the AMD modal object containing the form.\n * @param {Object} unenrolParams The unenrol parameters.\n * @private\n */\n StatusFieldActions.prototype.submitUnenrolFormAjax = function(modal, unenrolParams) {\n var request = {\n methodname: 'core_enrol_unenrol_user_enrolment',\n args: unenrolParams\n };\n\n Ajax.call([request])[0].done(function(data) {\n if (data.result) {\n // Dismiss the modal.\n modal.hide();\n\n // Reload the page, don't show changed data warnings.\n if (typeof window.M.core_formchangechecker !== \"undefined\") {\n window.M.core_formchangechecker.reset_form_dirty_state();\n }\n window.location.reload();\n } else {\n // Display an alert containing the error message\n Notification.alert(data.errors[0].key, data.errors[0].message);\n }\n }).fail(Notification.exception);\n };\n\n /**\n * Private method\n *\n * @method getBody\n * @private\n * @param {Number} ueid The user enrolment ID associated with the user.\n * @param {string} formData Serialized string of the edit enrolment form data.\n * @return {Promise}\n */\n StatusFieldActions.prototype.getBody = function(ueid, formData) {\n var params = {\n 'ueid': ueid\n };\n if (typeof formData !== 'undefined') {\n params.formdata = formData;\n }\n return Fragment.loadFragment('enrol', 'user_enrolment_form', this.contextid, params).fail(Notification.exception);\n };\n\n return /** @alias module:core_user/editenrolment */ {\n // Public variables and functions.\n /**\n * Every call to init creates a new instance of the class with it's own event listeners etc.\n *\n * @method init\n * @public\n * @param {object} config - config variables for the module.\n */\n init: function(config) {\n (new StatusFieldActions(config));\n }\n };\n });\n"],"file":"status_field.min.js"} \ No newline at end of file diff --git a/user/amd/src/status_field.js b/user/amd/src/status_field.js index 438941b690b..c03d9de31cf 100644 --- a/user/amd/src/status_field.js +++ b/user/amd/src/status_field.js @@ -261,48 +261,12 @@ define(['core/templates', // User enrolment ID. var ueid = $(form).find('[name="ue"]').val(); - // Status. - var status = $(form).find('[name="status"]').val(); - - var params = { - 'courseid': this.courseid, - 'ueid': ueid, - 'status': status - }; - - // Enrol time start. - var timeStartEnabled = $(form).find('[name="timestart[enabled]"]'); - if (timeStartEnabled.is(':checked')) { - var timeStartYear = $(form).find('[name="timestart[year]"]').val(); - var timeStartMonth = $(form).find('[name="timestart[month]"]').val() - 1; - var timeStartDay = $(form).find('[name="timestart[day]"]').val(); - var timeStartHour = $(form).find('[name="timestart[hour]"]').val(); - var timeStartMinute = $(form).find('[name="timestart[minute]"]').val(); - var timeStart = new Date(timeStartYear, timeStartMonth, timeStartDay, timeStartHour, timeStartMinute); - params.timestart = timeStart.getTime() / 1000; - } - - // Enrol time end. - var timeEndEnabled = $(form).find('[name="timeend[enabled]"]'); - if (timeEndEnabled.is(':checked')) { - var timeEndYear = $(form).find('[name="timeend[year]"]').val(); - var timeEndMonth = $(form).find('[name="timeend[month]"]').val() - 1; - var timeEndDay = $(form).find('[name="timeend[day]"]').val(); - var timeEndHour = $(form).find('[name="timeend[hour]"]').val(); - var timeEndMinute = $(form).find('[name="timeend[minute]"]').val(); - var timeEnd = new Date(timeEndYear, timeEndMonth, timeEndDay, timeEndHour, timeEndMinute); - params.timeend = timeEnd.getTime() / 1000; - } - - // Enrol duration. - var enrolDuration = $(form).find('[name="duration"]'); - if (enrolDuration.is(':enabled')) { - params.timeend = params.timestart + parseInt(enrolDuration.val()); - } var request = { - methodname: 'core_enrol_edit_user_enrolment', - args: params + methodname: 'core_enrol_submit_user_enrolment_form', + args: { + formdata: form.serialize() + } }; Ajax.call([request])[0].done(function(data) { @@ -323,7 +287,7 @@ define(['core/templates', }).fail(Notification.exception); }; - /** + /** * Private method * * @method submitUnenrolFormAjax diff --git a/version.php b/version.php index 1a5a4ba23f9..a3fd3c23c35 100644 --- a/version.php +++ b/version.php @@ -29,7 +29,7 @@ defined('MOODLE_INTERNAL') || die(); -$version = 2019083000.00; // YYYYMMDD = weekly release date of this DEV branch. +$version = 2019090400.00; // YYYYMMDD = weekly release date of this DEV branch. // RR = release increments - 00 in DEV branches. // .XX = incremental changes.