diff --git a/classes/output/comment.php b/classes/output/comment.php index 7bd67ec8c6305ed5dadf8eb68d6e2c802b385c16..860baabba9a156b6a2e5eee4e0376643da838021 100644 --- a/classes/output/comment.php +++ b/classes/output/comment.php @@ -1,4 +1,5 @@ <?php + // This file is part of Moodle - http://moodle.org/ // // Moodle is free software: you can redistribute it and/or modify @@ -36,7 +37,19 @@ class comment implements \renderable, \templatable { if (!is_array($data)) { $data = [$data]; } + + $report = has_capability('mod/pdfannotator:report', $context); + $closequestion = has_capability('mod/pdfannotator:closequestion', $context); + $closeanyquestion = has_capability('mod/pdfannotator:closeanyquestion', $context); $editanypost = has_capability('mod/pdfannotator:editanypost', $context); + $seehiddencomments = has_capability('mod/pdfannotator:seehiddencomments', $context); + $hidecomments = has_capability('mod/pdfannotator:hidecomments', $context); + $deleteany = has_capability('mod/pdfannotator:deleteany', $context); + $deleteown = has_capability('mod/pdfannotator:deleteown', $context); + $subscribe = has_capability('mod/pdfannotator:subscribe', $context); + $forwardquestions = has_capability('mod/pdfannotator:forwardquestions', $context); + $solve = has_capability('mod/pdfannotator:markcorrectanswer', $context); + foreach ($data as $comment) { $comment->buttons = []; @@ -46,92 +59,27 @@ class comment implements \renderable, \templatable { $comment->solved = boolval($comment->solved); $owner = ($comment->userid == $USER->id); + $comment->owner = ($comment->userid == $USER->id); - $comment->wrapperClass = 'chat-message comment-list-item'; - if ($comment->isquestion) { - $comment->wrapperClass .= ' questioncomment'; - } else if ($comment->solved) { - $comment->wrapperClass .= ' correct'; - } - if ($owner) { - $comment->wrapperClass .= ' owner'; - } - if ($comment->usevotes) { - $comment->wrapperClass .= ' usevotes'; - if (!$comment->isdeleted) { - if ($owner) { - $comment->voteBtn = get_string('likeOwnComment', 'pdfannotator'); - } else if ($comment->isvoted) { - if ($comment->isquestion) { - $comment->voteBtn = get_string('likeQuestionForbidden', 'pdfannotator'); - } else { - $comment->voteBtn = get_string('likeAnswerForbidden', 'pdfannotator'); - } - } else { - if ($comment->isquestion) { - $comment->voteBtn = get_string('likeQuestion', 'pdfannotator'); - } else { - $comment->voteBtn = get_string('likeAnswer', 'pdfannotator'); - } - } - } - - if (!$comment->votes) { - $comment->votes = "0"; - } - if ($comment->isquestion) { - $comment->voteTitle = $comment->votes . " " . get_string('likeCountQuestion', 'pdfannotator'); - } else { - $comment->voteTitle = $comment->votes . " " . get_string('likeCountAnswer', 'pdfannotator'); - } - } + $this->addcssclasses($comment, $owner); - if (!empty($comment->ishidden)) { - if (has_capability('mod/pdfannotator:seehiddencomments', $context)) { - $comment->content = $comment->content; - $comment->dimmed = 'dimmed_text'; - $comment->displayhidden = 1; - $comment->buttons[] = ["attributes" => ["name" => "id", "value" => "hideButton" . $comment->uuid], - "moodleicon" => ["key" => "i/hide", "component" => "core", "title" => get_string('removehidden', 'pdfannotator')], - "text" => get_string('removehidden', 'pdfannotator')]; - } else { - $comment->visibility = 'anonymous'; - $comment->content = '<em>' . get_string('hiddenComment', 'pdfannotator') . '</em>'; - } + $this->setvotes($comment); - } else { - if (has_capability('mod/pdfannotator:hidecomments', $context)) { - $comment->buttons[] = ["attributes" => ["name" => "id", "value" => "hideButton" . $comment->uuid], - "moodleicon" => ["key" => "i/show", "component" => "core", "title" => get_string('markhidden', 'pdfannotator')], - "text" => get_string('markhidden', 'pdfannotator')]; - } - } + $this->addreportbutton($comment, $report, $cm); + $this->addcloseopenbutton($comment, $closequestion, $closeanyquestion); + $this->addeditbutton($comment, $editanypost); + $this->addhidebutton($comment, $seehiddencomments, $hidecomments); + $this->adddeletebutton($comment, $deleteown, $deleteany); + $this->addsubscribebutton($comment, $subscribe); + $this->addforwardbutton($comment, $forwardquestions, $cm); + $this->addmarksolvedbutton($comment, $solve); + + $this->addsolvedicon($comment); if ($comment->isdeleted || isset($comment->type)) { $comment->content = '<em>' . $comment->content . '</em>'; } - if (!$comment->isdeleted) { - $deleteany = has_capability('mod/pdfannotator:deleteany', $context); - $deleteown = has_capability('mod/pdfannotator:deleteown', $context); - $report = has_capability('mod/pdfannotator:report', $context); - if ($deleteany || ($deleteown && $owner)) { // Delete. - $comment->buttons[] = ["classes" => "comment-delete-a", "text" => get_string('delete', 'pdfannotator'), - "moodleicon" => ["key" => "delete", "component" => "pdfannotator", "title" => get_string('delete', 'pdfannotator')]]; - } - // Report (textbox/drawing can't be reported because of a missing commentid). - if ($report && !$owner && !isset($comment->type) ) { - $comment->report = true; - $comment->cm = json_encode($cm); // Course module object. - $comment->cmid = $cm->id; - } - if (!isset($comment->type) && ($owner || $editanypost)) { - $comment->buttons[] = ["classes" => "comment-edit-a", "attributes" => ["name" => "id", "value" => "editButton" . $comment->uuid], - "moodleicon" => ["key" => "i/edit", "component" => "core", "title" => get_string('edit', 'pdfannotator')], - "text" => get_string('edit', 'pdfannotator')]; - } - } - if (!empty($comment->modifiedby) && ($comment->modifiedby != $comment->userid) && ($comment->userid != 0)) { $comment->modifiedby = get_string('modifiedby', 'pdfannotator') . pdfannotator_get_username($comment->modifiedby); } else { @@ -142,45 +90,6 @@ class comment implements \renderable, \templatable { $comment->dropdown = true; } - if (!isset($comment->type) && $comment->isquestion) { // Only set for textbox and drawing. - if (!empty($comment->issubscribed)) { - $comment->buttons[] = ["classes" => "comment-subscribe-a", "faicon" => ["class" => "fa-bell-slash"], - "text" => get_string('unsubscribeQuestion', 'pdfannotator')]; - } else { - $comment->buttons[] = ["classes" => "comment-subscribe-a", "faicon" => ["class" => "fa-bell"], - "text" => get_string('subscribeQuestion', 'pdfannotator')]; - } - // Open/Close. - $closequestion = has_capability('mod/pdfannotator:closequestion', $context); - $closeanyquestion = has_capability('mod/pdfannotator:closeanyquestion', $context); - if (($owner && $closequestion) || $closeanyquestion) { - if ($comment->solved) { - $comment->buttons[] = ["classes" => "comment-solve-a", "faicon" => ["class" => "fa-unlock"], - "text" => get_string('markUnsolved', 'pdfannotator')]; - } else { - $comment->buttons[] = ["classes" => "comment-solve-a", "faicon" => ["class" => "fa-lock"], - "text" => get_string('markSolved', 'pdfannotator')]; - } - } - } - - $solve = has_capability('mod/pdfannotator:markcorrectanswer', $context); - if ($solve && !$comment->isquestion && !$comment->isdeleted && !isset($comment->type)) { - if ($comment->solved) { - $comment->buttons[] = ["classes" => "comment-solve-a", "text" => get_string('removeCorrect', 'pdfannotator'), - "moodleicon" => ["key" => "i/completion-manual-n", "component" => "core", "title" => get_string('removeCorrect', 'pdfannotator')]]; - } else { - $comment->buttons[] = ["classes" => "comment-solve-a", "text" => get_string('markCorrect', 'pdfannotator'), - "moodleicon" => ["key" => "i/completion-manual-enabled", "component" => "core", "title" => get_string('markCorrect', 'pdfannotator')]]; - } - } - if ($comment->solved) { - if ($comment->isquestion) { - $comment->solvedicon = ["classes" => "icon fa fa-lock fa-fw solvedquestionicon", "title" => get_string('questionSolved', 'pdfannotator')]; - } else if (!$comment->isdeleted) { - $comment->solvedicon = ["classes" => "icon fa fa-check fa-fw correctanswericon", "title" => get_string('answerSolved', 'pdfannotator')]; - } - } $this->comments[] = $comment; } return; @@ -198,4 +107,179 @@ class comment implements \renderable, \templatable { return $data; } + private function addcssclasses($comment, $owner) { + $comment->wrapperClass = 'chat-message comment-list-item'; + if ($comment->isquestion) { + $comment->wrapperClass .= ' questioncomment'; + } else if ($comment->solved) { + $comment->wrapperClass .= ' correct'; + } + if ($owner) { + $comment->wrapperClass .= ' owner'; + } + if ($comment->usevotes) { + $comment->wrapperClass .= ' usevotes'; + } + } + + public function setvotes($comment) { + if ($comment->usevotes && !$comment->isdeleted) { + if ($comment->owner) { + $comment->voteBtn = get_string('likeOwnComment', 'pdfannotator'); + } else if ($comment->isvoted && $comment->isquestion) { + $comment->voteBtn = get_string('likeQuestionForbidden', 'pdfannotator'); + } else if ($comment->isvoted && !$comment->isquestion) { + $comment->voteBtn = get_string('likeAnswerForbidden', 'pdfannotator'); + } else if (!$comment->isvoted && $comment->isquestion) { + $comment->voteBtn = get_string('likeQuestion', 'pdfannotator'); + } else if (!$comment->isvoted && !$comment->isquestion) { + $comment->voteBtn = get_string('likeAnswer', 'pdfannotator'); + } + + if (!$comment->votes) { + $comment->votes = "0"; + } + if ($comment->isquestion) { + $comment->voteTitle = $comment->votes . " " . get_string('likeCountQuestion', 'pdfannotator'); + } else { + $comment->voteTitle = $comment->votes . " " . get_string('likeCountAnswer', 'pdfannotator'); + } + } + } + + /** + * Add check icon if comment is marked as correct. + * @param type $comment + */ + public function addsolvedicon($comment) { + if ($comment->solved) { + if ($comment->isquestion) { + $comment->solvedicon = ["classes" => "icon fa fa-lock fa-fw solvedquestionicon", "title" => get_string('questionSolved', 'pdfannotator')]; + } else if (!$comment->isdeleted) { + $comment->solvedicon = ["classes" => "icon fa fa-check fa-fw correctanswericon", "title" => get_string('answerSolved', 'pdfannotator')]; + } + } + } + + /** + * Report comment if user is not the owner. + * @param type $comment + * @param type $owner + * @param type $report + */ + private function addreportbutton($comment, $report, $cm) { + if (!$comment->isdeleted && $report && !$comment->owner && !isset($comment->type)) { + $comment->report = true; + $comment->cm = json_encode($cm); // Course module object. + $comment->cmid = $cm->id; + } + } + + /** + * Open/close question if user is owner of the question or manager. + * @param type $comment + * @param type $owner + * @param type $closequestion + * @param type $closeanyquestion + */ + private function addcloseopenbutton($comment, $closequestion, $closeanyquestion) { + + if (!isset($comment->type) && $comment->isquestion // Only set for textbox and drawing. + && (($comment->owner && $closequestion) || $closeanyquestion)) { + + if ($comment->solved) { + $comment->buttons[] = ["classes" => "comment-solve-a", "faicon" => ["class" => "fa-unlock"], + "text" => get_string('markUnsolved', 'pdfannotator')]; + } else { + $comment->buttons[] = ["classes" => "comment-solve-a", "faicon" => ["class" => "fa-lock"], + "text" => get_string('markSolved', 'pdfannotator')]; + } + } + } + + /** + * Button for editing comment if user is owner of the comment or manager. + * @param type $comment + * @param type $owner + * @param type $editanypost + */ + private function addeditbutton($comment, $editanypost) { + if (!$comment->isdeleted && !isset($comment->type) && ($comment->owner || $editanypost)) { + $comment->buttons[] = ["classes" => "comment-edit-a", "attributes" => ["name" => "id", "value" => "editButton" . $comment->uuid], + "moodleicon" => ["key" => "i/edit", "component" => "core", "title" => get_string('edit', 'pdfannotator')], + "text" => get_string('edit', 'pdfannotator')]; + } + } + + private function addhidebutton($comment, $seehiddencomments, $hidecomments) { + if (!empty($comment->ishidden) && !isset($comment->type)) { + if ($seehiddencomments) { + $comment->content = $comment->content; + $comment->dimmed = 'dimmed_text'; + $comment->displayhidden = 1; + $comment->buttons[] = ["attributes" => ["name" => "id", "value" => "hideButton" . $comment->uuid], + "moodleicon" => ["key" => "i/hide", "component" => "core", "title" => get_string('removehidden', 'pdfannotator')], + "text" => get_string('removehidden', 'pdfannotator')]; + } else { + $comment->visibility = 'anonymous'; + $comment->content = '<em>' . get_string('hiddenComment', 'pdfannotator') . '</em>'; + } + } else if (!isset($comment->type)) { + if ($hidecomments) { + $comment->buttons[] = ["attributes" => ["name" => "id", "value" => "hideButton" . $comment->uuid], + "moodleicon" => ["key" => "i/show", "component" => "core", "title" => get_string('markhidden', 'pdfannotator')], + "text" => get_string('markhidden', 'pdfannotator')]; + } + } + } + + /** + * Delete comment if user is owner of the comment or manager. + * @param type $comment + * @param type $owner + * @param type $deleteown + * @param type $deleteany + */ + private function adddeletebutton($comment, $deleteown, $deleteany) { + if (!$comment->isdeleted && ($deleteany || ($deleteown && $comment->owner))) { + $comment->buttons[] = ["classes" => "comment-delete-a", "text" => get_string('delete', 'pdfannotator'), + "moodleicon" => ["key" => "delete", "component" => "pdfannotator", "title" => get_string('delete', 'pdfannotator')]]; + } + } + + private function addsubscribebutton($comment, $subscribe) { + if (!isset($comment->type) && $comment->isquestion && $subscribe) { // Only set for textbox and drawing. + if (!empty($comment->issubscribed)) { + $comment->buttons[] = ["classes" => "comment-subscribe-a", "faicon" => ["class" => "fa-bell-slash"], + "text" => get_string('unsubscribeQuestion', 'pdfannotator')]; + } else { + $comment->buttons[] = ["classes" => "comment-subscribe-a", "faicon" => ["class" => "fa-bell"], + "text" => get_string('subscribeQuestion', 'pdfannotator')]; + } + } + } + + private function addforwardbutton($comment, $forwardquestions, $cm) { + if (!isset($comment->type) && $comment->isquestion && !$comment->isdeleted && $forwardquestions) { + global $CFG; + $urlparams = ['id' => $cm->id, 'action' => 'forwardquestion', 'commentid' => $comment->uuid]; + $url = new moodle_url($CFG->wwwroot . '/mod/pdfannotator/view.php', $urlparams); + + $comment->buttons[] = ["classes" => "comment-forward-a", "attributes" => ["name" => "onclick", "value" => "window.location.href = '$url';"], + "faicon" => ["class" => "fa-share"], "text" => get_string('forward', 'pdfannotator')]; + } + } + + private function addmarksolvedbutton($comment, $solve) { + if ($solve && !$comment->isquestion && !$comment->isdeleted && !isset($comment->type)) { + if ($comment->solved) { + $comment->buttons[] = ["classes" => "comment-solve-a", "text" => get_string('removeCorrect', 'pdfannotator'), + "moodleicon" => ["key" => "i/completion-manual-n", "component" => "core", "title" => get_string('removeCorrect', 'pdfannotator')]]; + } else { + $comment->buttons[] = ["classes" => "comment-solve-a", "text" => get_string('markCorrect', 'pdfannotator'), + "moodleicon" => ["key" => "i/completion-manual-enabled", "component" => "core", "title" => get_string('markCorrect', 'pdfannotator')]]; + } + } + } + } diff --git a/classes/output/questionmenu.php b/classes/output/questionmenu.php index 69691721756d8ec1ec60c1cfc2d1f659deb89014..c68c0b156fb165d92525e8357cd65436e9438429 100644 --- a/classes/output/questionmenu.php +++ b/classes/output/questionmenu.php @@ -15,7 +15,9 @@ // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** - * Dropdown menu in questionstable on overview tab. + * The purpose of this script is to collect the output data for the statistic template and + * make it available to the renderer. The data is collected via the statistic model and then processed. + * Therefore, class statistic can be seen as a view controller. * * @package mod_pdfannotator * @copyright 2018 RWTH Aachen (see README.md) @@ -31,12 +33,6 @@ class questionmenu implements \renderable, \templatable { private $label; private $buttonclass; - /** - * Constructor of renderable for dropdown menu in questionstable. - * - * @param int $commentid Id of the question - * @param array $urlparams Parameters for the link - */ public function __construct($commentid, $urlparams) { global $CFG; @@ -48,7 +44,6 @@ class questionmenu implements \renderable, \templatable { $urlparams['action'] = 'forwardquestion'; $urlparams['fromoverview'] = '1'; $urlparams['commentid'] = $commentid; - $urlparams['sesskey'] = sesskey(); $url = new moodle_url($CFG->wwwroot . '/mod/pdfannotator/view.php', $urlparams); $this->url = $url; diff --git a/controller.php b/controller.php index 71b6c4df9183709192bc3912dec68991be0daf1c..32c5b1899be251d44833f305d7bae3431adbc1dc 100644 --- a/controller.php +++ b/controller.php @@ -34,6 +34,96 @@ if ($action === 'overview') { // Go to question-overview by default. $action = 'overviewquestions'; } + +if ($action === 'forwardquestion') { + require_capability('mod/pdfannotator:forwardquestions', $context); + require_once($CFG->dirroot . '/mod/pdfannotator/forward_form.php'); + global $USER; + + $commentid = required_param('commentid', PARAM_INT); + $cminfo = pdfannotator_instance::get_cm_info($cm->course); + // Make sure user is allowed to see cm with the question. (Might happen if user changes commentid in url). + list($insql, $inparams) = $DB->get_in_or_equal(array_keys($cminfo)); + $sql = "SELECT c.*, a.page, cm.id AS cmid " + . "FROM {pdfannotator_comments} c " + . "JOIN {pdfannotator_annotations} a ON c.annotationid = a.id " + . "JOIN {pdfannotator} p ON a.pdfannotatorid = p.id " + . "JOIN {course_modules} cm ON p.id = cm.instance " + . "WHERE c.isdeleted = 0 AND c.id = ? AND cm.id $insql"; + $params = array_merge([$commentid], $inparams); + $comments = $DB->get_records_sql($sql, $params); + $error = false; + if (!$comments) { + $error = true; + } else { + $comment = $comments[$commentid]; + if (!$error && $comment->ishidden && !has_capability('mod/pdfannotator:seehiddencomments', $context)) { + $error = true; + } + } + + if ($error) { // An error occured e.g. comment doesn't exist. + $info = get_string('error:forwardquestion', 'pdfannotator'); // Display error notification. + echo "<span id='subscriptionPanel' class='usernotifications'><div class='alert alert-success alert-block fade in' role='alert'>$info</div></span>"; + $action = 'overviewquestions'; // And go back to overview. + } else { + + $possiblerecipients = get_enrolled_users($context, 'mod/pdfannotator:getforwardedquestions'); + $recipientslist = []; + foreach ($possiblerecipients as $recipient) { + $recipientslist[$recipient->id] = $recipient->firstname . ' ' . $recipient->lastname; + } + + $data = new stdClass(); + $data->course = $cm->course; + $data->pdfannotatorid = $cm->instance; + $data->pdfname = $cm->name; + $data->commentid = $commentid; + $data->id = $cm->id; // Course module id. + $data->action = 'forwardquestion'; + + // Initialise mform and pass on $data-object to it. + $mform = new pdfannotator_forward_form(null, ['comment' => $comment, 'recipients' => $recipientslist]); + $mform->set_data($data); + + if ($mform->is_cancelled()) { // Form was cancelled. + // Go back to overview or document. + $fromoverview = optional_param('fromoverview', 0, PARAM_INT); + if ($fromoverview) { + $action = 'overviewquestions'; + } else { + $action = 'view'; + } + } else if ($data = $mform->get_data()) { // Process validated data. $mform->get_data() returns data posted in form. + $url = (new moodle_url('/mod/pdfannotator/view.php', array('id' => $comment->cmid, + 'page' => $comment->page, 'annoid' => $comment->annotationid, 'commid' => $comment->id)))->out(); + + $params = new stdClass(); + $params->sender = $USER->firstname . ' ' . $USER->lastname; + $params->questioncontent = $comment->content; + $params->message = $data->message; + $params->urltoquestion = $url; + + if (isset($data->recipients)) { + send_forward_message($data->recipients, $params, $course, $cm, $context); + } + $fromoverview = optional_param('fromoverview', 0, PARAM_INT); + if ($fromoverview) { + // If user forwarded question from overview go back to overview. + $action = 'overviewquestions'; + } else { + // Else go to document. + $action = 'view'; + } + + } else { // Executed if the form is submitted but the data doesn't validate and the form should be redisplayed + // or on the first display of the form. + $PAGE->set_title("forward_form"); + echo $OUTPUT->heading(get_string('titleforwardform', 'pdfannotator')); + $mform->display(); // Display form. + } + } +} /* * This section prints a subpage of overview called 'unsolved questions'. */ @@ -69,7 +159,7 @@ if ($action === 'overviewquestions') { echo "<span class='notification'><div class='alert alert-info alert-block fade in' role='alert'>$info</div></span>"; } else { $urlparams = array('action' => 'overviewquestions', 'id' => $cmid, 'page' => $currentpage, 'itemsperpage' => $itemsperpage, 'questionfilter' => $questionfilter); - pdfannotator_print_questions($questions, $thiscourse, $urlparams, $currentpage, $itemsperpage); + pdfannotator_print_questions($questions, $thiscourse, $urlparams, $currentpage, $itemsperpage, $context); } } /* diff --git a/db/access.php b/db/access.php index f9ae9461accf341bca0bf5b6a4f142439b03f70c..dd4e0a084b4f0a596e8240cb8866f0530e32f1a7 100644 --- a/db/access.php +++ b/db/access.php @@ -236,6 +236,27 @@ $capabilities = array( ), ), + 'mod/pdfannotator:forwardquestions' => array ( // Forward a question (to an other teacher/manager). + 'captype' => 'write', + 'contextlevel' => CONTEXT_MODULE, + 'archetypes' => array( + 'teacher' => CAP_ALLOW, + 'editingteacher' => CAP_ALLOW, + 'manager' => CAP_ALLOW + ), + ), + + 'mod/pdfannotator:getforwardedquestions' => array ( // Receive forwarded questions. + 'captype' => 'write', + 'contextlevel' => CONTEXT_MODULE, + 'archetypes' => array( + 'teacher' => CAP_ALLOW, + 'editingteacher' => CAP_ALLOW, + 'manager' => CAP_ALLOW + ), + ), + + // Get a notification about new questions. 'mod/pdfannotator:recievenewquestionnotifications' => array ( 'captype' => 'read', diff --git a/db/messages.php b/db/messages.php index 70b5f95e04199ddceb5f2dfa62ea8502d13b6f68..939326cb30eef65779e9b8687a5af6711d2b238a 100644 --- a/db/messages.php +++ b/db/messages.php @@ -44,6 +44,15 @@ $messageproviders = array ( // Notify teacher about a newly reported comment. 'newreport' => array ( 'capability' => 'mod/pdfannotator:viewreports' // Teacher capability. + ), + + // Notify when receiving a forwarded question. + 'forwardedquestion' => array ( + 'capability' => 'mod/pdfannotator:getforwardedquestions', + 'defaults' => array( + 'popup' => MESSAGE_PERMITTED + MESSAGE_DEFAULT_LOGGEDIN + MESSAGE_DEFAULT_LOGGEDOFF, + 'email' => MESSAGE_PERMITTED + MESSAGE_DEFAULT_LOGGEDIN + MESSAGE_DEFAULT_LOGGEDOFF, + ) ) ); \ No newline at end of file diff --git a/forward_form.php b/forward_form.php new file mode 100644 index 0000000000000000000000000000000000000000..adf592c434295eee4abaa051f8b374e529629cc0 --- /dev/null +++ b/forward_form.php @@ -0,0 +1,83 @@ +<?php +// 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/>. +/** + * @package mod_pdfannotator + * @copyright 2018 RWTH Aachen (see README.md) + * @author Anna Heynkes + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + * + */ +defined('MOODLE_INTERNAL') || die(); + +require_once($CFG->libdir . '/formslib.php'); + +/** + * Description of reportform + * + * @author Admin + */ +class pdfannotator_forward_form extends moodleform { + + public function definition() { + global $CFG; + + $mform = $this->_form; // Don't forget the underscore! + // Pass contextual parameters to the form (via set_data() in controller.php) + // Course module id. + $mform->addElement('hidden', 'id'); + $mform->setType('id', PARAM_INT); + // Course id. + $mform->addElement('hidden', 'course'); + $mform->setType('course', PARAM_INT); + // Pdf id. + $mform->addElement('hidden', 'pdfannotatorid'); + $mform->setType('pdfannotatorid', PARAM_INT); + // Pdfname. + $mform->addElement('hidden', 'pdfname'); + $mform->setType('pdfname', PARAM_TEXT); + // Comment id. + $mform->addElement('hidden', 'commentid'); + $mform->setType('commentid', PARAM_INT); + // Action = 'forwardquestion'. + $mform->addElement('hidden', 'action'); + $mform->setType('action', PARAM_ALPHA); + + // Display question. + $comment = $this->_customdata['comment']; + $mform->addElement('static', 'description', get_string('question', 'pdfannotator'), $comment->content); + + // Select recipients. + $recipients = $this->_customdata['recipients']; + + // 'selectgroups' instead of 'select' because the required-rule didn't work properly with a multi-select. + $select = $mform->addElement('selectgroups', 'recipients', get_string('recipient', 'pdfannotator')); + $select->addOptGroup('', $recipients); + $select->setMultiple(true); + $mform->addHelpButton('recipients', 'recipient', 'pdfannotator'); + $mform->addRule('recipients', get_string('recipientrequired', 'pdfannotator'), 'required', null, 'client'); + + // Textarea for message to the recipient. + $mform->addElement('textarea', 'message', get_string('messageforwardform', 'pdfannotator'), 'wrap="virtual" rows="5" cols="109"'); + + // Add submit and cancel buttons. + $this->add_action_buttons($cancel = true, get_string('send', 'pdfannotator')); + } + + public function display() { + $this->_form->display(); + } + +} diff --git a/lang/de/pdfannotator.php b/lang/de/pdfannotator.php index a57a8c7fe6b644c86ae87ec183b2a01fabb4f7f7..cff96739c22973edd08f633ab093f348c007909a 100644 --- a/lang/de/pdfannotator.php +++ b/lang/de/pdfannotator.php @@ -46,10 +46,11 @@ $string['pdfannotator:usetextbox'] = 'Textbox verwenden (auch wenn es in den Ein $string['pdfannotator:usedrawing'] = 'Drawing verwenden (auch wenn es in den Einstellungen des Annotators nicht erlaubt wurde)'; $string['pdfannotator:printdocument'] = 'Dokument herunterladen'; $string['pdfannotator:printcomments'] = 'Kommentare herunterladen'; - +$string['pdfannotator:forwardquestions'] = 'Fragen weiterleiten'; +$string['pdfannotator:getforwardedquestions'] = 'Weitergeleitete Fragen erhalten'; $string['pdfannotator:hidecomments'] = 'Kommentare für Teilnehmer/innen verbergen'; $string['pdfannotator:seehiddencomments'] = 'Verborgene Kommentare sehen'; - + $string['pdfannotator:viewreports'] = 'Kommentar-Meldungen sehen (Übersichtsseite)'; $string['pdfannotator:viewanswers'] = 'Antworten auf abonnierte Fragen sehen (Übersichtsseite)'; $string['pdfannotator:viewquestions'] = 'Offene Fragen sehen (Übersichtsseite)'; @@ -137,13 +138,24 @@ $string['comments'] = 'Kommentare'; $string['author'] = 'Verfasser'; $string['guestscantdoanything'] = 'Gäste können hier nichts tun.'; +$string['forward'] = 'Weiterleiten'; +$string['titleforwardform'] = 'Frage weiterleiten'; +$string['messageforwardform'] = 'Ihre Nachricht an den/die Empfänger'; +$string['recipientrequired'] = 'Bitte wählen sie einen oder mehrere Empfänger aus'; +$string['recipientforwardform'] = 'Weiterleiten an'; +$string['recipient'] = 'Empfänger'; +$string['recipient_help'] = 'Um mehrere Personen auszuwählen, "Strg" gedrückt halten.'; +$string['send'] = 'Senden'; + // When displaying your message types in a user's messaging preferences it will use a string from your component's language file called "messageprovider:messagename". $string['messageprovider:newanswer'] = 'Mitteilung bei neuer Antwort auf eine abonnierte Frage'; $string['messageprovider:newreport'] = 'Mitteilung, wenn ein Kommentar gemeldet wurde'; $string['messageprovider:newquestion'] = 'Mitteilung, wenn eine neue Frage gestellt wurde'; +$string['messageprovider:forwardedquestion'] = 'Mitteilung, wenn eine Frage weitergeleitet an Sie wurde'; $string['notificationsubject:newreport'] = 'Neue Meldung eines Kommentars in {$a}'; $string['notificationsubject:newanswer'] = 'Neue Antwort auf von Ihnen abonnierte Frage in {$a}'; $string['notificationsubject:newquestion'] = 'Neue Frage in {$a}'; +$string['notificationsubject:forwardedquestion'] = 'Weitergeleitete Frage in {$a}'; $string['reportwassentoff'] = 'Ihre Meldung wurde erfolgreich versandt.'; $string['myquestion'] = 'Frage'; // 'zugehörige Frage' / 'Frage' / 'Abonnement' @@ -258,6 +270,7 @@ $string['error:show'] = 'Beim Einblenden des Elements ist ein Fehler aufgetreten $string['error:putinrecyclebin'] = 'Das Element konnte nicht in den Papierkorb verschoben werden.'; $string['error:markasread'] = 'Das Element konnte nicht als gelesen markiert werden.'; $string['error:markasunread'] = 'Das Element konnte nicht als ungelesen markiert werden.'; +$string['error:forwardquestion'] = 'Beim Weiterleiten der Frage ist ein Fehler aufgetreten.'; $string['document'] = 'Dokument'; @@ -316,6 +329,23 @@ $string['newquestiontext'] = 'Es wurde eine neue Frage von {$a->answeruser} eing Die Frage ist verfügbar unter: {$a->urltoanswer}'; +$string['forwardedquestionhtml'] = '{$a->sender} hat folgende Frage an sie weitergeleitet: <br /> <br />' + . '"{$a->questioncontent}" <br /> <br />' + . 'mit folgender Nachricht: <br /> <br />' + . '"{$a->message}" <br /> <br />' + . 'Die Frage ist <a href="{$a->urltoquestion}">hier</a> einzusehen.'; + +$string['forwardedquestiontext'] = '{$a->sender} hat folgende Frage an sie weitergeleitet: + + "{$a->questioncontent}" + + mit folgender Nachricht: + + "{$a->message}" + + Die Frage ist verfügbar unter: {$a->urltoquestion}'; + + $string['unsubscribe_notification'] = 'Um keine Benachrichtigung mehr zu erhalten, klicken Sie bitte <a href="{$a}">hier</a>.'; $string['gotocomment'] = 'zum Kommentar'; diff --git a/lang/en/pdfannotator.php b/lang/en/pdfannotator.php index b18bf3fa9dcece102f4d651be551e8a7d455ea0e..185b797e5d45fe0e3370e97591b821aa9376a36b 100644 --- a/lang/en/pdfannotator.php +++ b/lang/en/pdfannotator.php @@ -46,7 +46,8 @@ $string['pdfannotator:usetextbox'] = 'Use textbox (even if the option is disable $string['pdfannotator:usedrawing'] = 'Use drawing (even if the option is disabled for a PDF-Annotator)'; $string['pdfannotator:printdocument'] = 'Download the document'; $string['pdfannotator:printcomments'] = 'Download the comments'; - +$string['pdfannotator:forwardquestions'] = 'Forward questions'; +$string['pdfannotator:getforwardedquestions'] = 'Receive forwarded questions'; $string['pdfannotator:hidecomments'] = 'Hide comments for participants'; $string['pdfannotator:seehiddencomments'] = 'See hidden comments'; @@ -148,6 +149,16 @@ $string['correct'] = 'correct'; $string['comments'] = 'Comments'; $string['author'] = 'Author'; $string['guestscantdoanything'] = 'Guests can\'t do anything here.'; + +$string['forward'] = 'Forward'; +$string['titleforwardform'] = 'Forward question'; +$string['messageforwardform'] = 'Your message to the recipient/s'; +$string['recipientrequired'] = 'Please select recipient/s'; +$string['recipientforwardform'] = 'Forward to'; +$string['recipient'] = 'Recipient/s'; +$string['recipient_help'] = 'To select several persons, hold down "Ctrl"'; +$string['send'] = 'Send'; + $string['newanswersavailable'] = 'Recently answered'; $string['newquestions'] = 'Recently asked'; $string['read'] = 'Read'; @@ -216,14 +227,16 @@ $string['newstitle'] = 'Just asked'; $string['messageprovider:newanswer'] = 'When a question you subscribed to was answered'; $string['messageprovider:newreport'] = 'When a comment was reported'; $string['messageprovider:newquestion'] = 'When a new question was asked'; +$string['messageprovider:forwardedquestion'] = 'When a question was forwarded to you'; $string['notificationsubject:newreport'] = 'A comment was reported in {$a}'; $string['notificationsubject:newanswer'] = 'New answer to subscribed question in {$a}'; $string['notificationsubject:newquestion'] = 'New question in {$a}'; +$string['notificationsubject:forwardedquestion'] = 'Forwarded question in {$a}'; $string['reportwassentoff'] = 'The comment has been reported.'; $string['myquestion'] = 'Question'; $string['mypost'] = 'My post'; -$string['question'] = 'question'; +$string['question'] = 'Question'; $string['askedby'] = 'By / on'; $string['answeredby'] = 'By / on'; $string['by'] = 'by'; @@ -337,6 +350,7 @@ $string['error:show'] = 'An error has occured while showing the element.'; $string['error:putinrecyclebin'] = 'The item could not be placed in the recycle bin.'; $string['error:markasread'] = 'The item could not be marked as read.'; $string['error:markasunread'] = 'The item could not be marked as unread.'; +$string['error:forwardquestion'] = 'An error has occured while forwarding the question.'; $string['document'] = 'Document'; @@ -382,6 +396,22 @@ $string['newquestiontext'] = 'A new Questions was added by {$a->answeruser} with The question is available under: {$a->urltoanswer}'; +$string['forwardedquestionhtml'] = '{$a->sender} forwarded the following question to you: <br /> <br />' + . '"{$a->questioncontent}" <br /> <br />' + . 'with the message: <br /> <br />' + . '"{$a->message}" <br /> <br />' + . 'The question is available <a href="{$a->urltoquestion}">here</a>.'; + +$string['forwardedquestiontext'] = '{$a->sender} hat folgende Frage an sie weitergeleitet: + + "{$a->questioncontent}" + + mit folgender Nachricht: + + "{$a->message}" + + Die Frage ist verfügbar unter: {$a->urltoquestion}'; + $string['unsubscribe_notification'] = 'To unsubscribe from notification, please click <a href="{$a}">here</a>.'; $string['gotocomment'] = 'Open the comment.'; diff --git a/locallib.php b/locallib.php index 967a3ff10222bc3e14c4c28e89c5e994a37dcf0d..da431cd1ea3ad64bffea34a9a53da05baf5d8e77 100644 --- a/locallib.php +++ b/locallib.php @@ -231,9 +231,22 @@ function pdfannotator_process_latex($string) { } } +function send_forward_message($recipients, $messageparams, $course, $cm, $context) { + $name = 'forwardedquestion'; + $text = new stdClass(); + $module = get_string('modulename', 'pdfannotator'); + $text->text = pdfannotator_format_notification_message_text($course, $cm, $context, $module, $cm->name, $messageparams, $name); + $text->html = pdfannotator_format_notification_message_html($course, $cm, $context, $module, $cm->name, $messageparams, $name); + $text->url = $messageparams->urltoquestion; + + foreach ($recipients as $recipient) { + pdfannotator_notify_manager($recipient, $course, $cm, $name, $text); + } +} + function pdfannotator_notify_manager($recipient, $course, $cm, $name, $messagetext, $anonymous = false) { - global $USER, $CFG; + global $USER; $userfrom = $USER; if ($anonymous) { $userfrom = clone($USER); @@ -1290,11 +1303,12 @@ function pdfannotator_get_first_key_in_array($array) { * @param Moodle url object $url * @param int $currentpage */ -function pdfannotator_print_questions($questions, $thiscourse, $urlparams, $currentpage, $itemsperpage) { +function pdfannotator_print_questions($questions, $thiscourse, $urlparams, $currentpage, $itemsperpage, $context) { global $CFG, $OUTPUT; require_once("$CFG->dirroot/mod/pdfannotator/model/overviewtable.php"); + $showdropdown = has_capability('mod/pdfannotator:forwardquestions', $context); $questioncount = count($questions); $usepagination = !($itemsperpage == -1 || $itemsperpage >= $questioncount); $offset = $currentpage * $itemsperpage; @@ -1306,7 +1320,7 @@ function pdfannotator_print_questions($questions, $thiscourse, $urlparams, $curr $url = new moodle_url($CFG->wwwroot . '/mod/pdfannotator/view.php', $urlparams); // Define flexible table. - $table = new questionstable($url); + $table = new questionstable($url, $showdropdown); $table->setup(); // $table->pageable(false); @@ -1320,7 +1334,7 @@ function pdfannotator_print_questions($questions, $thiscourse, $urlparams, $curr // Add data to the table and print the requested table (page). if (pdfannotator_is_phone() || $itemsperpage == -1 || $itemsperpage >= $questioncount) { // No pagination. foreach ($questions as $question) { - pdfannotator_questionstable_add_row($thiscourse, $table, $question); + pdfannotator_questionstable_add_row($thiscourse, $table, $question, $urlparams, $showdropdown); } } else { $table->pagesize($itemsperpage, $questioncount); @@ -1329,7 +1343,7 @@ function pdfannotator_print_questions($questions, $thiscourse, $urlparams, $curr if ($itemsperpage === 0) { break; } - pdfannotator_questionstable_add_row($thiscourse, $table, $question); + pdfannotator_questionstable_add_row($thiscourse, $table, $question, $urlparams, $showdropdown); $itemsperpage--; } } @@ -1477,8 +1491,9 @@ function pdfannotator_print_reports($reports, $thiscourse, $url, $currentpage, $ * @param questionstable $table * @param object $question */ -function pdfannotator_questionstable_add_row($thiscourse, $table, $question) { - global $CFG; +function pdfannotator_questionstable_add_row($thiscourse, $table, $question, $urlparams, $showdropdown) { + + global $CFG, $PAGE; if ($question->visibility != 'public') { $author = get_string('anonymous', 'pdfannotator'); } else { @@ -1502,7 +1517,16 @@ function pdfannotator_questionstable_add_row($thiscourse, $table, $question) { } $content = "<a href=$question->link class='more'>$question->content</a>"; $pdfannotatorname = $question->pdfannotatorname; - $table->add_data(array($content, $author . '<br>' . $time, $question->votes, $question->answercount, $lastanswered, $pdfannotatorname), $classname); + + $data = array($content, $author . '<br>' . $time, $question->votes, $question->answercount, $lastanswered, $pdfannotatorname); + + if ($showdropdown) { + require_once($CFG->dirroot . '/mod/pdfannotator/classes/output/questionmenu.php'); + $myrenderer = $PAGE->get_renderer('mod_pdfannotator'); + $dropdown = $myrenderer->render_dropdownmenu(new questionmenu($question->commentid, $urlparams)); + $data[] = $dropdown; + } + $table->add_data($data, $classname); } /** * This function adds a row of data to the overview table that displays @@ -1610,7 +1634,38 @@ function pdfannotator_reportstable_add_row($thiscourse, $table, $report, $cmid, // Add a new row to the reports table. $table->add_data(array($report->report, $reportedby . '<br>' . $reporttime, $reportedcommmentlink, $writtenby . '<br>' . $commenttime, $dropdown), $classname); } - +/** + * This function receives data from our feedback form and sends it to the + * developers via email. + * + * @global type $USER + * @param type $formdata + */ +function pdfannotator_send_feedbackmail ($formdata, $url) { + + global $USER; + + $subject = 'Feedback zum PDF-Annotation-Tool aus Aachen'; + $messagetext = $formdata->feedback; + $from = $USER->firstname . ' ' . $USER->lastname . '<' . $USER->email . '>'; + $headers = "From: $from\r\n"; + $headers .= "Content-type: text/html\r\n"; + $to = 'obeid@cil.rwth-aachen.de, schwager@cil.rwth-aachen.de, heynkes@cil.rwth-aachen.de'; + $html = <<<EOF + <html> + <head> + <meta http-equiv='Content-Type' content='text/html; charset=utf-8'> + </head> + <body dir='auto'> + <div dir='ltr'>$messagetext</div> + <br><br> + Gesendet von $url + </body> + </html> +EOF; + + mail($to, $subject, $html, $headers); +} /** * Function takes a moodle timestamp, calculates how much time has since elapsed * and returns this information as a string (e.g.: '3 days ago'). diff --git a/model/comment.class.php b/model/comment.class.php index e3d5fbf7dd8b9083876b83effd317c2772803b48..077f4539d5644649338df60bae515a36ce27ba7e 100644 --- a/model/comment.class.php +++ b/model/comment.class.php @@ -260,13 +260,6 @@ class pdfannotator_comment { $tobedeletedaswell = []; $hideannotation = 0; -// $success = $DB->update_record('pdfannotator_comments', array("id" => $commentid, "ishidden" => 1), $bulk = false); - -// if ($wasanswered) { // If the comment was answered, mark it as deleted for a special display. -// $params = array("id" => $commentid, "isdeleted" => 1); -// $success = $DB->update_record('pdfannotator_comments', $params, $bulk = false); -// } else { // If not, just delete it. -// // if (!$wasanswered) { // But first: Check if the predecessor was already marked as deleted, too and if so, delete it completely. $sql = "SELECT id, isdeleted, isquestion from {pdfannotator_comments} " @@ -280,8 +273,7 @@ class pdfannotator_comment { if ($workingfine != 0) { $tobedeletedaswell[] = $predecessor->id; if ($predecessor->isquestion) { -// pdfannotator_annotation::delete($annotationid, $cmid, true); - $hideannotation = 1; //$annotationid; + $hideannotation = 1; // $annotationid; } } } else { @@ -289,22 +281,12 @@ class pdfannotator_comment { } } - // If the comment is a question and has no answers, delete the annotion. -// if ($comment->isquestion) { -// pdfannotator_annotation::delete($annotationid, $cmid, true); -// $deleteannotation = $annotationid; -// } - -// $success = $DB->delete_records('pdfannotator_comments', array("id" => $commentid)); } $success = $DB->update_record('pdfannotator_comments', array("id" => $commentid, "ishidden" => 1), $bulk = false); - // Delete votes to the comment. -// $DB->delete_records('pdfannotator_votes', array("commentid" => $commentid)); - if ($success == 1) { - return ['status' => 'success', 'hideannotation' => $hideannotation, 'wasanswered' => $wasanswered, 'followups' => $tobedeletedaswell]; //, 'deleteannotation' => $deleteannotation]; + return ['status' => 'success', 'hideannotation' => $hideannotation, 'wasanswered' => $wasanswered, 'followups' => $tobedeletedaswell]; // , 'deleteannotation' => $deleteannotation]; } else { return ['status' => 'error']; } diff --git a/model/overviewtable.php b/model/overviewtable.php index c0e1114982328ba80e835278ffd22a35da3c66e5..0ea65d12ad825729ea6b97d6a571af539ba25867 100644 --- a/model/overviewtable.php +++ b/model/overviewtable.php @@ -61,26 +61,39 @@ class questionstable extends overviewtable { private $id = 'mod-pdfannotator-questions'; - public function __construct($url) { + public function __construct($url, $showdropdown) { parent::__construct($this->id); global $OUTPUT; // $this->collapsible(true); // Concerns the tables columns. $this->define_baseurl($url); - $this->define_columns(array('col0', 'col1', 'col2', 'col3', 'col4', 'col5')); + $columns = array('col0', 'col1', 'col2', 'col3', 'col4', 'col5'); + if ($showdropdown) { + $columns[] = 'col6'; + } + $this->define_columns($columns); $this->column_style('col0', 'width', '30% !important'); // Question. $this->column_style('col1', 'width', '19%'); // Who asked the question when. $this->column_style('col2', 'width', '6%'); // How many people voted for the question. $this->column_style('col3', 'width', '6%'); // How many answers were given to it. $this->column_style('col4', 'width', '19%'); // When was the last answer given. $this->column_style('col5', 'width', '20%'); // In which annotator is the question located. + $this->attributes['id'] = $this->id; - $question = get_string('question', 'pdfannotator'); //$OUTPUT->pix_icon('i/unlock', '') . self::wrap(get_string('question', 'pdfannotator')); + $question = get_string('question', 'pdfannotator'); // $OUTPUT->pix_icon('i/unlock', '') . self::wrap(get_string('question', 'pdfannotator')); $whoasked = get_string('by', 'pdfannotator') . ' ' . get_string('on', 'pdfannotator'); // $OUTPUT->pix_icon('i/user', '') . self::wrap(get_string('by', 'pdfannotator')) . ' ' . $OUTPUT->pix_icon('e/insert_time', '') . self::wrap(get_string('on', 'pdfannotator')); $votes = "<i class='icon fa fa-thumbs-up fa-fw' style='float:left'></i>" . ' ' . $OUTPUT->help_icon('voteshelpicon', 'pdfannotator'); // "<i class='icon fa fa-chevron-up fa-lg' style='float:left'></i>" . self::wrap(get_string('votes', 'pdfannotator')) . ' ' . $OUTPUT->help_icon('voteshelpicon', 'pdfannotator'); $answers = $OUTPUT->pix_icon('t/message', '') . ' ' . $OUTPUT->help_icon('answercounthelpicon', 'pdfannotator');; // $OUTPUT->pix_icon('t/message', '') . ' ' . self::wrap(get_string('answers', 'pdfannotator')); $lastanswered = get_string('lastanswered', 'pdfannotator'); // $OUTPUT->pix_icon('e/insert_time', '') . self::wrap(get_string('lastanswered', 'pdfannotator')); $document = get_string('pdfannotatorcolumn', 'pdfannotator'); // "<i class='icon fa fa-book fa-fw'></i>" . self::wrap(get_string('pdfannotatorcolumn', 'pdfannotator')); - $this->define_headers(array($question, $whoasked, $votes, $answers, $lastanswered, $document)); + + $headers = array($question, $whoasked, $votes, $answers, $lastanswered, $document); + if ($showdropdown) { + $this->column_style('col6', 'width', '5%'); // Action dropdown menu. + $actionmenu = get_string('overviewactioncolumn', 'pdfannotator'); + $headers[] = $actionmenu; + } + + $this->define_headers($headers); $this->no_sorting('col0'); $this->sortable(true, 'col4', SORT_ASC); $this->sortable(true, 'col5', SORT_ASC); diff --git a/shared/index.js b/shared/index.js index 59e3469a806cf3d928d4d2e0fae307da97e11f59..0b96cd01b0b2b1c64cbbf7daa9dbe7975f0361ac 100644 --- a/shared/index.js +++ b/shared/index.js @@ -1534,7 +1534,7 @@ function startIndex(Y,_cm,_documentObject,_userid,_capabilities, _toolbarSetting createSubscriptionHandler(comment); createHideHandler(comment); createDeleteHandler(comment); - createSolvedHandler(comment); + createSolvedHandler(comment); let pattern = $('#searchPattern').val(); if(pattern !== '' && comment.content.search(new RegExp(pattern, "i")) !== -1){ $('#comment_'+comment.uuid).addClass('mark'); diff --git a/templates/comment.mustache b/templates/comment.mustache index 965b39daa1273ee354956921a9301ad4dc9bfafc..c6042fd28877b892f0d267f459054c3575fdc61a 100644 --- a/templates/comment.mustache +++ b/templates/comment.mustache @@ -34,7 +34,7 @@ </span> {{/ report }} {{#buttons}} - <button class="dropdown-item {{classes}}" type=button {{#attributes}} {{name}}="{{value}}"{{/attributes}}> + <button class="dropdown-item {{classes}}" type=button {{#attributes}} {{name}}="{{&value}}"{{/attributes}}> {{#moodleicon}} {{#pix}} {{key}},{{component}},{{title}} {{/pix}} {{/moodleicon}} {{#faicon}} <i class=" icon fa {{class}} fa-fw"></i> {{/faicon}} <span class="menu-action-text"> diff --git a/version.php b/version.php index ea4b5e7aff001000e35cd1f3d015bdb30353c1a5..dd28d00ab6018109bd93bbcacdc02c5b040cb0db 100644 --- a/version.php +++ b/version.php @@ -25,7 +25,7 @@ defined('MOODLE_INTERNAL') || die(); $plugin->component = 'mod_pdfannotator'; // Full name of the plugin (used for diagnostics). -$plugin->version = 2019042900; // The current module version (Date: YYYYMMDDXX). -$plugin->release = 'PDF Annotator v1.2 release 1'; +$plugin->version = 2019042500; // The current module version (Date: YYYYMMDDXX). +$plugin->release = 'PDF Annotator v1.1 release 1'; $plugin->requires = 2016112900; // Requires this Moodle version. $plugin->cron = 0; // Period for cron to check this module (secs).