diff --git a/grade/report/singleview/amd/build/bulkactions.min.js b/grade/report/singleview/amd/build/bulkactions.min.js new file mode 100644 index 0000000000000..b7fe60c98da72 --- /dev/null +++ b/grade/report/singleview/amd/build/bulkactions.min.js @@ -0,0 +1,10 @@ +define("gradereport_singleview/bulkactions",["exports","core/pending","core/custom_interaction_events","core/modal_factory","core/templates","core/modal_events"],(function(_exports,_pending,_custom_interaction_events,_modal_factory,_templates,_modal_events){function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj}} +/** + * Javascript module for bulk actions. + * + * @module gradereport_singleview/bulkactions + * @copyright 2022 Ilya Tregubov + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_pending=_interopRequireDefault(_pending),_custom_interaction_events=_interopRequireDefault(_custom_interaction_events),_modal_factory=_interopRequireDefault(_modal_factory),_templates=_interopRequireDefault(_templates),_modal_events=_interopRequireDefault(_modal_events);_exports.init=()=>{const pendingPromise=new _pending.default;registerListenerEvents(),pendingPromise.resolve()};const registerListenerEvents=()=>{const events=["click",_custom_interaction_events.default.events.activate,_custom_interaction_events.default.events.keyboardActivate];_custom_interaction_events.default.define(document,events),events.forEach((event=>{document.addEventListener(event,(async e=>{const trigger=e.target.closest("[data-role]");if(trigger)if("overrideallgrades"===trigger.dataset.role||"overridenonegrades"===trigger.dataset.role){const overrideAll=document.querySelectorAll("input[type=checkbox][name^=override]");if("overridenonegrades"===trigger.dataset.role){const confirm=new M.core.confirm({title:M.util.get_string("removeoverride","gradereport_singleview"),question:M.util.get_string("overridenoneconfirm","gradereport_singleview"),noLabel:M.util.get_string("cancel","moodle"),yesLabel:M.util.get_string("removeoverridesave","gradereport_singleview")});confirm.on("complete-yes",(function(){confirm.hide(),confirm.destroy(),overrideAll.forEach((function(el){el.checked&&el.click()}))}),self),confirm.show()}else overrideAll.forEach((function(el){el.checked||el.click()}))}else if("excludeallgrades"===trigger.dataset.role||"excludenonegrades"===trigger.dataset.role){const excludeAll=document.querySelectorAll("input[type=checkbox][name^=exclude]"),checked="excludeallgrades"===trigger.dataset.role;excludeAll.forEach((function(el){el.checked=checked}))}else"bulklegend"===trigger.dataset.role&&_modal_factory.default.create({type:_modal_factory.default.types.SAVE_CANCEL,body:_templates.default.render("gradereport_singleview/bulkinsert",{id:"bulkinsertmodal",name:"bulkinsertmodal"}),title:"Bulk insert"}).then((function(modal){return modal.setSaveButtonText("Save"),modal.getFooter().find('[data-action="save"]').attr("disabled",!0),modal.getRoot().on(_modal_events.default.hidden,(function(){modal.getRoot().remove()})),modal.getRoot().on("change",'input[type="checkbox"]',(e=>{if(e.preventDefault(),e.target.checked){modal.getRoot().find(".formdata").removeClass("dimmed_text"),modal.getRoot().find('input[type="radio"]').removeAttr("disabled"),modal.getRoot().find('input[type="text"]').removeAttr("disabled");modal.getRoot().find('input[type="radio"]:checked').val()&&modal.getFooter().find('[data-action="save"]').removeAttr("disabled")}else modal.getRoot().find(".formdata").addClass("dimmed_text"),modal.getRoot().find('input[type="radio"]').attr("disabled",!0),modal.getRoot().find('input[type="text"]').attr("disabled",!0),modal.getFooter().find('[data-action="save"]').attr("disabled",!0)})),modal.getRoot().on("change",'input[type="radio"]',(e=>{e.preventDefault(),modal.getFooter().find('[data-action="save"]').removeAttr("disabled")})),modal.getRoot().on(_modal_events.default.save,(function(){document.querySelector('input[type="checkbox"][name^=bulk]').checked=!0;const formRadioData=modal.getRoot().find('input[type="radio"]:checked').val();document.querySelector("select[name^=bulk]").value=formRadioData;const formData=modal.getRoot().find(".form-control").val();document.querySelector('input[type="text"][name^=bulk]').value=formData,document.querySelector('input[type="submit"]').click()})),modal.show(),modal}))}))}))}})); + +//# sourceMappingURL=bulkactions.min.js.map \ No newline at end of file diff --git a/grade/report/singleview/amd/build/bulkactions.min.js.map b/grade/report/singleview/amd/build/bulkactions.min.js.map new file mode 100644 index 0000000000000..f06d42d1cadf1 --- /dev/null +++ b/grade/report/singleview/amd/build/bulkactions.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"bulkactions.min.js","sources":["../src/bulkactions.js"],"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 bulk actions.\n *\n * @module gradereport_singleview/bulkactions\n * @copyright 2022 Ilya Tregubov \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport Pending from 'core/pending';\nimport CustomEvents from \"core/custom_interaction_events\";\nimport ModalFactory from 'core/modal_factory';\nimport Templates from 'core/templates';\nimport ModalEvents from 'core/modal_events';\n\n/**\n * Initialize module.\n */\nexport const init = () => {\n const pendingPromise = new Pending();\n registerListenerEvents();\n pendingPromise.resolve();\n};\n\n/**\n * Register bulk actions related event listeners.\n *\n * @method registerListenerEvents\n */\nconst registerListenerEvents = () => {\n const events = [\n 'click',\n CustomEvents.events.activate,\n CustomEvents.events.keyboardActivate\n ];\n CustomEvents.define(document, events);\n\n // Register events.\n events.forEach((event) => {\n document.addEventListener(event, async(e) => {\n const trigger = e.target.closest('[data-role]');\n if (trigger) {\n if ((trigger.dataset.role === 'overrideallgrades') || (trigger.dataset.role === 'overridenonegrades')) {\n const overrideAll = document.querySelectorAll('input[type=checkbox][name^=override]');\n\n if (trigger.dataset.role === 'overridenonegrades') {\n const confirm = new M.core.confirm({\n title: M.util.get_string('removeoverride', 'gradereport_singleview'),\n question: M.util.get_string('overridenoneconfirm', 'gradereport_singleview'),\n noLabel: M.util.get_string('cancel', 'moodle'),\n yesLabel: M.util.get_string('removeoverridesave', 'gradereport_singleview')\n });\n\n confirm.on('complete-yes', function () {\n confirm.hide();\n confirm.destroy();\n\n overrideAll.forEach(function (el) {\n if (el.checked) {\n el.click();\n }\n });\n }, self);\n confirm.show();\n } else {\n overrideAll.forEach(function (el) {\n if (!el.checked) {\n el.click();\n }\n });\n }\n } else if ((trigger.dataset.role === 'excludeallgrades') || (trigger.dataset.role === 'excludenonegrades')) {\n const excludeAll = document.querySelectorAll('input[type=checkbox][name^=exclude]');\n const checked = (trigger.dataset.role === 'excludeallgrades');\n excludeAll.forEach(function (el) {\n el.checked = checked;\n });\n } else if (trigger.dataset.role === 'bulklegend') {\n ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n body: Templates.render('gradereport_singleview/bulkinsert', {\n id: 'bulkinsertmodal',\n name: 'bulkinsertmodal'\n }),\n title: 'Bulk insert',\n })\n .then(function (modal) {\n modal.setSaveButtonText('Save');\n modal.getFooter().find('[data-action=\"save\"]').attr('disabled', true);\n\n modal.getRoot().on(ModalEvents.hidden, function () {\n modal.getRoot().remove();\n });\n\n modal.getRoot().on('change', 'input[type=\"checkbox\"]',\n (e) => {\n e.preventDefault();\n if (e.target.checked) {\n modal.getRoot().find('.formdata').removeClass('dimmed_text');\n modal.getRoot().find('input[type=\"radio\"]').removeAttr('disabled');\n modal.getRoot().find('input[type=\"text\"]').removeAttr('disabled');\n\n const formRadioData = modal.getRoot().find('input[type=\"radio\"]:checked').val();\n if (formRadioData) {\n modal.getFooter().find('[data-action=\"save\"]').removeAttr('disabled');\n }\n } else {\n modal.getRoot().find('.formdata').addClass('dimmed_text');\n modal.getRoot().find('input[type=\"radio\"]').attr('disabled', true);\n modal.getRoot().find('input[type=\"text\"]').attr('disabled', true);\n modal.getFooter().find('[data-action=\"save\"]').attr('disabled', true);\n }\n });\n\n modal.getRoot().on('change', 'input[type=\"radio\"]',\n (e) => {\n e.preventDefault();\n modal.getFooter().find('[data-action=\"save\"]').removeAttr('disabled');\n });\n\n modal.getRoot().on(ModalEvents.save, function () {\n document.querySelector('input[type=\"checkbox\"][name^=bulk]').checked = true;\n\n const formRadioData = modal.getRoot().find('input[type=\"radio\"]:checked').val();\n const $select = document.querySelector('select[name^=bulk]');\n $select.value = formRadioData;\n\n const formData = modal.getRoot().find('.form-control').val();\n document.querySelector('input[type=\"text\"][name^=bulk]').value = formData;\n document.querySelector('input[type=\"submit\"]').click();\n });\n\n modal.show();\n\n return modal;\n });\n }\n }\n });\n });\n};\n"],"names":["pendingPromise","Pending","registerListenerEvents","resolve","events","CustomEvents","activate","keyboardActivate","define","document","forEach","event","addEventListener","async","trigger","e","target","closest","dataset","role","overrideAll","querySelectorAll","confirm","M","core","title","util","get_string","question","noLabel","yesLabel","on","hide","destroy","el","checked","click","self","show","excludeAll","create","type","ModalFactory","types","SAVE_CANCEL","body","Templates","render","id","name","then","modal","setSaveButtonText","getFooter","find","attr","getRoot","ModalEvents","hidden","remove","preventDefault","removeClass","removeAttr","val","addClass","save","querySelector","formRadioData","value","formData"],"mappings":";;;;;;;gXAgCoB,WACVA,eAAiB,IAAIC,iBAC3BC,yBACAF,eAAeG,iBAQbD,uBAAyB,WACrBE,OAAS,CACX,QACAC,mCAAaD,OAAOE,SACpBD,mCAAaD,OAAOG,qDAEXC,OAAOC,SAAUL,QAG9BA,OAAOM,SAASC,QACZF,SAASG,iBAAiBD,OAAOE,MAAAA,UACvBC,QAAUC,EAAEC,OAAOC,QAAQ,kBAC7BH,WAC8B,sBAAzBA,QAAQI,QAAQC,MAA2D,uBAAzBL,QAAQI,QAAQC,KAAgC,OAC7FC,YAAcX,SAASY,iBAAiB,2CAEjB,uBAAzBP,QAAQI,QAAQC,KAA+B,OACzCG,QAAU,IAAIC,EAAEC,KAAKF,QAAQ,CAC/BG,MAAOF,EAAEG,KAAKC,WAAW,iBAAkB,0BAC3CC,SAAUL,EAAEG,KAAKC,WAAW,sBAAuB,0BACnDE,QAASN,EAAEG,KAAKC,WAAW,SAAU,UACrCG,SAAUP,EAAEG,KAAKC,WAAW,qBAAsB,4BAGtDL,QAAQS,GAAG,gBAAgB,WACvBT,QAAQU,OACRV,QAAQW,UAERb,YAAYV,SAAQ,SAAUwB,IACtBA,GAAGC,SACHD,GAAGE,aAGZC,MACHf,QAAQgB,YAERlB,YAAYV,SAAQ,SAAUwB,IACrBA,GAAGC,SACJD,GAAGE,gBAIZ,GAA8B,qBAAzBtB,QAAQI,QAAQC,MAA0D,sBAAzBL,QAAQI,QAAQC,KAA+B,OAClGoB,WAAa9B,SAASY,iBAAiB,uCACvCc,QAAoC,qBAAzBrB,QAAQI,QAAQC,KACjCoB,WAAW7B,SAAQ,SAAUwB,IACzBA,GAAGC,QAAUA,eAEe,eAAzBrB,QAAQI,QAAQC,6BACVqB,OAAO,CAChBC,KAAMC,uBAAaC,MAAMC,YACzBC,KAAMC,mBAAUC,OAAO,oCAAqC,CACxDC,GAAI,kBACJC,KAAM,oBAEVxB,MAAO,gBAENyB,MAAK,SAAUC,cACZA,MAAMC,kBAAkB,QACxBD,MAAME,YAAYC,KAAK,wBAAwBC,KAAK,YAAY,GAEhEJ,MAAMK,UAAUzB,GAAG0B,sBAAYC,QAAQ,WACnCP,MAAMK,UAAUG,YAGpBR,MAAMK,UAAUzB,GAAG,SAAU,0BACxBhB,OACGA,EAAE6C,iBACE7C,EAAEC,OAAOmB,QAAS,CAClBgB,MAAMK,UAAUF,KAAK,aAAaO,YAAY,eAC9CV,MAAMK,UAAUF,KAAK,uBAAuBQ,WAAW,YACvDX,MAAMK,UAAUF,KAAK,sBAAsBQ,WAAW,YAEhCX,MAAMK,UAAUF,KAAK,+BAA+BS,OAEtEZ,MAAME,YAAYC,KAAK,wBAAwBQ,WAAW,iBAG9DX,MAAMK,UAAUF,KAAK,aAAaU,SAAS,eAC3Cb,MAAMK,UAAUF,KAAK,uBAAuBC,KAAK,YAAY,GAC7DJ,MAAMK,UAAUF,KAAK,sBAAsBC,KAAK,YAAY,GAC5DJ,MAAME,YAAYC,KAAK,wBAAwBC,KAAK,YAAY,MAI5EJ,MAAMK,UAAUzB,GAAG,SAAU,uBACxBhB,IACGA,EAAE6C,iBACFT,MAAME,YAAYC,KAAK,wBAAwBQ,WAAW,eAGlEX,MAAMK,UAAUzB,GAAG0B,sBAAYQ,MAAM,WACjCxD,SAASyD,cAAc,sCAAsC/B,SAAU,QAEjEgC,cAAgBhB,MAAMK,UAAUF,KAAK,+BAA+BS,MAC1DtD,SAASyD,cAAc,sBAC/BE,MAAQD,oBAEVE,SAAWlB,MAAMK,UAAUF,KAAK,iBAAiBS,MACvDtD,SAASyD,cAAc,kCAAkCE,MAAQC,SACjE5D,SAASyD,cAAc,wBAAwB9B,WAGnDe,MAAMb,OAECa"} \ No newline at end of file diff --git a/grade/report/singleview/amd/src/bulkactions.js b/grade/report/singleview/amd/src/bulkactions.js new file mode 100644 index 0000000000000..58344fb493409 --- /dev/null +++ b/grade/report/singleview/amd/src/bulkactions.js @@ -0,0 +1,155 @@ +// 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 bulk actions. + * + * @module gradereport_singleview/bulkactions + * @copyright 2022 Ilya Tregubov + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +import Pending from 'core/pending'; +import CustomEvents from "core/custom_interaction_events"; +import ModalFactory from 'core/modal_factory'; +import Templates from 'core/templates'; +import ModalEvents from 'core/modal_events'; + +/** + * Initialize module. + */ +export const init = () => { + const pendingPromise = new Pending(); + registerListenerEvents(); + pendingPromise.resolve(); +}; + +/** + * Register bulk actions related event listeners. + * + * @method registerListenerEvents + */ +const registerListenerEvents = () => { + const events = [ + 'click', + CustomEvents.events.activate, + CustomEvents.events.keyboardActivate + ]; + CustomEvents.define(document, events); + + // Register events. + events.forEach((event) => { + document.addEventListener(event, async(e) => { + const trigger = e.target.closest('[data-role]'); + if (trigger) { + if ((trigger.dataset.role === 'overrideallgrades') || (trigger.dataset.role === 'overridenonegrades')) { + const overrideAll = document.querySelectorAll('input[type=checkbox][name^=override]'); + + if (trigger.dataset.role === 'overridenonegrades') { + const confirm = new M.core.confirm({ + title: M.util.get_string('removeoverride', 'gradereport_singleview'), + question: M.util.get_string('overridenoneconfirm', 'gradereport_singleview'), + noLabel: M.util.get_string('cancel', 'moodle'), + yesLabel: M.util.get_string('removeoverridesave', 'gradereport_singleview') + }); + + confirm.on('complete-yes', function () { + confirm.hide(); + confirm.destroy(); + + overrideAll.forEach(function (el) { + if (el.checked) { + el.click(); + } + }); + }, self); + confirm.show(); + } else { + overrideAll.forEach(function (el) { + if (!el.checked) { + el.click(); + } + }); + } + } else if ((trigger.dataset.role === 'excludeallgrades') || (trigger.dataset.role === 'excludenonegrades')) { + const excludeAll = document.querySelectorAll('input[type=checkbox][name^=exclude]'); + const checked = (trigger.dataset.role === 'excludeallgrades'); + excludeAll.forEach(function (el) { + el.checked = checked; + }); + } else if (trigger.dataset.role === 'bulklegend') { + ModalFactory.create({ + type: ModalFactory.types.SAVE_CANCEL, + body: Templates.render('gradereport_singleview/bulkinsert', { + id: 'bulkinsertmodal', + name: 'bulkinsertmodal' + }), + title: 'Bulk insert', + }) + .then(function (modal) { + modal.setSaveButtonText('Save'); + modal.getFooter().find('[data-action="save"]').attr('disabled', true); + + modal.getRoot().on(ModalEvents.hidden, function () { + modal.getRoot().remove(); + }); + + modal.getRoot().on('change', 'input[type="checkbox"]', + (e) => { + e.preventDefault(); + if (e.target.checked) { + modal.getRoot().find('.formdata').removeClass('dimmed_text'); + modal.getRoot().find('input[type="radio"]').removeAttr('disabled'); + modal.getRoot().find('input[type="text"]').removeAttr('disabled'); + + const formRadioData = modal.getRoot().find('input[type="radio"]:checked').val(); + if (formRadioData) { + modal.getFooter().find('[data-action="save"]').removeAttr('disabled'); + } + } else { + modal.getRoot().find('.formdata').addClass('dimmed_text'); + modal.getRoot().find('input[type="radio"]').attr('disabled', true); + modal.getRoot().find('input[type="text"]').attr('disabled', true); + modal.getFooter().find('[data-action="save"]').attr('disabled', true); + } + }); + + modal.getRoot().on('change', 'input[type="radio"]', + (e) => { + e.preventDefault(); + modal.getFooter().find('[data-action="save"]').removeAttr('disabled'); + }); + + modal.getRoot().on(ModalEvents.save, function () { + document.querySelector('input[type="checkbox"][name^=bulk]').checked = true; + + const formRadioData = modal.getRoot().find('input[type="radio"]:checked').val(); + const $select = document.querySelector('select[name^=bulk]'); + $select.value = formRadioData; + + const formData = modal.getRoot().find('.form-control').val(); + document.querySelector('input[type="text"][name^=bulk]').value = formData; + document.querySelector('input[type="submit"]').click(); + }); + + modal.show(); + + return modal; + }); + } + } + }); + }); +}; diff --git a/grade/report/singleview/classes/local/screen/screen.php b/grade/report/singleview/classes/local/screen/screen.php index 2abd4827a1b46..88d019ded7f86 100644 --- a/grade/report/singleview/classes/local/screen/screen.php +++ b/grade/report/singleview/classes/local/screen/screen.php @@ -246,7 +246,8 @@ public function js() { 'requires' => ['base', 'dom', 'event', 'event-simulate', 'io-base'] ]; - $PAGE->requires->string_for_js('overridenoneconfirm', 'gradereport_singleview'); + $PAGE->requires->strings_for_js(['overridenoneconfirm', 'removeoverride', 'removeoverridesave'], + 'gradereport_singleview'); $PAGE->requires->js_init_call('M.gradereport_singleview.init', [], false, $module); } diff --git a/grade/report/singleview/classes/output/action_bar.php b/grade/report/singleview/classes/output/action_bar.php index 59c0012e0349a..fb190f3e44dc9 100644 --- a/grade/report/singleview/classes/output/action_bar.php +++ b/grade/report/singleview/classes/output/action_bar.php @@ -66,6 +66,8 @@ public function get_template(): string { * @return array */ public function export_for_template(renderer_base $output) { + global $USER; + $courseid = $this->context->instanceid; // Get the data used to output the general navigation selector. $generalnavselector = new \core_grades\output\general_action_bar( @@ -92,6 +94,10 @@ public function export_for_template(renderer_base $output) { $data['pbarurl'] = $this->report->pbarurl->out(false); + if (!empty($USER->editing) && isset($this->report->screen->item)) { + $data['bulkactions'] = $this->report->bulk_actions_menu($output); + } + return $data; } } diff --git a/grade/report/singleview/classes/report/singleview.php b/grade/report/singleview/classes/report/singleview.php index 38d6b8a35f15a..58cb86addddec 100644 --- a/grade/report/singleview/classes/report/singleview.php +++ b/grade/report/singleview/classes/report/singleview.php @@ -19,6 +19,7 @@ use context_course; use grade_report; use moodle_url; +use renderer_base; use stdClass; defined('MOODLE_INTERNAL') || die; @@ -167,4 +168,33 @@ protected function setup_item_selector(string $itemtype, ?int $itemid) { $this->itemselector = $renderer->grade_items_selector($this->course, $itemid); } } + + /** + * Adds bulk actions menu. + * + * @param renderer_base $output + * @return string HTML to display + */ + public function bulk_actions_menu(renderer_base $output) : string { + $options = [ + 'overrideallgrades' => get_string('overrideallgrades', 'gradereport_singleview'), + 'overridenonegrades' => get_string('overridenonegrades', 'gradereport_singleview'), + 'excludeallgrades' => get_string('excludeallgrades', 'gradereport_singleview'), + 'excludenonegrades' => get_string('excludenonegrades', 'gradereport_singleview'), + 'bulklegend' => get_string('bulklegend', 'gradereport_singleview') + ]; + + $menu = new \action_menu(); + $menu->set_menu_trigger(get_string('actions'), 'text-dark'); + + foreach ($options as $type => $option) { + $action = new \action_menu_link_secondary(new \moodle_url('#'), null, $option, + ['data-role' => $type]); + $menu->add($action); + } + $menu->attributes['class'] .= ' float-left my-auto'; + + return $output->render($menu); + } + } diff --git a/grade/report/singleview/lang/en/gradereport_singleview.php b/grade/report/singleview/lang/en/gradereport_singleview.php index a299b807d8450..2335905fdf2f6 100644 --- a/grade/report/singleview/lang/en/gradereport_singleview.php +++ b/grade/report/singleview/lang/en/gradereport_singleview.php @@ -30,14 +30,18 @@ $string['blanks'] = 'Empty grades'; $string['bulkappliesto'] = 'For'; $string['bulkinsertvalue'] = 'Insert value'; +$string['bulkinsertvaluemodal'] = 'Insert value modal'; $string['bulklegend'] = 'Bulk insert'; +$string['bulkchoice'] = 'For which grades do you want to insert?'; $string['bulkperform'] = 'Perform bulk insert'; $string['bulkfor'] = 'Grades for {$a}'; $string['entrypage'] = 'Grade user or grade item'; $string['exclude'] = 'Exclude'; $string['excludeall'] = 'Exclude all grades'; +$string['excludeallgrades'] = 'Exclude All'; $string['excludefor'] = 'Exclude for {$a}'; $string['excludenone'] = 'Do not exclude any grades'; +$string['excludenonegrades'] = 'Exclude None'; $string['eventgradereportviewed'] = 'Grade single view report viewed.'; $string['feedbackfor'] = 'Feedback for {$a}'; $string['gradefor'] = 'Grade for {$a}'; @@ -51,11 +55,15 @@ $string['notvalid'] = 'Not a valid Single view screen: {$a}'; $string['override'] = 'Override'; $string['overrideall'] = 'Override all grades'; +$string['overrideallgrades'] = 'Override All'; $string['overridefor'] = 'Override for {$a}'; $string['overridenone'] = 'Do not override any grades'; -$string['overridenoneconfirm'] = 'You are about to disable grade overrides. This will remove all previously overridden grades. Are you sure you want to continue?'; +$string['overridenonegrades'] = 'Override None'; +$string['overridenoneconfirm'] = 'This will remove all previously entered overridden grades on this page when you save changes.'; $string['pluginname'] = 'Single view'; $string['privacy:metadata'] = 'The Grade single view report only shows data stored in other locations.'; +$string['removeoverride'] = 'Remove grade overrides'; +$string['removeoverridesave'] = 'Remove overrides'; $string['savegrades'] = 'Saving grades'; $string['save'] = 'Save'; $string['savegradessuccess'] = 'Grades were set for {$a} items'; @@ -64,6 +72,9 @@ $string['singleview:view'] = 'View report'; $string['summarygrade'] = 'A table of users, with columns for range, grade, feedback, and whether to override or exclude a particular grade.'; $string['summaryuser'] = 'A table of grade items, with columns for grade category, range, grade, feedback, and whether to override or exclude a particular grade.'; +$string['unsavedataalert'] = 'If you have unsave changes in grades table, you might lose some data when chosing "All grades" and click Save.'; +$string['unsavedataconfirm'] = 'I understand that my unsaved data might be lost'; +$string['users'] = 'Users'; $string['userselect'] = 'Select activity'; $string['ariareporttype'] = 'Select a report type to view'; diff --git a/grade/report/singleview/templates/action_bar.mustache b/grade/report/singleview/templates/action_bar.mustache index 8e51ade27e716..27b80c89edbb7 100644 --- a/grade/report/singleview/templates/action_bar.mustache +++ b/grade/report/singleview/templates/action_bar.mustache @@ -39,6 +39,15 @@ {{/itemselector}} {{#pagetoggler}}
+ {{#bulkactions}} + + + {{#js}} + require(['gradereport_singleview/bulkactions'], function(bulkactions) { + bulkactions.init(); + }); + {{/js}} + {{/bulkactions}}