From b05a56602ca8d18abd762b47f54b9a313bf5986a Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Mon, 20 Sep 2021 10:39:50 +0800 Subject: [PATCH 1/2] MDL-69364 enrol: Improve cohort test --- user/tests/behat/enrol_cohort_list.feature | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/user/tests/behat/enrol_cohort_list.feature b/user/tests/behat/enrol_cohort_list.feature index 17acd891676..fe32af431f6 100644 --- a/user/tests/behat/enrol_cohort_list.feature +++ b/user/tests/behat/enrol_cohort_list.feature @@ -27,8 +27,7 @@ Feature: Viewing the list of cohorts to enrol in a course | moodle/cohort:manage | Prohibit | | moodle/cohort:view | Prohibit | And I log out - And I log in as "teacher1" - And I am on "Course 1" course homepage + And I am on the "Course 1" course page logged in as teacher1 And I navigate to course participants When I press "Enrol users" Then I should not see "Select cohorts" @@ -40,8 +39,7 @@ Feature: Viewing the list of cohorts to enrol in a course | name | Test cohort name | | idnumber | 1337 | | description | Test cohort description | - And I log in as "teacher1" - And I am on "Course 1" course homepage + And I am on the "Course 1" course page logged in as teacher1 And I navigate to course participants When I press "Enrol users" Then I should see "Select cohorts" @@ -49,8 +47,7 @@ Feature: Viewing the list of cohorts to enrol in a course @javascript Scenario: Check we do not show the cohorts field if there are none present - Given I log in as "teacher1" - And I am on "Course 1" course homepage + Given I am on the "Course 1" course page logged in as teacher1 And I navigate to course participants When I press "Enrol users" Then I should not see "Select cohorts" From 96edd40beb82d361c62d49b1e21b1fec8800688e Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Mon, 20 Sep 2021 10:36:42 +0800 Subject: [PATCH 2/2] MDL-69364 enrol: Improve setting of save button --- enrol/manual/amd/build/quickenrolment.min.js | 2 +- .../amd/build/quickenrolment.min.js.map | 2 +- enrol/manual/amd/src/quickenrolment.js | 25 ++++++++----------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/enrol/manual/amd/build/quickenrolment.min.js b/enrol/manual/amd/build/quickenrolment.min.js index 02411ec7ef8..413250c7e59 100644 --- a/enrol/manual/amd/build/quickenrolment.min.js +++ b/enrol/manual/amd/build/quickenrolment.min.js @@ -1,2 +1,2 @@ -function _typeof(a){"@babel/helpers - typeof";if("function"==typeof Symbol&&"symbol"==typeof Symbol.iterator){_typeof=function(a){return typeof a}}else{_typeof=function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a}}return _typeof(a)}define ("enrol_manual/quickenrolment",["exports","core_table/dynamic","core/str","core/toast","core/config","core/fragment","core/modal_events","core/modal_factory","core/notification","jquery","core/pending","core/prefetch"],function(a,b,c,d,e,f,g,h,i,j,k,l){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=o(b);c=o(c);d=o(d);e=m(e);f=m(f);g=m(g);h=m(h);i=m(i);j=m(j);k=m(k);l=m(l);function m(a){return a&&a.__esModule?a:{default:a}}function n(){if("function"!=typeof WeakMap)return null;var a=new WeakMap;n=function(){return a};return a}function o(a){if(a&&a.__esModule){return a}if(null===a||"object"!==_typeof(a)&&"function"!=typeof a){return{default:a}}var b=n();if(b&&b.has(a)){return b.get(a)}var c={},d=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var e in a){if(Object.prototype.hasOwnProperty.call(a,e)){var f=d?Object.getOwnPropertyDescriptor(a,e):null;if(f&&(f.get||f.set)){Object.defineProperty(c,e,f)}else{c[e]=a[e]}}}c.default=a;if(b){b.set(a,c)}return c}function p(a,b){return u(a)||t(a,b)||r(a,b)||q()}function q(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function r(a,b){if(!a)return;if("string"==typeof a)return s(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);if("Object"===c&&a.constructor)c=a.constructor.name;if("Map"===c||"Set"===c)return Array.from(c);if("Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c))return s(a,b)}function s(a,b){if(null==b||b>a.length)b=a.length;for(var c=0,d=Array(b);ca.length)b=a.length;for(var c=0,d=Array(b);c.\n\n/**\n * Quick enrolment AMD module.\n *\n * @module enrol_manual/quickenrolment\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport * as DynamicTable from 'core_table/dynamic';\nimport * as Str from 'core/str';\nimport * as Toast from 'core/toast';\nimport Config from 'core/config';\nimport Fragment from 'core/fragment';\nimport ModalEvents from 'core/modal_events';\nimport ModalFactory from 'core/modal_factory';\nimport Notification from 'core/notification';\nimport jQuery from 'jquery';\nimport Pending from 'core/pending';\nimport Prefetch from 'core/prefetch';\n\nconst Selectors = {\n cohortSelector: \"#id_cohortlist\",\n triggerButtons: \".enrolusersbutton.enrol_manual_plugin [type='submit']\",\n unwantedHiddenFields: \"input[value='_qf__force_multiselect_submission']\",\n buttonWrapper: '[data-region=\"wrapper\"]',\n};\n\n/**\n * Get the content of the body for the specified context.\n *\n * @param {Number} contextId\n * @returns {Promise}\n */\nconst getBodyForContext = contextId => {\n return Fragment.loadFragment('enrol_manual', 'enrol_users_form', contextId, {});\n};\n\n/**\n * Get the dynamic table for the button.\n *\n * @param {HTMLElement} element\n * @returns {HTMLElement}\n */\nconst getDynamicTableForElement = element => {\n const wrapper = element.closest(Selectors.buttonWrapper);\n\n return DynamicTable.getTableFromId(wrapper.dataset.tableUniqueid);\n};\n\n/**\n * Register the event listeners for this contextid.\n *\n * @param {Number} contextId\n */\nconst registerEventListeners = contextId => {\n document.addEventListener('click', e => {\n if (e.target.closest(Selectors.triggerButtons)) {\n e.preventDefault();\n\n showModal(getDynamicTableForElement(e.target), contextId);\n\n return;\n }\n });\n};\n\n/**\n * Display the modal for this contextId.\n *\n * @param {HTMLElement} dynamicTable The table to beb refreshed when changes are made\n * @param {Number} contextId\n * @returns {Promise}\n */\nconst showModal = (dynamicTable, contextId) => {\n const pendingPromise = new Pending('enrol_manual/quickenrolment:showModal');\n\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n large: true,\n title: Str.get_string('enrolusers', 'enrol_manual'),\n body: getBodyForContext(contextId),\n })\n .then(modal => {\n modal.getRoot().on(ModalEvents.save, e => {\n // Trigger a form submission, so that any mform elements can do final tricks before the form submission\n // is processed.\n // The actual submit even tis captured in the next handler.\n\n e.preventDefault();\n modal.getRoot().find('form').submit();\n });\n\n modal.getRoot().on('submit', 'form', e => {\n e.preventDefault();\n\n submitFormAjax(dynamicTable, modal);\n });\n\n modal.getRoot().on(ModalEvents.hidden, () => {\n modal.destroy();\n });\n\n return modal;\n })\n .then(modal => {\n modal.show();\n\n return modal;\n })\n .then(modal => {\n modal.setSaveButtonText(Str.get_string('enrolusers', 'enrol_manual'));\n\n modal.getBodyPromise().then(body => {\n if (body.get(0).querySelector(Selectors.cohortSelector)) {\n modal.setSaveButtonText(Str.get_string('enroluserscohorts', 'enrol_manual'));\n }\n\n return body;\n })\n .catch();\n\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n};\n\n/**\n * Submit the form via ajax.\n *\n * @param {HTMLElement} dynamicTable\n * @param {Object} modal\n */\nconst submitFormAjax = (dynamicTable, modal) => {\n // Note: We use a jQuery object here so that we can use its serialize functionality.\n const form = modal.getRoot().find('form');\n\n // Before send the data through AJAX, we need to parse and remove some unwanted hidden fields.\n // This hidden fields are added automatically by mforms and when it reaches the AJAX we get an error.\n form.get(0).querySelectorAll(Selectors.unwantedHiddenFields).forEach(hiddenField => hiddenField.remove());\n\n modal.hide();\n modal.destroy();\n\n jQuery.ajax(\n `${Config.wwwroot}/enrol/manual/ajax.php?${form.serialize()}`,\n {\n type: 'GET',\n processData: false,\n contentType: \"application/json\",\n }\n )\n .then(response => {\n if (response.error) {\n throw new Error(response.error);\n }\n\n return response.count;\n })\n .then(count => {\n return Promise.all([\n Str.get_string('totalenrolledusers', 'enrol', count),\n DynamicTable.refreshTableContent(dynamicTable),\n ]);\n })\n .then(([notificationBody]) => notificationBody)\n .then(notificationBody => Toast.add(notificationBody))\n .catch(error => {\n Notification.addNotification({\n message: error.message,\n type: 'error',\n });\n });\n};\n\n/**\n * Set up quick enrolment for the manual enrolment plugin.\n *\n * @param {Number} contextid The context id to setup for\n */\nexport const init = ({contextid}) => {\n registerEventListeners(contextid);\n\n Prefetch.prefetchStrings('enrol_manual', [\n 'enrolusers',\n 'enroluserscohorts',\n ]);\n\n Prefetch.prefetchString('enrol', 'totalenrolledusers');\n};\n"],"file":"quickenrolment.min.js"} \ No newline at end of file +{"version":3,"sources":["../src/quickenrolment.js"],"names":["Selectors","cohortSelector","triggerButtons","unwantedHiddenFields","buttonWrapper","getBodyForContext","contextId","Fragment","loadFragment","getDynamicTableForElement","element","wrapper","closest","DynamicTable","getTableFromId","dataset","tableUniqueid","registerEventListeners","document","addEventListener","e","target","preventDefault","showModal","dynamicTable","pendingPromise","Pending","ModalFactory","create","type","types","SAVE_CANCEL","large","title","Str","get_string","body","buttons","save","then","modal","getRoot","on","ModalEvents","find","submit","submitFormAjax","hidden","destroy","show","Promise","all","getBodyPromise","get","querySelector","setSaveButtonText","resolve","catch","Notification","exception","form","querySelectorAll","forEach","hiddenField","remove","hide","jQuery","ajax","Config","wwwroot","serialize","processData","contentType","response","error","Error","count","refreshTableContent","notificationBody","Toast","add","addNotification","message","init","contextid","Prefetch","prefetchStrings","prefetchString"],"mappings":"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","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 * Quick enrolment AMD module.\n *\n * @module enrol_manual/quickenrolment\n * @copyright 2016 Damyon Wiese \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport * as DynamicTable from 'core_table/dynamic';\nimport * as Str from 'core/str';\nimport * as Toast from 'core/toast';\nimport Config from 'core/config';\nimport Fragment from 'core/fragment';\nimport ModalEvents from 'core/modal_events';\nimport ModalFactory from 'core/modal_factory';\nimport Notification from 'core/notification';\nimport jQuery from 'jquery';\nimport Pending from 'core/pending';\nimport Prefetch from 'core/prefetch';\n\nconst Selectors = {\n cohortSelector: \"#id_cohortlist\",\n triggerButtons: \".enrolusersbutton.enrol_manual_plugin [type='submit']\",\n unwantedHiddenFields: \"input[value='_qf__force_multiselect_submission']\",\n buttonWrapper: '[data-region=\"wrapper\"]',\n};\n\n/**\n * Get the content of the body for the specified context.\n *\n * @param {Number} contextId\n * @returns {Promise}\n */\nconst getBodyForContext = contextId => {\n return Fragment.loadFragment('enrol_manual', 'enrol_users_form', contextId, {});\n};\n\n/**\n * Get the dynamic table for the button.\n *\n * @param {HTMLElement} element\n * @returns {HTMLElement}\n */\nconst getDynamicTableForElement = element => {\n const wrapper = element.closest(Selectors.buttonWrapper);\n\n return DynamicTable.getTableFromId(wrapper.dataset.tableUniqueid);\n};\n\n/**\n * Register the event listeners for this contextid.\n *\n * @param {Number} contextId\n */\nconst registerEventListeners = contextId => {\n document.addEventListener('click', e => {\n if (e.target.closest(Selectors.triggerButtons)) {\n e.preventDefault();\n\n showModal(getDynamicTableForElement(e.target), contextId);\n\n return;\n }\n });\n};\n\n/**\n * Display the modal for this contextId.\n *\n * @param {HTMLElement} dynamicTable The table to beb refreshed when changes are made\n * @param {Number} contextId\n * @returns {Promise}\n */\nconst showModal = (dynamicTable, contextId) => {\n const pendingPromise = new Pending('enrol_manual/quickenrolment:showModal');\n\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n large: true,\n title: Str.get_string('enrolusers', 'enrol_manual'),\n body: getBodyForContext(contextId),\n buttons: {\n save: Str.get_string('enrolusers', 'enrol_manual'),\n }\n })\n .then(modal => {\n modal.getRoot().on(ModalEvents.save, e => {\n // Trigger a form submission, so that any mform elements can do final tricks before the form submission\n // is processed.\n // The actual submit even tis captured in the next handler.\n\n e.preventDefault();\n modal.getRoot().find('form').submit();\n });\n\n modal.getRoot().on('submit', 'form', e => {\n e.preventDefault();\n\n submitFormAjax(dynamicTable, modal);\n });\n\n modal.getRoot().on(ModalEvents.hidden, () => {\n modal.destroy();\n });\n\n modal.show();\n\n return modal;\n })\n .then(modal => Promise.all([modal, modal.getBodyPromise()]))\n .then(([modal, body]) => {\n if (body.get(0).querySelector(Selectors.cohortSelector)) {\n return modal.setSaveButtonText(Str.get_string('enroluserscohorts', 'enrol_manual')).then(() => modal);\n }\n\n return modal;\n })\n .then(modal => {\n pendingPromise.resolve();\n\n return modal;\n })\n .catch(Notification.exception);\n};\n\n/**\n * Submit the form via ajax.\n *\n * @param {HTMLElement} dynamicTable\n * @param {Object} modal\n */\nconst submitFormAjax = (dynamicTable, modal) => {\n // Note: We use a jQuery object here so that we can use its serialize functionality.\n const form = modal.getRoot().find('form');\n\n // Before send the data through AJAX, we need to parse and remove some unwanted hidden fields.\n // This hidden fields are added automatically by mforms and when it reaches the AJAX we get an error.\n form.get(0).querySelectorAll(Selectors.unwantedHiddenFields).forEach(hiddenField => hiddenField.remove());\n\n modal.hide();\n modal.destroy();\n\n jQuery.ajax(\n `${Config.wwwroot}/enrol/manual/ajax.php?${form.serialize()}`,\n {\n type: 'GET',\n processData: false,\n contentType: \"application/json\",\n }\n )\n .then(response => {\n if (response.error) {\n throw new Error(response.error);\n }\n\n return response.count;\n })\n .then(count => {\n return Promise.all([\n Str.get_string('totalenrolledusers', 'enrol', count),\n DynamicTable.refreshTableContent(dynamicTable),\n ]);\n })\n .then(([notificationBody]) => notificationBody)\n .then(notificationBody => Toast.add(notificationBody))\n .catch(error => {\n Notification.addNotification({\n message: error.message,\n type: 'error',\n });\n });\n};\n\n/**\n * Set up quick enrolment for the manual enrolment plugin.\n *\n * @param {Number} contextid The context id to setup for\n */\nexport const init = ({contextid}) => {\n registerEventListeners(contextid);\n\n Prefetch.prefetchStrings('enrol_manual', [\n 'enrolusers',\n 'enroluserscohorts',\n ]);\n\n Prefetch.prefetchString('enrol', 'totalenrolledusers');\n};\n"],"file":"quickenrolment.min.js"} \ No newline at end of file diff --git a/enrol/manual/amd/src/quickenrolment.js b/enrol/manual/amd/src/quickenrolment.js index 1034c2b2072..a9191129ab9 100644 --- a/enrol/manual/amd/src/quickenrolment.js +++ b/enrol/manual/amd/src/quickenrolment.js @@ -93,6 +93,9 @@ const showModal = (dynamicTable, contextId) => { large: true, title: Str.get_string('enrolusers', 'enrol_manual'), body: getBodyForContext(contextId), + buttons: { + save: Str.get_string('enrolusers', 'enrol_manual'), + } }) .then(modal => { modal.getRoot().on(ModalEvents.save, e => { @@ -114,25 +117,19 @@ const showModal = (dynamicTable, contextId) => { modal.destroy(); }); - return modal; - }) - .then(modal => { modal.show(); return modal; }) + .then(modal => Promise.all([modal, modal.getBodyPromise()])) + .then(([modal, body]) => { + if (body.get(0).querySelector(Selectors.cohortSelector)) { + return modal.setSaveButtonText(Str.get_string('enroluserscohorts', 'enrol_manual')).then(() => modal); + } + + return modal; + }) .then(modal => { - modal.setSaveButtonText(Str.get_string('enrolusers', 'enrol_manual')); - - modal.getBodyPromise().then(body => { - if (body.get(0).querySelector(Selectors.cohortSelector)) { - modal.setSaveButtonText(Str.get_string('enroluserscohorts', 'enrol_manual')); - } - - return body; - }) - .catch(); - pendingPromise.resolve(); return modal;