From 5db3c95e29269efb7ed3033efffe90ef74e57c68 Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Thu, 16 May 2024 12:54:01 +0100 Subject: [PATCH] MDL-81929 user: reset the selected bulk action when nothing selected. In the case of bulk user actions that are implemented via Javascript, we should ensure that once they are complete the selected action is reset to its default state of "Choose..." so that it can be selected again. --- admin/amd/build/bulk_user_actions.min.js | 2 +- admin/amd/build/bulk_user_actions.min.js.map | 2 +- admin/amd/src/bulk_user_actions.js | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/admin/amd/build/bulk_user_actions.min.js b/admin/amd/build/bulk_user_actions.min.js index df8e7b09bb0..d211e40b3c1 100644 --- a/admin/amd/build/bulk_user_actions.min.js +++ b/admin/amd/build/bulk_user_actions.min.js @@ -5,6 +5,6 @@ define("core_admin/bulk_user_actions",["exports","core_reportbuilder/local/selec * @module core_admin/bulk_user_actions * @copyright 2024 Marina Glancy * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,reportSelectors=_interopRequireWildcard(reportSelectors),tableEvents=_interopRequireWildcard(tableEvents),FormChangeChecker=_interopRequireWildcard(FormChangeChecker),CustomEvents=_interopRequireWildcard(CustomEvents),_jquery=(obj=_jquery)&&obj.__esModule?obj:{default:obj};const Selectors_bulkActionsForm="form#user-bulk-action-form",Selectors_userReportWrapper='[data-region="report-user-list-wrapper"]',Selectors_checkbox='input[type="checkbox"][data-togglegroup="report-select-all"][data-toggle="slave"]',Selectors_masterCheckbox='input[type="checkbox"][data-togglegroup="report-select-all"][data-toggle="master"]',Selectors_checkedRows='[data-togglegroup="report-select-all"][data-toggle="slave"]:checked';_exports.init=()=>{var _userBulkForm$closest;const userBulkForm=document.querySelector(Selectors_bulkActionsForm),userReport=null==userBulkForm||null===(_userBulkForm$closest=userBulkForm.closest(Selectors_userReportWrapper))||void 0===_userBulkForm$closest?void 0:_userBulkForm$closest.querySelector(reportSelectors.regions.report);if(!userBulkForm||!userReport)return;const actionSelect=userBulkForm.querySelector("select");CustomEvents.define(actionSelect,[CustomEvents.events.accessibleChange]),(0,_jquery.default)(actionSelect).on(CustomEvents.events.accessibleChange,(event=>{if(event.target.value&&"0"!=="".concat(event.target.value)){const e=new Event("submit",{cancelable:!0});userBulkForm.dispatchEvent(e),e.defaultPrevented||(FormChangeChecker.markFormSubmitted(userBulkForm),userBulkForm.submit())}}));const updateUserIds=()=>{const selectedUsers=[...userReport.querySelectorAll(Selectors_checkedRows)],selectedUserIds=selectedUsers.map((check=>parseInt(check.value)));userBulkForm.querySelector('[name="userids"]').value=selectedUserIds.join(","),actionSelect.disabled=0===selectedUsers.length;const selectedUsersNames=selectedUsers.map((check=>document.querySelector('label[for="'.concat(check.id,'"]')).textContent));userBulkForm.data={userids:selectedUserIds,usernames:selectedUsersNames}};updateUserIds(),document.addEventListener("change",(event=>{(event.target.matches(Selectors_checkbox)||event.target.matches(Selectors_masterCheckbox))&&userReport.contains(event.target)&&updateUserIds()})),document.addEventListener(tableEvents.tableContentRefreshed,(event=>{userReport.contains(event.target)&&updateUserIds()}))}})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,reportSelectors=_interopRequireWildcard(reportSelectors),tableEvents=_interopRequireWildcard(tableEvents),FormChangeChecker=_interopRequireWildcard(FormChangeChecker),CustomEvents=_interopRequireWildcard(CustomEvents),_jquery=(obj=_jquery)&&obj.__esModule?obj:{default:obj};const Selectors_bulkActionsForm="form#user-bulk-action-form",Selectors_userReportWrapper='[data-region="report-user-list-wrapper"]',Selectors_checkbox='input[type="checkbox"][data-togglegroup="report-select-all"][data-toggle="slave"]',Selectors_masterCheckbox='input[type="checkbox"][data-togglegroup="report-select-all"][data-toggle="master"]',Selectors_checkedRows='[data-togglegroup="report-select-all"][data-toggle="slave"]:checked';_exports.init=()=>{var _userBulkForm$closest;const userBulkForm=document.querySelector(Selectors_bulkActionsForm),userReport=null==userBulkForm||null===(_userBulkForm$closest=userBulkForm.closest(Selectors_userReportWrapper))||void 0===_userBulkForm$closest?void 0:_userBulkForm$closest.querySelector(reportSelectors.regions.report);if(!userBulkForm||!userReport)return;const actionSelect=userBulkForm.querySelector("select");CustomEvents.define(actionSelect,[CustomEvents.events.accessibleChange]),(0,_jquery.default)(actionSelect).on(CustomEvents.events.accessibleChange,(event=>{if(event.target.value&&"0"!=="".concat(event.target.value)){const e=new Event("submit",{cancelable:!0});userBulkForm.dispatchEvent(e),e.defaultPrevented||(FormChangeChecker.markFormSubmitted(userBulkForm),userBulkForm.submit())}}));const updateUserIds=()=>{const selectedUsers=[...userReport.querySelectorAll(Selectors_checkedRows)],selectedUserIds=selectedUsers.map((check=>parseInt(check.value)));userBulkForm.querySelector('[name="userids"]').value=selectedUserIds.join(","),actionSelect.disabled=0===selectedUsers.length,actionSelect.disabled&&(actionSelect.value="0");const selectedUsersNames=selectedUsers.map((check=>document.querySelector('label[for="'.concat(check.id,'"]')).textContent));userBulkForm.data={userids:selectedUserIds,usernames:selectedUsersNames}};updateUserIds(),document.addEventListener("change",(event=>{(event.target.matches(Selectors_checkbox)||event.target.matches(Selectors_masterCheckbox))&&userReport.contains(event.target)&&updateUserIds()})),document.addEventListener(tableEvents.tableContentRefreshed,(event=>{userReport.contains(event.target)&&updateUserIds()}))}})); //# sourceMappingURL=bulk_user_actions.min.js.map \ No newline at end of file diff --git a/admin/amd/build/bulk_user_actions.min.js.map b/admin/amd/build/bulk_user_actions.min.js.map index 84606bc2486..6d0ce11aace 100644 --- a/admin/amd/build/bulk_user_actions.min.js.map +++ b/admin/amd/build/bulk_user_actions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"bulk_user_actions.min.js","sources":["../src/bulk_user_actions.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 * Add bulk actions to the users list report\n *\n * @module core_admin/bulk_user_actions\n * @copyright 2024 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport * as tableEvents from 'core_table/local/dynamic/events';\nimport * as FormChangeChecker from 'core_form/changechecker';\nimport * as CustomEvents from 'core/custom_interaction_events';\nimport jQuery from 'jquery';\n\nconst Selectors = {\n bulkActionsForm: 'form#user-bulk-action-form',\n userReportWrapper: '[data-region=\"report-user-list-wrapper\"]',\n checkbox: 'input[type=\"checkbox\"][data-togglegroup=\"report-select-all\"][data-toggle=\"slave\"]',\n masterCheckbox: 'input[type=\"checkbox\"][data-togglegroup=\"report-select-all\"][data-toggle=\"master\"]',\n checkedRows: '[data-togglegroup=\"report-select-all\"][data-toggle=\"slave\"]:checked',\n};\n\n/**\n * Initialise module\n */\nexport const init = () => {\n\n const userBulkForm = document.querySelector(Selectors.bulkActionsForm);\n const userReport = userBulkForm?.closest(Selectors.userReportWrapper)?.querySelector(reportSelectors.regions.report);\n if (!userBulkForm || !userReport) {\n return;\n }\n const actionSelect = userBulkForm.querySelector('select');\n CustomEvents.define(actionSelect, [CustomEvents.events.accessibleChange]);\n\n jQuery(actionSelect).on(CustomEvents.events.accessibleChange, event => {\n if (event.target.value && `${event.target.value}` !== \"0\") {\n const e = new Event('submit', {cancelable: true});\n userBulkForm.dispatchEvent(e);\n if (!e.defaultPrevented) {\n FormChangeChecker.markFormSubmitted(userBulkForm);\n userBulkForm.submit();\n }\n }\n });\n\n // Every time the checkboxes in the report are changed, update the list of users in the form values\n // and enable/disable the action select.\n const updateUserIds = () => {\n const selectedUsers = [...userReport.querySelectorAll(Selectors.checkedRows)];\n const selectedUserIds = selectedUsers.map(check => parseInt(check.value));\n userBulkForm.querySelector('[name=\"userids\"]').value = selectedUserIds.join(',');\n actionSelect.disabled = selectedUsers.length === 0;\n const selectedUsersNames = selectedUsers.map(check => document.querySelector(`label[for=\"${check.id}\"]`).textContent);\n // Add the user ids and names to the form data attributes so they can be available from the\n // other JS modules that listen to the form submit event.\n userBulkForm.data = {userids: selectedUserIds, usernames: selectedUsersNames};\n };\n\n updateUserIds();\n\n document.addEventListener('change', event => {\n // When checkboxes are checked next to individual users or the master toggle (Select all/none).\n if ((event.target.matches(Selectors.checkbox) || event.target.matches(Selectors.masterCheckbox))\n && userReport.contains(event.target)) {\n updateUserIds();\n }\n });\n\n document.addEventListener(tableEvents.tableContentRefreshed, event => {\n // When the report contents is updated (i.e. page is changed, filters applied, etc).\n if (userReport.contains(event.target)) {\n updateUserIds();\n }\n });\n};\n"],"names":["Selectors","userBulkForm","document","querySelector","userReport","closest","_userBulkForm$closest","reportSelectors","regions","report","actionSelect","CustomEvents","define","events","accessibleChange","on","event","target","value","e","Event","cancelable","dispatchEvent","defaultPrevented","FormChangeChecker","markFormSubmitted","submit","updateUserIds","selectedUsers","querySelectorAll","selectedUserIds","map","check","parseInt","join","disabled","length","selectedUsersNames","id","textContent","data","userids","usernames","addEventListener","matches","contains","tableEvents","tableContentRefreshed"],"mappings":";;;;;;;0WA6BMA,0BACe,6BADfA,4BAEiB,2CAFjBA,mBAGQ,oFAHRA,yBAIc,qFAJdA,sBAKW,oFAMG,qCAEVC,aAAeC,SAASC,cAAcH,2BACtCI,WAAaH,MAAAA,4CAAAA,aAAcI,QAAQL,qEAAtBM,sBAAoDH,cAAcI,gBAAgBC,QAAQC,YACxGR,eAAiBG,wBAGhBM,aAAeT,aAAaE,cAAc,UAChDQ,aAAaC,OAAOF,aAAc,CAACC,aAAaE,OAAOC,uCAEhDJ,cAAcK,GAAGJ,aAAaE,OAAOC,kBAAkBE,WACtDA,MAAMC,OAAOC,OAAqC,MAA5B,UAAGF,MAAMC,OAAOC,OAAiB,OACjDC,EAAI,IAAIC,MAAM,SAAU,CAACC,YAAY,IAC3CpB,aAAaqB,cAAcH,GACtBA,EAAEI,mBACHC,kBAAkBC,kBAAkBxB,cACpCA,aAAayB,oBAOnBC,cAAgB,WACZC,cAAgB,IAAIxB,WAAWyB,iBAAiB7B,wBAChD8B,gBAAkBF,cAAcG,KAAIC,OAASC,SAASD,MAAMd,SAClEjB,aAAaE,cAAc,oBAAoBe,MAAQY,gBAAgBI,KAAK,KAC5ExB,aAAayB,SAAoC,IAAzBP,cAAcQ,aAChCC,mBAAqBT,cAAcG,KAAIC,OAAS9B,SAASC,mCAA4B6B,MAAMM,UAAQC,cAGzGtC,aAAauC,KAAO,CAACC,QAASX,gBAAiBY,UAAWL,qBAG9DV,gBAEAzB,SAASyC,iBAAiB,UAAU3B,SAE3BA,MAAMC,OAAO2B,QAAQ5C,qBAAuBgB,MAAMC,OAAO2B,QAAQ5C,4BAC3DI,WAAWyC,SAAS7B,MAAMC,SACjCU,mBAIRzB,SAASyC,iBAAiBG,YAAYC,uBAAuB/B,QAErDZ,WAAWyC,SAAS7B,MAAMC,SAC1BU"} \ No newline at end of file +{"version":3,"file":"bulk_user_actions.min.js","sources":["../src/bulk_user_actions.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 * Add bulk actions to the users list report\n *\n * @module core_admin/bulk_user_actions\n * @copyright 2024 Marina Glancy\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport * as tableEvents from 'core_table/local/dynamic/events';\nimport * as FormChangeChecker from 'core_form/changechecker';\nimport * as CustomEvents from 'core/custom_interaction_events';\nimport jQuery from 'jquery';\n\nconst Selectors = {\n bulkActionsForm: 'form#user-bulk-action-form',\n userReportWrapper: '[data-region=\"report-user-list-wrapper\"]',\n checkbox: 'input[type=\"checkbox\"][data-togglegroup=\"report-select-all\"][data-toggle=\"slave\"]',\n masterCheckbox: 'input[type=\"checkbox\"][data-togglegroup=\"report-select-all\"][data-toggle=\"master\"]',\n checkedRows: '[data-togglegroup=\"report-select-all\"][data-toggle=\"slave\"]:checked',\n};\n\n/**\n * Initialise module\n */\nexport const init = () => {\n\n const userBulkForm = document.querySelector(Selectors.bulkActionsForm);\n const userReport = userBulkForm?.closest(Selectors.userReportWrapper)?.querySelector(reportSelectors.regions.report);\n if (!userBulkForm || !userReport) {\n return;\n }\n const actionSelect = userBulkForm.querySelector('select');\n CustomEvents.define(actionSelect, [CustomEvents.events.accessibleChange]);\n\n jQuery(actionSelect).on(CustomEvents.events.accessibleChange, event => {\n if (event.target.value && `${event.target.value}` !== \"0\") {\n const e = new Event('submit', {cancelable: true});\n userBulkForm.dispatchEvent(e);\n if (!e.defaultPrevented) {\n FormChangeChecker.markFormSubmitted(userBulkForm);\n userBulkForm.submit();\n }\n }\n });\n\n // Every time the checkboxes in the report are changed, update the list of users in the form values\n // and enable/disable the action select.\n const updateUserIds = () => {\n const selectedUsers = [...userReport.querySelectorAll(Selectors.checkedRows)];\n const selectedUserIds = selectedUsers.map(check => parseInt(check.value));\n userBulkForm.querySelector('[name=\"userids\"]').value = selectedUserIds.join(',');\n\n // Disable the action selector if nothing selected, and reset the current selection.\n actionSelect.disabled = selectedUsers.length === 0;\n if (actionSelect.disabled) {\n actionSelect.value = \"0\";\n }\n\n const selectedUsersNames = selectedUsers.map(check => document.querySelector(`label[for=\"${check.id}\"]`).textContent);\n // Add the user ids and names to the form data attributes so they can be available from the\n // other JS modules that listen to the form submit event.\n userBulkForm.data = {userids: selectedUserIds, usernames: selectedUsersNames};\n };\n\n updateUserIds();\n\n document.addEventListener('change', event => {\n // When checkboxes are checked next to individual users or the master toggle (Select all/none).\n if ((event.target.matches(Selectors.checkbox) || event.target.matches(Selectors.masterCheckbox))\n && userReport.contains(event.target)) {\n updateUserIds();\n }\n });\n\n document.addEventListener(tableEvents.tableContentRefreshed, event => {\n // When the report contents is updated (i.e. page is changed, filters applied, etc).\n if (userReport.contains(event.target)) {\n updateUserIds();\n }\n });\n};\n"],"names":["Selectors","userBulkForm","document","querySelector","userReport","closest","_userBulkForm$closest","reportSelectors","regions","report","actionSelect","CustomEvents","define","events","accessibleChange","on","event","target","value","e","Event","cancelable","dispatchEvent","defaultPrevented","FormChangeChecker","markFormSubmitted","submit","updateUserIds","selectedUsers","querySelectorAll","selectedUserIds","map","check","parseInt","join","disabled","length","selectedUsersNames","id","textContent","data","userids","usernames","addEventListener","matches","contains","tableEvents","tableContentRefreshed"],"mappings":";;;;;;;0WA6BMA,0BACe,6BADfA,4BAEiB,2CAFjBA,mBAGQ,oFAHRA,yBAIc,qFAJdA,sBAKW,oFAMG,qCAEVC,aAAeC,SAASC,cAAcH,2BACtCI,WAAaH,MAAAA,4CAAAA,aAAcI,QAAQL,qEAAtBM,sBAAoDH,cAAcI,gBAAgBC,QAAQC,YACxGR,eAAiBG,wBAGhBM,aAAeT,aAAaE,cAAc,UAChDQ,aAAaC,OAAOF,aAAc,CAACC,aAAaE,OAAOC,uCAEhDJ,cAAcK,GAAGJ,aAAaE,OAAOC,kBAAkBE,WACtDA,MAAMC,OAAOC,OAAqC,MAA5B,UAAGF,MAAMC,OAAOC,OAAiB,OACjDC,EAAI,IAAIC,MAAM,SAAU,CAACC,YAAY,IAC3CpB,aAAaqB,cAAcH,GACtBA,EAAEI,mBACHC,kBAAkBC,kBAAkBxB,cACpCA,aAAayB,oBAOnBC,cAAgB,WACZC,cAAgB,IAAIxB,WAAWyB,iBAAiB7B,wBAChD8B,gBAAkBF,cAAcG,KAAIC,OAASC,SAASD,MAAMd,SAClEjB,aAAaE,cAAc,oBAAoBe,MAAQY,gBAAgBI,KAAK,KAG5ExB,aAAayB,SAAoC,IAAzBP,cAAcQ,OAClC1B,aAAayB,WACbzB,aAAaQ,MAAQ,WAGnBmB,mBAAqBT,cAAcG,KAAIC,OAAS9B,SAASC,mCAA4B6B,MAAMM,UAAQC,cAGzGtC,aAAauC,KAAO,CAACC,QAASX,gBAAiBY,UAAWL,qBAG9DV,gBAEAzB,SAASyC,iBAAiB,UAAU3B,SAE3BA,MAAMC,OAAO2B,QAAQ5C,qBAAuBgB,MAAMC,OAAO2B,QAAQ5C,4BAC3DI,WAAWyC,SAAS7B,MAAMC,SACjCU,mBAIRzB,SAASyC,iBAAiBG,YAAYC,uBAAuB/B,QAErDZ,WAAWyC,SAAS7B,MAAMC,SAC1BU"} \ No newline at end of file diff --git a/admin/amd/src/bulk_user_actions.js b/admin/amd/src/bulk_user_actions.js index 6e1a07565c3..652281c1fea 100644 --- a/admin/amd/src/bulk_user_actions.js +++ b/admin/amd/src/bulk_user_actions.js @@ -65,7 +65,13 @@ export const init = () => { const selectedUsers = [...userReport.querySelectorAll(Selectors.checkedRows)]; const selectedUserIds = selectedUsers.map(check => parseInt(check.value)); userBulkForm.querySelector('[name="userids"]').value = selectedUserIds.join(','); + + // Disable the action selector if nothing selected, and reset the current selection. actionSelect.disabled = selectedUsers.length === 0; + if (actionSelect.disabled) { + actionSelect.value = "0"; + } + const selectedUsersNames = selectedUsers.map(check => document.querySelector(`label[for="${check.id}"]`).textContent); // Add the user ids and names to the form data attributes so they can be available from the // other JS modules that listen to the form submit event.