MDL-68076 core: display the feedback link on footer
authorShamim Rezaie <shamim@moodle.com>
Sun, 3 May 2020 06:04:05 +0000 (16:04 +1000)
committerShamim Rezaie <shamim@moodle.com>
Thu, 4 Jun 2020 01:57:24 +0000 (11:57 +1000)
lib/amd/build/userfeedback.min.js
lib/amd/build/userfeedback.min.js.map
lib/amd/src/userfeedback.js
lib/classes/external/userfeedback/generate_url.php
lib/classes/userfeedback.php
lib/outputrenderers.php
lib/templates/userfeedback_footer_link.mustache [new file with mode: 0644]

index 8706659..5eb8d7c 100644 (file)
Binary files a/lib/amd/build/userfeedback.min.js and b/lib/amd/build/userfeedback.min.js differ
index 897ef98..5f74d58 100644 (file)
Binary files a/lib/amd/build/userfeedback.min.js.map and b/lib/amd/build/userfeedback.min.js.map differ
index 20d93e5..a74bf4e 100644 (file)
@@ -41,27 +41,20 @@ export const registerEventListeners = () => {
         const giveAction = e.target.closest(Selectors.actions.give);
         if (giveAction) {
             e.preventDefault();
+
             giveFeedback()
-                .then(() => {
-                    return recordAction('give');
-                })
-                .then(() => {
-                    const root = giveAction.closest(Selectors.regions.root);
-                    root.remove();
-                    return;
-                })
+                .then(() => hideRoot(giveAction))
+                .then(recordAction)
                 .catch(Notification.exception);
         }
 
         const remindAction = e.target.closest(Selectors.actions.remind);
         if (remindAction) {
             e.preventDefault();
-            recordAction('remind')
-                .then(() => {
-                    const root = remindAction.closest(Selectors.regions.root);
-                    root.remove();
-                    return;
-                })
+
+            Promise.resolve(remindAction)
+                .then(hideRoot)
+                .then(recordAction)
                 .catch(Notification.exception);
         }
     });
@@ -90,14 +83,32 @@ const giveFeedback = () => {
 /**
  * Record the action that the user took.
  *
- * @param {string} action The action that the user took. Either give or remind.
- * @returns {Promise<null>}
+ * @param {HTMLElement} clickedItem The action element that the user chose.
+ * @returns {Promise}
  */
-const recordAction = action => {
-    return Ajax.call([{
-        methodname: 'core_create_userfeedback_action_record',
-        args: {
-            action,
-        }
-    }])[0];
+const recordAction = clickedItem => {
+    if (clickedItem.dataset.record) {
+        return Ajax.call([{
+            methodname: 'core_create_userfeedback_action_record',
+            args: {
+                action: clickedItem.dataset.action,
+            }
+        }])[0];
+    }
+
+    return Promise.resolve();
+};
+
+/**
+ * Hide the root node of the CTA notification.
+ *
+ * @param {HTMLElement} clickedItem The action element that the user chose.
+ * @returns {HTMLElement}
+ */
+const hideRoot = clickedItem => {
+    if (clickedItem.dataset.hide) {
+        clickedItem.closest(Selectors.regions.root).remove();
+    }
+
+    return clickedItem;
 };
index 821e3c8..307bbc2 100644 (file)
@@ -59,9 +59,7 @@ class generate_url extends external_api {
      * @return \stdClass
      */
     public static function execute(int $contextid) {
-        global $CFG, $PAGE;
-
-        require_once($CFG->libdir . '/adminlib.php');
+        global $PAGE;
 
         external_api::validate_parameters(self::execute_parameters(), ['contextid' => $contextid]);
 
@@ -69,22 +67,7 @@ class generate_url extends external_api {
         self::validate_context($context);
         $PAGE->set_context($context);
 
-        $baseurl = $CFG->userfeedback_url ?? 'https://feedback.moodle.org/lms';
-        $lang = clean_param(current_language(), PARAM_LANG); // Avoid breaking WS because of incorrect package langs.
-        $moodleurl = $CFG->wwwroot;
-        $moodleversion = $CFG->release;
-        $theme = $PAGE->theme->name;
-        $themeversion = get_component_version('theme_' . $theme);
-
-        $firstseparator = strpos($baseurl, '?') === false ? '?' : '&';
-
-        $url = $baseurl . $firstseparator . 'lang=' . $lang;
-        $url .= '&moodle_url=' . rawurlencode($moodleurl) .
-                '&moodle_version=' . rawurlencode($moodleversion) .
-                '&theme=' . rawurlencode($theme) .
-                '&theme_version=' . $themeversion;
-
-        return $url;
+        return \core_userfeedback::make_link()->out(false);
     }
 
     /**
index 6ede895..1bdddf7 100644 (file)
@@ -60,6 +60,8 @@ class core_userfeedback {
                 'url' => '#',
                 'data' => [
                         'action' => 'give',
+                    'record' => 1,
+                    'hide' => 1,
                 ],
             ],
             [
@@ -67,6 +69,8 @@ class core_userfeedback {
                 'url' => '#',
                 'data' => [
                     'action' => 'remind',
+                    'record' => 1,
+                    'hide' => 1,
                 ],
             ],
         ];
@@ -113,6 +117,35 @@ class core_userfeedback {
         return false;
     }
 
+    /**
+     * Prepare and return the URL of the feedback site
+     *
+     * @return moodle_url
+     */
+    public static function make_link(): moodle_url {
+        global $CFG, $PAGE;
+        require_once($CFG->libdir . '/adminlib.php');
+
+        $baseurl = $CFG->userfeedback_url ?? 'https://feedback.moodle.org/lms';
+        $lang = clean_param(current_language(), PARAM_LANG); // Avoid breaking WS because of incorrect package langs.
+        $moodleurl = $CFG->wwwroot;
+        $moodleversion = $CFG->release;
+        $theme = $PAGE->theme->name;
+        $themeversion = get_component_version('theme_' . $theme);
+
+        $url = new moodle_url($baseurl, [
+            'lang' => $lang,
+            'moodle_url' => $moodleurl,
+            'moodle_version' => $moodleversion,
+            'theme' => $theme,
+            'theme_version' => $themeversion,
+            'newtest' => 'Y', // Respondents might be using the same device/browser to fill out the survey.
+                              // The newtest param resets the session.
+        ]);
+
+        return $url;
+    }
+
     /**
      * Returns the last major upgrade time
      *
index e3705ea..240d449 100644 (file)
@@ -835,6 +835,12 @@ class core_renderer extends renderer_base {
             }
         }
 
+        if (isloggedin() && !isguestuser()) {
+            $output .= html_writer::div(
+                $this->render_from_template('core/userfeedback_footer_link', ['url' => core_userfeedback::make_link()->out(false)])
+            );
+        }
+
         // This function is normally called from a layout.php file in {@link core_renderer::header()}
         // but some of the content won't be known until later, so we return a placeholder
         // for now. This will be replaced with the real content in {@link core_renderer::footer()}.
diff --git a/lib/templates/userfeedback_footer_link.mustache b/lib/templates/userfeedback_footer_link.mustache
new file mode 100644 (file)
index 0000000..baca852
--- /dev/null
@@ -0,0 +1,27 @@
+{{!
+    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/>.
+}}
+{{!
+    @template core/userfeedback_footer_link
+
+    Adds the give feedback link.
+
+    Example context (json):
+    {}
+}}
+
+{{# pix }} i/bullhorn, core {{/ pix }}
+<a href="{{url}}" target="_blank">{{#str}}calltofeedback_give{{/str}}</a>