From dabf88a99a1f10db07106930897b657f613b8511 Mon Sep 17 00:00:00 2001 From: Huong Nguyen Date: Mon, 8 Jul 2024 09:13:19 +0700 Subject: [PATCH] MDL-82404 core_cohort: Fix random Behat failure - Switched to use Table row verification instead of text assertion for better result - Used the correct selector for checkboxes --- cohort/amd/build/actions.min.js | 2 +- cohort/amd/build/actions.min.js.map | 2 +- cohort/amd/src/actions.js | 12 +++--------- cohort/tests/behat/add_cohort.feature | 17 +++++++++++++---- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/cohort/amd/build/actions.min.js b/cohort/amd/build/actions.min.js index c5d49ea3974..e54666369af 100644 --- a/cohort/amd/build/actions.min.js +++ b/cohort/amd/build/actions.min.js @@ -5,6 +5,6 @@ define("core_cohort/actions",["exports","core/event_dispatcher","core/notificati * @module core_cohort/actions * @copyright 2024 David Woloszyn * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later - */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.registerEventListeners=_exports.init=void 0,_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),reportEvents=_interopRequireWildcard(reportEvents),reportSelectors=_interopRequireWildcard(reportSelectors);const SELECTORS_CHECKBOXES='[data-togglegroup="report-select-all"][data-toggle="slave"]:checked',SELECTORS_DELETEBUTTON='[data-action="cohort-delete-selected"]',SELECTORS_EDITNAME='[data-itemtype="cohortname"]';_exports.init=()=>{(0,_prefetch.prefetchStrings)("core_cohort",["delcohortsconfirm"]),(0,_prefetch.prefetchStrings)("core",["delete","deleteselected","selectitem"]),registerEventListeners()};const registerEventListeners=()=>{document.addEventListener(_events2.eventTypes.elementUpdated,(async event=>{if(event.target.closest(SELECTORS_EDITNAME)){const newName=await(0,_str.getString)("selectitem","core",event.target.dataset.value),cohortId=event.target.dataset.itemid,checkbox=document.querySelector('input[value="'.concat(cohortId,'"]')),label=document.querySelector('label[for="'.concat(checkbox.id,'"]'));newName&&label&&(label.innerHTML=newName)}})),document.addEventListener("click",(event=>{const cohortDeleteSelected=event.target.closest(SELECTORS_DELETEBUTTON);if(cohortDeleteSelected){event.preventDefault();const reportElement=document.querySelector(reportSelectors.regions.report),cohortDeleteChecked=reportElement.querySelectorAll(SELECTORS_CHECKBOXES);if(0===cohortDeleteChecked.length)return;_notification.default.saveCancelPromise((0,_str.getString)("deleteselected","core"),(0,_str.getString)("delcohortsconfirm","core_cohort"),(0,_str.getString)("delete","core"),{triggerElement:cohortDeleteSelected}).then((()=>{const pendingPromise=new _pending.default("core_cohort/cohorts:delete"),deleteCohortIds=[...cohortDeleteChecked].map((check=>check.value));return(0,_repository.deleteCohorts)(deleteCohortIds).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{preservePagination:!0},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)})).catch((()=>{}))}}))};_exports.registerEventListeners=registerEventListeners})); + */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.registerEventListeners=_exports.init=void 0,_notification=_interopRequireDefault(_notification),_pending=_interopRequireDefault(_pending),reportEvents=_interopRequireWildcard(reportEvents),reportSelectors=_interopRequireWildcard(reportSelectors);const SELECTORS_CHECKBOXES='[data-togglegroup="report-select-all"][data-toggle="slave"]:checked',SELECTORS_DELETEBUTTON='[data-action="cohort-delete-selected"]',SELECTORS_EDITNAME='[data-itemtype="cohortname"]';_exports.init=()=>{(0,_prefetch.prefetchStrings)("core_cohort",["delcohortsconfirm"]),(0,_prefetch.prefetchStrings)("core",["delete","deleteselected","selectitem"]),registerEventListeners()};const registerEventListeners=()=>{document.addEventListener(_events2.eventTypes.elementUpdated,(async event=>{if(event.target.closest(SELECTORS_EDITNAME)){const cohortId=event.target.dataset.itemid,checkbox=document.querySelector('input[value="'.concat(cohortId,'"][type="checkbox"]')),label=document.querySelector('label[for="'.concat(checkbox.id,'"]'));label&&(label.innerHTML=await(0,_str.getString)("selectitem","core",event.target.dataset.value))}})),document.addEventListener("click",(event=>{const cohortDeleteSelected=event.target.closest(SELECTORS_DELETEBUTTON);if(cohortDeleteSelected){event.preventDefault();const reportElement=document.querySelector(reportSelectors.regions.report),cohortDeleteChecked=reportElement.querySelectorAll(SELECTORS_CHECKBOXES);if(0===cohortDeleteChecked.length)return;_notification.default.saveCancelPromise((0,_str.getString)("deleteselected","core"),(0,_str.getString)("delcohortsconfirm","core_cohort"),(0,_str.getString)("delete","core"),{triggerElement:cohortDeleteSelected}).then((()=>{const pendingPromise=new _pending.default("core_cohort/cohorts:delete"),deleteCohortIds=[...cohortDeleteChecked].map((check=>check.value));return(0,_repository.deleteCohorts)(deleteCohortIds).then((()=>((0,_event_dispatcher.dispatchEvent)(reportEvents.tableReload,{preservePagination:!0},reportElement),pendingPromise.resolve()))).catch(_notification.default.exception)})).catch((()=>{}))}}))};_exports.registerEventListeners=registerEventListeners})); //# sourceMappingURL=actions.min.js.map \ No newline at end of file diff --git a/cohort/amd/build/actions.min.js.map b/cohort/amd/build/actions.min.js.map index 7f777fd08ae..4885abd4649 100644 --- a/cohort/amd/build/actions.min.js.map +++ b/cohort/amd/build/actions.min.js.map @@ -1 +1 @@ -{"version":3,"file":"actions.min.js","sources":["../src/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 * Cohorts actions.\n *\n * @module core_cohort/actions\n * @copyright 2024 David Woloszyn \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {dispatchEvent} from 'core/event_dispatcher';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {prefetchStrings} from 'core/prefetch';\nimport {getString} from 'core/str';\nimport {deleteCohorts} from 'core_cohort/repository';\nimport * as reportEvents from 'core_reportbuilder/local/events';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {eventTypes} from 'core/local/inplace_editable/events';\n\nconst SELECTORS = {\n CHECKBOXES: '[data-togglegroup=\"report-select-all\"][data-toggle=\"slave\"]:checked',\n DELETEBUTTON: '[data-action=\"cohort-delete-selected\"]',\n EDITNAME: '[data-itemtype=\"cohortname\"]',\n};\n\n/**\n * Initialise module.\n */\nexport const init = () => {\n\n prefetchStrings('core_cohort', [\n 'delcohortsconfirm',\n ]);\n\n prefetchStrings('core', [\n 'delete',\n 'deleteselected',\n 'selectitem',\n ]);\n\n registerEventListeners();\n};\n\n/**\n * Register event listeners.\n */\nexport const registerEventListeners = () => {\n\n // Edit cohort name inplace.\n document.addEventListener(eventTypes.elementUpdated, async(event) => {\n\n const editCohortName = event.target.closest(SELECTORS.EDITNAME);\n\n if (editCohortName) {\n const newName = await getString('selectitem', 'core', event.target.dataset.value);\n const cohortId = event.target.dataset.itemid;\n const checkbox = document.querySelector(`input[value=\"${cohortId}\"]`);\n const label = document.querySelector(`label[for=\"${checkbox.id}\"]`);\n\n if (newName && label) {\n label.innerHTML = newName;\n }\n }\n });\n\n // Delete multiple cohorts.\n document.addEventListener('click', event => {\n\n const cohortDeleteSelected = event.target.closest(SELECTORS.DELETEBUTTON);\n\n if (cohortDeleteSelected) {\n event.preventDefault();\n\n const reportElement = document.querySelector(reportSelectors.regions.report);\n const cohortDeleteChecked = reportElement.querySelectorAll(SELECTORS.CHECKBOXES);\n if (cohortDeleteChecked.length === 0) {\n return;\n }\n\n Notification.saveCancelPromise(\n getString('deleteselected', 'core'),\n getString('delcohortsconfirm', 'core_cohort'),\n getString('delete', 'core'),\n {triggerElement: cohortDeleteSelected}\n ).then(() => {\n const pendingPromise = new Pending('core_cohort/cohorts:delete');\n const deleteCohortIds = [...cohortDeleteChecked].map(check => check.value);\n\n // eslint-disable-next-line promise/no-nesting\n return deleteCohorts(deleteCohortIds)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {preservePagination: true}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n });\n};\n"],"names":["SELECTORS","registerEventListeners","document","addEventListener","eventTypes","elementUpdated","async","event","target","closest","newName","dataset","value","cohortId","itemid","checkbox","querySelector","label","id","innerHTML","cohortDeleteSelected","preventDefault","reportElement","reportSelectors","regions","report","cohortDeleteChecked","querySelectorAll","length","saveCancelPromise","triggerElement","then","pendingPromise","Pending","deleteCohortIds","map","check","reportEvents","tableReload","preservePagination","resolve","catch","Notification","exception"],"mappings":";;;;;;;kUAiCMA,qBACU,sEADVA,uBAEY,yCAFZA,mBAGQ,6CAMM,mCAEA,cAAe,CAC3B,oDAGY,OAAQ,CACpB,SACA,iBACA,eAGJC,gCAMSA,uBAAyB,KAGlCC,SAASC,iBAAiBC,oBAAWC,gBAAgBC,MAAAA,WAE1BC,MAAMC,OAAOC,QAAQT,oBAExB,OACVU,cAAgB,kBAAU,aAAc,OAAQH,MAAMC,OAAOG,QAAQC,OACrEC,SAAWN,MAAMC,OAAOG,QAAQG,OAChCC,SAAWb,SAASc,qCAA8BH,gBAClDI,MAAQf,SAASc,mCAA4BD,SAASG,UAExDR,SAAWO,QACXA,MAAME,UAAYT,aAM9BR,SAASC,iBAAiB,SAASI,cAEzBa,qBAAuBb,MAAMC,OAAOC,QAAQT,2BAE9CoB,qBAAsB,CACtBb,MAAMc,uBAEAC,cAAgBpB,SAASc,cAAcO,gBAAgBC,QAAQC,QAC/DC,oBAAsBJ,cAAcK,iBAAiB3B,yBACxB,IAA/B0B,oBAAoBE,oCAIXC,mBACT,kBAAU,iBAAkB,SAC5B,kBAAU,oBAAqB,gBAC/B,kBAAU,SAAU,QACpB,CAACC,eAAgBV,uBACnBW,MAAK,WACGC,eAAiB,IAAIC,iBAAQ,8BAC7BC,gBAAkB,IAAIR,qBAAqBS,KAAIC,OAASA,MAAMxB,eAG7D,6BAAcsB,iBAChBH,MAAK,yCACYM,aAAaC,YAAa,CAACC,oBAAoB,GAAOjB,eAC7DU,eAAeQ,aAEzBC,MAAMC,sBAAaC,cACzBF,OAAM"} \ No newline at end of file +{"version":3,"file":"actions.min.js","sources":["../src/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 * Cohorts actions.\n *\n * @module core_cohort/actions\n * @copyright 2024 David Woloszyn \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\n\nimport {dispatchEvent} from 'core/event_dispatcher';\nimport Notification from 'core/notification';\nimport Pending from 'core/pending';\nimport {prefetchStrings} from 'core/prefetch';\nimport {getString} from 'core/str';\nimport {deleteCohorts} from 'core_cohort/repository';\nimport * as reportEvents from 'core_reportbuilder/local/events';\nimport * as reportSelectors from 'core_reportbuilder/local/selectors';\nimport {eventTypes} from 'core/local/inplace_editable/events';\n\nconst SELECTORS = {\n CHECKBOXES: '[data-togglegroup=\"report-select-all\"][data-toggle=\"slave\"]:checked',\n DELETEBUTTON: '[data-action=\"cohort-delete-selected\"]',\n EDITNAME: '[data-itemtype=\"cohortname\"]',\n};\n\n/**\n * Initialise module.\n */\nexport const init = () => {\n\n prefetchStrings('core_cohort', [\n 'delcohortsconfirm',\n ]);\n\n prefetchStrings('core', [\n 'delete',\n 'deleteselected',\n 'selectitem',\n ]);\n\n registerEventListeners();\n};\n\n/**\n * Register event listeners.\n */\nexport const registerEventListeners = () => {\n\n // Edit cohort name inplace.\n document.addEventListener(eventTypes.elementUpdated, async(event) => {\n const editCohortName = event.target.closest(SELECTORS.EDITNAME);\n if (editCohortName) {\n const cohortId = event.target.dataset.itemid;\n const checkbox = document.querySelector(`input[value=\"${cohortId}\"][type=\"checkbox\"]`);\n const label = document.querySelector(`label[for=\"${checkbox.id}\"]`);\n if (label) {\n label.innerHTML = await getString('selectitem', 'core', event.target.dataset.value);\n }\n }\n });\n\n // Delete multiple cohorts.\n document.addEventListener('click', event => {\n const cohortDeleteSelected = event.target.closest(SELECTORS.DELETEBUTTON);\n if (cohortDeleteSelected) {\n event.preventDefault();\n\n const reportElement = document.querySelector(reportSelectors.regions.report);\n const cohortDeleteChecked = reportElement.querySelectorAll(SELECTORS.CHECKBOXES);\n if (cohortDeleteChecked.length === 0) {\n return;\n }\n\n Notification.saveCancelPromise(\n getString('deleteselected', 'core'),\n getString('delcohortsconfirm', 'core_cohort'),\n getString('delete', 'core'),\n {triggerElement: cohortDeleteSelected}\n ).then(() => {\n const pendingPromise = new Pending('core_cohort/cohorts:delete');\n const deleteCohortIds = [...cohortDeleteChecked].map(check => check.value);\n\n // eslint-disable-next-line promise/no-nesting\n return deleteCohorts(deleteCohortIds)\n .then(() => {\n dispatchEvent(reportEvents.tableReload, {preservePagination: true}, reportElement);\n return pendingPromise.resolve();\n })\n .catch(Notification.exception);\n }).catch(() => {\n return;\n });\n }\n });\n};\n"],"names":["SELECTORS","registerEventListeners","document","addEventListener","eventTypes","elementUpdated","async","event","target","closest","cohortId","dataset","itemid","checkbox","querySelector","label","id","innerHTML","value","cohortDeleteSelected","preventDefault","reportElement","reportSelectors","regions","report","cohortDeleteChecked","querySelectorAll","length","saveCancelPromise","triggerElement","then","pendingPromise","Pending","deleteCohortIds","map","check","reportEvents","tableReload","preservePagination","resolve","catch","Notification","exception"],"mappings":";;;;;;;kUAiCMA,qBACU,sEADVA,uBAEY,yCAFZA,mBAGQ,6CAMM,mCAEA,cAAe,CAC3B,oDAGY,OAAQ,CACpB,SACA,iBACA,eAGJC,gCAMSA,uBAAyB,KAGlCC,SAASC,iBAAiBC,oBAAWC,gBAAgBC,MAAAA,WAC1BC,MAAMC,OAAOC,QAAQT,oBACxB,OACVU,SAAWH,MAAMC,OAAOG,QAAQC,OAChCC,SAAWX,SAASY,qCAA8BJ,iCAClDK,MAAQb,SAASY,mCAA4BD,SAASG,UACxDD,QACAA,MAAME,gBAAkB,kBAAU,aAAc,OAAQV,MAAMC,OAAOG,QAAQO,YAMzFhB,SAASC,iBAAiB,SAASI,cACzBY,qBAAuBZ,MAAMC,OAAOC,QAAQT,2BAC9CmB,qBAAsB,CACtBZ,MAAMa,uBAEAC,cAAgBnB,SAASY,cAAcQ,gBAAgBC,QAAQC,QAC/DC,oBAAsBJ,cAAcK,iBAAiB1B,yBACxB,IAA/ByB,oBAAoBE,oCAIXC,mBACT,kBAAU,iBAAkB,SAC5B,kBAAU,oBAAqB,gBAC/B,kBAAU,SAAU,QACpB,CAACC,eAAgBV,uBACnBW,MAAK,WACGC,eAAiB,IAAIC,iBAAQ,8BAC7BC,gBAAkB,IAAIR,qBAAqBS,KAAIC,OAASA,MAAMjB,eAG7D,6BAAce,iBAChBH,MAAK,yCACYM,aAAaC,YAAa,CAACC,oBAAoB,GAAOjB,eAC7DU,eAAeQ,aAEzBC,MAAMC,sBAAaC,cACzBF,OAAM"} \ No newline at end of file diff --git a/cohort/amd/src/actions.js b/cohort/amd/src/actions.js index e529714f798..a6480122259 100644 --- a/cohort/amd/src/actions.js +++ b/cohort/amd/src/actions.js @@ -62,26 +62,20 @@ export const registerEventListeners = () => { // Edit cohort name inplace. document.addEventListener(eventTypes.elementUpdated, async(event) => { - const editCohortName = event.target.closest(SELECTORS.EDITNAME); - if (editCohortName) { - const newName = await getString('selectitem', 'core', event.target.dataset.value); const cohortId = event.target.dataset.itemid; - const checkbox = document.querySelector(`input[value="${cohortId}"]`); + const checkbox = document.querySelector(`input[value="${cohortId}"][type="checkbox"]`); const label = document.querySelector(`label[for="${checkbox.id}"]`); - - if (newName && label) { - label.innerHTML = newName; + if (label) { + label.innerHTML = await getString('selectitem', 'core', event.target.dataset.value); } } }); // Delete multiple cohorts. document.addEventListener('click', event => { - const cohortDeleteSelected = event.target.closest(SELECTORS.DELETEBUTTON); - if (cohortDeleteSelected) { event.preventDefault(); diff --git a/cohort/tests/behat/add_cohort.feature b/cohort/tests/behat/add_cohort.feature index 5b1f6a6b18f..9b808900972 100644 --- a/cohort/tests/behat/add_cohort.feature +++ b/cohort/tests/behat/add_cohort.feature @@ -121,8 +121,17 @@ Feature: Add cohorts of users @javascript Scenario: Edit cohort name in-place When I navigate to "Users > Accounts > Cohorts" in site administration + Then the following should exist in the "reportbuilder-table" table: + | Name | Cohort ID | Description | + | Test cohort name | 333 | Test cohort description | And I set the field "Edit cohort name" to "Students cohort" - Then I should not see "Test cohort name" - And I should see "Students cohort" - And I navigate to "Users > Accounts > Cohorts" in site administration - And I should see "Students cohort" + And the following should not exist in the "reportbuilder-table" table: + | Name | Cohort ID | Description | + | Test cohort name | 333 | Test cohort description | + And the following should exist in the "reportbuilder-table" table: + | Name | Cohort ID | Description | + | Students cohort | 333 | Test cohort description | + And I reload the page + And the following should exist in the "reportbuilder-table" table: + | Name | Cohort ID | Description | + | Students cohort | 333 | Test cohort description |