From 773051b98f61d4bd18e080d16926a3d7ffb2737f Mon Sep 17 00:00:00 2001 From: Peter Dias Date: Wed, 16 Jun 2021 12:55:02 +0800 Subject: [PATCH] MDL-71914 mod_feedback: Add tertiary nav in feedback --- mod/feedback/amd/build/createtemplate.min.js | 2 + .../amd/build/createtemplate.min.js.map | 1 + mod/feedback/amd/build/usetemplate.min.js | 2 + mod/feedback/amd/build/usetemplate.min.js.map | 1 + mod/feedback/amd/src/createtemplate.js | 70 +++++++ mod/feedback/amd/src/usetemplate.js | 67 +++++++ mod/feedback/analysis.php | 8 +- mod/feedback/analysis_course.php | 7 +- mod/feedback/classes/completion.php | 2 +- .../classes/form/create_template_form.php | 115 +++++++++++ .../classes/form/use_template_form.php | 120 ++++++++++++ .../classes/local/views/secondary.php | 75 +++++++ .../classes/output/base_action_bar.php | 101 ++++++++++ .../classes/output/edit_action_bar.php | 96 +++++++++ .../output/edit_template_action_bar.php | 86 ++++++++ mod/feedback/classes/output/renderer.php | 50 +++++ .../classes/output/responses_action_bar.php | 72 +++++++ .../classes/output/standard_action_bar.php | 92 +++++++++ mod/feedback/classes/templates_table.php | 38 +++- mod/feedback/complete.php | 11 +- mod/feedback/edit.php | 103 ++-------- mod/feedback/edit_form.php | 135 ++++++++++++- mod/feedback/edit_item.php | 5 +- mod/feedback/import.php | 15 +- mod/feedback/import_form.php | 8 +- mod/feedback/index.php | 4 +- .../item/feedback_item_form_class.php | 2 +- mod/feedback/lang/en/feedback.php | 3 + mod/feedback/lib.php | 57 +++--- ...lete_template.php => manage_templates.php} | 84 ++++---- mod/feedback/mapcourse.php | 7 +- mod/feedback/show_entries.php | 9 +- mod/feedback/show_nonrespondents.php | 7 +- .../templates/create_template.mustache | 35 ++++ .../templates/main_action_menu.mustache | 185 ++++++++++++++++++ mod/feedback/templates/use_template.mustache | 37 ++++ mod/feedback/upgrade.txt | 6 + mod/feedback/use_templ.php | 40 ++-- mod/feedback/use_templ_form.php | 65 ++++++ mod/feedback/version.php | 2 +- mod/feedback/view.php | 58 +++--- 41 files changed, 1629 insertions(+), 254 deletions(-) create mode 100644 mod/feedback/amd/build/createtemplate.min.js create mode 100644 mod/feedback/amd/build/createtemplate.min.js.map create mode 100644 mod/feedback/amd/build/usetemplate.min.js create mode 100644 mod/feedback/amd/build/usetemplate.min.js.map create mode 100644 mod/feedback/amd/src/createtemplate.js create mode 100644 mod/feedback/amd/src/usetemplate.js create mode 100644 mod/feedback/classes/form/create_template_form.php create mode 100644 mod/feedback/classes/form/use_template_form.php create mode 100644 mod/feedback/classes/local/views/secondary.php create mode 100644 mod/feedback/classes/output/base_action_bar.php create mode 100644 mod/feedback/classes/output/edit_action_bar.php create mode 100644 mod/feedback/classes/output/edit_template_action_bar.php create mode 100644 mod/feedback/classes/output/renderer.php create mode 100644 mod/feedback/classes/output/responses_action_bar.php create mode 100644 mod/feedback/classes/output/standard_action_bar.php rename mod/feedback/{delete_template.php => manage_templates.php} (51%) create mode 100644 mod/feedback/templates/create_template.mustache create mode 100644 mod/feedback/templates/main_action_menu.mustache create mode 100644 mod/feedback/templates/use_template.mustache 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));