MDL-66074 mod_forum: Grader documentation
authorMathew May <mathewm@hotmail.co.nz>
Mon, 28 Oct 2019 05:03:40 +0000 (13:03 +0800)
committerMathew May <mathewm@hotmail.co.nz>
Wed, 30 Oct 2019 05:03:59 +0000 (13:03 +0800)
mod/forum/amd/build/grades/grader.min.js
mod/forum/amd/build/grades/grader.min.js.map
mod/forum/amd/src/grades/grader.js

index 2bb04a8..0d1a46f 100644 (file)
Binary files a/mod/forum/amd/build/grades/grader.min.js and b/mod/forum/amd/build/grades/grader.min.js differ
index aff647e..459670e 100644 (file)
Binary files a/mod/forum/amd/build/grades/grader.min.js.map and b/mod/forum/amd/build/grades/grader.min.js.map differ
index 6a6f49c..61b151b 100644 (file)
@@ -32,48 +32,51 @@ const templateNames = {
     contentRegion: 'mod_forum/grades/grader/discussion/posts',
 };
 
-const getWholeForumFunctions = (cmid) => {
-    const getPostContextFunction = () => {
-        return (userid) => {
-            return Repository.getDiscussionByUserID(userid, cmid);
-        };
-    };
-
-    const getContentForUserIdFunction = () => {
-        const postContextFunction = getPostContextFunction(cmid);
-        return userid => {
-            return postContextFunction(userid)
-            .then(context => {
-                // Rebuild the returned data for the template.
-                context.discussions = context.discussions.map(discussionPostMapper);
-
-                return Templates.render(templateNames.contentRegion, context);
-            })
-            .catch(Notification.exception);
-        };
-    };
+/**
+ * Curried function with CMID set, this is then used in unified grader as a fetch a users content.
+ *
+ * @param {Number} cmid
+ * @return {Function}
+ */
+const getContentForUserIdFunction = (cmid) => (userid) => {
+    /**
+     * Given the parent function is called with the second param set execute the partially executed function.
+     *
+     * @param {Number} userid
+     */
+    return Repository.getDiscussionByUserID(userid, cmid)
+        .then(context => {
+            // Rebuild the returned data for the template.
+            context.discussions = context.discussions.map(discussionPostMapper);
+
+            return Templates.render(templateNames.contentRegion, context);
+        })
+        .catch(Notification.exception);
+};
 
-    const getUsersForCmidFunction = () => {
-        return () => {
-            return CourseRepository.getUsersFromCourseModuleID(cmid)
-                .then((context) => {
-                    return context.users;
-                })
-                .catch(Notification.exception);
-        };
-    };
+/**
+ * Curried function with CMID set, this is then used in unified grader as a fetch users call.
+ * The function curried fetches all users in a course for a given CMID.
+ *
+ * @param {Number} cmid
+ * @return {Array} Array of users for a given context.
+ */
+const getUsersForCmidFunction = (cmid) => async() => {
+    const context = await CourseRepository.getUsersFromCourseModuleID(cmid);
 
-    return {
-        getContentForUserId: getContentForUserIdFunction(),
-        getUsers: getUsersForCmidFunction(),
-    };
+    return context.users;
 };
 
-const findGradableNode = (node) => {
-    return node.closest(Selectors.gradableItem);
-};
 
-const discussionPostMapper = discussion => {
+const findGradableNode = node => node.closest(Selectors.gradableItem);
+
+/**
+ * For a discussion we need to manipulate it's posts to hide certain UI elements.
+ *
+ * @param {Object} discussion
+ * @return {Array} name, id, posts
+ */
+const discussionPostMapper = (discussion) => {
     // Map postid => post.
     const parentMap = new Map();
     discussion.posts.parentposts.forEach(post => parentMap.set(post.id, post));
@@ -82,6 +85,7 @@ const discussionPostMapper = discussion => {
         post.readonly = true;
         post.starter = !post.parentid;
         post.parent = parentMap.get(post.parentid);
+        post.html.rating = null;
 
         return post;
     });
@@ -98,9 +102,8 @@ const discussionPostMapper = discussion => {
  *
  * @param {HTMLElement} rootNode the root HTML element describing what is to be graded
  */
-const launchWholeForumGrading = async rootNode => {
+const launchWholeForumGrading = async(rootNode) => {
     const data = rootNode.dataset;
-    const wholeForumFunctions = getWholeForumFunctions(data.cmid);
     const gradingPanelFunctions = await Grader.getGradingPanelFunctions(
         'mod_forum',
         data.contextid,
@@ -110,8 +113,8 @@ const launchWholeForumGrading = async rootNode => {
     );
 
     await Grader.launch(
-        wholeForumFunctions.getUsers,
-        wholeForumFunctions.getContentForUserId,
+        getUsersForCmidFunction(data.cmid),
+        getContentForUserIdFunction(data.cmid),
         gradingPanelFunctions.getter,
         gradingPanelFunctions.setter,
         {
@@ -126,7 +129,7 @@ const launchWholeForumGrading = async rootNode => {
  * Register listeners to launch the grading panel.
  */
 export const registerLaunchListeners = () => {
-    document.addEventListener('click', async e => {
+    document.addEventListener('click', async(e) => {
         if (e.target.matches(Selectors.launch)) {
             const rootNode = findGradableNode(e.target);