From db5be3a31c3cc5109b10bc2b680087f4982fd06b Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Wed, 20 May 2020 08:47:02 +0800 Subject: [PATCH] MDL-68778 user: Fetch select from selected option It seems that the HTMLSelectElement behaves slightly different on Linux vs MacOS. On Linux with Firefox 47 when selecting an option the HTMLOptionElement is returned, whereas on MavOS the HTMLSelectElement that the Option belongs to is returned. We need to normalise the value here before resetting the currently selected item. --- user/amd/build/participants.min.js | 2 +- user/amd/build/participants.min.js.map | 2 +- user/amd/src/participants.js | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/user/amd/build/participants.min.js b/user/amd/build/participants.min.js index b963d28dbbf..00384323667 100644 --- a/user/amd/build/participants.min.js +++ b/user/amd/build/participants.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 ("core_user/participants",["exports","core_table/dynamic","core/str","core/checkbox-toggleall","core/custom_interaction_events","core_table/local/dynamic/selectors","core/modal_events","core/notification","jquery","core_user/local/participants/bulkactions"],function(a,b,c,d,e,f,g,h,i,j){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.init=void 0;b=m(b);c=m(c);d=k(d);e=k(e);f=k(f);g=k(g);h=k(h);i=k(i);function k(a){return a&&a.__esModule?a:{default:a}}function l(){if("function"!=typeof WeakMap)return null;var a=new WeakMap;l=function(){return a};return a}function m(a){if(a&&a.__esModule){return a}if(null===a||"object"!==_typeof(a)&&"function"!=typeof a){return{default:a}}var b=l();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 n(a,b){return s(a)||r(a,b)||p(a,b)||o()}function o(){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 p(a,b){if(!a)return;if("string"==typeof a)return q(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 q(a,b)}function q(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 * Some UI stuff for participants page.\n * This is also used by the report/participants/index.php because it has the same functionality.\n *\n * @module core_user/participants\n * @package core_user\n * @copyright 2017 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport * as DynamicTable from 'core_table/dynamic';\nimport * as Str from 'core/str';\nimport CheckboxToggleAll from 'core/checkbox-toggleall';\nimport CustomEvents from 'core/custom_interaction_events';\nimport DynamicTableSelectors from 'core_table/local/dynamic/selectors';\nimport ModalEvents from 'core/modal_events';\nimport Notification from 'core/notification';\nimport jQuery from 'jquery';\nimport {showAddNote, showSendMessage} from 'core_user/local/participants/bulkactions';\n\nconst Selectors = {\n bulkActionSelect: \"#formactionid\",\n bulkUserSelectedCheckBoxes: \"input[data-togglegroup='participants-table']:checked\",\n checkCountButton: \"#checkall\",\n showCountText: '[data-region=\"participant-count\"]',\n showCountToggle: '[data-action=\"showcount\"]',\n stateHelpIcon: '[data-region=\"state-help-icon\"]',\n tableForm: uniqueId => `form[data-table-unique-id=\"${uniqueId}\"]`,\n};\n\nexport const init = ({\n uniqueid,\n noteStateNames = {},\n}) => {\n const root = document.querySelector(Selectors.tableForm(uniqueid));\n const getTableFromUniqueId = uniqueId => root.querySelector(DynamicTableSelectors.main.fromRegionId(uniqueId));\n\n /**\n * Private method.\n *\n * @method registerEventListeners\n * @private\n */\n const registerEventListeners = () => {\n CustomEvents.define(Selectors.bulkActionSelect, [CustomEvents.events.accessibleChange]);\n jQuery(Selectors.bulkActionSelect).on(CustomEvents.events.accessibleChange, e => {\n const action = e.target.value;\n const tableRoot = getTableFromUniqueId(uniqueid);\n const checkboxes = tableRoot.querySelectorAll(Selectors.bulkUserSelectedCheckBoxes);\n\n if (action.indexOf('#') !== -1) {\n e.preventDefault();\n\n const ids = [];\n checkboxes.forEach(checkbox => {\n ids.push(checkbox.getAttribute('name').replace('user', ''));\n });\n\n let bulkAction;\n if (action === '#messageselect') {\n bulkAction = showSendMessage(ids);\n } else if (action === '#addgroupnote') {\n bulkAction = showAddNote(\n root.dataset.courseId,\n ids,\n noteStateNames,\n root.querySelector(Selectors.stateHelpIcon)\n );\n }\n\n if (bulkAction) {\n bulkAction\n .then(modal => {\n modal.getRoot().on(ModalEvents.hidden, () => {\n // Focus on the action select when the dialog is closed.\n const bulkActionSelector = root.querySelector(Selectors.bulkActionSelect);\n bulkActionSelector.focus();\n });\n\n return modal;\n })\n .catch(Notification.exception);\n }\n } else if (action !== '' && checkboxes.length) {\n e.target.form.submit();\n }\n\n resetBulkAction(e.target);\n });\n\n root.addEventListener('click', e => {\n // Handle clicking of the \"Show [all|count]\" and \"Select all\" actions.\n const showCountLink = root.querySelector(Selectors.showCountToggle);\n const checkCountButton = root.querySelector(Selectors.checkCountButton);\n\n const showCountLinkClicked = showCountLink && showCountLink.contains(e.target);\n const checkCountButtonClicked = checkCountButton && checkCountButton.contains(e.target);\n\n if (showCountLinkClicked || checkCountButtonClicked) {\n e.preventDefault();\n\n const tableRoot = getTableFromUniqueId(uniqueid);\n\n DynamicTable.setPageSize(tableRoot, showCountLink.dataset.targetPageSize)\n .then(tableRoot => {\n // Always update the toggle state.\n // This ensures that the bulk actions are disabled after changing the page size.\n CheckboxToggleAll.setGroupState(tableRoot, 'participants-table', checkCountButtonClicked);\n\n return tableRoot;\n })\n .catch(Notification.exception);\n }\n });\n\n // When the content is refreshed, update the row counts in various places.\n root.addEventListener(DynamicTable.Events.tableContentRefreshed, e => {\n const showCountLink = root.querySelector(Selectors.showCountToggle);\n const checkCountButton = root.querySelector(Selectors.checkCountButton);\n\n const tableRoot = e.target;\n\n const defaultPageSize = parseInt(root.dataset.tableDefaultPerPage, 10);\n const currentPageSize = parseInt(tableRoot.dataset.tablePageSize, 10);\n const totalRowCount = parseInt(tableRoot.dataset.tableTotalRows, 10);\n\n CheckboxToggleAll.updateSlavesFromMasterState(tableRoot, 'participants-table');\n\n const pageCountStrings = [\n {\n key: 'countparticipantsfound',\n component: 'core_user',\n param: totalRowCount,\n },\n ];\n\n\n if (totalRowCount <= defaultPageSize) {\n // There are fewer than the default page count numbers of rows.\n showCountLink.classList.add('hidden');\n\n if (checkCountButton) {\n checkCountButton.classList.add('hidden');\n }\n } else if (totalRowCount <= currentPageSize) {\n // The are fewer than the current page size.\n pageCountStrings.push({\n key: 'showperpage',\n component: 'core',\n param: defaultPageSize,\n });\n\n pageCountStrings.push({\n key: 'selectalluserswithcount',\n component: 'core',\n param: defaultPageSize,\n });\n\n // Show the 'Show [x]' link.\n showCountLink.classList.remove('hidden');\n showCountLink.dataset.targetPageSize = defaultPageSize;\n\n if (checkCountButton) {\n // The 'Check all [x]' button is only visible when there are values to set.\n checkCountButton.classList.add('hidden');\n }\n } else {\n pageCountStrings.push({\n key: 'showall',\n component: 'core',\n param: totalRowCount,\n });\n\n pageCountStrings.push({\n key: 'selectalluserswithcount',\n component: 'core',\n param: totalRowCount,\n });\n\n // Show both the 'Show [x]' link, and the 'Check all [x]' button.\n showCountLink.classList.remove('hidden');\n showCountLink.dataset.targetPageSize = totalRowCount;\n\n if (checkCountButton) {\n checkCountButton.classList.remove('hidden');\n }\n }\n\n Str.get_strings(pageCountStrings)\n .then(([showingParticipantCountString, showCountString, selectCountString]) => {\n const showingParticipantCount = root.querySelector(Selectors.showCountText);\n showingParticipantCount.innerHTML = showingParticipantCountString;\n\n if (showCountString) {\n showCountLink.innerHTML = showCountString;\n }\n\n if (selectCountString && checkCountButton) {\n checkCountButton.value = selectCountString;\n }\n\n return;\n })\n .catch(Notification.exception);\n });\n };\n\n const resetBulkAction = bulkActionSelect => {\n bulkActionSelect.value = '';\n };\n\n registerEventListeners();\n};\n"],"file":"participants.min.js"} \ No newline at end of file +{"version":3,"sources":["../src/participants.js"],"names":["Selectors","bulkActionSelect","bulkUserSelectedCheckBoxes","checkCountButton","showCountText","showCountToggle","stateHelpIcon","tableForm","uniqueId","init","uniqueid","noteStateNames","root","document","querySelector","getTableFromUniqueId","DynamicTableSelectors","main","fromRegionId","registerEventListeners","CustomEvents","define","events","accessibleChange","on","e","target","closest","action","value","tableRoot","checkboxes","querySelectorAll","indexOf","preventDefault","ids","forEach","checkbox","push","getAttribute","replace","bulkAction","dataset","courseId","then","modal","getRoot","ModalEvents","hidden","focus","catch","Notification","exception","length","form","submit","resetBulkAction","addEventListener","showCountLink","showCountLinkClicked","contains","checkCountButtonClicked","DynamicTable","setPageSize","targetPageSize","CheckboxToggleAll","setGroupState","Events","tableContentRefreshed","defaultPageSize","parseInt","tableDefaultPerPage","currentPageSize","tablePageSize","totalRowCount","tableTotalRows","updateSlavesFromMasterState","pageCountStrings","key","component","param","classList","add","remove","Str","get_strings","showingParticipantCountString","showCountString","selectCountString","showingParticipantCount","innerHTML"],"mappings":"spBAyBA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,O,wjDAGMA,CAAAA,CAAS,CAAG,CACdC,gBAAgB,CAAE,eADJ,CAEdC,0BAA0B,CAAE,sDAFd,CAGdC,gBAAgB,CAAE,WAHJ,CAIdC,aAAa,CAAE,qCAJD,CAKdC,eAAe,CAAE,6BALH,CAMdC,aAAa,CAAE,mCAND,CAOdC,SAAS,CAAE,mBAAAC,CAAQ,8CAAkCA,CAAlC,QAPL,C,QAUE,QAAPC,CAAAA,IAAO,GAGd,IAFFC,CAAAA,CAEE,GAFFA,QAEE,KADFC,cACE,CADFA,CACE,YADe,EACf,GACIC,CAAI,CAAGC,QAAQ,CAACC,aAAT,CAAuBd,CAAS,CAACO,SAAV,CAAoBG,CAApB,CAAvB,CADX,CAEIK,CAAoB,CAAG,SAAAP,CAAQ,QAAII,CAAAA,CAAI,CAACE,aAAL,CAAmBE,UAAsBC,IAAtB,CAA2BC,YAA3B,CAAwCV,CAAxC,CAAnB,CAAJ,CAFnC,CAUIW,CAAsB,CAAG,UAAM,CACjCC,UAAaC,MAAb,CAAoBrB,CAAS,CAACC,gBAA9B,CAAgD,CAACmB,UAAaE,MAAb,CAAoBC,gBAArB,CAAhD,EACA,cAAOvB,CAAS,CAACC,gBAAjB,EAAmCuB,EAAnC,CAAsCJ,UAAaE,MAAb,CAAoBC,gBAA1D,CAA4E,SAAAE,CAAC,CAAI,IACvExB,CAAAA,CAAgB,CAAGwB,CAAC,CAACC,MAAF,CAASC,OAAT,CAAiB,QAAjB,CADoD,CAEvEC,CAAM,CAAG3B,CAAgB,CAAC4B,KAF6C,CAGvEC,CAAS,CAAGf,CAAoB,CAACL,CAAD,CAHuC,CAIvEqB,CAAU,CAAGD,CAAS,CAACE,gBAAV,CAA2BhC,CAAS,CAACE,0BAArC,CAJ0D,CAM7E,GAA4B,CAAC,CAAzB,GAAA0B,CAAM,CAACK,OAAP,CAAe,GAAf,CAAJ,CAAgC,CAC5BR,CAAC,CAACS,cAAF,GAEA,GAAMC,CAAAA,CAAG,CAAG,EAAZ,CACAJ,CAAU,CAACK,OAAX,CAAmB,SAAAC,CAAQ,CAAI,CAC3BF,CAAG,CAACG,IAAJ,CAASD,CAAQ,CAACE,YAAT,CAAsB,MAAtB,EAA8BC,OAA9B,CAAsC,MAAtC,CAA8C,EAA9C,CAAT,CACH,CAFD,EAIA,GAAIC,CAAAA,CAAJ,CACA,GAAe,gBAAX,GAAAb,CAAJ,CAAiC,CAC7Ba,CAAU,CAAG,sBAAgBN,CAAhB,CAChB,CAFD,IAEO,IAAe,eAAX,GAAAP,CAAJ,CAAgC,CACnCa,CAAU,CAAG,kBACT7B,CAAI,CAAC8B,OAAL,CAAaC,QADJ,CAETR,CAFS,CAGTxB,CAHS,CAITC,CAAI,CAACE,aAAL,CAAmBd,CAAS,CAACM,aAA7B,CAJS,CAMhB,CAED,GAAImC,CAAJ,CAAgB,CACZA,CAAU,CACTG,IADD,CACM,SAAAC,CAAK,CAAI,CACXA,CAAK,CAACC,OAAN,GAAgBtB,EAAhB,CAAmBuB,UAAYC,MAA/B,CAAuC,UAAM,CAEzC/C,CAAgB,CAACgD,KAAjB,EACH,CAHD,EAKA,MAAOJ,CAAAA,CACV,CARD,EASCK,KATD,CASOC,UAAaC,SATpB,CAUH,CACJ,CAhCD,IAgCO,IAAe,EAAX,GAAAxB,CAAM,EAAWG,CAAU,CAACsB,MAAhC,CAAwC,CAC3CpD,CAAgB,CAACqD,IAAjB,CAAsBC,MAAtB,EACH,CAEDC,CAAe,CAACvD,CAAD,CAClB,CA3CD,EA6CAW,CAAI,CAAC6C,gBAAL,CAAsB,OAAtB,CAA+B,SAAAhC,CAAC,CAAI,IAE1BiC,CAAAA,CAAa,CAAG9C,CAAI,CAACE,aAAL,CAAmBd,CAAS,CAACK,eAA7B,CAFU,CAG1BF,CAAgB,CAAGS,CAAI,CAACE,aAAL,CAAmBd,CAAS,CAACG,gBAA7B,CAHO,CAK1BwD,CAAoB,CAAGD,CAAa,EAAIA,CAAa,CAACE,QAAd,CAAuBnC,CAAC,CAACC,MAAzB,CALd,CAM1BmC,CAAuB,CAAG1D,CAAgB,EAAIA,CAAgB,CAACyD,QAAjB,CAA0BnC,CAAC,CAACC,MAA5B,CANpB,CAQhC,GAAIiC,CAAoB,EAAIE,CAA5B,CAAqD,CACjDpC,CAAC,CAACS,cAAF,GAEA,GAAMJ,CAAAA,CAAS,CAAGf,CAAoB,CAACL,CAAD,CAAtC,CAEAoD,CAAY,CAACC,WAAb,CAAyBjC,CAAzB,CAAoC4B,CAAa,CAAChB,OAAd,CAAsBsB,cAA1D,EACCpB,IADD,CACM,SAAAd,CAAS,CAAI,CAGfmC,UAAkBC,aAAlB,CAAgCpC,CAAhC,CAA2C,oBAA3C,CAAiE+B,CAAjE,EAEA,MAAO/B,CAAAA,CACV,CAPD,EAQCoB,KARD,CAQOC,UAAaC,SARpB,CASH,CACJ,CAvBD,EA0BAxC,CAAI,CAAC6C,gBAAL,CAAsBK,CAAY,CAACK,MAAb,CAAoBC,qBAA1C,CAAiE,SAAA3C,CAAC,CAAI,IAC5DiC,CAAAA,CAAa,CAAG9C,CAAI,CAACE,aAAL,CAAmBd,CAAS,CAACK,eAA7B,CAD4C,CAE5DF,CAAgB,CAAGS,CAAI,CAACE,aAAL,CAAmBd,CAAS,CAACG,gBAA7B,CAFyC,CAI5D2B,CAAS,CAAGL,CAAC,CAACC,MAJ8C,CAM5D2C,CAAe,CAAGC,QAAQ,CAAC1D,CAAI,CAAC8B,OAAL,CAAa6B,mBAAd,CAAmC,EAAnC,CANkC,CAO5DC,CAAe,CAAGF,QAAQ,CAACxC,CAAS,CAACY,OAAV,CAAkB+B,aAAnB,CAAkC,EAAlC,CAPkC,CAQ5DC,CAAa,CAAGJ,QAAQ,CAACxC,CAAS,CAACY,OAAV,CAAkBiC,cAAnB,CAAmC,EAAnC,CARoC,CAUlEV,UAAkBW,2BAAlB,CAA8C9C,CAA9C,CAAyD,oBAAzD,EAEA,GAAM+C,CAAAA,CAAgB,CAAG,CACrB,CACIC,GAAG,CAAE,wBADT,CAEIC,SAAS,CAAE,WAFf,CAGIC,KAAK,CAAEN,CAHX,CADqB,CAAzB,CASA,GAAIA,CAAa,EAAIL,CAArB,CAAsC,CAElCX,CAAa,CAACuB,SAAd,CAAwBC,GAAxB,CAA4B,QAA5B,EAEA,GAAI/E,CAAJ,CAAsB,CAClBA,CAAgB,CAAC8E,SAAjB,CAA2BC,GAA3B,CAA+B,QAA/B,CACH,CACJ,CAPD,IAOO,IAAIR,CAAa,EAAIF,CAArB,CAAsC,CAEzCK,CAAgB,CAACvC,IAAjB,CAAsB,CAClBwC,GAAG,CAAE,aADa,CAElBC,SAAS,CAAE,MAFO,CAGlBC,KAAK,CAAEX,CAHW,CAAtB,EAMAQ,CAAgB,CAACvC,IAAjB,CAAsB,CAClBwC,GAAG,CAAE,yBADa,CAElBC,SAAS,CAAE,MAFO,CAGlBC,KAAK,CAAEX,CAHW,CAAtB,EAOAX,CAAa,CAACuB,SAAd,CAAwBE,MAAxB,CAA+B,QAA/B,EACAzB,CAAa,CAAChB,OAAd,CAAsBsB,cAAtB,CAAuCK,CAAvC,CAEA,GAAIlE,CAAJ,CAAsB,CAElBA,CAAgB,CAAC8E,SAAjB,CAA2BC,GAA3B,CAA+B,QAA/B,CACH,CACJ,CAtBM,IAsBA,CACHL,CAAgB,CAACvC,IAAjB,CAAsB,CAClBwC,GAAG,CAAE,SADa,CAElBC,SAAS,CAAE,MAFO,CAGlBC,KAAK,CAAEN,CAHW,CAAtB,EAMAG,CAAgB,CAACvC,IAAjB,CAAsB,CAClBwC,GAAG,CAAE,yBADa,CAElBC,SAAS,CAAE,MAFO,CAGlBC,KAAK,CAAEN,CAHW,CAAtB,EAOAhB,CAAa,CAACuB,SAAd,CAAwBE,MAAxB,CAA+B,QAA/B,EACAzB,CAAa,CAAChB,OAAd,CAAsBsB,cAAtB,CAAuCU,CAAvC,CAEA,GAAIvE,CAAJ,CAAsB,CAClBA,CAAgB,CAAC8E,SAAjB,CAA2BE,MAA3B,CAAkC,QAAlC,CACH,CACJ,CAEDC,CAAG,CAACC,WAAJ,CAAgBR,CAAhB,EACCjC,IADD,CACM,WAAyE,cAAvE0C,CAAuE,MAAxCC,CAAwC,MAAvBC,CAAuB,MACrEC,CAAuB,CAAG7E,CAAI,CAACE,aAAL,CAAmBd,CAAS,CAACI,aAA7B,CAD2C,CAE3EqF,CAAuB,CAACC,SAAxB,CAAoCJ,CAApC,CAEA,GAAIC,CAAJ,CAAqB,CACjB7B,CAAa,CAACgC,SAAd,CAA0BH,CAC7B,CAED,GAAIC,CAAiB,EAAIrF,CAAzB,CAA2C,CACvCA,CAAgB,CAAC0B,KAAjB,CAAyB2D,CAC5B,CAGJ,CAdD,EAeCtC,KAfD,CAeOC,UAAaC,SAfpB,CAgBH,CAxFD,CAyFH,CA5KC,CA8KII,CAAe,CAAG,SAAAvD,CAAgB,CAAI,CACxCA,CAAgB,CAAC4B,KAAjB,CAAyB,EAC5B,CAhLC,CAkLFV,CAAsB,EACzB,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 * Some UI stuff for participants page.\n * This is also used by the report/participants/index.php because it has the same functionality.\n *\n * @module core_user/participants\n * @package core_user\n * @copyright 2017 Damyon Wiese\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport * as DynamicTable from 'core_table/dynamic';\nimport * as Str from 'core/str';\nimport CheckboxToggleAll from 'core/checkbox-toggleall';\nimport CustomEvents from 'core/custom_interaction_events';\nimport DynamicTableSelectors from 'core_table/local/dynamic/selectors';\nimport ModalEvents from 'core/modal_events';\nimport Notification from 'core/notification';\nimport jQuery from 'jquery';\nimport {showAddNote, showSendMessage} from 'core_user/local/participants/bulkactions';\n\nconst Selectors = {\n bulkActionSelect: \"#formactionid\",\n bulkUserSelectedCheckBoxes: \"input[data-togglegroup='participants-table']:checked\",\n checkCountButton: \"#checkall\",\n showCountText: '[data-region=\"participant-count\"]',\n showCountToggle: '[data-action=\"showcount\"]',\n stateHelpIcon: '[data-region=\"state-help-icon\"]',\n tableForm: uniqueId => `form[data-table-unique-id=\"${uniqueId}\"]`,\n};\n\nexport const init = ({\n uniqueid,\n noteStateNames = {},\n}) => {\n const root = document.querySelector(Selectors.tableForm(uniqueid));\n const getTableFromUniqueId = uniqueId => root.querySelector(DynamicTableSelectors.main.fromRegionId(uniqueId));\n\n /**\n * Private method.\n *\n * @method registerEventListeners\n * @private\n */\n const registerEventListeners = () => {\n CustomEvents.define(Selectors.bulkActionSelect, [CustomEvents.events.accessibleChange]);\n jQuery(Selectors.bulkActionSelect).on(CustomEvents.events.accessibleChange, e => {\n const bulkActionSelect = e.target.closest('select');\n const action = bulkActionSelect.value;\n const tableRoot = getTableFromUniqueId(uniqueid);\n const checkboxes = tableRoot.querySelectorAll(Selectors.bulkUserSelectedCheckBoxes);\n\n if (action.indexOf('#') !== -1) {\n e.preventDefault();\n\n const ids = [];\n checkboxes.forEach(checkbox => {\n ids.push(checkbox.getAttribute('name').replace('user', ''));\n });\n\n let bulkAction;\n if (action === '#messageselect') {\n bulkAction = showSendMessage(ids);\n } else if (action === '#addgroupnote') {\n bulkAction = showAddNote(\n root.dataset.courseId,\n ids,\n noteStateNames,\n root.querySelector(Selectors.stateHelpIcon)\n );\n }\n\n if (bulkAction) {\n bulkAction\n .then(modal => {\n modal.getRoot().on(ModalEvents.hidden, () => {\n // Focus on the action select when the dialog is closed.\n bulkActionSelect.focus();\n });\n\n return modal;\n })\n .catch(Notification.exception);\n }\n } else if (action !== '' && checkboxes.length) {\n bulkActionSelect.form.submit();\n }\n\n resetBulkAction(bulkActionSelect);\n });\n\n root.addEventListener('click', e => {\n // Handle clicking of the \"Show [all|count]\" and \"Select all\" actions.\n const showCountLink = root.querySelector(Selectors.showCountToggle);\n const checkCountButton = root.querySelector(Selectors.checkCountButton);\n\n const showCountLinkClicked = showCountLink && showCountLink.contains(e.target);\n const checkCountButtonClicked = checkCountButton && checkCountButton.contains(e.target);\n\n if (showCountLinkClicked || checkCountButtonClicked) {\n e.preventDefault();\n\n const tableRoot = getTableFromUniqueId(uniqueid);\n\n DynamicTable.setPageSize(tableRoot, showCountLink.dataset.targetPageSize)\n .then(tableRoot => {\n // Always update the toggle state.\n // This ensures that the bulk actions are disabled after changing the page size.\n CheckboxToggleAll.setGroupState(tableRoot, 'participants-table', checkCountButtonClicked);\n\n return tableRoot;\n })\n .catch(Notification.exception);\n }\n });\n\n // When the content is refreshed, update the row counts in various places.\n root.addEventListener(DynamicTable.Events.tableContentRefreshed, e => {\n const showCountLink = root.querySelector(Selectors.showCountToggle);\n const checkCountButton = root.querySelector(Selectors.checkCountButton);\n\n const tableRoot = e.target;\n\n const defaultPageSize = parseInt(root.dataset.tableDefaultPerPage, 10);\n const currentPageSize = parseInt(tableRoot.dataset.tablePageSize, 10);\n const totalRowCount = parseInt(tableRoot.dataset.tableTotalRows, 10);\n\n CheckboxToggleAll.updateSlavesFromMasterState(tableRoot, 'participants-table');\n\n const pageCountStrings = [\n {\n key: 'countparticipantsfound',\n component: 'core_user',\n param: totalRowCount,\n },\n ];\n\n\n if (totalRowCount <= defaultPageSize) {\n // There are fewer than the default page count numbers of rows.\n showCountLink.classList.add('hidden');\n\n if (checkCountButton) {\n checkCountButton.classList.add('hidden');\n }\n } else if (totalRowCount <= currentPageSize) {\n // The are fewer than the current page size.\n pageCountStrings.push({\n key: 'showperpage',\n component: 'core',\n param: defaultPageSize,\n });\n\n pageCountStrings.push({\n key: 'selectalluserswithcount',\n component: 'core',\n param: defaultPageSize,\n });\n\n // Show the 'Show [x]' link.\n showCountLink.classList.remove('hidden');\n showCountLink.dataset.targetPageSize = defaultPageSize;\n\n if (checkCountButton) {\n // The 'Check all [x]' button is only visible when there are values to set.\n checkCountButton.classList.add('hidden');\n }\n } else {\n pageCountStrings.push({\n key: 'showall',\n component: 'core',\n param: totalRowCount,\n });\n\n pageCountStrings.push({\n key: 'selectalluserswithcount',\n component: 'core',\n param: totalRowCount,\n });\n\n // Show both the 'Show [x]' link, and the 'Check all [x]' button.\n showCountLink.classList.remove('hidden');\n showCountLink.dataset.targetPageSize = totalRowCount;\n\n if (checkCountButton) {\n checkCountButton.classList.remove('hidden');\n }\n }\n\n Str.get_strings(pageCountStrings)\n .then(([showingParticipantCountString, showCountString, selectCountString]) => {\n const showingParticipantCount = root.querySelector(Selectors.showCountText);\n showingParticipantCount.innerHTML = showingParticipantCountString;\n\n if (showCountString) {\n showCountLink.innerHTML = showCountString;\n }\n\n if (selectCountString && checkCountButton) {\n checkCountButton.value = selectCountString;\n }\n\n return;\n })\n .catch(Notification.exception);\n });\n };\n\n const resetBulkAction = bulkActionSelect => {\n bulkActionSelect.value = '';\n };\n\n registerEventListeners();\n};\n"],"file":"participants.min.js"} \ No newline at end of file diff --git a/user/amd/src/participants.js b/user/amd/src/participants.js index f9b62a670d4..e56541c87fa 100644 --- a/user/amd/src/participants.js +++ b/user/amd/src/participants.js @@ -59,7 +59,8 @@ export const init = ({ const registerEventListeners = () => { CustomEvents.define(Selectors.bulkActionSelect, [CustomEvents.events.accessibleChange]); jQuery(Selectors.bulkActionSelect).on(CustomEvents.events.accessibleChange, e => { - const action = e.target.value; + const bulkActionSelect = e.target.closest('select'); + const action = bulkActionSelect.value; const tableRoot = getTableFromUniqueId(uniqueid); const checkboxes = tableRoot.querySelectorAll(Selectors.bulkUserSelectedCheckBoxes); @@ -88,8 +89,7 @@ export const init = ({ .then(modal => { modal.getRoot().on(ModalEvents.hidden, () => { // Focus on the action select when the dialog is closed. - const bulkActionSelector = root.querySelector(Selectors.bulkActionSelect); - bulkActionSelector.focus(); + bulkActionSelect.focus(); }); return modal; @@ -97,10 +97,10 @@ export const init = ({ .catch(Notification.exception); } } else if (action !== '' && checkboxes.length) { - e.target.form.submit(); + bulkActionSelect.form.submit(); } - resetBulkAction(e.target); + resetBulkAction(bulkActionSelect); }); root.addEventListener('click', e => {