MDL-66722 mod_forum: Pull grader into UI

Part of MDL-66074
This commit is contained in:
Andrew Nicols
2019-09-26 12:25:27 +08:00
committed by Mathew May
parent 09f92d6644
commit f281c61642
15 changed files with 124 additions and 27 deletions
+1 -1
View File
@@ -1,2 +1,2 @@
define ("mod_forum/grades/grader",["exports","./grader/selectors","mod_forum/repository","core/templates","../local/grades/grader","core/notification","core_course/repository"],function(a,b,c,d,f,g,h){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.registerLaunchListeners=void 0;b=j(b);c=i(c);d=i(d);f=j(f);g=i(g);h=i(h);function i(a){return a&&a.__esModule?a:{default:a}}function j(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}}var k={contentRegion:"mod_forum/grades/grader/discussion/posts"},l=function(a){var b=function(){return function(b){return c.default.getDiscussionByUserID(b,a)}};return{getContentForUserId:function getContentForUserIdFunction(){var c=b(a);return function(a){return c(a).then(function(a){a.discussions=a.discussions.map(n);return d.default.render(k.contentRegion,a)}).catch(g.default.exception)}}(),getUsers:function getUsersForCmidFunction(){return function(){return h.default.getUsersFromCourseModuleID(a).then(function(a){return a.users}).catch(g.default.exception)}}()}},m=function(a){return a.closest(b.gradableItem)},n=function(a){var b=new Map;a.posts.parentposts.forEach(function(a){return b.set(a.id,a)});var c=a.posts.userposts.map(function(a){a.subject=null;a.readonly=!0;a.starter=!a.parentid;a.parent=b.get(a.parentid);return a});return{id:a.id,name:a.name,posts:c}};a.registerLaunchListeners=function registerLaunchListeners(){document.addEventListener("click",function(a){if(a.target.matches(b.launch)){var c=m(a.target);if(!c){throw Error("Unable to find a gradable item")}if(c.matches(b.gradableItems.wholeForum)){var d=l(c.dataset.cmid);f.launch(d.getUsers,d.getContentForUserId,{groupid:c.dataset.groupid,initialUserId:c.dataset.initialuserid});a.preventDefault()}else{throw Error("Unable to find a valid gradable item")}}})}});
define ("mod_forum/grades/grader",["exports","./grader/selectors","mod_forum/repository","core/templates","../local/grades/grader","core/notification","core_course/repository"],function(a,b,c,d,f,g,h){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.registerLaunchListeners=void 0;b=j(b);c=i(c);d=i(d);f=j(f);g=i(g);h=i(h);function i(a){return a&&a.__esModule?a:{default:a}}function j(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 k(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function l(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){k(h,d,e,f,g,"next",a)}function g(a){k(h,d,e,f,g,"throw",a)}f(void 0)})}}var m={contentRegion:"mod_forum/grades/grader/discussion/posts"},n=function(a){var b=function(){return function(b){return c.default.getDiscussionByUserID(b,a)}};return{getContentForUserId:function getContentForUserIdFunction(){var c=b(a);return function(a){return c(a).then(function(a){a.discussions=a.discussions.map(p);return d.default.render(m.contentRegion,a)}).catch(g.default.exception)}}(),getUsers:function getUsersForCmidFunction(){return function(){return h.default.getUsersFromCourseModuleID(a).then(function(a){return a.users}).catch(g.default.exception)}}()}},o=function(a){return a.closest(b.gradableItem)},p=function(a){var b=new Map;a.posts.parentposts.forEach(function(a){return b.set(a.id,a)});var c=a.posts.userposts.map(function(a){a.subject=null;a.readonly=!0;a.starter=!a.parentid;a.parent=b.get(a.parentid);return a});return{id:a.id,name:a.name,posts:c}};a.registerLaunchListeners=function registerLaunchListeners(){document.addEventListener("click",function(){var a=l(regeneratorRuntime.mark(function a(c){var d,e,g,h;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:if(!c.target.matches(b.launch)){a.next=15;break}d=o(c.target);if(d){a.next=4;break}throw Error("Unable to find a gradable item");case 4:if(!d.matches(b.gradableItems.wholeForum)){a.next=14;break}c.preventDefault();e=d.dataset;g=n(e.cmid);a.next=10;return f.getGradingPanelFunctions("mod_forum",e.contextid,e.gradingComponent,e.gradingComponentSubtype,e.gradableItemtype);case 10:h=a.sent;f.launch(g.getUsers,g.getContentForUserId,h.getter,h.setter,{groupid:e.groupid,initialUserId:e.initialuserid});a.next=15;break;case 14:throw Error("Unable to find a valid gradable item");case 15:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}())}});
//# sourceMappingURL=grader.min.js.map
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
define ("mod_forum/local/grades/grader",["exports","core/templates","./local/grader/selectors","./local/grader/user_picker","mod_forum/local/layout/fullscreen"],function(a,b,c,d,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.launch=void 0;b=f(b);c=f(c);d=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}}(d);function f(a){return a&&a.__esModule?a:{default:a}}function g(a,b){return k(a)||j(a,b)||h()}function h(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function j(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 k(a){if(Array.isArray(a))return a}function l(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function m(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){l(h,d,e,f,g,"next",a)}function g(a){l(h,d,e,f,g,"throw",a)}f(void 0)})}}var n={grader:{app:"mod_forum/local/grades/grader"}},o=function(a,d){var e=a.querySelector(c.default.regions.pickerRegion);b.default.replaceNodeContents(e,d,"")},p=function(a,d){return function(){var e=m(regeneratorRuntime.mark(function e(f){var h,i,j,k,l;return regeneratorRuntime.wrap(function(e){while(1){switch(e.prev=e.next){case 0:e.next=2;return Promise.all([d(f.id).then(function(a,b){return{html:a,js:b}})]);case 2:h=e.sent;i=g(h,1);j=i[0];k=j.html;l=j.js;b.default.replaceNodeContents(a.querySelector(c.default.regions.moduleReplace),k,l);case 8:case"end":return e.stop();}}},e)}));return function(){return e.apply(this,arguments)}}()},q=function(a){var b=a.getContainer();b.addEventListener("click",function(b){if(b.target.closest(c.default.buttons.toggleFullscreen)){b.stopImmediatePropagation();b.preventDefault();a.toggleFullscreen()}else if(b.target.closest(c.default.buttons.closeGrader)){b.stopImmediatePropagation();b.preventDefault();a.close()}})},r=function(){var a=m(regeneratorRuntime.mark(function a(c,f){var h,i,j,k,l,m,r,s,t,u,v,w=arguments;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:h=2<w.length&&w[2]!==void 0?w[2]:{},i=h.initialUserId,j=void 0===i?0:i;a.next=3;return Promise.all([(0,e.createLayout)({fullscreen:!1,showLoader:!1}),b.default.render(n.grader.app,{}),c()]);case 3:k=a.sent;l=g(k,3);m=l[0];r=l[1];s=l[2];t=m.getContainer();b.default.replaceNodeContents(t,r,"");q(m);u=p(t,f);a.next=14;return d.buildPicker(s,j,u);case 14:v=a.sent;o(t,v);case 16:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}();a.launch=r});
define ("mod_forum/local/grades/grader",["exports","core/templates","./local/grader/selectors","./local/grader/user_picker","mod_forum/local/layout/fullscreen","./local/grader/gradingpanel"],function(a,b,c,d,e,f){"use strict";Object.defineProperty(a,"__esModule",{value:!0});Object.defineProperty(a,"getGradingPanelFunctions",{enumerable:!0,get:function get(){return f.default}});a.launch=void 0;b=g(b);c=g(c);d=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}}(d);f=g(f);function g(a){return a&&a.__esModule?a:{default:a}}function h(a,b){return l(a)||k(a,b)||j()}function j(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function k(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 l(a){if(Array.isArray(a))return a}function m(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function n(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){m(h,d,e,f,g,"next",a)}function g(a){m(h,d,e,f,g,"throw",a)}f(void 0)})}}var o={grader:{app:"mod_forum/local/grades/grader"}},p=function(a,d){var e=a.querySelector(c.default.regions.pickerRegion);b.default.replaceNodeContents(e,d,"")},q=function(a,b){return[a,b]},r=function(a,d,e){return function(){var f=n(regeneratorRuntime.mark(function f(g){var i,j,k,l,m,n,o,p,r,s;return regeneratorRuntime.wrap(function(f){while(1){switch(f.prev=f.next){case 0:f.next=2;return Promise.all([d(g.id).then(q),e(g.id)]);case 2:i=f.sent;j=h(i,2);k=h(j[0],2);l=k[0];m=k[1];n=j[1];b.default.replaceNodeContents(a.querySelector(c.default.regions.moduleReplace),l,m);f.next=11;return b.default.render(n.templatename,n.grade).then(q);case 11:o=f.sent;p=h(o,2);r=p[0];s=p[1];b.default.replaceNodeContents(a.querySelector(c.default.regions.gradingPanel),r,s);case 16:case"end":return f.stop();}}},f)}));return function(){return f.apply(this,arguments)}}()},s=function(a){var b=a.getContainer();b.addEventListener("click",function(b){if(b.target.closest(c.default.buttons.toggleFullscreen)){b.stopImmediatePropagation();b.preventDefault();a.toggleFullscreen()}else if(b.target.closest(c.default.buttons.closeGrader)){b.stopImmediatePropagation();b.preventDefault();a.close()}})},t=function(a,b){return function(d){return b(d.id,a.querySelector(c.default.regions.gradingPanel))}},u=function(){var a=n(regeneratorRuntime.mark(function a(c,f,g,i){var j,k,l,m,n,q,u,v,w,x,y,z=arguments;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:j=4<z.length&&z[4]!==void 0?z[4]:{},k=j.initialUserId,l=void 0===k?0:k;a.next=3;return Promise.all([(0,e.createLayout)({fullscreen:!1,showLoader:!1}),b.default.render(o.grader.app,{}),c()]);case 3:m=a.sent;n=h(m,3);q=n[0];u=n[1];v=n[2];w=q.getContainer();b.default.replaceNodeContents(w,u,"");s(q);x=r(w,f,g);a.next=14;return d.buildPicker(v,l,x,t(w,i));case 14:y=a.sent;p(w,y);case 16:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}();a.launch=u});
//# sourceMappingURL=grader.min.js.map
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
define ("mod_forum/local/grades/local/grader/gradingpanel",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;var d="undefined"!=typeof window?window:"undefined"!=typeof self?self:"undefined"!=typeof global?global:{};function b(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function c(a){return function(){var c=this,d=arguments;return new Promise(function(e,f){var i=a.apply(c,d);function g(a){b(i,e,f,g,h,"next",a)}function h(a){b(i,e,f,g,h,"throw",a)}g(void 0)})}}var e=function(){var a=c(regeneratorRuntime.mark(function a(b,c,e,f,g){var h,i;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:h="".concat(e,"/grades/grader/gradingpanel");if(f){h+="/".concat(f)}a.next=4;return"function"==typeof d.define&&d.define.amd?new Promise(function(a,b){d.require([h],a,b)}):"undefined"!=typeof module&&module.exports&&"undefined"!=typeof require||"undefined"!=typeof module&&module.component&&d.require&&"component"===d.require.loader?Promise.resolve(require((h))):Promise.resolve(d[h]);case 4:i=a.sent;return a.abrupt("return",{getter:function(a){return i.fetchCurrentGrade(b,c,g,a)},setter:function(a,d){return i.storeCurrentGrade(b,c,g,a,d)}});case 6:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}();a.default=e;return a.default});
//# sourceMappingURL=gradingpanel.min.js.map
@@ -0,0 +1 @@
{"version":3,"sources":["../../../../../src/local/grades/local/grader/gradingpanel.js"],"names":["component","context","gradingComponent","gradingSubtype","itemName","gradingMethodHandler","GradingMethod","getter","userId","fetchCurrentGrade","setter","formData","storeCurrentGrade"],"mappings":"6nBAkCe,WAAMA,CAAN,CAAiBC,CAAjB,CAA0BC,CAA1B,CAA4CC,CAA5C,CAA4DC,CAA5D,2FACPC,CADO,WACmBH,CADnB,gCAEX,GAAIC,CAAJ,CAAoB,CAChBE,CAAoB,aAAQF,CAAR,CACvB,CAJU,8FAMwBE,CANxB,mMAMwBA,CANxB,sBAMwBA,CANxB,UAMLC,CANK,iCAQJ,CACHC,MAAM,CAAE,SAAAC,CAAM,QAAIF,CAAAA,CAAa,CAACG,iBAAd,CAAgCT,CAAhC,CAA2CC,CAA3C,CAAoDG,CAApD,CAA8DI,CAA9D,CAAJ,CADX,CAEHE,MAAM,CAAE,SAACF,CAAD,CAASG,CAAT,QAAsBL,CAAAA,CAAa,CAACM,iBAAd,CAAgCZ,CAAhC,CAA2CC,CAA3C,CAAoDG,CAApD,CAA8DI,CAA9D,CAAsEG,CAAtE,CAAtB,CAFL,CARI,0C","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 * Grading panel functions.\n *\n * @module mod_forum/local/grades/local/grader/gradingpnael\n * @package mod_forum\n * @copyright 2019 Andrew Nicols <andrew@nicols.co.uk>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\n/**\n * Get the grade panel setter and getter for the current component.\n *\n * @param {String} component The component being graded\n * @param {Number} context The contextid of the thing being graded\n * @param {String} gradingComponent The thing providing the grading type\n * @param {String} gradingSubtype The subtype fo the grading component\n * @param {String} itemName The name of the thing being graded\n * @return {Object}\n */\nexport default async(component, context, gradingComponent, gradingSubtype, itemName) => {\n let gradingMethodHandler = `${gradingComponent}/grades/grader/gradingpanel`;\n if (gradingSubtype) {\n gradingMethodHandler += `/${gradingSubtype}`;\n }\n\n const GradingMethod = await import(gradingMethodHandler);\n\n return {\n getter: userId => GradingMethod.fetchCurrentGrade(component, context, itemName, userId),\n setter: (userId, formData) => GradingMethod.storeCurrentGrade(component, context, itemName, userId, formData),\n };\n};\n\n"],"file":"gradingpanel.min.js"}
@@ -1,2 +1,2 @@
define ("mod_forum/local/grades/local/grader/selectors",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;var b=function(a,b){return"[data-".concat(a,"=\"").concat(b,"\"]")},c={buttons:{toggleFullscreen:b("action","togglefullscreen"),closeGrader:b("action","closegrader")},regions:{moduleReplace:b("region","module_content"),pickerRegion:b("region","user_picker")}};a.default=c;return a.default});
define ("mod_forum/local/grades/local/grader/selectors",["exports"],function(a){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.default=void 0;var b=function(a,b){return"[data-".concat(a,"=\"").concat(b,"\"]")},c={buttons:{toggleFullscreen:b("action","togglefullscreen"),closeGrader:b("action","closegrader")},regions:{moduleReplace:b("region","module_content"),pickerRegion:b("region","user_picker"),gradingPanel:b("region","grade")}};a.default=c;return a.default});
//# sourceMappingURL=selectors.min.js.map
@@ -1 +1 @@
{"version":3,"sources":["../../../../../src/local/grades/local/grader/selectors.js"],"names":["getDataSelector","name","value","buttons","toggleFullscreen","closeGrader","regions","moduleReplace","pickerRegion"],"mappings":"kKAwBMA,CAAAA,CAAe,CAAG,SAACC,CAAD,CAAOC,CAAP,CAAiB,CACrC,sBAAgBD,CAAhB,eAAyBC,CAAzB,OACH,C,GAEc,CACXC,OAAO,CAAE,CACLC,gBAAgB,CAAEJ,CAAe,CAAC,QAAD,CAAW,kBAAX,CAD5B,CAELK,WAAW,CAAEL,CAAe,CAAC,QAAD,CAAW,aAAX,CAFvB,CADE,CAKXM,OAAO,CAAE,CACLC,aAAa,CAAEP,CAAe,CAAC,QAAD,CAAW,gBAAX,CADzB,CAELQ,YAAY,CAAER,CAAe,CAAC,QAAD,CAAW,aAAX,CAFxB,CALE,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 * Define all of the selectors we will be using on the grading interface.\n *\n * @module mod_forum/local/grades/local/grader/selectors\n * @package mod_forum\n * @copyright 2019 Mathew May <mathew.solutions>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nconst getDataSelector = (name, value) => {\n return `[data-${name}=\"${value}\"]`;\n};\n\nexport default {\n buttons: {\n toggleFullscreen: getDataSelector('action', 'togglefullscreen'),\n closeGrader: getDataSelector('action', 'closegrader'),\n },\n regions: {\n moduleReplace: getDataSelector('region', 'module_content'),\n pickerRegion: getDataSelector('region', 'user_picker'),\n },\n};\n\n"],"file":"selectors.min.js"}
{"version":3,"sources":["../../../../../src/local/grades/local/grader/selectors.js"],"names":["getDataSelector","name","value","buttons","toggleFullscreen","closeGrader","regions","moduleReplace","pickerRegion","gradingPanel"],"mappings":"kKAwBMA,CAAAA,CAAe,CAAG,SAACC,CAAD,CAAOC,CAAP,CAAiB,CACrC,sBAAgBD,CAAhB,eAAyBC,CAAzB,OACH,C,GAEc,CACXC,OAAO,CAAE,CACLC,gBAAgB,CAAEJ,CAAe,CAAC,QAAD,CAAW,kBAAX,CAD5B,CAELK,WAAW,CAAEL,CAAe,CAAC,QAAD,CAAW,aAAX,CAFvB,CADE,CAKXM,OAAO,CAAE,CACLC,aAAa,CAAEP,CAAe,CAAC,QAAD,CAAW,gBAAX,CADzB,CAELQ,YAAY,CAAER,CAAe,CAAC,QAAD,CAAW,aAAX,CAFxB,CAGLS,YAAY,CAAET,CAAe,CAAC,QAAD,CAAW,OAAX,CAHxB,CALE,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 * Define all of the selectors we will be using on the grading interface.\n *\n * @module mod_forum/local/grades/local/grader/selectors\n * @package mod_forum\n * @copyright 2019 Mathew May <mathew.solutions>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nconst getDataSelector = (name, value) => {\n return `[data-${name}=\"${value}\"]`;\n};\n\nexport default {\n buttons: {\n toggleFullscreen: getDataSelector('action', 'togglefullscreen'),\n closeGrader: getDataSelector('action', 'closegrader'),\n },\n regions: {\n moduleReplace: getDataSelector('region', 'module_content'),\n pickerRegion: getDataSelector('region', 'user_picker'),\n gradingPanel: getDataSelector('region', 'grade'),\n },\n};\n\n"],"file":"selectors.min.js"}
@@ -1,2 +1,2 @@
define ("mod_forum/local/grades/local/grader/user_picker",["exports","core/templates","./user_picker/selectors"],function(a,b,c){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.buildPicker=void 0;b=d(b);c=d(c);function d(a){return a&&a.__esModule?a:{default:a}}function e(a,b){return h(a)||g(a,b)||f()}function f(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function g(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 h(a){if(Array.isArray(a))return a}function i(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){j(a,b,c[b])})}return a}function j(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 k(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function l(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){k(h,d,e,f,g,"next",a)}function g(a){k(h,d,e,f,g,"throw",a)}f(void 0)})}}var m=function(){return b.default.render("mod_forum/local/grades/local/grader/user_picker",{})},n=function(a){return b.default.render("mod_forum/local/grades/local/grader/user_picker/user",a)},o=function(){var a=l(regeneratorRuntime.mark(function a(d,f,g,h){var j,k,l,m,o;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:j=i({},f[g],{total:f.length,displayIndex:g+1});a.next=3;return Promise.all([n(j),h(j)]);case 3:k=a.sent;l=e(k,1);m=l[0];o=d.querySelector(c.default.regions.userRegion);b.default.replaceNodeContents(o,m,"");case 8:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),p=function(a,b,d,e){a.addEventListener("click",function(f){var g=f.target.closest(c.default.actions.changeUser);if(g){d+=parseInt(g.dataset.direction);o(a,b,d,e)}})},q=function(){var a=l(regeneratorRuntime.mark(function a(c,d,f){var g,h,i,j,k;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:g=document.createElement("div");a.next=3;return Promise.all([m()]);case 3:h=a.sent;i=e(h,1);j=i[0];b.default.replaceNodeContents(g,j,"");k=c.findIndex(function(a){return a.id===parseInt(d)});a.next=10;return o(g,c,k,f);case 10:p(g,c,k,f);return a.abrupt("return",g);case 12:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}();a.buildPicker=q});
define ("mod_forum/local/grades/local/grader/user_picker",["exports","core/templates","./user_picker/selectors"],function(a,b,c){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.buildPicker=void 0;b=d(b);c=d(c);function d(a){return a&&a.__esModule?a:{default:a}}function e(a,b){return h(a)||g(a,b)||f()}function f(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function g(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 h(a){if(Array.isArray(a))return a}function i(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){j(a,b,c[b])})}return a}function j(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 k(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){c(a);return}if(h.done){b(i)}else{Promise.resolve(i).then(d,e)}}function l(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){var h=a.apply(b,c);function f(a){k(h,d,e,f,g,"next",a)}function g(a){k(h,d,e,f,g,"throw",a)}f(void 0)})}}var m=function(){return b.default.render("mod_forum/local/grades/local/grader/user_picker",{})},n=function(a){return b.default.render("mod_forum/local/grades/local/grader/user_picker/user",a)},o=function(){var a=l(regeneratorRuntime.mark(function a(d,f,g,h){var j,k,l,m,o;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:j=i({},f[g],{total:f.length,displayIndex:g+1});a.next=3;return Promise.all([n(j),h(j)]);case 3:k=a.sent;l=e(k,1);m=l[0];o=d.querySelector(c.default.regions.userRegion);b.default.replaceNodeContents(o,m,"");case 8:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}(),p=function(a,b,d,e,f){a.addEventListener("click",function(g){var h=g.target.closest(c.default.actions.changeUser);if(h){f(b[d]);d+=parseInt(h.dataset.direction);o(a,b,d,e)}})},q=function(){var a=l(regeneratorRuntime.mark(function a(c,d,f,g){var h,i,j,k,l;return regeneratorRuntime.wrap(function(a){while(1){switch(a.prev=a.next){case 0:h=document.createElement("div");a.next=3;return Promise.all([m()]);case 3:i=a.sent;j=e(i,1);k=j[0];b.default.replaceNodeContents(h,k,"");l=c.findIndex(function(a){return a.id===parseInt(d)});a.next=10;return o(h,c,l,f);case 10:p(h,c,l,f,g);return a.abrupt("return",h);case 12:case"end":return a.stop();}}},a)}));return function(){return a.apply(this,arguments)}}();a.buildPicker=q});
//# sourceMappingURL=user_picker.min.js.map
File diff suppressed because one or more lines are too long
+27 -8
View File
@@ -94,8 +94,11 @@ const discussionPostMapper = discussion => {
};
};
/**
* Register listeners to launch the grading panel.
*/
export const registerLaunchListeners = () => {
document.addEventListener('click', (e) => {
document.addEventListener('click', async(e) => {
if (e.target.matches(Selectors.launch)) {
const rootNode = findGradableNode(e.target);
@@ -104,14 +107,30 @@ export const registerLaunchListeners = () => {
}
if (rootNode.matches(Selectors.gradableItems.wholeForum)) {
const wholeForumFunctions = getWholeForumFunctions(rootNode.dataset.cmid);
Grader.launch(wholeForumFunctions.getUsers, wholeForumFunctions.getContentForUserId, {
groupid: rootNode.dataset.groupid,
initialUserId: rootNode.dataset.initialuserid,
});
// Note: The preventDefault must be before any async function calls because the function becomes async
// at that point and the default action is implemented.
e.preventDefault();
const data = rootNode.dataset;
const wholeForumFunctions = getWholeForumFunctions(data.cmid);
const gradingPanelFunctions = await Grader.getGradingPanelFunctions(
'mod_forum',
data.contextid,
data.gradingComponent,
data.gradingComponentSubtype,
data.gradableItemtype
);
Grader.launch(
wholeForumFunctions.getUsers,
wholeForumFunctions.getContentForUserId,
gradingPanelFunctions.getter,
gradingPanelFunctions.setter,
{
groupid: data.groupid,
initialUserId: data.initialuserid,
}
);
} else {
throw Error('Unable to find a valid gradable item');
}
+33 -8
View File
@@ -26,6 +26,7 @@ import Templates from 'core/templates';
import Selectors from './local/grader/selectors';
import * as UserPicker from './local/grader/user_picker';
import {createLayout as createFullScreenWindow} from 'mod_forum/local/layout/fullscreen';
import getGradingPanelFunctions from './local/grader/gradingpanel';
const templateNames = {
grader: {
@@ -38,16 +39,26 @@ const displayUserPicker = (root, html) => {
Templates.replaceNodeContents(pickerRegion, html, '');
};
const getUpdateUserContentFunction = (root, getContentForUser) => {
const fetchContentFromRender = (html, js) => {
return [html, js];
};
const getUpdateUserContentFunction = (root, getContentForUser, getGradeForUser) => {
return async(user) => {
const [
{html, js},
[html, js],
userGrade,
] = await Promise.all([
getContentForUser(user.id).then((html, js) => {
return {html, js};
}),
getContentForUser(user.id).then(fetchContentFromRender),
getGradeForUser(user.id),
]);
Templates.replaceNodeContents(root.querySelector(Selectors.regions.moduleReplace), html, js);
const [
gradingPanelHtml,
gradingPanelJS
] = await Templates.render(userGrade.templatename, userGrade.grade).then(fetchContentFromRender);
Templates.replaceNodeContents(root.querySelector(Selectors.regions.gradingPanel), gradingPanelHtml, gradingPanelJS);
};
};
@@ -67,8 +78,14 @@ const registerEventListeners = (graderLayout) => {
});
};
const getSaveUserGradeFunction = (root, setGradeForUser) => {
return user => {
return setGradeForUser(user.id, root.querySelector(Selectors.regions.gradingPanel));
};
};
// Make this explicit rather than object
export const launch = async(getListOfUsers, getContentForUser, {
export const launch = async(getListOfUsers, getContentForUser, getGradeForUser, setGradeForUser, {
initialUserId = 0,
} = {}) => {
@@ -85,8 +102,16 @@ export const launch = async(getListOfUsers, getContentForUser, {
Templates.replaceNodeContents(graderContainer, graderHTML, '');
registerEventListeners(graderLayout);
const updateUserContent = getUpdateUserContentFunction(graderContainer, getContentForUser);
const updateUserContent = getUpdateUserContentFunction(graderContainer, getContentForUser, getGradeForUser);
const pickerHTML = await UserPicker.buildPicker(
userList,
initialUserId,
updateUserContent,
getSaveUserGradeFunction(graderContainer, setGradeForUser)
);
const pickerHTML = await UserPicker.buildPicker(userList, initialUserId, updateUserContent);
displayUserPicker(graderContainer, pickerHTML);
};
export {getGradingPanelFunctions};
@@ -0,0 +1,48 @@
// 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/>.
/**
* Grading panel functions.
*
* @module mod_forum/local/grades/local/grader/gradingpnael
* @package mod_forum
* @copyright 2019 Andrew Nicols <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* Get the grade panel setter and getter for the current component.
*
* @param {String} component The component being graded
* @param {Number} context The contextid of the thing being graded
* @param {String} gradingComponent The thing providing the grading type
* @param {String} gradingSubtype The subtype fo the grading component
* @param {String} itemName The name of the thing being graded
* @return {Object}
*/
export default async(component, context, gradingComponent, gradingSubtype, itemName) => {
let gradingMethodHandler = `${gradingComponent}/grades/grader/gradingpanel`;
if (gradingSubtype) {
gradingMethodHandler += `/${gradingSubtype}`;
}
const GradingMethod = await import(gradingMethodHandler);
return {
getter: userId => GradingMethod.fetchCurrentGrade(component, context, itemName, userId),
setter: (userId, formData) => GradingMethod.storeCurrentGrade(component, context, itemName, userId, formData),
};
};
@@ -34,6 +34,7 @@ export default {
regions: {
moduleReplace: getDataSelector('region', 'module_content'),
pickerRegion: getDataSelector('region', 'user_picker'),
gradingPanel: getDataSelector('region', 'grade'),
},
};
@@ -44,17 +44,18 @@ const showUser = async(root, users, currentUserIndex, showUserCallback) => {
Templates.replaceNodeContents(userRegion, html, '');
};
const bindEvents = (root, users, currentUserIndex, showUserCallback) => {
const bindEvents = (root, users, currentUserIndex, showUserCallback, saveUserCallback) => {
root.addEventListener('click', (e) => {
const button = e.target.closest(Selectors.actions.changeUser);
if (button) {
saveUserCallback(users[currentUserIndex]);
currentUserIndex += parseInt(button.dataset.direction);
showUser(root, users, currentUserIndex, showUserCallback);
}
});
};
export const buildPicker = async(users, currentUserID, showUserCallback) => {
export const buildPicker = async(users, currentUserID, showUserCallback, saveUserCallback) => {
let root = document.createElement('div');
const [html] = await Promise.all([renderNavigator()]);
@@ -66,7 +67,7 @@ export const buildPicker = async(users, currentUserID, showUserCallback) => {
await showUser(root, users, currentUserIndex, showUserCallback);
bindEvents(root, users, currentUserIndex, showUserCallback);
bindEvents(root, users, currentUserIndex, showUserCallback, saveUserCallback);
return root;
};