Merge branch 'MDL-68442-master' of git://github.com/andrewnicols/moodle

This commit is contained in:
Adrian Greeve
2020-04-29 13:54:57 +08:00
14 changed files with 413 additions and 324 deletions
+2
View File
@@ -64,6 +64,7 @@ $string['enrolmentnewuser'] = '{$a->user} has enrolled in course "{$a->course}"'
$string['enrolmentmethod'] = 'Enrolment method';
$string['enrolments'] = 'Enrolments';
$string['enrolmentoptions'] = 'Enrolment options';
$string['enrolmentupdatedforuser'] = 'The enrolment for user "{$a->fullname}" has been updated';
$string['enrolnotpermitted'] = 'You do not have permission or are not allowed to enrol someone in this course';
$string['enrolperiod'] = 'Enrolment duration';
$string['enrolusage'] = 'Instances / enrolments';
@@ -136,6 +137,7 @@ $string['totalunenrolledusers'] = '{$a} unenrolled users';
$string['totalotherusers'] = '{$a} other users';
$string['unassignnotpermitted'] = 'You do not have permission to unassign roles in this course';
$string['unenrol'] = 'Unenrol';
$string['unenrolleduser'] = 'The user "{$a->fullname}" was unenrolled from the course';
$string['unenrolconfirm'] = 'Do you really want to unenrol "{$a->user}" (previously enrolled via "{$a->enrolinstancename}") from "{$a->course}"?';
$string['unenrolme'] = 'Unenrol me from {$a}';
$string['unenrolnotpermitted'] = 'You do not have permission or can not unenrol this user from this course.';
+1 -1
View File
@@ -1,2 +1,2 @@
define ("core_table/dynamic",["exports","core_table/local/dynamic/repository","core_table/local/dynamic/selectors"],function(a,b,c){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=a.showColumn=a.hideColumn=a.setLastInitial=a.setFirstInitial=a.setPageSize=a.setPageNumber=a.setSortOrder=a.setFilters=a.updateTable=a.refreshTableContent=void 0;c=function(a){if(a&&a.__esModule){return a}else{var b={};if(null!=a){for(var c in a){if(Object.prototype.hasOwnProperty.call(a,c)){var d=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(a,c):{};if(d.get||d.set){Object.defineProperty(b,c,d)}else{b[c]=a[c]}}}}b.default=a;return b}}(c);function d(a){return g(a)||f(a)||e()}function e(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function f(a){if(Symbol.iterator in Object(a)||"[object Arguments]"===Object.prototype.toString.call(a))return Array.from(a)}function g(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b<a.length;b++){c[b]=a[b]}return c}}var h=!1,i=function(a){if(!a){throw new Error("The table specified is not a dynamic table and cannot be updated")}if(!a.matches(c.main.region)){throw new Error("The table specified is not a dynamic table and cannot be updated")}return!0},j=function(a){return JSON.parse(a.dataset.tableFilters)},k=function(a){var c=j(a);return(0,b.fetch)(a.dataset.tableComponent,a.dataset.tableHandler,a.dataset.tableUniqueid,{sortBy:a.dataset.tableSortBy,sortOrder:a.dataset.tableSortOrder,joinType:c.jointype,filters:c.filters,firstinitial:a.dataset.tableFirstInitial,lastinitial:a.dataset.tableLastInitial,pageNumber:a.dataset.tablePageNumber,pageSize:a.dataset.tablePageSize,hiddenColumns:JSON.parse(a.dataset.tableHiddenColumns)}).then(function(b){var c=document.createElement("div");c.innerHTML=b.html;a.replaceWith.apply(a,d(c.childNodes));return b})};a.refreshTableContent=k;var l=function(a){var b=1<arguments.length&&arguments[1]!==void 0?arguments[1]:{},c=b.sortBy,d=void 0===c?null:c,e=b.sortOrder,f=void 0===e?null:e,g=b.filters,h=void 0===g?null:g,j=b.firstInitial,l=void 0===j?null:j,m=b.lastInitial,n=void 0===m?null:m,o=b.pageNumber,p=void 0===o?null:o,q=b.pageSize,r=void 0===q?null:q,s=b.hiddenColumns,t=void 0===s?null:s,u=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;i(a);if(d&&f){a.dataset.tableSortBy=d;a.dataset.tableSortOrder=f}if(null!==l){a.dataset.tableFirstInitial=l}if(null!==n){a.dataset.tableLastInitial=n}if(null!==p){a.dataset.tablePageNumber=p}if(null!==r){a.dataset.tablePageSize=r}if(h){a.dataset.tableFilters=JSON.stringify(h)}if(t){a.dataset.tableHiddenColumns=JSON.stringify(t)}if(u){return k(a)}else{return Promise.resolve()}};a.updateTable=l;a.setFilters=function setFilters(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{filters:b},c)};var m=function(a,b,c){var d=3<arguments.length&&arguments[3]!==void 0?arguments[3]:!0;return l(a,{sortBy:b,sortOrder:c},d)};a.setSortOrder=m;var n=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{pageNumber:b},c)};a.setPageNumber=n;a.setPageSize=function setPageSize(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{pageSize:b,pageNumber:0},c)};var o=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{firstInitial:b},c)};a.setFirstInitial=o;var p=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{lastInitial:b},c)};a.setLastInitial=p;var q=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0,d=JSON.parse(a.dataset.tableHiddenColumns);d.push(b);l(a,{hiddenColumns:d},c)};a.hideColumn=q;var r=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0,d=JSON.parse(a.dataset.tableHiddenColumns);d=d.filter(function(a){return a!==b});l(a,{hiddenColumns:d},c)};a.showColumn=r;var s=function(){if(h){return}h=!0;document.addEventListener("click",function(a){var b=a.target.closest(c.main.region);if(!b){return}var d=a.target.closest(c.table.links.sortableColumn);if(d){a.preventDefault();m(b,d.dataset.sortby,d.dataset.sortorder)}var e=a.target.closest(c.initialsBar.links.firstInitial);if(null!==e){a.preventDefault();o(b,e.dataset.initial)}var f=a.target.closest(c.initialsBar.links.lastInitial);if(null!==f){a.preventDefault();p(b,f.dataset.initial)}var g=a.target.closest(c.paginationBar.links.pageItem);if(g){a.preventDefault();n(b,g.dataset.pageNumber)}var h=a.target.closest(c.table.links.hide);if(h){a.preventDefault();q(b,h.dataset.column)}var i=a.target.closest(c.table.links.show);if(i){a.preventDefault();r(b,i.dataset.column)}})};a.init=s});
define ("core_table/dynamic",["exports","core_table/local/dynamic/repository","core_table/local/dynamic/selectors"],function(a,b,c){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.getTableFromId=a.init=a.showColumn=a.hideColumn=a.setLastInitial=a.setFirstInitial=a.setPageSize=a.setPageNumber=a.setSortOrder=a.setFilters=a.updateTable=a.refreshTableContent=void 0;c=function(a){if(a&&a.__esModule){return a}else{var b={};if(null!=a){for(var c in a){if(Object.prototype.hasOwnProperty.call(a,c)){var d=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(a,c):{};if(d.get||d.set){Object.defineProperty(b,c,d)}else{b[c]=a[c]}}}}b.default=a;return b}}(c);function d(a){return g(a)||f(a)||e()}function e(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function f(a){if(Symbol.iterator in Object(a)||"[object Arguments]"===Object.prototype.toString.call(a))return Array.from(a)}function g(a){if(Array.isArray(a)){for(var b=0,c=Array(a.length);b<a.length;b++){c[b]=a[b]}return c}}var h=!1,i=function(a){if(!a){throw new Error("The table specified is not a dynamic table and cannot be updated")}if(!a.matches(c.main.region)){throw new Error("The table specified is not a dynamic table and cannot be updated")}return!0},j=function(a){return JSON.parse(a.dataset.tableFilters)},k=function(a){var c=j(a);return(0,b.fetch)(a.dataset.tableComponent,a.dataset.tableHandler,a.dataset.tableUniqueid,{sortBy:a.dataset.tableSortBy,sortOrder:a.dataset.tableSortOrder,joinType:c.jointype,filters:c.filters,firstinitial:a.dataset.tableFirstInitial,lastinitial:a.dataset.tableLastInitial,pageNumber:a.dataset.tablePageNumber,pageSize:a.dataset.tablePageSize,hiddenColumns:JSON.parse(a.dataset.tableHiddenColumns)}).then(function(b){var c=document.createElement("div");c.innerHTML=b.html;a.replaceWith.apply(a,d(c.childNodes));return b})};a.refreshTableContent=k;var l=function(a){var b=1<arguments.length&&arguments[1]!==void 0?arguments[1]:{},c=b.sortBy,d=void 0===c?null:c,e=b.sortOrder,f=void 0===e?null:e,g=b.filters,h=void 0===g?null:g,j=b.firstInitial,l=void 0===j?null:j,m=b.lastInitial,n=void 0===m?null:m,o=b.pageNumber,p=void 0===o?null:o,q=b.pageSize,r=void 0===q?null:q,s=b.hiddenColumns,t=void 0===s?null:s,u=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;i(a);if(d&&f){a.dataset.tableSortBy=d;a.dataset.tableSortOrder=f}if(null!==l){a.dataset.tableFirstInitial=l}if(null!==n){a.dataset.tableLastInitial=n}if(null!==p){a.dataset.tablePageNumber=p}if(null!==r){a.dataset.tablePageSize=r}if(h){a.dataset.tableFilters=JSON.stringify(h)}if(t){a.dataset.tableHiddenColumns=JSON.stringify(t)}if(u){return k(a)}else{return Promise.resolve()}};a.updateTable=l;a.setFilters=function setFilters(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{filters:b},c)};var m=function(a,b,c){var d=3<arguments.length&&arguments[3]!==void 0?arguments[3]:!0;return l(a,{sortBy:b,sortOrder:c},d)};a.setSortOrder=m;var n=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{pageNumber:b},c)};a.setPageNumber=n;a.setPageSize=function setPageSize(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{pageSize:b,pageNumber:0},c)};var o=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{firstInitial:b},c)};a.setFirstInitial=o;var p=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0;return l(a,{lastInitial:b},c)};a.setLastInitial=p;var q=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0,d=JSON.parse(a.dataset.tableHiddenColumns);d.push(b);l(a,{hiddenColumns:d},c)};a.hideColumn=q;var r=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:!0,d=JSON.parse(a.dataset.tableHiddenColumns);d=d.filter(function(a){return a!==b});l(a,{hiddenColumns:d},c)};a.showColumn=r;var s=function(){if(h){return}h=!0;document.addEventListener("click",function(a){var b=a.target.closest(c.main.region);if(!b){return}var d=a.target.closest(c.table.links.sortableColumn);if(d){a.preventDefault();m(b,d.dataset.sortby,d.dataset.sortorder)}var e=a.target.closest(c.initialsBar.links.firstInitial);if(null!==e){a.preventDefault();o(b,e.dataset.initial)}var f=a.target.closest(c.initialsBar.links.lastInitial);if(null!==f){a.preventDefault();p(b,f.dataset.initial)}var g=a.target.closest(c.paginationBar.links.pageItem);if(g){a.preventDefault();n(b,g.dataset.pageNumber)}var h=a.target.closest(c.table.links.hide);if(h){a.preventDefault();q(b,h.dataset.column)}var i=a.target.closest(c.table.links.show);if(i){a.preventDefault();r(b,i.dataset.column)}})};a.init=s;var t=function(a){var b=document.querySelector(c.main.fromRegionId(a));if(!b){throw new Error("The table specified is not a dynamic table and cannot be updated")}return b};a.getTableFromId=t});
//# sourceMappingURL=dynamic.min.js.map
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
define ("core_table/local/dynamic/selectors",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;a.default={main:{region:"[data-region=\"core_table/dynamic\"]"},table:{links:{sortableColumn:"a[data-sortable=\"1\"]",hide:"a[data-action=\"hide\"]",show:"a[data-action=\"show\"]"}},initialsBar:{links:{firstInitial:".firstinitial [data-initial]",lastInitial:".lastinitial [data-initial]"}},paginationBar:{links:{pageItem:".pagination [data-page-number]"}}};return a.default});
define ("core_table/local/dynamic/selectors",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;a.default={main:{region:"[data-region=\"core_table/dynamic\"]",fromRegionId:function fromRegionId(a){return"[data-region=\"core_table/dynamic\"][data-table-uniqueid=\"".concat(a,"\"]")}},table:{links:{sortableColumn:"a[data-sortable=\"1\"]",hide:"a[data-action=\"hide\"]",show:"a[data-action=\"show\"]"}},initialsBar:{links:{firstInitial:".firstinitial [data-initial]",lastInitial:".lastinitial [data-initial]"}},paginationBar:{links:{pageItem:".pagination [data-page-number]"}}};return a.default});
//# sourceMappingURL=selectors.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../../../src/local/dynamic/selectors.js"],"names":["main","region","table","links","sortableColumn","hide","show","initialsBar","firstInitial","lastInitial","paginationBar","pageItem"],"mappings":"8JAuBe,CACXA,IAAI,CAAE,CACFC,MAAM,CAAE,sCADN,CADK,CAIXC,KAAK,CAAE,CACHC,KAAK,CAAE,CACHC,cAAc,CAAE,wBADb,CAEHC,IAAI,CAAE,yBAFH,CAGHC,IAAI,CAAE,yBAHH,CADJ,CAJI,CAWXC,WAAW,CAAE,CACTJ,KAAK,CAAE,CACHK,YAAY,CAAE,8BADX,CAEHC,WAAW,CAAE,6BAFV,CADE,CAXF,CAiBXC,aAAa,CAAE,CACXP,KAAK,CAAE,CACHQ,QAAQ,CAAE,gCADP,CADI,CAjBJ,C","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 <http://www.gnu.org/licenses/>.\n\n/**\n * Dynamic table selectors.\n *\n * @module core_table/selectors\n * @package core_table\n * @copyright 2020 Simey Lameze <[email protected]>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nexport default {\n main: {\n region: '[data-region=\"core_table/dynamic\"]',\n },\n table: {\n links: {\n sortableColumn: 'a[data-sortable=\"1\"]',\n hide: 'a[data-action=\"hide\"]',\n show: 'a[data-action=\"show\"]',\n },\n },\n initialsBar: {\n links: {\n firstInitial: '.firstinitial [data-initial]',\n lastInitial: '.lastinitial [data-initial]',\n },\n },\n paginationBar: {\n links: {\n pageItem: '.pagination [data-page-number]'\n }\n },\n};\n"],"file":"selectors.min.js"}
{"version":3,"sources":["../../../src/local/dynamic/selectors.js"],"names":["main","region","fromRegionId","regionId","table","links","sortableColumn","hide","show","initialsBar","firstInitial","lastInitial","paginationBar","pageItem"],"mappings":"8JAuBe,CACXA,IAAI,CAAE,CACFC,MAAM,CAAE,sCADN,CAEFC,YAAY,CAAE,sBAAAC,CAAQ,6EAA+DA,CAA/D,QAFpB,CADK,CAKXC,KAAK,CAAE,CACHC,KAAK,CAAE,CACHC,cAAc,CAAE,wBADb,CAEHC,IAAI,CAAE,yBAFH,CAGHC,IAAI,CAAE,yBAHH,CADJ,CALI,CAYXC,WAAW,CAAE,CACTJ,KAAK,CAAE,CACHK,YAAY,CAAE,8BADX,CAEHC,WAAW,CAAE,6BAFV,CADE,CAZF,CAkBXC,aAAa,CAAE,CACXP,KAAK,CAAE,CACHQ,QAAQ,CAAE,gCADP,CADI,CAlBJ,C","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 <http://www.gnu.org/licenses/>.\n\n/**\n * Dynamic table selectors.\n *\n * @module core_table/selectors\n * @package core_table\n * @copyright 2020 Simey Lameze <[email protected]>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nexport default {\n main: {\n region: '[data-region=\"core_table/dynamic\"]',\n fromRegionId: regionId => `[data-region=\"core_table/dynamic\"][data-table-uniqueid=\"${regionId}\"]`,\n },\n table: {\n links: {\n sortableColumn: 'a[data-sortable=\"1\"]',\n hide: 'a[data-action=\"hide\"]',\n show: 'a[data-action=\"show\"]',\n },\n },\n initialsBar: {\n links: {\n firstInitial: '.firstinitial [data-initial]',\n lastInitial: '.lastinitial [data-initial]',\n },\n },\n paginationBar: {\n links: {\n pageItem: '.pagination [data-page-number]'\n }\n },\n};\n"],"file":"selectors.min.js"}
+18
View File
@@ -299,3 +299,21 @@ export const init = () => {
});
};
/**
* Fetch the table via its table region id
*
* @param {String} tableRegionId
* @returns {HTMLElement}
*/
export const getTableFromId = tableRegionId => {
const tableRoot = document.querySelector(Selectors.main.fromRegionId(tableRegionId));
if (!tableRoot) {
// The table is not a dynamic table.
throw new Error("The table specified is not a dynamic table and cannot be updated");
}
return tableRoot;
};
@@ -24,6 +24,7 @@
export default {
main: {
region: '[data-region="core_table/dynamic"]',
fromRegionId: regionId => `[data-region="core_table/dynamic"][data-table-uniqueid="${regionId}"]`,
},
table: {
links: {
+2
View File
@@ -0,0 +1,2 @@
define ("core_user/repository",["exports","core/ajax"],function(a,b){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.submitUserEnrolmentForm=a.unenrolUser=void 0;a.unenrolUser=function unenrolUser(a){return(0,b.call)([{methodname:"core_enrol_unenrol_user_enrolment",args:{ueid:a}}])[0]};a.submitUserEnrolmentForm=function submitUserEnrolmentForm(a){return(0,b.call)([{methodname:"core_enrol_submit_user_enrolment_form",args:{formdata:a}}])[0]}});
//# sourceMappingURL=repository.min.js.map
+1
View File
@@ -0,0 +1 @@
{"version":3,"sources":["../src/repository.js"],"names":["unenrolUser","userEnrolmentId","methodname","args","ueid","submitUserEnrolmentForm","formdata"],"mappings":"gMA8B2B,QAAdA,CAAAA,WAAc,CAAAC,CAAe,CAAI,CAC1C,MAAO,WAAU,CAAC,CACdC,UAAU,CAAE,mCADE,CAEdC,IAAI,CAAE,CACFC,IAAI,CAAEH,CADJ,CAFQ,CAAD,CAAV,EAKH,CALG,CAMV,C,2BAQsC,QAA1BI,CAAAA,uBAA0B,CAAAC,CAAQ,CAAI,CAC/C,MAAO,WAAU,CAAC,CACdJ,UAAU,CAAE,uCADE,CAEdC,IAAI,CAAE,CACFG,QAAQ,CAARA,CADE,CAFQ,CAAD,CAAV,EAKH,CALG,CAMV,C","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 <http://www.gnu.org/licenses/>.\n\n/**\n * Module to handle AJAX interactions.\n *\n * @module core_user/repository\n * @copyright 2020 Andrew Nicols <[email protected]>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {call as fetchMany} from 'core/ajax';\n\n/**\n * Unenrol the user with the specified user enrolmentid ID.\n *\n * @param {Number} userEnrolmentId\n * @return {Promise}\n */\nexport const unenrolUser = userEnrolmentId => {\n return fetchMany([{\n methodname: 'core_enrol_unenrol_user_enrolment',\n args: {\n ueid: userEnrolmentId,\n },\n }])[0];\n};\n\n/**\n * Submit the user enrolment form with the specified form data.\n *\n * @param {String} formdata\n * @return {Promise}\n */\nexport const submitUserEnrolmentForm = formdata => {\n return fetchMany([{\n methodname: 'core_enrol_submit_user_enrolment_form',\n args: {\n formdata,\n },\n }])[0];\n};\n"],"file":"repository.min.js"}
+1 -1
View File
@@ -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("<div>").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)}}});
define ("core_user/status_field",["exports","core_table/dynamic","./repository","core/str","core_table/local/dynamic/selectors","core/fragment","core/modal_events","core/modal_factory","core/notification","core/templates","core/toast"],function(a,b,c,d,f,g,h,i,j,k,l){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=n(b);c=n(c);d=n(d);f=m(f);g=m(g);h=m(h);i=m(i);j=m(j);k=m(k);function m(a){return a&&a.__esModule?a:{default:a}}function n(a){if(a&&a.__esModule){return a}else{var b={};if(null!=a){for(var c in a){if(Object.prototype.hasOwnProperty.call(a,c)){var d=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(a,c):{};if(d.get||d.set){Object.defineProperty(b,c,d)}else{b[c]=a[c]}}}}b.default=a;return b}}function o(a){for(var b=1;b<arguments.length;b++){var c=null!=arguments[b]?arguments[b]:{},d=Object.keys(c);if("function"==typeof Object.getOwnPropertySymbols){d=d.concat(Object.getOwnPropertySymbols(c).filter(function(a){return Object.getOwnPropertyDescriptor(c,a).enumerable}))}d.forEach(function(b){p(a,b,c[b])})}return a}function p(a,b,c){if(b in a){Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0})}else{a[b]=c}return a}function q(a,b){return t(a)||s(a,b)||r()}function r(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function s(a,b){var c=[],d=!0,e=!1,f=void 0;try{for(var g=a[Symbol.iterator](),h;!(d=(h=g.next()).done);d=!0){c.push(h.value);if(b&&c.length===b)break}}catch(a){e=!0;f=a}finally{try{if(!d&&null!=g["return"])g["return"]()}finally{if(e)throw f}}return c}function t(a){if(Array.isArray(a))return a}var u={editEnrolment:"[data-action=\"editenrolment\"]",showDetails:"[data-action=\"showdetails\"]",unenrol:"[data-action=\"unenrol\"]",statusElement:"[data-status]"},v=function(a){return a.closest(f.default.main.region)},w=function(a){return a.closest(u.statusElement)},x=function(a){return a.getAttribute("rel")},y=function(a,b){var c=function(b,c){return E(a,b,c)};document.addEventListener("click",function(a){var d=a.target.closest(f.default.main.fromRegionId(b));if(!d){return}var e=a.target.closest(u.editEnrolment);if(e){a.preventDefault();z(e,c)}var g=a.target.closest(u.unenrol);if(g){a.preventDefault();A(g)}var h=a.target.closest(u.showDetails);if(h){a.preventDefault();B(h)}})},z=function(a,b){var c=w(a),f=x(a);i.default.create({large:!0,title:d.get_string("edituserenrolment","enrol",c.dataset.fullname),type:i.default.types.SAVE_CANCEL,body:b(f)}).then(function(d){d.getRoot().on(h.default.save,function(g){g.preventDefault();C(a,b,d,f,c.dataset)});d.getRoot().on(h.default.hidden,function(){d.destroy()});d.show();return d}).catch(j.default.exception)},A=function(a){var b=w(a),c=x(a);i.default.create({type:i.default.types.SAVE_CANCEL}).then(function(f){f.getRoot().on(h.default.save,function(d){d.preventDefault();D(a,f,{ueid:c},b.dataset)});f.getRoot().on(h.default.hidden,function(){f.destroy()});f.show();var g=[{key:"unenrol",component:"enrol"},{key:"unenrolconfirm",component:"enrol",param:{user:b.dataset.fullname,course:b.dataset.coursename,enrolinstancename:b.dataset.enrolinstancename}}];return Promise.all([d.get_strings(g),f])}).then(function(a){var b=q(a,2),c=b[0],d=b[1];d.setTitle(c[0]);d.setSaveButtonText(c[0]);d.setBody(c[1]);return d}).catch(j.default.exception)},B=function(a){var b=w(a),c=o({editenrollink:"",statusclass:b.querySelector("span.badge").getAttribute("class")},b.dataset),f=b.querySelector(u.editEnrolment);if(f){c.editenrollink=f.outerHTML}i.default.create({large:!0,type:i.default.types.CANCEL,title:d.get_string("enroldetails","enrol"),body:k.default.render("core_user/status_details",c)}).then(function(a){if(f){a.getRoot().on("click",u.editEnrolment,function(b){b.preventDefault();a.hide();f.click()})}a.show();a.getRoot().on(h.default.hidden,function(){return a.destroy()});return a}).catch(j.default.exception)},C=function(a,e,f,g,h){var i=f.getRoot().find("form");c.submitUserEnrolmentForm(i.serialize()).then(function(a){if(!a.result){throw a.result}f.hide();f.destroy();return a}).then(function(){b.refreshTableContent(v(a));return d.get_string("enrolmentupdatedforuser","core_enrol",h)}).then(function(a){(0,l.add)(a)}).catch(function(){f.setBody(e(g,JSON.stringify(i.serialize())));return f})},D=function(a,e,f,g){c.unenrolUser(f.ueid).then(function(a){if(!a.result){j.default.alert(a.errors[0].key,a.errors[0].message);return a}e.hide();e.destroy();return a}).then(function(){b.refreshTableContent(v(a));return d.get_string("unenrolleduser","core_enrol",g)}).then(function(a){(0,l.add)(a)}).catch(j.default.exception)},E=function(a,b){var c=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;return g.default.loadFragment("enrol","user_enrolment_form",a,{ueid:b,formdata:c})};a.init=function init(a){var b=a.contextid,c=a.uniqueid;y(b,c)}});
//# sourceMappingURL=status_field.min.js.map
File diff suppressed because one or more lines are too long
+53
View File
@@ -0,0 +1,53 @@
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Module to handle AJAX interactions.
*
* @module core_user/repository
* @copyright 2020 Andrew Nicols <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
import {call as fetchMany} from 'core/ajax';
/**
* Unenrol the user with the specified user enrolmentid ID.
*
* @param {Number} userEnrolmentId
* @return {Promise}
*/
export const unenrolUser = userEnrolmentId => {
return fetchMany([{
methodname: 'core_enrol_unenrol_user_enrolment',
args: {
ueid: userEnrolmentId,
},
}])[0];
};
/**
* Submit the user enrolment form with the specified form data.
*
* @param {String} formdata
* @return {Promise}
*/
export const submitUserEnrolmentForm = formdata => {
return fetchMany([{
methodname: 'core_enrol_submit_user_enrolment_form',
args: {
formdata,
},
}])[0];
};
+326 -317
View File
@@ -20,334 +20,343 @@
* @copyright 2017 Jun Pataleta
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
define(['core/templates',
'jquery',
'core/str',
'core/config',
'core/notification',
'core/modal_factory',
'core/modal_events',
'core/fragment',
'core/ajax'
],
function(Template, $, Str, Config, Notification, ModalFactory, ModalEvents, Fragment, Ajax) {
/**
* Action selectors.
*
* @access private
* @type {{EDIT_ENROLMENT: string, SHOW_DETAILS: string, UNENROL: string}}
*/
var SELECTORS = {
EDIT_ENROLMENT: '[data-action="editenrolment"]',
SHOW_DETAILS: '[data-action="showdetails"]',
UNENROL: '[data-action="unenrol"]'
};
import * as DynamicTable from 'core_table/dynamic';
import * as Repository from './repository';
import * as Str from 'core/str';
import DynamicTableSelectors from 'core_table/local/dynamic/selectors';
import Fragment from 'core/fragment';
import ModalEvents from 'core/modal_events';
import ModalFactory from 'core/modal_factory';
import Notification from 'core/notification';
import Templates from 'core/templates';
import {add as notifyUser} from 'core/toast';
/**
* Constructor
*
* @param {Object} options Object containing options. The only valid option at this time is contextid.
* Each call to templates.render gets it's own instance of this class.
*/
var StatusFieldActions = function(options) {
this.contextid = options.contextid;
this.courseid = options.courseid;
const Selectors = {
editEnrolment: '[data-action="editenrolment"]',
showDetails: '[data-action="showdetails"]',
unenrol: '[data-action="unenrol"]',
statusElement: '[data-status]',
};
// Bind click event to editenrol buttons.
this.bindEditEnrol();
/**
* Get the dynamic table from the specified link.
*
* @param {HTMLElement} link
* @returns {HTMLElement}
*/
const getDynamicTableFromLink = link => link.closest(DynamicTableSelectors.main.region);
// Bind click event to unenrol buttons.
this.bindUnenrol();
/**
* Get the status container from the specified link.
*
* @param {HTMLElement} link
* @returns {HTMLElement}
*/
const getStatusContainer = link => link.closest(Selectors.statusElement);
// Bind click event to status details buttons.
this.bindStatusDetails();
};
// Class variables and functions.
/**
* Get user enrolment id from the specified link
*
* @param {HTMLElement} link
* @returns {Number}
*/
const getUserEnrolmentIdFromLink = link => link.getAttribute('rel');
/** @var {number} courseid The course ID. */
StatusFieldActions.prototype.courseid = 0;
/**
* Register all event listeners for the status fields.
*
* @param {Number} contextId
* @param {Number} uniqueId
*/
const registerEventListeners = (contextId, uniqueId) => {
const getBodyFunction = (userEnrolmentId, formData) => getBody(contextId, userEnrolmentId, formData);
/**
* Private method
*
* @method initModal
* @private
*/
StatusFieldActions.prototype.bindEditEnrol = function() {
var statusFieldInstsance = this;
document.addEventListener('click', e => {
const tableRoot = e.target.closest(DynamicTableSelectors.main.fromRegionId(uniqueId));
if (!tableRoot) {
return;
}
$(SELECTORS.EDIT_ENROLMENT).click(function(e) {
e.preventDefault();
const editLink = e.target.closest(Selectors.editEnrolment);
if (editLink) {
e.preventDefault();
// The particular edit button that was clicked.
var clickedEditTrigger = $(this);
// Get the parent container (it contains the data attributes associated with the status field).
var parentContainer = clickedEditTrigger.parent();
// Get the name of the user whose enrolment status is being edited.
var fullname = parentContainer.data('fullname');
// Get the user enrolment ID.
var ueid = clickedEditTrigger.attr('rel');
showEditDialogue(editLink, getBodyFunction);
}
$.when(Str.get_string('edituserenrolment', 'enrol', fullname)).then(function(modalTitle) {
return ModalFactory.create({
large: true,
title: modalTitle,
type: ModalFactory.types.SAVE_CANCEL
});
}).done(function(modal) {
// Handle save event.
modal.getRoot().on(ModalEvents.save, function(e) {
// Don't close the modal yet.
e.preventDefault();
// Submit form data.
statusFieldInstsance.submitEditFormAjax(modal);
});
const unenrolLink = e.target.closest(Selectors.unenrol);
if (unenrolLink) {
e.preventDefault();
// Handle hidden event.
modal.getRoot().on(ModalEvents.hidden, function() {
// Destroy when hidden.
modal.destroy();
});
showUnenrolConfirmation(unenrolLink);
}
// Set the modal body.
modal.setBody(statusFieldInstsance.getBody(ueid));
const showDetailsLink = e.target.closest(Selectors.showDetails);
if (showDetailsLink) {
e.preventDefault();
// Show the modal!
modal.show();
}).fail(Notification.exception);
});
};
/**
* Private method
*
* @method bindUnenrol
* @private
*/
StatusFieldActions.prototype.bindUnenrol = function() {
var statusFieldInstsance = this;
$(SELECTORS.UNENROL).click(function(e) {
e.preventDefault();
var unenrolLink = $(this);
var parentContainer = unenrolLink.parent();
var strings = [
{
key: 'unenrol',
component: 'enrol'
},
{
key: 'unenrolconfirm',
component: 'enrol',
param: {
user: parentContainer.data('fullname'),
course: parentContainer.data('coursename'),
enrolinstancename: parentContainer.data('enrolinstancename')
}
}
];
var deleteModalPromise = ModalFactory.create({
type: ModalFactory.types.SAVE_CANCEL
});
$.when(Str.get_strings(strings), deleteModalPromise).done(function(results, modal) {
var title = results[0];
var confirmMessage = results[1];
modal.setTitle(title);
modal.setBody(confirmMessage);
modal.setSaveButtonText(title);
// Handle confirm event.
modal.getRoot().on(ModalEvents.save, function() {
// Build params.
var unenrolParams = {
'ueid': $(unenrolLink).attr('rel')
};
// Don't close the modal yet.
e.preventDefault();
// Submit data.
statusFieldInstsance.submitUnenrolFormAjax(modal, unenrolParams);
});
// Handle hidden event.
modal.getRoot().on(ModalEvents.hidden, function() {
// Destroy when hidden.
modal.destroy();
});
// Display the delete confirmation modal.
modal.show();
}).fail(Notification.exception);
});
};
/**
* Private method
*
* @method bindStatusDetails
* @private
*/
StatusFieldActions.prototype.bindStatusDetails = function() {
$(SELECTORS.SHOW_DETAILS).click(function(e) {
e.preventDefault();
var detailsButton = $(this);
var parentContainer = detailsButton.parent();
var context = {
"fullname": parentContainer.data('fullname'),
"coursename": parentContainer.data('coursename'),
"enrolinstancename": parentContainer.data('enrolinstancename'),
"status": parentContainer.data('status'),
"statusclass": parentContainer.find('span').attr('class'),
"timestart": parentContainer.data('timestart'),
"timeend": parentContainer.data('timeend'),
"timeenrolled": parentContainer.data('timeenrolled')
};
// Get default string for the modal and modal type.
var strings = [
{
key: 'enroldetails',
component: 'enrol'
}
];
// Find the edit enrolment link.
var editEnrolLink = detailsButton.next(SELECTORS.EDIT_ENROLMENT);
if (editEnrolLink.length) {
// If there's an edit enrolment link for this user, clone it into the context for the modal.
context.editenrollink = $('<div>').append(editEnrolLink.clone()).html();
}
var modalStringsPromise = Str.get_strings(strings);
var modalPromise = ModalFactory.create({large: true, type: ModalFactory.types.CANCEL});
$.when(modalStringsPromise, modalPromise).done(function(strings, modal) {
var modalBodyPromise = Template.render('core_user/status_details', context);
modal.setTitle(strings[0]);
modal.setBody(modalBodyPromise);
if (editEnrolLink.length) {
modal.getRoot().on('click', SELECTORS.EDIT_ENROLMENT, function(e) {
e.preventDefault();
modal.hide();
// Trigger click event for the edit enrolment link to show the edit enrolment modal.
$(editEnrolLink).trigger('click');
});
}
modal.show();
// Handle hidden event.
modal.getRoot().on(ModalEvents.hidden, function() {
// Destroy when hidden.
modal.destroy();
});
}).fail(Notification.exception);
});
};
/**
* Private method
*
* @method submitEditFormAjax
* @param {Object} modal The the AMD modal object containing the form.
* @private
*/
StatusFieldActions.prototype.submitEditFormAjax = function(modal) {
var statusFieldInstsance = this;
var form = modal.getRoot().find('form');
// User enrolment ID.
var ueid = $(form).find('[name="ue"]').val();
var request = {
methodname: 'core_enrol_submit_user_enrolment_form',
args: {
formdata: form.serialize()
}
};
Ajax.call([request])[0].done(function(data) {
if (data.result) {
// Dismiss the modal.
modal.hide();
// Reload the page, don't show changed data warnings.
if (typeof window.M.core_formchangechecker !== "undefined") {
window.M.core_formchangechecker.reset_form_dirty_state();
}
window.location.reload();
} else {
// Serialise the form data and reload the form fragment to show validation errors.
var formData = JSON.stringify(form.serialize());
modal.setBody(statusFieldInstsance.getBody(ueid, formData));
}
}).fail(Notification.exception);
};
/**
* Private method
*
* @method submitUnenrolFormAjax
* @param {Object} modal The the AMD modal object containing the form.
* @param {Object} unenrolParams The unenrol parameters.
* @private
*/
StatusFieldActions.prototype.submitUnenrolFormAjax = function(modal, unenrolParams) {
var request = {
methodname: 'core_enrol_unenrol_user_enrolment',
args: unenrolParams
};
Ajax.call([request])[0].done(function(data) {
if (data.result) {
// Dismiss the modal.
modal.hide();
// Reload the page, don't show changed data warnings.
if (typeof window.M.core_formchangechecker !== "undefined") {
window.M.core_formchangechecker.reset_form_dirty_state();
}
window.location.reload();
} else {
// Display an alert containing the error message
Notification.alert(data.errors[0].key, data.errors[0].message);
}
}).fail(Notification.exception);
};
/**
* Private method
*
* @method getBody
* @private
* @param {Number} ueid The user enrolment ID associated with the user.
* @param {string} formData Serialized string of the edit enrolment form data.
* @return {Promise}
*/
StatusFieldActions.prototype.getBody = function(ueid, formData) {
var params = {
'ueid': ueid
};
if (typeof formData !== 'undefined') {
params.formdata = formData;
}
return Fragment.loadFragment('enrol', 'user_enrolment_form', this.contextid, params).fail(Notification.exception);
};
return /** @alias module:core_user/editenrolment */ {
// Public variables and functions.
/**
* Every call to init creates a new instance of the class with it's own event listeners etc.
*
* @method init
* @public
* @param {object} config - config variables for the module.
*/
init: function(config) {
(new StatusFieldActions(config));
}
};
showStatusDetails(showDetailsLink);
}
});
};
/**
* Show the edit dialogue.
*
* @param {HTMLElement} link
* @param {Function} getBody Function to get the body for the specified user enrolment
*/
const showEditDialogue = (link, getBody) => {
const container = getStatusContainer(link);
const userEnrolmentId = getUserEnrolmentIdFromLink(link);
ModalFactory.create({
large: true,
title: Str.get_string('edituserenrolment', 'enrol', container.dataset.fullname),
type: ModalFactory.types.SAVE_CANCEL,
body: getBody(userEnrolmentId)
})
.then(modal => {
// Handle save event.
modal.getRoot().on(ModalEvents.save, e => {
// Don't close the modal yet.
e.preventDefault();
// Submit form data.
submitEditFormAjax(link, getBody, modal, userEnrolmentId, container.dataset);
});
// Handle hidden event.
modal.getRoot().on(ModalEvents.hidden, () => {
// Destroy when hidden.
modal.destroy();
});
// Show the modal.
modal.show();
return modal;
})
.catch(Notification.exception);
};
/**
* Show and handle the unenrolment confirmation dialogue.
*
* @param {HTMLElement} link
*/
const showUnenrolConfirmation = link => {
const container = getStatusContainer(link);
const userEnrolmentId = getUserEnrolmentIdFromLink(link);
ModalFactory.create({
type: ModalFactory.types.SAVE_CANCEL,
})
.then(modal => {
// Handle confirm event.
modal.getRoot().on(ModalEvents.save, e => {
// Don't close the modal yet.
e.preventDefault();
// Submit data.
submitUnenrolFormAjax(
link,
modal,
{
ueid: userEnrolmentId,
},
container.dataset
);
});
// Handle hidden event.
modal.getRoot().on(ModalEvents.hidden, () => {
// Destroy when hidden.
modal.destroy();
});
// Display the delete confirmation modal.
modal.show();
const stringData = [
{
key: 'unenrol',
component: 'enrol',
},
{
key: 'unenrolconfirm',
component: 'enrol',
param: {
user: container.dataset.fullname,
course: container.dataset.coursename,
enrolinstancename: container.dataset.enrolinstancename,
}
}
];
return Promise.all([Str.get_strings(stringData), modal]);
})
.then(([strings, modal]) => {
modal.setTitle(strings[0]);
modal.setSaveButtonText(strings[0]);
modal.setBody(strings[1]);
return modal;
})
.catch(Notification.exception);
};
/**
* Show the user details dialogue.
*
* @param {HTMLElement} link
*/
const showStatusDetails = link => {
const container = getStatusContainer(link);
const context = {
editenrollink: '',
statusclass: container.querySelector('span.badge').getAttribute('class'),
...container.dataset,
};
// Find the edit enrolment link.
const editEnrolLink = container.querySelector(Selectors.editEnrolment);
if (editEnrolLink) {
// If there's an edit enrolment link for this user, clone it into the context for the modal.
context.editenrollink = editEnrolLink.outerHTML;
}
ModalFactory.create({
large: true,
type: ModalFactory.types.CANCEL,
title: Str.get_string('enroldetails', 'enrol'),
body: Templates.render('core_user/status_details', context),
})
.then(modal => {
if (editEnrolLink) {
modal.getRoot().on('click', Selectors.editEnrolment, e => {
e.preventDefault();
modal.hide();
// Trigger click event for the edit enrolment link to show the edit enrolment modal.
editEnrolLink.click();
});
}
modal.show();
// Handle hidden event.
modal.getRoot().on(ModalEvents.hidden, () => modal.destroy());
return modal;
})
.catch(Notification.exception);
};
/**
* Submit the edit dialogue.
*
* @param {HTMLElement} clickedLink
* @param {Function} getBody
* @param {Object} modal
* @param {Number} userEnrolmentId
* @param {Object} userData
*/
const submitEditFormAjax = (clickedLink, getBody, modal, userEnrolmentId, userData) => {
const form = modal.getRoot().find('form');
Repository.submitUserEnrolmentForm(form.serialize())
.then(data => {
if (!data.result) {
throw data.result;
}
// Dismiss the modal.
modal.hide();
modal.destroy();
return data;
})
.then(() => {
DynamicTable.refreshTableContent(getDynamicTableFromLink(clickedLink));
return Str.get_string('enrolmentupdatedforuser', 'core_enrol', userData);
})
.then(notificationString => {
notifyUser(notificationString);
return;
})
.catch(() => {
modal.setBody(getBody(userEnrolmentId, JSON.stringify(form.serialize())));
return modal;
});
};
/**
* Submit the unenrolment form.
*
* @param {HTMLElement} clickedLink
* @param {Object} modal
* @param {Object} args
* @param {Object} userData
*/
const submitUnenrolFormAjax = (clickedLink, modal, args, userData) => {
Repository.unenrolUser(args.ueid)
.then(data => {
if (!data.result) {
// Display an alert containing the error message
Notification.alert(data.errors[0].key, data.errors[0].message);
return data;
}
// Dismiss the modal.
modal.hide();
modal.destroy();
return data;
})
.then(() => {
DynamicTable.refreshTableContent(getDynamicTableFromLink(clickedLink));
return Str.get_string('unenrolleduser', 'core_enrol', userData);
})
.then(notificationString => {
notifyUser(notificationString);
return;
})
.catch(Notification.exception);
};
/**
* Get the body fragment.
*
* @param {Number} contextId
* @param {Number} ueid The user enrolment id
* @param {Object} formdata
* @returns {Promise}
*/
const getBody = (contextId, ueid, formdata = null) => Fragment.loadFragment(
'enrol',
'user_enrolment_form',
contextId,
{
ueid,
formdata,
}
);
/**
* Initialise the statu field handler.
*
* @param {Number} contextid
* @param {Number} uniqueid
*/
export const init = ({contextid, uniqueid}) => {
registerEventListeners(contextid, uniqueid);
};
+4 -1
View File
@@ -239,7 +239,10 @@ class participants extends \table_sql implements dynamic_table {
parent::out($pagesize, $useinitialsbar, $downloadhelpbutton);
if (has_capability('moodle/course:enrolreview', $this->context)) {
$params = ['contextid' => $this->context->id, 'courseid' => $this->course->id];
$params = [
'contextid' => $this->context->id,
'uniqueid' => $this->uniqueid,
];
$PAGE->requires->js_call_amd('core_user/status_field', 'init', [$params]);
}
}