diff --git a/mod/feedback/amd/build/createtemplate.min.js b/mod/feedback/amd/build/createtemplate.min.js
new file mode 100644
index 00000000000..0eec01fdb1a
--- /dev/null
+++ b/mod/feedback/amd/build/createtemplate.min.js
@@ -0,0 +1,2 @@
+define ("mod_feedback/createtemplate",["exports","core_form/modalform","core/notification","core/str","core/toast"],function(a,b,c,d,e){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=f(b);c=f(c);function f(a){return a&&a.__esModule?a:{default:a}}var g={modaltrigger:"[data-action=\"createtemplate\"]"};a.init=function init(){var a=document.querySelector(g.modaltrigger);a.addEventListener("click",function(a){a.preventDefault();var f=a.currentTarget,g=new b.default({modalConfig:{title:(0,d.get_string)("save_as_new_template","mod_feedback")},formClass:"mod_feedback\\form\\create_template_form",args:{id:f.dataset.dataid},saveButtonText:(0,d.get_string)("save","core")});g.addEventListener(g.events.FORM_SUBMITTED,function(a){if(a.detail.result){(0,d.get_string)("template_saved","feedback").then(e.add).catch()}else{(0,d.get_string)("saving_failed","feedback").then(function(a){return c.default.addNotification({type:"error",message:a})}).catch()}});g.show()})}});
+//# sourceMappingURL=createtemplate.min.js.map
diff --git a/mod/feedback/amd/build/createtemplate.min.js.map b/mod/feedback/amd/build/createtemplate.min.js.map
new file mode 100644
index 00000000000..4a19c0472cc
--- /dev/null
+++ b/mod/feedback/amd/build/createtemplate.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/createtemplate.js"],"names":["selectors","modaltrigger","init","trigger","document","querySelector","addEventListener","event","preventDefault","ele","currentTarget","modalForm","ModalForm","modalConfig","title","formClass","args","id","dataset","dataid","saveButtonText","events","FORM_SUBMITTED","detail","result","then","addToast","catch","string","Notification","addNotification","type","message","show"],"mappings":"oNAuBA,OACA,O,sDAIMA,CAAAA,CAAS,CAAG,CACdC,YAAY,CAAE,kCADA,C,QAOE,QAAPC,CAAAA,IAAO,EAAM,CACtB,GAAMC,CAAAA,CAAO,CAAGC,QAAQ,CAACC,aAAT,CAAuBL,CAAS,CAACC,YAAjC,CAAhB,CAEAE,CAAO,CAACG,gBAAR,CAAyB,OAAzB,CAAkC,SAAAC,CAAK,CAAI,CACvCA,CAAK,CAACC,cAAN,GADuC,GAEjCC,CAAAA,CAAG,CAAGF,CAAK,CAACG,aAFqB,CAIjCC,CAAS,CAAG,GAAIC,UAAJ,CAAc,CAC5BC,WAAW,CAAE,CACTC,KAAK,CAAE,iBAAU,sBAAV,CAAkC,cAAlC,CADE,CADe,CAI5BC,SAAS,CAAE,0CAJiB,CAK5BC,IAAI,CAAE,CACFC,EAAE,CAAER,CAAG,CAACS,OAAJ,CAAYC,MADd,CALsB,CAQ5BC,cAAc,CAAE,iBAAU,MAAV,CAAkB,MAAlB,CARY,CAAd,CAJqB,CAgBvCT,CAAS,CAACL,gBAAV,CAA2BK,CAAS,CAACU,MAAV,CAAiBC,cAA5C,CAA4D,SAAAf,CAAK,CAAI,CACjE,GAAIA,CAAK,CAACgB,MAAN,CAAaC,MAAjB,CAAyB,CACrB,iBAAU,gBAAV,CAA4B,UAA5B,EAAwCC,IAAxC,CAA6CC,KAA7C,EAAuDC,KAAvD,EACH,CAFD,IAEO,CACH,iBAAU,eAAV,CAA2B,UAA3B,EAAuCF,IAAvC,CAA4C,SAAAG,CAAM,CAAI,CAClD,MAAOC,WAAaC,eAAb,CAA6B,CAChCC,IAAI,CAAE,OAD0B,CAEhCC,OAAO,CAAEJ,CAFuB,CAA7B,CAIV,CALD,EAKGD,KALH,EAMH,CACJ,CAXD,EAaAhB,CAAS,CAACsB,IAAV,EACH,CA9BD,CA+BH,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 .\n\n/**\n * Javascript module for saving a new template.\n *\n * @module mod_feedback/createtemplate\n * @copyright 2021 Peter Dias\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport {get_string as getString} from 'core/str';\nimport {add as addToast} from 'core/toast';\n\nconst selectors = {\n modaltrigger: '[data-action=\"createtemplate\"]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n const trigger = document.querySelector(selectors.modaltrigger);\n\n trigger.addEventListener('click', event => {\n event.preventDefault();\n const ele = event.currentTarget;\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: getString('save_as_new_template', 'mod_feedback'),\n },\n formClass: 'mod_feedback\\\\form\\\\create_template_form',\n args: {\n id: ele.dataset.dataid\n },\n saveButtonText: getString('save', 'core')\n });\n\n // Show a toast notification when the form is submitted.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n getString('template_saved', 'feedback').then(addToast).catch();\n } else {\n getString('saving_failed', 'feedback').then(string => {\n return Notification.addNotification({\n type: 'error',\n message: string\n });\n }).catch();\n }\n });\n\n modalForm.show();\n });\n};\n"],"file":"createtemplate.min.js"}
\ No newline at end of file
diff --git a/mod/feedback/amd/build/usetemplate.min.js b/mod/feedback/amd/build/usetemplate.min.js
new file mode 100644
index 00000000000..481ee5e2fc3
--- /dev/null
+++ b/mod/feedback/amd/build/usetemplate.min.js
@@ -0,0 +1,2 @@
+define ("mod_feedback/usetemplate",["exports","core_form/modalform","core/notification","core/str"],function(a,b,c,d){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=e(b);c=e(c);function e(a){return a&&a.__esModule?a:{default:a}}var f={modaltrigger:"[data-action=\"usetemplate\"]"};a.init=function init(){var a=document.querySelector(f.modaltrigger);a.addEventListener("click",function(e){e.preventDefault();var f=new b.default({modalConfig:{title:(0,d.get_string)("use_this_template","mod_feedback")},formClass:"mod_feedback\\form\\use_template_form",args:{id:a.getAttribute("data-dataid"),templateid:a.getAttribute("data-templateid")},saveButtonText:(0,d.get_string)("save","core")});f.addEventListener(f.events.FORM_SUBMITTED,function(a){if(a.detail.result){window.location.assign(a.detail.url)}else{c.default.addNotification({type:"error",message:(0,d.get_string)("saving_failed","mod_feedback")})}});f.show()})}});
+//# sourceMappingURL=usetemplate.min.js.map
diff --git a/mod/feedback/amd/build/usetemplate.min.js.map b/mod/feedback/amd/build/usetemplate.min.js.map
new file mode 100644
index 00000000000..18f5e592306
--- /dev/null
+++ b/mod/feedback/amd/build/usetemplate.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../src/usetemplate.js"],"names":["selectors","modaltrigger","init","trigger","document","querySelector","addEventListener","event","preventDefault","modalForm","ModalForm","modalConfig","title","formClass","args","id","getAttribute","templateid","saveButtonText","events","FORM_SUBMITTED","detail","result","window","location","assign","url","Notification","addNotification","type","message","show"],"mappings":"kMAuBA,OACA,O,sDAGMA,CAAAA,CAAS,CAAG,CACdC,YAAY,CAAE,+BADA,C,QAOE,QAAPC,CAAAA,IAAO,EAAM,CACtB,GAAMC,CAAAA,CAAO,CAAGC,QAAQ,CAACC,aAAT,CAAuBL,CAAS,CAACC,YAAjC,CAAhB,CAEAE,CAAO,CAACG,gBAAR,CAAyB,OAAzB,CAAkC,SAAAC,CAAK,CAAI,CACvCA,CAAK,CAACC,cAAN,GAEA,GAAMC,CAAAA,CAAS,CAAG,GAAIC,UAAJ,CAAc,CAC5BC,WAAW,CAAE,CACTC,KAAK,CAAE,iBAAU,mBAAV,CAA+B,cAA/B,CADE,CADe,CAI5BC,SAAS,CAAE,uCAJiB,CAK5BC,IAAI,CAAE,CACFC,EAAE,CAAEZ,CAAO,CAACa,YAAR,CAAqB,aAArB,CADF,CAEFC,UAAU,CAAEd,CAAO,CAACa,YAAR,CAAqB,iBAArB,CAFV,CALsB,CAS5BE,cAAc,CAAE,iBAAU,MAAV,CAAkB,MAAlB,CATY,CAAd,CAAlB,CAaAT,CAAS,CAACH,gBAAV,CAA2BG,CAAS,CAACU,MAAV,CAAiBC,cAA5C,CAA4D,SAAAb,CAAK,CAAI,CACjE,GAAIA,CAAK,CAACc,MAAN,CAAaC,MAAjB,CAAyB,CACrBC,MAAM,CAACC,QAAP,CAAgBC,MAAhB,CAAuBlB,CAAK,CAACc,MAAN,CAAaK,GAApC,CACH,CAFD,IAEO,CACHC,UAAaC,eAAb,CAA6B,CACzBC,IAAI,CAAE,OADmB,CAEzBC,OAAO,CAAG,iBAAU,eAAV,CAA2B,cAA3B,CAFe,CAA7B,CAIH,CACJ,CATD,EAWArB,CAAS,CAACsB,IAAV,EACH,CA5BD,CA6BH,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 .\n\n/**\n * Javascript module for using an existing template\n *\n * @module mod_feedback/usetemplate\n * @copyright 2021 Peter Dias\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport ModalForm from 'core_form/modalform';\nimport Notification from 'core/notification';\nimport {get_string as getString} from 'core/str';\n\nconst selectors = {\n modaltrigger: '[data-action=\"usetemplate\"]',\n};\n\n/**\n * Initialize module\n */\nexport const init = () => {\n const trigger = document.querySelector(selectors.modaltrigger);\n\n trigger.addEventListener('click', event => {\n event.preventDefault();\n\n const modalForm = new ModalForm({\n modalConfig: {\n title: getString('use_this_template', 'mod_feedback'),\n },\n formClass: 'mod_feedback\\\\form\\\\use_template_form',\n args: {\n id: trigger.getAttribute('data-dataid'),\n templateid: trigger.getAttribute('data-templateid')\n },\n saveButtonText: getString('save', 'core')\n });\n\n // Show a toast notification when the form is submitted.\n modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {\n if (event.detail.result) {\n window.location.assign(event.detail.url);\n } else {\n Notification.addNotification({\n type: 'error',\n message: getString('saving_failed', 'mod_feedback')\n });\n }\n });\n\n modalForm.show();\n });\n};\n"],"file":"usetemplate.min.js"}
\ No newline at end of file
diff --git a/mod/feedback/amd/src/createtemplate.js b/mod/feedback/amd/src/createtemplate.js
new file mode 100644
index 00000000000..97d4c090a6a
--- /dev/null
+++ b/mod/feedback/amd/src/createtemplate.js
@@ -0,0 +1,70 @@
+// 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 .
+
+/**
+ * Javascript module for saving a new template.
+ *
+ * @module mod_feedback/createtemplate
+ * @copyright 2021 Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+import ModalForm from 'core_form/modalform';
+import Notification from 'core/notification';
+import {get_string as getString} from 'core/str';
+import {add as addToast} from 'core/toast';
+
+const selectors = {
+ modaltrigger: '[data-action="createtemplate"]',
+};
+
+/**
+ * Initialize module
+ */
+export const init = () => {
+ const trigger = document.querySelector(selectors.modaltrigger);
+
+ trigger.addEventListener('click', event => {
+ event.preventDefault();
+ const ele = event.currentTarget;
+
+ const modalForm = new ModalForm({
+ modalConfig: {
+ title: getString('save_as_new_template', 'mod_feedback'),
+ },
+ formClass: 'mod_feedback\\form\\create_template_form',
+ args: {
+ id: ele.dataset.dataid
+ },
+ saveButtonText: getString('save', 'core')
+ });
+
+ // Show a toast notification when the form is submitted.
+ modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {
+ if (event.detail.result) {
+ getString('template_saved', 'feedback').then(addToast).catch();
+ } else {
+ getString('saving_failed', 'feedback').then(string => {
+ return Notification.addNotification({
+ type: 'error',
+ message: string
+ });
+ }).catch();
+ }
+ });
+
+ modalForm.show();
+ });
+};
diff --git a/mod/feedback/amd/src/usetemplate.js b/mod/feedback/amd/src/usetemplate.js
new file mode 100644
index 00000000000..57d28f3d942
--- /dev/null
+++ b/mod/feedback/amd/src/usetemplate.js
@@ -0,0 +1,67 @@
+// 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 .
+
+/**
+ * Javascript module for using an existing template
+ *
+ * @module mod_feedback/usetemplate
+ * @copyright 2021 Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+
+import ModalForm from 'core_form/modalform';
+import Notification from 'core/notification';
+import {get_string as getString} from 'core/str';
+
+const selectors = {
+ modaltrigger: '[data-action="usetemplate"]',
+};
+
+/**
+ * Initialize module
+ */
+export const init = () => {
+ const trigger = document.querySelector(selectors.modaltrigger);
+
+ trigger.addEventListener('click', event => {
+ event.preventDefault();
+
+ const modalForm = new ModalForm({
+ modalConfig: {
+ title: getString('use_this_template', 'mod_feedback'),
+ },
+ formClass: 'mod_feedback\\form\\use_template_form',
+ args: {
+ id: trigger.getAttribute('data-dataid'),
+ templateid: trigger.getAttribute('data-templateid')
+ },
+ saveButtonText: getString('save', 'core')
+ });
+
+ // Show a toast notification when the form is submitted.
+ modalForm.addEventListener(modalForm.events.FORM_SUBMITTED, event => {
+ if (event.detail.result) {
+ window.location.assign(event.detail.url);
+ } else {
+ Notification.addNotification({
+ type: 'error',
+ message: getString('saving_failed', 'mod_feedback')
+ });
+ }
+ });
+
+ modalForm.show();
+ });
+};
diff --git a/mod/feedback/analysis.php b/mod/feedback/analysis.php
index 406e0228fdc..e44ea6d920c 100644
--- a/mod/feedback/analysis.php
+++ b/mod/feedback/analysis.php
@@ -49,11 +49,9 @@ if (!$feedbackstructure->can_view_analysis()) {
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
echo $OUTPUT->header();
-echo $OUTPUT->heading(format_string($feedback->name));
-
-/// print the tabs
-require('tabs.php');
-
+if (!$PAGE->has_secondary_navigation()) {
+ echo $OUTPUT->heading(format_string($feedback->name));
+}
//get the groupid
$mygroupid = groups_get_activity_group($cm, true);
diff --git a/mod/feedback/analysis_course.php b/mod/feedback/analysis_course.php
index 04dfdd7c170..7f5e3da27ae 100644
--- a/mod/feedback/analysis_course.php
+++ b/mod/feedback/analysis_course.php
@@ -71,10 +71,9 @@ $strfeedback = get_string("modulename", "feedback");
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
echo $OUTPUT->header();
-echo $OUTPUT->heading(format_string($feedback->name));
-
-/// print the tabs
-require('tabs.php');
+if (!$PAGE->has_secondary_navigation()) {
+ echo $OUTPUT->heading(format_string($feedback->name));
+}
//get the groupid
//lstgroupid is the choosen id
diff --git a/mod/feedback/classes/completion.php b/mod/feedback/classes/completion.php
index f492e3ce51b..89ec15a83c4 100644
--- a/mod/feedback/classes/completion.php
+++ b/mod/feedback/classes/completion.php
@@ -713,7 +713,7 @@ class mod_feedback_completion extends mod_feedback_structure {
if ($this->form->is_cancelled()) {
// Form was cancelled - return to the course page.
- $urltogo = course_get_url($this->courseid ?: $this->feedback->course);
+ $urltogo = new moodle_url('/mod/feedback/view.php', ['id' => $this->get_cm()->id]);
} else if ($this->form->is_submitted() &&
($this->form->is_validated() || $gopreviouspage)) {
// Form was submitted (skip validation for "Previous page" button).
diff --git a/mod/feedback/classes/form/create_template_form.php b/mod/feedback/classes/form/create_template_form.php
new file mode 100644
index 00000000000..a28e2b11dbf
--- /dev/null
+++ b/mod/feedback/classes/form/create_template_form.php
@@ -0,0 +1,115 @@
+.
+
+namespace mod_feedback\form;
+
+use core_form\dynamic_form;
+use moodle_url;
+use context;
+use context_module;
+use context_system;
+
+/**
+ * Prints the create new template form
+ *
+ * @copyright 2021 Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
+ * @package mod_feedback
+ */
+class create_template_form extends dynamic_form {
+ /**
+ * Define the form
+ */
+ public function definition() {
+ $mform =& $this->_form;
+
+ $mform->addElement('hidden', 'id');
+ $mform->setType('id', PARAM_INT);
+
+ $mform->addElement('text',
+ 'templatename',
+ get_string('name', 'feedback'),
+ ['maxlength' => '200', 'size' => '50']);
+ $mform->setType('templatename', PARAM_TEXT);
+
+ if (has_capability('mod/feedback:createpublictemplate', context_system::instance())) {
+ $mform->addElement('checkbox',
+ 'ispublic', '',
+ get_string('public', 'feedback'));
+ }
+ }
+
+ /**
+ * Returns context where this form is used
+ *
+ * @return context
+ */
+ protected function get_context_for_dynamic_submission(): context {
+ $id = $this->optional_param('id', null, PARAM_INT);
+ list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
+ return context_module::instance($cm->id);
+ }
+
+ /**
+ * Checks if current user has access to this form, otherwise throws exception
+ *
+ * @throws \moodle_exception User does not have capability to access the form
+ */
+ protected function check_access_for_dynamic_submission(): void {
+ $context = $this->get_context_for_dynamic_submission();
+ if (!has_capability('mod/feedback:edititems', $context) ||
+ !(has_capability('mod/feedback:createprivatetemplate', $context) ||
+ has_capability('mod/feedback:createpublictemplate', $context))) {
+ throw new \moodle_exception('nocapabilitytousethisservice');
+ }
+ }
+
+ /**
+ * Process the form submission, used if form was submitted via AJAX
+ *
+ * @return array Returns whether a new template was created.
+ */
+ public function process_dynamic_submission(): array {
+ global $PAGE;
+ $formdata = $this->get_data();
+ $ispublic = !empty($formdata->ispublic) ? 1 : 0;
+ $result = feedback_save_as_template($PAGE->activityrecord, $formdata->templatename, $ispublic);
+ return [
+ 'result' => $result,
+ ];
+ }
+
+ /**
+ * Load in existing data as form defaults
+ */
+ public function set_data_for_dynamic_submission(): void {
+ $this->set_data((object)[
+ 'id' => $this->optional_param('id', null, PARAM_INT),
+ ]);
+ }
+
+ /**
+ * Returns url to set in $PAGE->set_url() when form is being rendered or submitted via AJAX
+ *
+ * @return moodle_url
+ */
+ protected function get_page_url_for_dynamic_submission(): moodle_url {
+ $params = [
+ 'id' => $this->optional_param('id', null, PARAM_INT),
+ ];
+ return new moodle_url('/mod/feedback/edit.php', $params);
+ }
+}
diff --git a/mod/feedback/classes/form/use_template_form.php b/mod/feedback/classes/form/use_template_form.php
new file mode 100644
index 00000000000..3e7f9baf155
--- /dev/null
+++ b/mod/feedback/classes/form/use_template_form.php
@@ -0,0 +1,120 @@
+.
+
+namespace mod_feedback\form;
+
+use core_form\dynamic_form;
+use moodle_url;
+use context;
+use context_module;
+
+/**
+ * Prints the confirm use template form
+ *
+ * @copyright 2021 Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
+ * @package mod_feedback
+ */
+class use_template_form extends dynamic_form {
+ /**
+ * Define the form
+ */
+ public function definition() {
+ $mform =& $this->_form;
+
+ $mform->addElement('static', 'generalheader', '', get_string("whatfor", 'feedback'));
+ $mform->addElement('radio', 'deleteolditems', '', get_string('delete_old_items', 'feedback'), 1);
+ $mform->addElement('radio', 'deleteolditems', '', get_string('append_new_items', 'feedback'), 0);
+ $mform->setType('deleteolditems', PARAM_INT);
+ $mform->setDefault('deleteolditems', 1);
+
+ $mform->addElement('hidden', 'id');
+ $mform->setType('id', PARAM_INT);
+ $mform->addElement('hidden', 'templateid');
+ $mform->setType('templateid', PARAM_INT);
+ }
+
+ /**
+ * Returns context where this form is used
+ *
+ * @return context
+ */
+ protected function get_context_for_dynamic_submission(): context {
+ $id = $this->optional_param('id', null, PARAM_INT);
+ list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
+ return context_module::instance($cm->id);
+ }
+
+ /**
+ * Checks if current user has access to this form, otherwise throws exception
+ *
+ * @throws \moodle_exception User does not have capability to access the form
+ */
+ protected function check_access_for_dynamic_submission(): void {
+ if (!has_capability('mod/feedback:edititems', $this->get_context_for_dynamic_submission())) {
+ throw new \moodle_exception('nocapabilitytousethisservice');
+ }
+ }
+
+ /**
+ * Process the form submission, used if form was submitted via AJAX
+ *
+ * @return array Returns the following information
+ * - the template was successfully created/updated from the provided template
+ * - the redirect url.
+ */
+ public function process_dynamic_submission(): array {
+ global $PAGE;
+ $formdata = $this->get_data();
+ $templateid = $this->optional_param('templateid', null, PARAM_INT);
+ $id = $this->optional_param('id', null, PARAM_INT);
+ $response = feedback_items_from_template($PAGE->activityrecord, $templateid, $formdata->deleteolditems);
+ $url = new moodle_url('/mod/feedback/edit.php', ['id' => $id]);
+
+ if ($response !== false) {
+ // Provide a notification on success as the user will be redirected.
+ \core\notification::add(get_string('feedbackupdated', 'feedback'), \core\notification::SUCCESS);
+ }
+
+ return [
+ 'result' => $response !== false,
+ 'url' => $url->out()
+ ];
+ }
+
+ /**
+ * Load in existing data as form defaults
+ */
+ public function set_data_for_dynamic_submission(): void {
+ $this->set_data((object)[
+ 'id' => $this->optional_param('id', null, PARAM_INT),
+ 'templateid' => $this->optional_param('templateid', null, PARAM_INT)
+ ]);
+ }
+
+ /**
+ * Returns url to set in $PAGE->set_url() when form is being rendered or submitted via AJAX
+ *
+ * @return moodle_url
+ */
+ protected function get_page_url_for_dynamic_submission(): moodle_url {
+ $params = [
+ 'id' => $this->optional_param('id', null, PARAM_INT),
+ 'templateid' => $this->optional_param('templateid', null, PARAM_INT)
+ ];
+ return new moodle_url('/mod/feedback/use_templ.php', $params);
+ }
+}
diff --git a/mod/feedback/classes/local/views/secondary.php b/mod/feedback/classes/local/views/secondary.php
new file mode 100644
index 00000000000..c548559d385
--- /dev/null
+++ b/mod/feedback/classes/local/views/secondary.php
@@ -0,0 +1,75 @@
+.
+
+namespace mod_feedback\local\views;
+
+use core\navigation\views\secondary as core_secondary;
+
+/**
+ * Custom secondary navigation class
+ *
+ * A custom construct of secondary nav for feedback. This rearranges the nodes for the secondary
+ *
+ * @package mod_feedback
+ * @category navigation
+ * @copyright 2021 onwards Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class secondary extends core_secondary {
+ protected function get_default_module_mapping(): array {
+ $basenodes = parent::get_default_module_mapping();
+ $basenodes[self::TYPE_CUSTOM] += [
+ 'templatenode' => 12,
+ 'mapcourse' => 13,
+ 'feedbackanalysis' => 14,
+ 'responses' => 15,
+ 'nonrespondents' => 15.1
+ ];
+
+ return $basenodes;
+ }
+ /**
+ * Custom module construct for feedback
+ */
+ protected function load_module_navigation(): void {
+ $settingsnav = $this->page->settingsnav;
+ $mainnode = $settingsnav->find('modulesettings', self::TYPE_SETTING);
+ $nodes = $this->get_default_module_mapping();
+
+ if ($mainnode) {
+ $url = new \moodle_url('/mod/' . $this->page->activityname . '/view.php', ['id' => $this->page->cm->id]);
+ $setactive = $url->compare($this->page->url, URL_MATCH_BASE);
+ $node = $this->add(get_string('modulename', 'feedback'), $url, null, null, 'modulepage');
+ if ($setactive) {
+ $node->make_active();
+ }
+
+ // Add the initial nodes.
+ $nodesordered = $this->get_leaf_nodes($mainnode, $nodes);
+ $this->add_ordered_nodes($nodesordered);
+
+ // Reorder the existing nodes in settings so the active node scan can pick it up.
+ $existingnode = $settingsnav->find('questionnode', self::TYPE_CUSTOM);
+ if ($existingnode) {
+ $node->add_node($existingnode);
+ $nodes[self::TYPE_CUSTOM] += ['questionnode' => 3];
+ }
+ // We have finished inserting the initial structure.
+ // Populate the menu with the rest of the nodes available.
+ $this->load_remaining_nodes($mainnode, $nodes);
+ }
+ }
+}
diff --git a/mod/feedback/classes/output/base_action_bar.php b/mod/feedback/classes/output/base_action_bar.php
new file mode 100644
index 00000000000..2aad01a6bef
--- /dev/null
+++ b/mod/feedback/classes/output/base_action_bar.php
@@ -0,0 +1,101 @@
+.
+
+namespace mod_feedback\output;
+
+use context_module;
+use renderable;
+use renderer_base;
+use templatable;
+
+/**
+ * Class base_action_bar
+ *
+ * Base class to be inherited by any other feedback action bar
+ *
+ * @package mod_feedback
+ * @copyright 2021 onwards Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+abstract class base_action_bar implements renderable, templatable {
+ /** @var int $cmid The module id */
+ protected $cmid;
+ /** @var object $context The context we are in */
+ protected $context;
+ /** @var object $course The course we are in */
+ protected $course;
+ /** @var array $urlparams The default params to be used when creating urls */
+ protected $urlparams;
+ /** @var object $feedback The activity record that is being viewed */
+ protected $feedback;
+
+ /**
+ * base_action_bar constructor.
+ *
+ * @param int $cmid
+ */
+ public function __construct(int $cmid) {
+ global $PAGE;
+ $this->cmid = $cmid;
+ $this->context = context_module::instance($cmid);
+ [$course, $cm] = get_course_and_cm_from_cmid($cmid);
+ $this->course = $course;
+ $this->urlparams = [
+ 'id' => $cmid
+ ];
+ $this->feedback = $PAGE->activityrecord;
+ }
+
+ /**
+ * Recursively iterates through to array of renderables and exports
+ *
+ * @param array $items Collection of renderables
+ * @param renderer_base $output
+ * @return array $items Data to be used in the mustache template
+ */
+ private function export_items_for_template(array $items, renderer_base $output): array {
+ $items = array_map(function($item) use ($output) {
+ if (is_array($item)) {
+ return $this->export_items_for_template($item, $output);
+ }
+
+ if (is_object($item) && method_exists($item, 'export_for_template')) {
+ return $item->export_for_template($output);
+ }
+
+ return $item;
+ }, $items);
+
+ return $items;
+ }
+
+ /**
+ * Export the data so it can be used as the context for a mustache template.
+ *
+ * @param renderer_base $output
+ * @return array
+ */
+ public function export_for_template(renderer_base $output): array {
+ $items = $this->export_items_for_template($this->get_items(), $output);
+ return $items;
+ }
+
+ /**
+ * Function to generate a list of renderables to be displayed
+ * @return array
+ */
+ abstract protected function get_items(): array;
+}
diff --git a/mod/feedback/classes/output/edit_action_bar.php b/mod/feedback/classes/output/edit_action_bar.php
new file mode 100644
index 00000000000..a0b35430fa0
--- /dev/null
+++ b/mod/feedback/classes/output/edit_action_bar.php
@@ -0,0 +1,96 @@
+.
+
+namespace mod_feedback\output;
+
+use moodle_url;
+use action_link;
+use single_select;
+use url_select;
+
+/**
+ * Class actionbar - Display the action bar
+ *
+ * @package mod_feedback
+ * @copyright 2021 Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class edit_action_bar extends base_action_bar {
+ /** @var moodle_url $currenturl The current page url */
+ private $currenturl;
+ /** @var int|null $lastposition The index of the last question type in the feedback module */
+ private $lastposition;
+
+ /**
+ * edit_action_bar constructor.
+ *
+ * @param int $cmid The course module id
+ * @param moodle_url $pageurl The current page url
+ * @param int|null $lastposition Index of the last question in the feedback
+ */
+ public function __construct(int $cmid, moodle_url $pageurl, ?int $lastposition = null) {
+ parent::__construct($cmid);
+ $this->currenturl = $pageurl;
+ $this->lastposition = $lastposition;
+ }
+
+ /**
+ * Return the items to be used for the tertiary nav
+ *
+ * @return array
+ */
+ public function get_items(): array {
+ $url = new moodle_url('/mod/feedback/view.php', ['id' => $this->cmid]);
+ $items['left'][]['actionlink'] = new action_link($url, get_string('back'), null, ['class' => 'btn btn-secondary']);
+
+ if (has_capability('mod/feedback:edititems', $this->context)) {
+ $editurl = new moodle_url('/mod/feedback/edit.php', $this->urlparams);
+ $templateurl = new moodle_url('/mod/feedback/manage_templates.php', $this->urlparams);
+ $importurl = new moodle_url('/mod/feedback/import.php', $this->urlparams);
+
+ $options = [
+ $editurl->out(false) => get_string('add_item', 'feedback'),
+ $templateurl->out(false) => get_string('using_templates', 'feedback'),
+ $importurl->out(false) => get_string('import_questions', 'feedback')
+ ];
+
+ $selected = $this->currenturl;
+ // Template pages can have sub pages, so match these.
+ if ($this->currenturl->compare(new moodle_url('/mod/feedback/use_templ.php'), URL_MATCH_BASE)) {
+ $selected = $templateurl;
+ }
+
+ $items['left'][]['urlselect'] = new url_select($options, $selected->out(false), null);
+
+ $viewquestions = $editurl->compare($this->currenturl);
+ if ($viewquestions) {
+ $select = new single_select(new moodle_url('/mod/feedback/edit_item.php',
+ ['cmid' => $this->cmid, 'position' => $this->lastposition, 'sesskey' => sesskey()]),
+ 'typ', feedback_load_feedback_items_options());
+ $items['left'][]['singleselect'] = $select;
+
+ $exporturl = new moodle_url('/mod/feedback/export.php', $this->urlparams + ['action' => 'exportfile']);
+ $items['export'] = new action_link(
+ $exporturl,
+ get_string('export_questions', 'feedback'),
+ null,
+ ['class' => 'btn btn-secondary']);
+ }
+ }
+
+ return $items;
+ }
+}
diff --git a/mod/feedback/classes/output/edit_template_action_bar.php b/mod/feedback/classes/output/edit_template_action_bar.php
new file mode 100644
index 00000000000..4e602461623
--- /dev/null
+++ b/mod/feedback/classes/output/edit_template_action_bar.php
@@ -0,0 +1,86 @@
+.
+
+namespace mod_feedback\output;
+
+use confirm_action;
+use context_system;
+use moodle_url;
+use action_link;
+
+/**
+ * Class actionbar - Display the action bar
+ *
+ * @package mod_feedback
+ * @copyright 2021 Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class edit_template_action_bar extends base_action_bar {
+ /** @var int $templateid The template that is being edited/used */
+ private $templateid;
+ /** @var string $mode The type of view we are dealing with */
+ private $mode;
+
+ /**
+ * edit_template_action_bar constructor.
+ * @param int $cmid
+ * @param int $templateid
+ * @param string $mode
+ */
+ public function __construct(int $cmid, int $templateid, string $mode) {
+ parent::__construct($cmid);
+ $this->templateid = $templateid;
+ $this->mode = $mode;
+ }
+
+ /**
+ * Return the items to be used in the tertiary nav
+ *
+ * @return array
+ */
+ public function get_items(): array {
+ global $DB;
+ $additionalparams = ($this->mode ? ['mode' => $this->mode] : []);
+ $templateurl = new moodle_url('/mod/feedback/manage_templates.php', $this->urlparams + $additionalparams);
+ $items['left'][]['actionlink'] = new action_link($templateurl, get_string('back'), null, ['class' => 'btn btn-secondary']);
+
+ if (has_capability('mod/feedback:edititems', $this->context)) {
+ $items['usetemplate'] = $this->urlparams + [
+ 'templateid' => $this->templateid
+ ];
+ }
+
+ $template = $DB->get_record('feedback_template', array('id' => $this->templateid), '*', MUST_EXIST);
+ $systemcontext = context_system::instance();
+ $showdelete = has_capability('mod/feedback:deletetemplate', $this->context);
+ if ($template->ispublic) {
+ $showdelete = has_capability('mod/feedback:createpublictemplate', $systemcontext) &&
+ has_capability('mod/feedback:deletetemplate', $systemcontext);
+ }
+
+ if ($showdelete) {
+ $params = $this->urlparams + $additionalparams + [
+ 'deletetemplate' => $this->templateid,
+ 'sesskey' => sesskey()
+ ];
+ $deleteurl = new moodle_url('/mod/feedback/manage_templates.php', $params);
+ $deleteaction = new confirm_action(get_string('confirmdeletetemplate', 'feedback'));
+ $items['export'] = new action_link($deleteurl, get_string('delete'), $deleteaction, ['class' => 'btn btn-secondary']);
+ }
+
+ return $items;
+ }
+}
diff --git a/mod/feedback/classes/output/renderer.php b/mod/feedback/classes/output/renderer.php
new file mode 100644
index 00000000000..5808cfaa511
--- /dev/null
+++ b/mod/feedback/classes/output/renderer.php
@@ -0,0 +1,50 @@
+.
+
+namespace mod_feedback\output;
+
+use plugin_renderer_base;
+
+/**
+ * Class renderer
+ *
+ * @package mod_feedback
+ * @copyright 2021 Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+class renderer extends plugin_renderer_base {
+ /**
+ * Generate the tertiary nav
+ *
+ * @param base_action_bar $actionmenu
+ * @return bool|string
+ */
+ public function main_action_bar(base_action_bar $actionmenu) {
+ $context = $actionmenu->export_for_template($this);
+
+ return $this->render_from_template('mod_feedback/main_action_menu', $context);
+ }
+
+ /**
+ * Render the create template form
+ *
+ * @param int $id
+ * @return bool|string
+ */
+ public function create_template_form(int $id) {
+ return $this->render_from_template('mod_feedback/create_template', ['id' => $id]);
+ }
+}
diff --git a/mod/feedback/classes/output/responses_action_bar.php b/mod/feedback/classes/output/responses_action_bar.php
new file mode 100644
index 00000000000..0505a31869b
--- /dev/null
+++ b/mod/feedback/classes/output/responses_action_bar.php
@@ -0,0 +1,72 @@
+.
+
+namespace mod_feedback\output;
+
+use moodle_url;
+use url_select;
+
+/**
+ * Class responses_action_bar. The tertiary nav for the responses page
+ *
+ * @copyright 2021 Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
+ * @package mod_feedback
+ */
+class responses_action_bar extends base_action_bar {
+ /** @var moodle_url $currenturl The current page url */
+ private $currenturl;
+
+ /**
+ * responses_action_bar constructor.
+ *
+ * @param int $cmid The cmid for the module we are operating on
+ * @param moodle_url $pageurl The current page url
+ */
+ public function __construct(int $cmid, moodle_url $pageurl) {
+ parent::__construct($cmid);
+ $this->currenturl = $pageurl;
+ $this->urlparams['courseid'] = $this->course->id;
+ }
+
+ /**
+ * Return the items to be used in the tertiary nav
+ *
+ * @return array
+ */
+ public function get_items(): array {
+ $items = [];
+ if (has_capability('mod/feedback:viewreports', $this->context)) {
+ $reporturl = new moodle_url('/mod/feedback/show_entries.php', $this->urlparams);
+ $options[$reporturl->out(false)] = get_string('show_entries', 'feedback');
+ $selected = $this->currenturl->compare($reporturl, URL_MATCH_BASE) ? $reporturl : $this->currenturl;
+
+ if ($this->feedback->anonymous == FEEDBACK_ANONYMOUS_NO && $this->course != SITEID) {
+ $nonrespondenturl = new moodle_url('/mod/feedback/show_nonrespondents.php', $this->urlparams);
+ $options[$nonrespondenturl->out(false)] = get_string('show_nonrespondents', 'feedback');
+ $selected = $this->currenturl->compare($nonrespondenturl, URL_MATCH_BASE) ? $nonrespondenturl : $this->currenturl;;
+ }
+
+ // Don't show the dropdown if it's only a single item.
+ if (count($options) != 1) {
+ $items['left'][]['urlselect'] = new url_select($options,
+ $selected->out(false),
+ null);
+ }
+ }
+ return $items;
+ }
+}
diff --git a/mod/feedback/classes/output/standard_action_bar.php b/mod/feedback/classes/output/standard_action_bar.php
new file mode 100644
index 00000000000..4970f328c22
--- /dev/null
+++ b/mod/feedback/classes/output/standard_action_bar.php
@@ -0,0 +1,92 @@
+.
+
+namespace mod_feedback\output;
+
+use action_link;
+use moodle_url;
+
+/**
+ * Class standard_action_bar
+ *
+ * The default tertiary nav on the module landing page
+ *
+ * @copyright 2021 Peter Dias
+ * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
+ * @package mod_feedback
+ */
+class standard_action_bar extends base_action_bar {
+ /** @var int $startpage The page to resume with. */
+ private $startpage;
+ /** @var int $viewcompletion Whether or not the user can finish the feedback */
+ private $viewcompletion;
+
+ /**
+ * standard_action_bar constructor.
+ *
+ * @param int $cmid
+ * @param bool $viewcompletion Whether or not the user can finish the feedback
+ * @param int|null $startpage The page to resume with.
+ * @param int|null $courseid The course that the feedback is being accessed from. If null, courseid will be
+ * set via the $cmid relationship
+ */
+ public function __construct(int $cmid, bool $viewcompletion, ?int $startpage = null, ?int $courseid = null) {
+ parent::__construct($cmid);
+ $this->startpage = $startpage;
+ $this->viewcompletion = $viewcompletion;
+ if ($courseid && $courseid != $this->course->id) {
+ $this->course = get_course($courseid);
+ }
+ $this->urlparams['courseid'] = $this->course->id;
+ }
+
+ /**
+ * Return the items to be used in the tertiary nav
+ *
+ * @return array
+ */
+ public function get_items(): array {
+ $items = [];
+
+ if (has_capability('mod/feedback:edititems', $this->context)) {
+ $editurl = new moodle_url('/mod/feedback/edit.php', $this->urlparams);
+ $items['left'][]['actionlink'] = new action_link($editurl, get_string('edit_items', 'feedback'),
+ null, ['class' => 'btn btn-secondary']);
+ }
+
+ $previewlnk = new moodle_url('/mod/feedback/print.php', array('id' => $this->cmid));
+ if ($this->course->id) {
+ $previewlnk->param('courseid', $this->course->id);
+ }
+ $items['left'][]['actionlink'] = new action_link($previewlnk, get_string('previewquestions', 'feedback'),
+ null, ['class' => 'btn btn-secondary']);
+
+ if ($this->viewcompletion) {
+ // Display a link to complete feedback or resume.
+ $completeurl = new moodle_url('/mod/feedback/complete.php',
+ ['id' => $this->cmid, 'courseid' => $this->course->id]);
+ if ($this->startpage) {
+ $completeurl->param('gopage', $this->startpage);
+ $label = get_string('continue_the_form', 'feedback');
+ } else {
+ $label = get_string('complete_the_form', 'feedback');
+ }
+ $items['left'][]['actionlink'] = new action_link($completeurl, $label, null, ['class' => 'btn btn-secondary']);
+ }
+
+ return $items;
+ }
+}
diff --git a/mod/feedback/classes/templates_table.php b/mod/feedback/classes/templates_table.php
index be01a447036..1a99224692c 100644
--- a/mod/feedback/classes/templates_table.php
+++ b/mod/feedback/classes/templates_table.php
@@ -35,17 +35,24 @@ require_once($CFG->libdir . '/tablelib.php');
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class mod_feedback_templates_table extends flexible_table {
+ /** @var string|null Indicate whether we are managing template or not. */
+ private $mode;
/**
* Constructor
* @param int $uniqueid all tables have to have a unique id, this is used
* as a key when storing table properties like sort order in the session.
* @param moodle_url $baseurl
+ * @param string $mode Indicate whether we are managing templates
*/
- public function __construct($uniqueid, $baseurl) {
+ public function __construct($uniqueid, $baseurl, ?string $mode = null) {
parent::__construct($uniqueid);
+ $this->mode = $mode;
+ $tablecolumns = array('template');
+ if ($this->mode) {
+ $tablecolumns[] = 'actions';
+ }
- $tablecolumns = array('template', 'action');
$tableheaders = array(get_string('template', 'feedback'), '');
$this->set_attribute('class', 'templateslist');
@@ -54,8 +61,7 @@ class mod_feedback_templates_table extends flexible_table {
$this->define_headers($tableheaders);
$this->define_baseurl($baseurl);
$this->column_class('template', 'template');
- $this->column_class('action', 'action');
-
+ $this->column_class('actions', 'text-right');
$this->sortable(false);
}
@@ -75,12 +81,26 @@ class mod_feedback_templates_table extends flexible_table {
$strdeletefeedback = get_string('delete_template', 'feedback');
foreach ($templates as $template) {
- $data = array();
- $data[] = format_string($template->name);
- $url = new moodle_url($this->baseurl, array('deletetempl' => $template->id, 'sesskey' => sesskey()));
+ $data = [];
+ $url = new moodle_url($this->baseurl, array('templateid' => $template->id, 'sesskey' => sesskey()));
+ $data[] = $OUTPUT->action_link($url, format_string($template->name));
+
+ // Only show the actions if we are managing templates.
+ if ($this->mode && has_capability('mod/feedback:deletetemplate', $this->get_context())) {
+ $deleteurl = new moodle_url('/mod/feedback/manage_templates.php',
+ $url->params() + ['deletetemplate' => $template->id]);
+ $deleteaction = new confirm_action(get_string('confirmdeletetemplate', 'feedback'));
+ $deleteicon = $OUTPUT->action_icon($deleteurl, new pix_icon('t/delete', $strdeletefeedback), $deleteaction);
+ if ($template->ispublic) {
+ $systemcontext = context_system::instance();
+ if (!(has_capability('mod/feedback:createpublictemplate', $systemcontext) &&
+ has_capability('mod/feedback:deletetemplate', $systemcontext))) {
+ $deleteicon = false;
+ }
+ }
+ $data[] = $deleteicon;
+ }
- $deleteaction = new confirm_action(get_string('confirmdeletetemplate', 'feedback'));
- $data[] = $OUTPUT->action_icon($url, new pix_icon('t/delete', $strdeletefeedback), $deleteaction);
$this->add_data($data);
}
$this->finish_output();
diff --git a/mod/feedback/complete.php b/mod/feedback/complete.php
index c91b9afd2ab..b02976d7f4d 100644
--- a/mod/feedback/complete.php
+++ b/mod/feedback/complete.php
@@ -68,11 +68,14 @@ $PAGE->navbar->add(get_string('feedback:complete', 'feedback'));
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
$PAGE->set_pagelayout('incourse');
+$PAGE->set_secondary_active_tab('modulepage');
// Check if the feedback is open (timeopen, timeclose).
if (!$feedbackcompletion->is_open()) {
echo $OUTPUT->header();
- echo $OUTPUT->heading(format_string($feedback->name));
+ if (!$PAGE->has_secondary_navigation()) {
+ echo $OUTPUT->heading(format_string($feedback->name));
+ }
echo $OUTPUT->box_start('generalbox boxaligncenter');
echo $OUTPUT->notification(get_string('feedback_is_not_open', 'feedback'));
echo $OUTPUT->continue_button(course_get_url($courseid ?: $feedback->course));
@@ -104,7 +107,9 @@ $strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
echo $OUTPUT->header();
-echo $OUTPUT->heading(format_string($feedback->name));
+if (!$PAGE->has_secondary_navigation()) {
+ echo $OUTPUT->heading(format_string($feedback->name));
+}
if ($feedbackcompletion->is_empty()) {
\core\notification::error(get_string('no_items_available_yet', 'feedback'));
@@ -115,7 +120,7 @@ if ($feedbackcompletion->is_empty()) {
echo $OUTPUT->box($feedbackcompletion->page_after_submit(),
'generalbox boxaligncenter');
}
- if ($feedbackcompletion->can_view_analysis()) {
+ if (!$PAGE->has_secondary_navigation() && $feedbackcompletion->can_view_analysis()) {
echo '
';
$analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id' => $cm->id, 'courseid' => $courseid));
echo html_writer::link($analysisurl, get_string('completed_feedbacks', 'feedback'));
diff --git a/mod/feedback/edit.php b/mod/feedback/edit.php
index dfd8d7f4317..f182bdd7211 100644
--- a/mod/feedback/edit.php
+++ b/mod/feedback/edit.php
@@ -24,7 +24,6 @@
require_once('../../config.php');
require_once('lib.php');
-require_once('edit_form.php');
feedback_init_feedback_session();
@@ -34,14 +33,9 @@ if (($formdata = data_submitted()) AND !confirm_sesskey()) {
print_error('invalidsesskey');
}
-$do_show = optional_param('do_show', 'edit', PARAM_ALPHA);
$switchitemrequired = optional_param('switchitemrequired', false, PARAM_INT);
$deleteitem = optional_param('deleteitem', false, PARAM_INT);
-$current_tab = $do_show;
-
-$url = new moodle_url('/mod/feedback/edit.php', array('id'=>$id, 'do_show'=>$do_show));
-
list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
$context = context_module::instance($cm->id);
@@ -49,6 +43,7 @@ require_login($course, false, $cm);
require_capability('mod/feedback:edititems', $context);
$feedback = $PAGE->activityrecord;
$feedbackstructure = new mod_feedback_structure($feedback, $cm);
+$url = new moodle_url('/mod/feedback/edit.php', ['id' => $cm->id]);
if ($switchitemrequired) {
require_sesskey();
@@ -71,19 +66,6 @@ if ($deleteitem) {
// Process the create template form.
$cancreatetemplates = has_capability('mod/feedback:createprivatetemplate', $context) ||
has_capability('mod/feedback:createpublictemplate', $context);
-$create_template_form = new feedback_edit_create_template_form(null, array('id' => $id));
-if ($data = $create_template_form->get_data()) {
- // Check the capabilities to create templates.
- if (!$cancreatetemplates) {
- print_error('cannotsavetempl', 'feedback', $url);
- }
- $ispublic = !empty($data->ispublic) ? 1 : 0;
- if (!feedback_save_as_template($feedback, $data->templatename, $ispublic)) {
- redirect($url, get_string('saving_failed', 'feedback'), null, \core\output\notification::NOTIFY_ERROR);
- } else {
- redirect($url, get_string('template_saved', 'feedback'), null, \core\output\notification::NOTIFY_SUCCESS);
- }
-}
//Get the feedbackitems
$lastposition = 0;
@@ -99,79 +81,34 @@ if (is_array($feedbackitems)) {
}
$lastposition++;
-
-//The use_template-form
-$use_template_form = new feedback_edit_use_template_form('use_templ.php', array('course' => $course, 'id' => $id));
-
-//Print the page header.
-$strfeedbacks = get_string('modulenameplural', 'feedback');
-$strfeedback = get_string('modulename', 'feedback');
-
-$PAGE->set_url('/mod/feedback/edit.php', array('id'=>$cm->id, 'do_show'=>$do_show));
+$PAGE->set_url($url);
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
+$actionbar = new \mod_feedback\output\edit_action_bar($cm->id, $url, $lastposition);
//Adding the javascript module for the items dragdrop.
if (count($feedbackitems) > 1) {
- if ($do_show == 'edit') {
- $PAGE->requires->strings_for_js(array(
- 'pluginname',
- 'move_item',
- 'position',
- ), 'feedback');
- $PAGE->requires->yui_module('moodle-mod_feedback-dragdrop', 'M.mod_feedback.init_dragdrop',
- array(array('cmid' => $cm->id)));
- }
+ $PAGE->requires->strings_for_js(array(
+ 'pluginname',
+ 'move_item',
+ 'position',
+ ), 'feedback');
+ $PAGE->requires->yui_module('moodle-mod_feedback-dragdrop', 'M.mod_feedback.init_dragdrop',
+ array(array('cmid' => $cm->id)));
}
echo $OUTPUT->header();
-echo $OUTPUT->heading(format_string($feedback->name));
+/** @var \mod_feedback\output\renderer $renderer */
+$renderer = $PAGE->get_renderer('mod_feedback');
+echo $renderer->main_action_bar($actionbar);
+$form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_EDIT,
+ $feedbackstructure, 'feedback_edit_form');
+echo '
'; // The container for the dragging area.
+$form->display();
+echo '
';
-/// print the tabs
-require('tabs.php');
-
-// Print the main part of the page.
-
-if ($do_show == 'templates') {
- // Print the template-section.
- $use_template_form->display();
-
- if ($cancreatetemplates) {
- $deleteurl = new moodle_url('/mod/feedback/delete_template.php', array('id' => $id));
- $create_template_form->display();
- echo ''.
- get_string('delete_templates', 'feedback').
- '
';
- } else {
- echo ' ';
- }
-
- if (has_capability('mod/feedback:edititems', $context)) {
- $urlparams = array('action'=>'exportfile', 'id'=>$id);
- $exporturl = new moodle_url('/mod/feedback/export.php', $urlparams);
- $importurl = new moodle_url('/mod/feedback/import.php', array('id'=>$id));
- echo '
- '.get_string('export_questions', 'feedback').'/
- '.get_string('import_questions', 'feedback').'
-
';
- }
-}
-
-if ($do_show == 'edit') {
- // Print the Item-Edit-section.
-
- $select = new single_select(new moodle_url('/mod/feedback/edit_item.php',
- array('cmid' => $id, 'position' => $lastposition, 'sesskey' => sesskey())),
- 'typ', feedback_load_feedback_items_options());
- $select->label = get_string('add_item', 'mod_feedback');
- echo $OUTPUT->render($select);
-
-
- $form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_EDIT,
- $feedbackstructure, 'feedback_edit_form');
- echo ''; // The container for the dragging area.
- $form->display();
- echo '
';
+if ($cancreatetemplates) {
+ echo $renderer->create_template_form($id);
}
echo $OUTPUT->footer();
diff --git a/mod/feedback/edit_form.php b/mod/feedback/edit_form.php
index 6753bab831c..f9b67561a43 100644
--- a/mod/feedback/edit_form.php
+++ b/mod/feedback/edit_form.php
@@ -29,7 +29,71 @@ if (!defined('MOODLE_INTERNAL')) {
require_once($CFG->libdir.'/formslib.php');
+/**
+ * The feedback_edit_use_template_form
+ *
+ * @deprecated since 4.0 new dynamic forms created
+ */
class feedback_edit_use_template_form extends moodleform {
+ public function __construct($action = null, $customdata = null, $method = 'post', $target = '',
+ $attributes = null, $editable = true, $ajaxformdata = null) {
+ debugging('Class feedback_edit_use_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ parent::__construct($action, $customdata, $method, $target, $attributes, $editable, $ajaxformdata);
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @return array
+ */
+ public static function get_js_module() {
+ debugging('Class feedback_edit_use_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ return parent::get_js_module();
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @param array $simulatedsubmitteddata
+ * @param array $simulatedsubmittedfiles
+ * @param string $method
+ * @param null $formidentifier
+ * @return array
+ */
+ public static function mock_ajax_submit($simulatedsubmitteddata, $simulatedsubmittedfiles = array(),
+ $method = 'post', $formidentifier = null) {
+ debugging('Class feedback_edit_use_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ return parent::mock_ajax_submit($simulatedsubmitteddata, $simulatedsubmittedfiles, $method, $formidentifier);
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @param array $data
+ * @return array
+ */
+ public static function mock_generate_submit_keys($data = []) {
+ debugging('Class feedback_edit_use_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ return parent::mock_generate_submit_keys($data);
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @param array $simulatedsubmitteddata
+ * @param array $simulatedsubmittedfiles
+ * @param string $method
+ * @param null $formidentifier
+ */
+ public static function mock_submit($simulatedsubmitteddata, $simulatedsubmittedfiles = array(),
+ $method = 'post', $formidentifier = null) {
+ debugging('Class feedback_edit_use_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ parent::mock_submit($simulatedsubmitteddata, $simulatedsubmittedfiles, $method, $formidentifier);
+ }
/**
* Form definition
@@ -97,7 +161,71 @@ class feedback_edit_use_template_form extends moodleform {
}
}
+/**
+ * The feedback_edit_create_template_form
+ *
+ * @deprecated since 4.0, new dynamic forms have been created instead.
+ */
class feedback_edit_create_template_form extends moodleform {
+ public function __construct($action = null, $customdata = null, $method = 'post',
+ $target = '', $attributes = null, $editable = true, $ajaxformdata = null) {
+ debugging('Class feedback_edit_create_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ parent::__construct($action, $customdata, $method, $target, $attributes, $editable, $ajaxformdata);
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @return array
+ */
+ public static function get_js_module() {
+ debugging('Class feedback_edit_create_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ return parent::get_js_module();
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @param array $simulatedsubmitteddata
+ * @param array $simulatedsubmittedfiles
+ * @param string $method
+ * @param null $formidentifier
+ * @return array
+ */
+ public static function mock_ajax_submit($simulatedsubmitteddata, $simulatedsubmittedfiles = array(),
+ $method = 'post', $formidentifier = null) {
+ debugging('Class feedback_edit_create_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ return parent::mock_ajax_submit($simulatedsubmitteddata, $simulatedsubmittedfiles, $method, $formidentifier);
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @param array $data
+ * @return array
+ */
+ public static function mock_generate_submit_keys($data = []) {
+ debugging('Class feedback_edit_create_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ return parent::mock_generate_submit_keys($data);
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @param array $simulatedsubmitteddata
+ * @param array $simulatedsubmittedfiles
+ * @param string $method
+ * @param null $formidentifier
+ */
+ public static function mock_submit($simulatedsubmitteddata, $simulatedsubmittedfiles = array(),
+ $method = 'post', $formidentifier = null) {
+ debugging('Class feedback_edit_create_template_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ parent::mock_submit($simulatedsubmitteddata, $simulatedsubmittedfiles, $method, $formidentifier);
+ }
/**
* Form definition
@@ -110,10 +238,7 @@ class feedback_edit_create_template_form extends moodleform {
$mform->setType('id', PARAM_INT);
$mform->addElement('hidden', 'do_show');
$mform->setType('do_show', PARAM_ALPHANUMEXT);
- $mform->setConstant('do_show', 'templates');
-
- //headline
- $mform->addElement('header', 'creating_templates', get_string('creating_templates', 'feedback'));
+ $mform->setConstant('do_show', 'edit');
// visible elements
$elementgroup = array();
@@ -121,7 +246,7 @@ class feedback_edit_create_template_form extends moodleform {
$elementgroup[] = $mform->createElement('text',
'templatename',
get_string('name', 'feedback'),
- array('size'=>'40', 'maxlength'=>'200'));
+ ['maxlength' => '200']);
if (has_capability('mod/feedback:createpublictemplate', context_system::instance())) {
$elementgroup[] = $mform->createElement('checkbox',
diff --git a/mod/feedback/edit_item.php b/mod/feedback/edit_item.php
index 4ba8d121179..5f2be63beb9 100644
--- a/mod/feedback/edit_item.php
+++ b/mod/feedback/edit_item.php
@@ -101,13 +101,14 @@ $PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
echo $OUTPUT->header();
+if (!$PAGE->has_secondary_navigation()) {
// Print the main part of the page.
-echo $OUTPUT->heading(format_string($feedback->name));
+ echo $OUTPUT->heading(format_string($feedback->name));
+}
/// print the tabs
$current_tab = 'edit';
$id = $cm->id;
-require('tabs.php');
//print errormsg
if (isset($error)) {
diff --git a/mod/feedback/import.php b/mod/feedback/import.php
index f125a111f02..0558d98315f 100644
--- a/mod/feedback/import.php
+++ b/mod/feedback/import.php
@@ -57,6 +57,7 @@ $context = context_module::instance($cm->id);
require_login($course, true, $cm);
require_capability('mod/feedback:edititems', $context);
+$actionbar = new \mod_feedback\output\edit_action_bar($cm->id, $url);
$mform = new feedback_import_form();
$newformdata = array('id'=>$id,
@@ -95,16 +96,20 @@ $strfeedback = get_string("modulename", "feedback");
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
echo $OUTPUT->header();
-echo $OUTPUT->heading(format_string($feedback->name));
-/// print the tabs
-$current_tab = 'templates';
-require('tabs.php');
+/** @var \mod_feedback\output\renderer $renderer */
+$renderer = $PAGE->get_renderer('mod_feedback');
+echo $renderer->main_action_bar($actionbar);
+if (!$PAGE->has_secondary_navigation()) {
+ echo $OUTPUT->heading(format_string($feedback->name));
+}
/// Print the main part of the page
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////
-echo $OUTPUT->heading(get_string('import_questions', 'feedback'), 3);
+if (!$PAGE->has_secondary_navigation()) {
+ echo $OUTPUT->heading(get_string('import_questions', 'feedback'), 3);
+}
if (isset($importerror->msg) AND is_array($importerror->msg)) {
echo $OUTPUT->box_start('generalbox errorboxcontent boxaligncenter');
diff --git a/mod/feedback/import_form.php b/mod/feedback/import_form.php
index 9b32e921889..1cc02995536 100644
--- a/mod/feedback/import_form.php
+++ b/mod/feedback/import_form.php
@@ -40,9 +40,6 @@ class feedback_import_form extends moodleform {
$strnodeleteolditmes = get_string('append_new_items', 'feedback').
' ('.get_string('oldvaluespreserved', 'feedback').')';
- $mform->addElement('radio', 'deleteolditems', '', $strdeleteolditmes, true);
- $mform->addElement('radio', 'deleteolditems', '', $strnodeleteolditmes);
-
// hidden elements
$mform->addElement('hidden', 'id');
$mform->setType('id', PARAM_INT);
@@ -52,8 +49,11 @@ class feedback_import_form extends moodleform {
null,
array('maxbytes' => $CFG->maxbytes, 'filetypes' => '*'));
+ $mform->addElement('radio', 'deleteolditems', '', $strdeleteolditmes, true);
+ $mform->addElement('radio', 'deleteolditems', '', $strnodeleteolditmes);
+
// buttons
- $this->add_action_buttons(true, get_string('yes'));
+ $this->add_action_buttons(false, get_string('save'));
}
}
diff --git a/mod/feedback/index.php b/mod/feedback/index.php
index 44d84c5430a..2c07c5084db 100644
--- a/mod/feedback/index.php
+++ b/mod/feedback/index.php
@@ -53,7 +53,9 @@ $PAGE->navbar->add($strfeedbacks);
$PAGE->set_heading($course->fullname);
$PAGE->set_title(get_string('modulename', 'feedback').' '.get_string('activities'));
echo $OUTPUT->header();
-echo $OUTPUT->heading($strfeedbacks);
+if (!$PAGE->has_secondary_navigation()) {
+ echo $OUTPUT->heading($strfeedbacks);
+}
/// Get all the appropriate data
diff --git a/mod/feedback/item/feedback_item_form_class.php b/mod/feedback/item/feedback_item_form_class.php
index be3db851a39..7fb6379202e 100644
--- a/mod/feedback/item/feedback_item_form_class.php
+++ b/mod/feedback/item/feedback_item_form_class.php
@@ -102,7 +102,7 @@ abstract class feedback_item_form extends moodleform {
$mform->setType('clone_item', PARAM_INT);
$buttonarray[] = &$mform->createElement('submit',
'save_item',
- get_string('save_item', 'feedback'));
+ get_string('savechanges'));
}
$buttonarray[] = &$mform->createElement('cancel');
$mform->addGroup($buttonarray, 'buttonar', ' ', array(' '), false);
diff --git a/mod/feedback/lang/en/feedback.php b/mod/feedback/lang/en/feedback.php
index 179e5e3e592..a1cefe5f17d 100644
--- a/mod/feedback/lang/en/feedback.php
+++ b/mod/feedback/lang/en/feedback.php
@@ -126,6 +126,7 @@ $string['feedback:receivemail'] = 'Receive email notification';
$string['feedback:view'] = 'View a feedback';
$string['feedback:viewanalysepage'] = 'View the analysis page after submit';
$string['feedback:viewreports'] = 'View reports';
+$string['feedbackupdated'] = 'Feedback updated.';
$string['file'] = 'File';
$string['filter_by_course'] = 'Filter by course';
$string['handling_error'] = 'Error occurred in feedback module action handling';
@@ -227,6 +228,7 @@ $string['pluginadministration'] = 'Feedback administration';
$string['pluginname'] = 'Feedback';
$string['position'] = 'Position';
$string['previous_page'] = 'Previous page';
+$string['previewquestions'] = 'Preview questions';
$string['privacy:metadata:completed'] = 'A record of the submissions to the feedback';
$string['privacy:metadata:completed:anonymousresponse'] = 'Whether the submission is to be used anonymously.';
$string['privacy:metadata:completed:timemodified'] = 'The time when the submission was last modified.';
@@ -293,3 +295,4 @@ $string['use_one_line_for_each_value'] = 'Use one line for each answer!';
$string['use_this_template'] = 'Use this template';
$string['using_templates'] = 'Use a template';
$string['vertical'] = 'Vertical';
+$string['whatfor'] = 'What do you want to do?';
diff --git a/mod/feedback/lib.php b/mod/feedback/lib.php
index 681dfa6fbcd..0e5995f6f64 100644
--- a/mod/feedback/lib.php
+++ b/mod/feedback/lib.php
@@ -2801,17 +2801,17 @@ function feedback_extend_settings_navigation(settings_navigation $settings,
global $PAGE;
+ $hassecondary = $PAGE->has_secondary_navigation();
if (!$context = context_module::instance($PAGE->cm->id, IGNORE_MISSING)) {
print_error('badcontext');
}
if (has_capability('mod/feedback:edititems', $context)) {
- $questionnode = $feedbacknode->add(get_string('questions', 'feedback'));
-
+ $questionnode = $feedbacknode->add(get_string('questions', 'feedback'), null,
+ navigation_node::TYPE_CUSTOM, null, 'questionnode');
$questionnode->add(get_string('edit_items', 'feedback'),
new moodle_url('/mod/feedback/edit.php',
- array('id' => $PAGE->cm->id,
- 'do_show' => 'edit')));
+ ['id' => $PAGE->cm->id]));
$questionnode->add(get_string('export_questions', 'feedback'),
new moodle_url('/mod/feedback/export.php',
@@ -2822,38 +2822,43 @@ function feedback_extend_settings_navigation(settings_navigation $settings,
new moodle_url('/mod/feedback/import.php',
array('id' => $PAGE->cm->id)));
- $questionnode->add(get_string('templates', 'feedback'),
- new moodle_url('/mod/feedback/edit.php',
- array('id' => $PAGE->cm->id,
- 'do_show' => 'templates')));
+ $feedbacknode->add(get_string('templates', 'feedback'),
+ new moodle_url('/mod/feedback/manage_templates.php', ['id' => $PAGE->cm->id, 'mode' => 'manage']),
+ navigation_node::TYPE_CUSTOM, null, 'templatenode');
}
if (has_capability('mod/feedback:mapcourse', $context) && $PAGE->course->id == SITEID) {
$feedbacknode->add(get_string('mappedcourses', 'feedback'),
- new moodle_url('/mod/feedback/mapcourse.php',
- array('id' => $PAGE->cm->id)));
+ new moodle_url('/mod/feedback/mapcourse.php', ['id' => $PAGE->cm->id]),
+ navigation_node::TYPE_CUSTOM, null, 'mapcourse');
+ }
+
+ $feedback = $PAGE->activityrecord;
+ if ($feedback->course == SITEID) {
+ $analysisnode = navigation_node::create(get_string('analysis', 'feedback'),
+ new moodle_url('/mod/feedback/analysis_course.php', ['id' => $PAGE->cm->id]),
+ navigation_node::TYPE_CUSTOM, null, 'feedbackanalysis');
+ } else {
+ $analysisnode = navigation_node::create(get_string('analysis', 'feedback'),
+ new moodle_url('/mod/feedback/analysis.php', ['id' => $PAGE->cm->id]),
+ navigation_node::TYPE_CUSTOM, null, 'feedbackanalysis');
}
if (has_capability('mod/feedback:viewreports', $context)) {
- $feedback = $PAGE->activityrecord;
- if ($feedback->course == SITEID) {
- $feedbacknode->add(get_string('analysis', 'feedback'),
- new moodle_url('/mod/feedback/analysis_course.php',
- array('id' => $PAGE->cm->id)));
- } else {
- $feedbacknode->add(get_string('analysis', 'feedback'),
- new moodle_url('/mod/feedback/analysis.php',
- array('id' => $PAGE->cm->id)));
- }
-
- $feedbacknode->add(get_string('show_entries', 'feedback'),
- new moodle_url('/mod/feedback/show_entries.php',
- array('id' => $PAGE->cm->id)));
+ $feedbacknode->add_node($analysisnode);
+ $feedbacknode->add(get_string(($hassecondary ? 'responses' : 'show_entries'), 'feedback'),
+ new moodle_url('/mod/feedback/show_entries.php', ['id' => $PAGE->cm->id]),
+ navigation_node::TYPE_CUSTOM, null, 'responses');
if ($feedback->anonymous == FEEDBACK_ANONYMOUS_NO AND $feedback->course != SITEID) {
$feedbacknode->add(get_string('show_nonrespondents', 'feedback'),
- new moodle_url('/mod/feedback/show_nonrespondents.php',
- array('id' => $PAGE->cm->id)));
+ new moodle_url('/mod/feedback/show_nonrespondents.php', ['id' => $PAGE->cm->id]),
+ navigation_node::TYPE_CUSTOM, null, 'nonrespondents');
+ }
+ } else {
+ $feedbackcompletion = new mod_feedback_completion($feedback, $context, $PAGE->course->id);
+ if ($feedbackcompletion->can_view_analysis()) {
+ $feedbacknode->add_node($analysisnode);
}
}
}
diff --git a/mod/feedback/delete_template.php b/mod/feedback/manage_templates.php
similarity index 51%
rename from mod/feedback/delete_template.php
rename to mod/feedback/manage_templates.php
index 0e109fb2ef6..f170dbe07b9 100644
--- a/mod/feedback/delete_template.php
+++ b/mod/feedback/manage_templates.php
@@ -15,9 +15,10 @@
// along with Moodle. If not, see .
/**
- * deletes a template
+ * Manage the various templates available
*
- * @author Andreas Grabs
+ * @author Peter Dias
+ * @copyright 2021 Peter Dias
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package mod_feedback
*/
@@ -25,27 +26,41 @@
require_once("../../config.php");
require_once("lib.php");
-$current_tab = 'templates';
-
$id = required_param('id', PARAM_INT);
-$deletetempl = optional_param('deletetempl', false, PARAM_INT);
-
-$baseurl = new moodle_url('/mod/feedback/delete_template.php', array('id' => $id));
-$PAGE->set_url($baseurl);
+$mode = optional_param('mode', '', PARAM_ALPHA);
+$templateid = optional_param('deletetemplate', 0, PARAM_INT);
list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
$context = context_module::instance($cm->id);
require_login($course, true, $cm);
-require_capability('mod/feedback:deletetemplate', $context);
+require_capability('mod/feedback:edititems', $context);
$feedback = $PAGE->activityrecord;
$systemcontext = context_system::instance();
+$params = ['id' => $id];
+if ($mode) {
+ $params += ['mode' => $mode];
+}
+$url = new moodle_url('/mod/feedback/manage_templates.php', $params);
+if ($mode == 'manage') {
+ navigation_node::override_active_url($url);
+} else {
+ navigation_node::override_active_url(new moodle_url('/mod/feedback/view.php', $params));
+}
+
+$PAGE->set_url($url);
+$actionbar = new \mod_feedback\output\edit_action_bar($cm->id, $url);
+
+$PAGE->set_heading($course->fullname);
+$PAGE->set_title($feedback->name);
+
// Process template deletion.
-if ($deletetempl) {
+if ($templateid) {
require_sesskey();
- $template = $DB->get_record('feedback_template', array('id' => $deletetempl), '*', MUST_EXIST);
+ require_capability('mod/feedback:deletetemplate', $context);
+ $template = $DB->get_record('feedback_template', ['id' => $templateid], '*', MUST_EXIST);
if ($template->ispublic) {
require_capability('mod/feedback:createpublictemplate', $systemcontext);
@@ -53,46 +68,31 @@ if ($deletetempl) {
}
feedback_delete_template($template);
- redirect($baseurl, get_string('template_deleted', 'feedback'));
+ $successurl = new moodle_url('/mod/feedback/manage_templates.php', ['id' => $id]);
+ redirect($url, get_string('template_deleted', 'feedback'), null, \core\output\notification::NOTIFY_SUCCESS);
}
-/// Print the page header
-$strfeedbacks = get_string("modulenameplural", "feedback");
-$strfeedback = get_string("modulename", "feedback");
-$strdeletefeedback = get_string('delete_template', 'feedback');
-
-navigation_node::override_active_url(new moodle_url('/mod/feedback/edit.php',
- array('id' => $id, 'do_show' => 'templates')));
-$PAGE->set_heading($course->fullname);
-$PAGE->set_title($feedback->name);
echo $OUTPUT->header();
-echo $OUTPUT->heading(format_string($feedback->name));
-/// print the tabs
-require('tabs.php');
-
-// Print the main part of the page.
-echo $OUTPUT->heading($strdeletefeedback, 3);
+/** @var \mod_feedback\output\renderer $renderer */
+$renderer = $PAGE->get_renderer('mod_feedback');
+if (!$mode) {
+ echo $renderer->main_action_bar($actionbar);
+}
// First we get the course templates.
$templates = feedback_get_template_list($course, 'own');
echo $OUTPUT->box_start('coursetemplates');
echo $OUTPUT->heading(get_string('course'), 4);
-$tablecourse = new mod_feedback_templates_table('feedback_template_course_table', $baseurl);
+
+$baseurl = new moodle_url('/mod/feedback/use_templ.php', $params);
+$tablecourse = new mod_feedback_templates_table('feedback_template_course_table', $baseurl, $mode);
$tablecourse->display($templates);
echo $OUTPUT->box_end();
-// Now we get the public templates if it is permitted.
-if (has_capability('mod/feedback:createpublictemplate', $systemcontext) AND
- has_capability('mod/feedback:deletetemplate', $systemcontext)) {
- $templates = feedback_get_template_list($course, 'public');
- echo $OUTPUT->box_start('publictemplates');
- echo $OUTPUT->heading(get_string('public', 'feedback'), 4);
- $tablepublic = new mod_feedback_templates_table('feedback_template_public_table', $baseurl);
- $tablepublic->display($templates);
- echo $OUTPUT->box_end();
-}
-
-$url = new moodle_url('/mod/feedback/edit.php', array('id' => $id, 'do_show' => 'templates'));
-echo $OUTPUT->single_button($url, get_string('back'), 'post');
+$templates = feedback_get_template_list($course, 'public');
+echo $OUTPUT->box_start('publictemplates');
+echo $OUTPUT->heading(get_string('public', 'feedback'), 4);
+$tablepublic = new mod_feedback_templates_table('feedback_template_public_table', $baseurl, $mode);
+$tablepublic->display($templates);
+echo $OUTPUT->box_end();
echo $OUTPUT->footer();
-
diff --git a/mod/feedback/mapcourse.php b/mod/feedback/mapcourse.php
index 6330d6effa2..975c801f163 100644
--- a/mod/feedback/mapcourse.php
+++ b/mod/feedback/mapcourse.php
@@ -58,10 +58,9 @@ $strfeedback = get_string("modulename", "feedback");
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
echo $OUTPUT->header();
-echo $OUTPUT->heading(format_string($feedback->name));
-
-require('tabs.php');
-
+if (!$PAGE->has_secondary_navigation()) {
+ echo $OUTPUT->heading(format_string($feedback->name));
+}
echo $OUTPUT->box(get_string('mapcourseinfo', 'feedback'));
$form->display();
diff --git a/mod/feedback/show_entries.php b/mod/feedback/show_entries.php
index 0f0cfe96e6c..54ce08f72d5 100644
--- a/mod/feedback/show_entries.php
+++ b/mod/feedback/show_entries.php
@@ -43,7 +43,6 @@ list($course, $cm) = get_course_and_cm_from_cmid($id, 'feedback');
$baseurl = new moodle_url('/mod/feedback/show_entries.php', array('id' => $cm->id));
$PAGE->set_url(new moodle_url($baseurl, array('userid' => $userid, 'showcompleted' => $showcompleted,
'delete' => $deleteid)));
-
$context = context_module::instance($cm->id);
require_login($course, true, $cm);
@@ -51,6 +50,8 @@ $feedback = $PAGE->activityrecord;
require_capability('mod/feedback:viewreports', $context);
+$actionbar = new \mod_feedback\output\responses_action_bar($cm->id, $baseurl);
+
if ($deleteid) {
// This is a request to delete a reponse.
require_capability('mod/feedback:deletesubmissions', $context);
@@ -86,10 +87,12 @@ navigation_node::override_active_url($baseurl);
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
echo $OUTPUT->header();
-echo $OUTPUT->heading(format_string($feedback->name));
+
+/** @var \mod_feedback\output\renderer $renderer */
+$renderer = $PAGE->get_renderer('mod_feedback');
+echo $renderer->main_action_bar($actionbar);
$current_tab = 'showentries';
-require('tabs.php');
/// Print the main part of the page
///////////////////////////////////////////////////////////////////////////
diff --git a/mod/feedback/show_nonrespondents.php b/mod/feedback/show_nonrespondents.php
index 8aa381da1fd..adb2c7b770c 100644
--- a/mod/feedback/show_nonrespondents.php
+++ b/mod/feedback/show_nonrespondents.php
@@ -70,6 +70,8 @@ $coursecontext = context_course::instance($course->id);
require_login($course, true, $cm);
+$actionbar = new \mod_feedback\output\responses_action_bar($cm->id, $url);
+
if (($formdata = data_submitted()) AND !confirm_sesskey()) {
print_error('invalidsesskey');
}
@@ -136,9 +138,10 @@ if ($action == 'sendmessage' AND $canbulkmessaging) {
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
echo $OUTPUT->header();
-echo $OUTPUT->heading(format_string($feedback->name));
-require('tabs.php');
+/** @var \mod_feedback\output\renderer $renderer */
+$renderer = $PAGE->get_renderer('mod_feedback');
+echo $renderer->main_action_bar($actionbar);
/// Print the main part of the page
///////////////////////////////////////////////////////////////////////////
diff --git a/mod/feedback/templates/create_template.mustache b/mod/feedback/templates/create_template.mustache
new file mode 100644
index 00000000000..842ecd10923
--- /dev/null
+++ b/mod/feedback/templates/create_template.mustache
@@ -0,0 +1,35 @@
+{{!
+ 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 .
+}}
+{{!
+ @template mod_feedback/create_template
+ Trigger button for the create template modal form.
+ Classes required for JS:
+ * none
+ Data attributes required for JS:
+ * All data attributes are required
+ Context variables required for this template:
+ * id - The feedback id.
+ Example context (json):
+ {
+ "id": 1
+ }
+}}
+
+{{#js}}
+ require(['mod_feedback/createtemplate'], function(createtemplate) {
+ createtemplate.init();
+ });
+{{/js}}
diff --git a/mod/feedback/templates/main_action_menu.mustache b/mod/feedback/templates/main_action_menu.mustache
new file mode 100644
index 00000000000..6c72a6d7e60
--- /dev/null
+++ b/mod/feedback/templates/main_action_menu.mustache
@@ -0,0 +1,185 @@
+{{!
+ 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 .
+}}
+{{!
+ @template mod_feedback/main_action_menu
+ Tertiary nav for the feedback module
+ Classes required for JS:
+ * none
+ Data attributes required for JS:
+ * data-region
+ Context variables required for this template:
+ * see mod/feedback/classes/output/edit_action_bar.php
+ * see mod/feedback/classes/output/edit_template_action_bar.php
+ * see mod/feedback/classes/output/responses_action_bar.php
+ * see mod/feedback/classes/output/standard_action_bar.php
+ Example context (json):
+ {
+ "left": {
+ "actionlink": {
+ "disabled": false,
+ "url": "#",
+ "id": "test-id",
+ "classes": "btn btn-link",
+ "attributes": [
+ {
+ "name": "title",
+ "value": "Action link's title"
+ }
+ ],
+ "icon": {
+ "attributes": [
+ {"name": "src", "value": "https://raw.githubusercontent.com/moodle/moodle/master/pix/t/check.png"},
+ {"name": "alt", "value": "Action link's icon"}
+ ]
+ },
+ "text": "This is an action link"
+ },
+ "urlselect": {
+ "id": "url_select_test",
+ "action": "https://example.com/post",
+ "formid": "url_select_form",
+ "sesskey": "sesskey",
+ "label": "core/url_select",
+ "helpicon": {
+ "title": "Help with something",
+ "text": "Help with something",
+ "url": "http://example.org/help",
+ "linktext": "",
+ "icon":{
+ "extraclasses": "iconhelp",
+ "attributes": [
+ {"name": "src", "value": "../../../pix/help.svg"},
+ {"name": "alt", "value": "Help icon"}
+ ]
+ }
+ },
+ "showbutton": "Go",
+ "options": [{
+ "name": "Group 1", "isgroup": true, "options":
+ [
+ {"name": "Item 1", "isgroup": false, "value": "1"},
+ {"name": "Item 2", "isgroup": false, "value": "2"}
+ ]},
+ {"name": "Group 2", "isgroup": true, "options":
+ [
+ {"name": "Item 3", "isgroup": false, "value": "3"},
+ {"name": "Item 4", "isgroup": false, "value": "4"}
+ ]}],
+ "disabled": false,
+ "title": "Some cool title"
+ },
+ "singleselect": {
+ "name": "lang",
+ "method": "get",
+ "action": "http://localhost/stable_master/mod/scorm/player.php",
+ "classes": "langmenu",
+ "label": "Zombies are coming...",
+ "disabled": false,
+ "title": null,
+ "formid": "randomid",
+ "id": "single_select5833dd4f4b08d108",
+ "params": [
+ {
+ "name": "scoid",
+ "value": "12"
+ },
+ {
+ "name": "cm",
+ "value": "15"
+ },
+ {
+ "name": "mode",
+ "value": "review"
+ },
+ {
+ "name": "currentorg",
+ "value": "eXeMapADrive4823c6301cf72b22b72"
+ }
+ ],
+ "options": [
+ {
+ "value": "en",
+ "name": "English (en)",
+ "selected": true,
+ "optgroup": false
+ },
+ {
+ "value": "ar",
+ "name": "Muhaaaa..",
+ "selected": false,
+ "optgroup": false
+ }
+ ],
+ "labelattributes": [],
+ "helpicon": false
+ }
+ },
+ "usetemplate": {
+ "id": 1,
+ "templateid": 2
+ },
+ "export": {
+ "disabled": false,
+ "url": "#",
+ "id": "test-id",
+ "classes": "btn btn-link",
+ "attributes": [
+ {
+ "name": "title",
+ "value": "Action link's title"
+ }
+ ],
+ "icon": {
+ "attributes": [
+ {"name": "src", "value": "https://raw.githubusercontent.com/moodle/moodle/master/pix/t/check.png"},
+ {"name": "alt", "value": "Action link's icon"}
+ ]
+ },
+ "text": "This is an action link"
+ }
+ }
+}}
+
+
+
+ {{#left}}
+ {{#actionlink}}
+
+ {{> core/action_link}}
+
+ {{/actionlink}}
+ {{#urlselect}}
+
+ {{> core/url_select}}
+
+ {{/urlselect}}
+ {{#singleselect}}
+
+ {{> core/single_select}}
+
+ {{/singleselect}}
+ {{/left}}
+ {{#usetemplate }}
+
+ {{> mod_feedback/use_template }}
+
+ {{/usetemplate}}
+
+ {{#export}}
+
+ {{> core/action_link }}
+
+ {{/export}}
+
+
diff --git a/mod/feedback/templates/use_template.mustache b/mod/feedback/templates/use_template.mustache
new file mode 100644
index 00000000000..cb4119e84f7
--- /dev/null
+++ b/mod/feedback/templates/use_template.mustache
@@ -0,0 +1,37 @@
+{{!
+ 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 .
+}}
+{{!
+ @template mod_feedback/use_template
+ Trigger button for the use template confirmation modal form.
+ Classes required for JS:
+ * none
+ Data attributes required for JS:
+ * All data attributes are required
+ Context variables required for this template:
+ * id - The feedback id.
+ * templateid - The template id.
+ Example context (json):
+ {
+ "id": 1,
+ "templateid": 2
+ }
+}}
+
+{{#js}}
+ require(['mod_feedback/usetemplate'], function(usetemplate) {
+ usetemplate.init();
+ });
+{{/js}}
diff --git a/mod/feedback/upgrade.txt b/mod/feedback/upgrade.txt
index 2e443379ee8..b6eb5f8effa 100644
--- a/mod/feedback/upgrade.txt
+++ b/mod/feedback/upgrade.txt
@@ -1,3 +1,9 @@
+=== 4.0 ===
+* The following files and classes within them have been deprecated in favour of dynamic forms:
+ * edit_form.php
+ * use_templ_form.php
+* The page delete_template.php has been removed as it is now handled within manage_templates.php
+
=== 3.11 ===
The $extradetails parameter in the constructor of the mod_feedback\output\summary class has been deprecated and is not used anymore.
diff --git a/mod/feedback/use_templ.php b/mod/feedback/use_templ.php
index 3fb38f8361a..72a3621f6e8 100644
--- a/mod/feedback/use_templ.php
+++ b/mod/feedback/use_templ.php
@@ -24,10 +24,10 @@
require_once("../../config.php");
require_once("lib.php");
-require_once('use_templ_form.php');
$id = required_param('id', PARAM_INT);
$templateid = optional_param('templateid', false, PARAM_INT);
+$mode = optional_param('mode', '', PARAM_ALPHA);
if (!$templateid) {
redirect('edit.php?id='.$id);
@@ -46,35 +46,29 @@ $feedbackstructure = new mod_feedback_structure($feedback, $cm, 0, $templateid);
require_capability('mod/feedback:edititems', $context);
-$mform = new mod_feedback_use_templ_form();
-$mform->set_data(array('id' => $id, 'templateid' => $templateid));
-
-if ($mform->is_cancelled()) {
- redirect('edit.php?id='.$id.'&do_show=templates');
-} else if ($formdata = $mform->get_data()) {
- feedback_items_from_template($feedback, $templateid, $formdata->deleteolditems);
- redirect('edit.php?id=' . $id);
-}
-
/// Print the page header
$strfeedbacks = get_string("modulenameplural", "feedback");
$strfeedback = get_string("modulename", "feedback");
-navigation_node::override_active_url(new moodle_url('/mod/feedback/edit.php',
- array('id' => $id, 'do_show' => 'templates')));
+$params = ['id' => $id];
+$params += ($mode ? ['mode' => $mode] : []);
+$activeurl = new moodle_url('/mod/feedback/manage_templates.php', $params);
+$PAGE->set_url($activeurl);
+
+if ($mode == 'manage') {
+ navigation_node::override_active_url($activeurl);
+} else {
+ navigation_node::override_active_url(new moodle_url('/mod/feedback/view.php', $params));
+}
+
$PAGE->set_heading($course->fullname);
$PAGE->set_title($feedback->name);
+$actionbar = new \mod_feedback\output\edit_template_action_bar($cm->id, $templateid, $mode);
+/** @var \mod_feedback\output\renderer $renderer */
+$renderer = $PAGE->get_renderer('mod_feedback');
+
echo $OUTPUT->header();
-
-/// Print the main part of the page
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-///////////////////////////////////////////////////////////////////////////
-echo $OUTPUT->heading(format_string($feedback->name));
-
-echo $OUTPUT->heading(get_string('confirmusetemplate', 'feedback'), 4);
-
-$mform->display();
+echo $renderer->main_action_bar($actionbar);
$form = new mod_feedback_complete_form(mod_feedback_complete_form::MODE_VIEW_TEMPLATE,
$feedbackstructure, 'feedback_preview_form', ['templateid' => $templateid]);
diff --git a/mod/feedback/use_templ_form.php b/mod/feedback/use_templ_form.php
index 4f535a8cddf..c97dc96e876 100644
--- a/mod/feedback/use_templ_form.php
+++ b/mod/feedback/use_templ_form.php
@@ -28,7 +28,18 @@ if (!defined('MOODLE_INTERNAL')) {
require_once($CFG->libdir.'/formslib.php');
+/**
+ * The mod_feedback_use_templ_form
+ *
+ * @deprecated since 4.0. New dynamic forms have been created instead.
+ */
class mod_feedback_use_templ_form extends moodleform {
+ public function __construct($action = null, $customdata = null, $method = 'post', $target = '',
+ $attributes = null, $editable = true, $ajaxformdata = null) {
+ debugging('Class mod_feedback_use_templ_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ parent::__construct($action, $customdata, $method, $target, $attributes, $editable, $ajaxformdata);
+ }
+
public function definition() {
$mform =& $this->_form;
@@ -52,5 +63,59 @@ class mod_feedback_use_templ_form extends moodleform {
$this->add_action_buttons();
}
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @return array
+ */
+ public static function get_js_module() {
+ debugging('Class mod_feedback_use_templ_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ return parent::get_js_module();
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @param array $simulatedsubmitteddata
+ * @param array $simulatedsubmittedfiles
+ * @param string $method
+ * @param null $formidentifier
+ * @return array
+ */
+ public static function mock_ajax_submit($simulatedsubmitteddata, $simulatedsubmittedfiles = array(),
+ $method = 'post', $formidentifier = null) {
+ debugging('Class mod_feedback_use_templ_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ return parent::mock_ajax_submit($simulatedsubmitteddata, $simulatedsubmittedfiles, $method, $formidentifier);
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @param array $data
+ * @return array
+ */
+ public static function mock_generate_submit_keys($data = []) {
+ debugging('Class mod_feedback_use_templ_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ return parent::mock_generate_submit_keys($data);
+ }
+
+ /**
+ * Overrides parent static method for deprecation purposes.
+ *
+ * @deprecated since 4.0
+ * @param array $simulatedsubmitteddata
+ * @param array $simulatedsubmittedfiles
+ * @param string $method
+ * @param null $formidentifier
+ */
+ public static function mock_submit($simulatedsubmitteddata, $simulatedsubmittedfiles = array(),
+ $method = 'post', $formidentifier = null) {
+ debugging('Class mod_feedback_use_templ_form is deprecated. Replaced with dynamic forms.', DEBUG_DEVELOPER);
+ parent::mock_submit($simulatedsubmitteddata, $simulatedsubmittedfiles, $method, $formidentifier);
+ }
}
diff --git a/mod/feedback/version.php b/mod/feedback/version.php
index 02a78e820b3..dfe92585ca7 100644
--- a/mod/feedback/version.php
+++ b/mod/feedback/version.php
@@ -24,7 +24,7 @@
defined('MOODLE_INTERNAL') || die();
-$plugin->version = 2021052500; // The current module version (Date: YYYYMMDDXX).
+$plugin->version = 2021052507; // The current module version (Date: YYYYMMDDXX).
$plugin->requires = 2021052500; // Requires this Moodle version.
$plugin->component = 'mod_feedback'; // Full name of the plugin (used for diagnostics)
$plugin->cron = 0;
diff --git a/mod/feedback/view.php b/mod/feedback/view.php
index 42d41d08ed7..5ddd7efa987 100644
--- a/mod/feedback/view.php
+++ b/mod/feedback/view.php
@@ -58,6 +58,17 @@ if (!has_capability('mod/feedback:edititems', $context) &&
exit;
}
+$viewcompletion = $feedbackcompletion->is_open() && $feedbackcompletion->can_complete() && $feedbackcompletion->can_submit();
+$actionbar = new \mod_feedback\output\standard_action_bar(
+ $cm->id,
+ $viewcompletion,
+ $feedbackcompletion->get_resume_page(),
+ $courseid
+);
+
+/** @var \mod_feedback\output\renderer $renderer */
+$renderer = $PAGE->get_renderer('mod_feedback');
+
// Trigger module viewed event.
$feedbackcompletion->trigger_module_viewed();
@@ -76,20 +87,16 @@ if ($courseid) {
}
$preview = html_writer::link($previewlnk, $previewimg);
-echo $OUTPUT->heading(format_string($feedback->name) . $preview);
-
// Render the activity information.
$completiondetails = \core_completion\cm_completion_details::get_instance($cm, $USER->id);
$activitydates = \core\activity_dates::get_dates_for_module($cm, $USER->id);
echo $OUTPUT->activity_information($cm, $completiondetails, $activitydates);
-// Print the tabs.
-require('tabs.php');
-
// Show description.
echo $OUTPUT->box_start('generalbox feedback_description');
$options = (object)array('noclean' => true);
echo format_module_intro('feedback', $feedback, $cm->id);
+echo $renderer->main_action_bar($actionbar);
echo $OUTPUT->box_end();
//show some infos to the feedback
@@ -111,21 +118,23 @@ if (has_capability('mod/feedback:edititems', $context)) {
}
}
-if (!has_capability('mod/feedback:viewreports', $context) &&
+if (!$PAGE->has_secondary_navigation()) {
+ if (!has_capability('mod/feedback:viewreports', $context) &&
$feedbackcompletion->can_view_analysis()) {
- $analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id' => $id));
- echo '';
-}
+ $analysisurl = new moodle_url('/mod/feedback/analysis.php', array('id' => $id));
+ echo '';
+ }
-if (has_capability('mod/feedback:mapcourse', $context) && $feedback->course == SITEID) {
- echo $OUTPUT->box_start('generalbox feedback_mapped_courses');
- echo $OUTPUT->heading(get_string("mappedcourses", "feedback"), 3);
- echo '' . get_string('mapcourse_help', 'feedback') . '
';
- $mapurl = new moodle_url('/mod/feedback/mapcourse.php', array('id' => $id));
- echo '' . html_writer::link($mapurl, get_string('mapcourses', 'feedback')) . '
';
- echo $OUTPUT->box_end();
+ if (has_capability('mod/feedback:mapcourse', $context) && $feedback->course == SITEID) {
+ echo $OUTPUT->box_start('generalbox feedback_mapped_courses');
+ echo $OUTPUT->heading(get_string("mappedcourses", "feedback"), 3);
+ echo '' . get_string('mapcourse_help', 'feedback') . '
';
+ $mapurl = new moodle_url('/mod/feedback/mapcourse.php', array('id' => $id));
+ echo '' . html_writer::link($mapurl, get_string('mapcourses', 'feedback')) . '
';
+ echo $OUTPUT->box_end();
+ }
}
if ($feedbackcompletion->can_complete()) {
@@ -134,18 +143,7 @@ if ($feedbackcompletion->can_complete()) {
// Feedback is not yet open or is already closed.
echo $OUTPUT->notification(get_string('feedback_is_not_open', 'feedback'));
echo $OUTPUT->continue_button(course_get_url($courseid ?: $course->id));
- } else if ($feedbackcompletion->can_submit()) {
- // Display a link to complete feedback or resume.
- $completeurl = new moodle_url('/mod/feedback/complete.php',
- ['id' => $id, 'courseid' => $courseid]);
- if ($startpage = $feedbackcompletion->get_resume_page()) {
- $completeurl->param('gopage', $startpage);
- $label = get_string('continue_the_form', 'feedback');
- } else {
- $label = get_string('complete_the_form', 'feedback');
- }
- echo html_writer::div(html_writer::link($completeurl, $label, array('class' => 'btn btn-secondary')), 'complete-feedback');
- } else {
+ } else if (!$feedbackcompletion->can_submit()) {
// Feedback was already submitted.
echo $OUTPUT->notification(get_string('this_feedback_is_already_submitted', 'feedback'));
$OUTPUT->continue_button(course_get_url($courseid ?: $course->id));