diff --git a/lib/form/amd/build/collapsesections.min.js b/lib/form/amd/build/collapsesections.min.js
index dee64966c5d..3bf9630b22b 100644
--- a/lib/form/amd/build/collapsesections.min.js
+++ b/lib/form/amd/build/collapsesections.min.js
@@ -6,6 +6,6 @@ define("core_form/collapsesections",["exports","jquery","core/pending"],(functio
* @copyright 2021 Bas Brands
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since 4.0
- */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_jquery=_interopRequireDefault(_jquery),_pending=_interopRequireDefault(_pending);const SELECTORS_FORMHEADER=".fheader",SELECTORS_FORMCONTAINER=".fcontainer",SELECTORS_FIELDSET="fieldset",CLASSES_SHOW="show",CLASSES_COLLAPSED="collapsed",CLASSES_HIDDEN="d-none";_exports.init=collapsesections=>{const pendingPromise=new _pending.default("core_form/collapsesections"),collapsemenu=document.querySelector(collapsesections),formParent=collapsemenu.closest("form");collapsemenu.addEventListener("keydown",(e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),collapsemenu.click())}));let formcontainercount=0;(0,_jquery.default)(SELECTORS_FORMCONTAINER).each(((_,container)=>{const parentFieldset=container.closest(SELECTORS_FIELDSET);parentFieldset!=container.parentElement||parentFieldset.classList.contains(CLASSES_HIDDEN)||formcontainercount++}));let expandedcount=0;(0,_jquery.default)(SELECTORS_FORMCONTAINER).each(((_,collapsecontainer)=>{collapsecontainer.classList.contains(CLASSES_SHOW)&&expandedcount++})),formcontainercount===expandedcount&&(collapsemenu.classList.remove(CLASSES_COLLAPSED),collapsemenu.setAttribute("aria-expanded",!0)),collapsemenu.addEventListener("click",(()=>{let action="hide";collapsemenu.classList.contains(CLASSES_COLLAPSED)&&(action="show"),formParent.querySelectorAll(SELECTORS_FORMCONTAINER).forEach((collapsecontainer=>{(0,_jquery.default)(collapsecontainer).collapse(action)}))}));const collapseElementIds=[...(0,_jquery.default)(SELECTORS_FORMHEADER)].map(((element,index)=>(element.id=element.id||"collapseElement-".concat(index),element.id)));collapsemenu.setAttribute("aria-controls",collapseElementIds.join(" ")),(0,_jquery.default)(SELECTORS_FORMCONTAINER).on("hidden.bs.collapse",(()=>{let allCollapsed=!0;formParent.querySelectorAll(SELECTORS_FORMCONTAINER).forEach((collapsecontainer=>{collapsecontainer.classList.contains(CLASSES_SHOW)&&(allCollapsed=!1)})),allCollapsed&&(collapsemenu.classList.add(CLASSES_COLLAPSED),collapsemenu.setAttribute("aria-expanded",!1))})),(0,_jquery.default)(SELECTORS_FORMCONTAINER).on("shown.bs.collapse",(()=>{let allExpanded=!0;formParent.querySelectorAll(SELECTORS_FORMCONTAINER).forEach((collapsecontainer=>{collapsecontainer.classList.contains(CLASSES_SHOW)||(allExpanded=!1)})),allExpanded&&(collapsemenu.classList.remove(CLASSES_COLLAPSED),collapsemenu.setAttribute("aria-expanded",!0))})),pendingPromise.resolve()}}));
+ */Object.defineProperty(_exports,"__esModule",{value:!0}),_exports.init=void 0,_jquery=_interopRequireDefault(_jquery),_pending=_interopRequireDefault(_pending);const SELECTORS_FORMHEADER=".fheader",SELECTORS_FORMCONTAINER="fieldset > .fcontainer",CLASSES_SHOW="show",CLASSES_COLLAPSED="collapsed",CLASSES_HIDDEN="d-none";_exports.init=collapsesections=>{const pendingPromise=new _pending.default("core_form/collapsesections"),collapsemenu=document.querySelector(collapsesections),formParent=collapsemenu.closest("form"),formContainers=(null==formParent?void 0:formParent.querySelectorAll(SELECTORS_FORMCONTAINER))||[];collapsemenu.addEventListener("keydown",(e=>{"Enter"!==e.key&&" "!==e.key||(e.preventDefault(),collapsemenu.click())}));let formcontainercount=0,expandedcount=0;formContainers.forEach((container=>{container.parentElement.classList.contains(CLASSES_HIDDEN)||formcontainercount++,container.classList.contains(CLASSES_SHOW)&&expandedcount++})),formcontainercount===expandedcount&&(collapsemenu.classList.remove(CLASSES_COLLAPSED),collapsemenu.setAttribute("aria-expanded",!0)),collapsemenu.addEventListener("click",(()=>{let action="hide";collapsemenu.classList.contains(CLASSES_COLLAPSED)&&(action="show"),formContainers.forEach((container=>(0,_jquery.default)(container).collapse(action)))}));const collapseElementIds=[...(0,_jquery.default)(SELECTORS_FORMHEADER)].map(((element,index)=>(element.id=element.id||"collapseElement-".concat(index),element.id)));collapsemenu.setAttribute("aria-controls",collapseElementIds.join(" ")),(0,_jquery.default)(SELECTORS_FORMCONTAINER).on("hidden.bs.collapse",(()=>{[...formContainers].every((container=>!container.classList.contains(CLASSES_SHOW)))&&(collapsemenu.classList.add(CLASSES_COLLAPSED),collapsemenu.setAttribute("aria-expanded",!1))})),(0,_jquery.default)(SELECTORS_FORMCONTAINER).on("shown.bs.collapse",(()=>{[...formContainers].every((container=>container.classList.contains(CLASSES_SHOW)))&&(collapsemenu.classList.remove(CLASSES_COLLAPSED),collapsemenu.setAttribute("aria-expanded",!0))})),pendingPromise.resolve()}}));
//# sourceMappingURL=collapsesections.min.js.map
\ No newline at end of file
diff --git a/lib/form/amd/build/collapsesections.min.js.map b/lib/form/amd/build/collapsesections.min.js.map
index 46d3116f5fe..266e864bf96 100644
--- a/lib/form/amd/build/collapsesections.min.js.map
+++ b/lib/form/amd/build/collapsesections.min.js.map
@@ -1 +1 @@
-{"version":3,"file":"collapsesections.min.js","sources":["../src/collapsesections.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 * Collapse or expand all form sections on clicking the expand all / collapse al link.\n *\n * @module core_form/collapsesections\n * @copyright 2021 Bas Brands\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 4.0\n */\n\nimport $ from 'jquery';\nimport Pending from 'core/pending';\n\nconst SELECTORS = {\n FORMHEADER: '.fheader',\n FORMCONTAINER: '.fcontainer',\n FIELDSET: 'fieldset',\n};\n\nconst CLASSES = {\n SHOW: 'show',\n COLLAPSED: 'collapsed',\n HIDDEN: 'd-none'\n};\n\n/**\n * Initialises the form section collapse / expand action.\n *\n * @param {string} collapsesections the collapse/expand link id.\n */\nexport const init = collapsesections => {\n // All jQuery in this code can be replaced when MDL-71979 is integrated (move to Bootstrap 5).\n const pendingPromise = new Pending('core_form/collapsesections');\n const collapsemenu = document.querySelector(collapsesections);\n const formParent = collapsemenu.closest('form');\n collapsemenu.addEventListener('keydown', e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n collapsemenu.click();\n }\n });\n\n // Override default collapse class if all visible containers are expanded on page load\n let formcontainercount = 0;\n $(SELECTORS.FORMCONTAINER).each((_, container) => {\n const parentFieldset = container.closest(SELECTORS.FIELDSET);\n if (parentFieldset == container.parentElement && !parentFieldset.classList.contains(CLASSES.HIDDEN)) {\n formcontainercount++;\n }\n });\n let expandedcount = 0;\n $(SELECTORS.FORMCONTAINER).each((_, collapsecontainer) => {\n if (collapsecontainer.classList.contains(CLASSES.SHOW)) {\n expandedcount++;\n }\n });\n\n if (formcontainercount === expandedcount) {\n collapsemenu.classList.remove(CLASSES.COLLAPSED);\n collapsemenu.setAttribute('aria-expanded', true);\n }\n\n collapsemenu.addEventListener('click', () => {\n let action = 'hide';\n if (collapsemenu.classList.contains(CLASSES.COLLAPSED)) {\n action = 'show';\n }\n\n formParent.querySelectorAll(SELECTORS.FORMCONTAINER).forEach((collapsecontainer) => {\n $(collapsecontainer).collapse(action);\n });\n });\n\n // Ensure collapse menu button adds aria-controls attribute referring to each collapsible element.\n const collapseElements = $(SELECTORS.FORMHEADER);\n const collapseElementIds = [...collapseElements].map((element, index) => {\n element.id = element.id || `collapseElement-${index}`;\n return element.id;\n });\n collapsemenu.setAttribute('aria-controls', collapseElementIds.join(' '));\n\n $(SELECTORS.FORMCONTAINER).on('hidden.bs.collapse', () => {\n let allCollapsed = true;\n\n formParent.querySelectorAll(SELECTORS.FORMCONTAINER).forEach((collapsecontainer) => {\n if (collapsecontainer.classList.contains(CLASSES.SHOW)) {\n allCollapsed = false;\n }\n });\n\n if (allCollapsed) {\n collapsemenu.classList.add(CLASSES.COLLAPSED);\n collapsemenu.setAttribute('aria-expanded', false);\n }\n });\n $(SELECTORS.FORMCONTAINER).on('shown.bs.collapse', () => {\n let allExpanded = true;\n\n formParent.querySelectorAll(SELECTORS.FORMCONTAINER).forEach((collapsecontainer) => {\n if (!collapsecontainer.classList.contains(CLASSES.SHOW)) {\n allExpanded = false;\n }\n });\n\n if (allExpanded) {\n collapsemenu.classList.remove(CLASSES.COLLAPSED);\n collapsemenu.setAttribute('aria-expanded', true);\n }\n });\n pendingPromise.resolve();\n};\n"],"names":["SELECTORS","CLASSES","collapsesections","pendingPromise","Pending","collapsemenu","document","querySelector","formParent","closest","addEventListener","e","key","preventDefault","click","formcontainercount","each","_","container","parentFieldset","parentElement","classList","contains","expandedcount","collapsecontainer","remove","setAttribute","action","querySelectorAll","forEach","collapse","collapseElementIds","map","element","index","id","join","on","allCollapsed","add","allExpanded","resolve"],"mappings":";;;;;;;;0KA2BMA,qBACU,WADVA,wBAEa,cAFbA,mBAGQ,WAGRC,aACI,OADJA,kBAES,YAFTA,eAGM,uBAQQC,yBAEVC,eAAiB,IAAIC,iBAAQ,8BAC7BC,aAAeC,SAASC,cAAcL,kBACtCM,WAAaH,aAAaI,QAAQ,QACxCJ,aAAaK,iBAAiB,WAAWC,IACvB,UAAVA,EAAEC,KAA6B,MAAVD,EAAEC,MACvBD,EAAEE,iBACFR,aAAaS,gBAKjBC,mBAAqB,sBACvBf,yBAAyBgB,MAAK,CAACC,EAAGC,mBAC1BC,eAAiBD,UAAUT,QAAQT,oBACrCmB,gBAAkBD,UAAUE,eAAkBD,eAAeE,UAAUC,SAASrB,iBAChFc,4BAGJQ,cAAgB,sBAClBvB,yBAAyBgB,MAAK,CAACC,EAAGO,qBAC5BA,kBAAkBH,UAAUC,SAASrB,eACrCsB,mBAIJR,qBAAuBQ,gBACvBlB,aAAagB,UAAUI,OAAOxB,mBAC9BI,aAAaqB,aAAa,iBAAiB,IAG/CrB,aAAaK,iBAAiB,SAAS,SAC/BiB,OAAS,OACTtB,aAAagB,UAAUC,SAASrB,qBAChC0B,OAAS,QAGbnB,WAAWoB,iBAAiB5B,yBAAyB6B,SAASL,wCACxDA,mBAAmBM,SAASH,oBAMhCI,mBAAqB,KADF,mBAAE/B,uBACsBgC,KAAI,CAACC,QAASC,SAC3DD,QAAQE,GAAKF,QAAQE,8BAAyBD,OACvCD,QAAQE,MAEnB9B,aAAaqB,aAAa,gBAAiBK,mBAAmBK,KAAK,0BAEjEpC,yBAAyBqC,GAAG,sBAAsB,SAC5CC,cAAe,EAEnB9B,WAAWoB,iBAAiB5B,yBAAyB6B,SAASL,oBACtDA,kBAAkBH,UAAUC,SAASrB,gBACrCqC,cAAe,MAInBA,eACAjC,aAAagB,UAAUkB,IAAItC,mBAC3BI,aAAaqB,aAAa,iBAAiB,2BAGjD1B,yBAAyBqC,GAAG,qBAAqB,SAC3CG,aAAc,EAElBhC,WAAWoB,iBAAiB5B,yBAAyB6B,SAASL,oBACrDA,kBAAkBH,UAAUC,SAASrB,gBACtCuC,aAAc,MAIlBA,cACAnC,aAAagB,UAAUI,OAAOxB,mBAC9BI,aAAaqB,aAAa,iBAAiB,OAGnDvB,eAAesC"}
\ No newline at end of file
+{"version":3,"file":"collapsesections.min.js","sources":["../src/collapsesections.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 * Collapse or expand all form sections on clicking the expand all / collapse al link.\n *\n * @module core_form/collapsesections\n * @copyright 2021 Bas Brands\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 4.0\n */\n\nimport $ from 'jquery';\nimport Pending from 'core/pending';\n\nconst SELECTORS = {\n FORMHEADER: '.fheader',\n FORMCONTAINER: 'fieldset > .fcontainer',\n};\n\nconst CLASSES = {\n SHOW: 'show',\n COLLAPSED: 'collapsed',\n HIDDEN: 'd-none'\n};\n\n/**\n * Initialises the form section collapse / expand action.\n *\n * @param {string} collapsesections the collapse/expand link id.\n */\nexport const init = collapsesections => {\n // All jQuery in this code can be replaced when MDL-71979 is integrated (move to Bootstrap 5).\n const pendingPromise = new Pending('core_form/collapsesections');\n const collapsemenu = document.querySelector(collapsesections);\n const formParent = collapsemenu.closest('form');\n const formContainers = formParent?.querySelectorAll(SELECTORS.FORMCONTAINER) || [];\n\n collapsemenu.addEventListener('keydown', e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n collapsemenu.click();\n }\n });\n\n // Override default collapse class if all visible containers are expanded on page load\n let formcontainercount = 0;\n let expandedcount = 0;\n formContainers.forEach(container => {\n const parentFieldset = container.parentElement;\n if (!parentFieldset.classList.contains(CLASSES.HIDDEN)) {\n formcontainercount++;\n }\n if (container.classList.contains(CLASSES.SHOW)) {\n expandedcount++;\n }\n });\n\n if (formcontainercount === expandedcount) {\n collapsemenu.classList.remove(CLASSES.COLLAPSED);\n collapsemenu.setAttribute('aria-expanded', true);\n }\n\n // When the collapse menu is toggled, update each form container to match.\n collapsemenu.addEventListener('click', () => {\n let action = 'hide';\n if (collapsemenu.classList.contains(CLASSES.COLLAPSED)) {\n action = 'show';\n }\n\n formContainers.forEach(container => $(container).collapse(action));\n });\n\n // Ensure collapse menu button adds aria-controls attribute referring to each collapsible element.\n const collapseElements = $(SELECTORS.FORMHEADER);\n const collapseElementIds = [...collapseElements].map((element, index) => {\n element.id = element.id || `collapseElement-${index}`;\n return element.id;\n });\n collapsemenu.setAttribute('aria-controls', collapseElementIds.join(' '));\n\n // When any form container is toggled, re-calculate collapse menu state.\n $(SELECTORS.FORMCONTAINER).on('hidden.bs.collapse', () => {\n const allCollapsed = [...formContainers].every(container => !container.classList.contains(CLASSES.SHOW));\n if (allCollapsed) {\n collapsemenu.classList.add(CLASSES.COLLAPSED);\n collapsemenu.setAttribute('aria-expanded', false);\n }\n });\n $(SELECTORS.FORMCONTAINER).on('shown.bs.collapse', () => {\n const allExpanded = [...formContainers].every(container => container.classList.contains(CLASSES.SHOW));\n if (allExpanded) {\n collapsemenu.classList.remove(CLASSES.COLLAPSED);\n collapsemenu.setAttribute('aria-expanded', true);\n }\n });\n pendingPromise.resolve();\n};\n"],"names":["SELECTORS","CLASSES","collapsesections","pendingPromise","Pending","collapsemenu","document","querySelector","formParent","closest","formContainers","querySelectorAll","addEventListener","e","key","preventDefault","click","formcontainercount","expandedcount","forEach","container","parentElement","classList","contains","remove","setAttribute","action","collapse","collapseElementIds","map","element","index","id","join","on","every","add","resolve"],"mappings":";;;;;;;;0KA2BMA,qBACU,WADVA,wBAEa,yBAGbC,aACI,OADJA,kBAES,YAFTA,eAGM,uBAQQC,yBAEVC,eAAiB,IAAIC,iBAAQ,8BAC7BC,aAAeC,SAASC,cAAcL,kBACtCM,WAAaH,aAAaI,QAAQ,QAClCC,gBAAiBF,MAAAA,kBAAAA,WAAYG,iBAAiBX,2BAA4B,GAEhFK,aAAaO,iBAAiB,WAAWC,IACvB,UAAVA,EAAEC,KAA6B,MAAVD,EAAEC,MACvBD,EAAEE,iBACFV,aAAaW,gBAKjBC,mBAAqB,EACrBC,cAAgB,EACpBR,eAAeS,SAAQC,YACIA,UAAUC,cACbC,UAAUC,SAAStB,iBACnCgB,qBAEAG,UAAUE,UAAUC,SAAStB,eAC7BiB,mBAIJD,qBAAuBC,gBACvBb,aAAaiB,UAAUE,OAAOvB,mBAC9BI,aAAaoB,aAAa,iBAAiB,IAI/CpB,aAAaO,iBAAiB,SAAS,SAC/Bc,OAAS,OACTrB,aAAaiB,UAAUC,SAAStB,qBAChCyB,OAAS,QAGbhB,eAAeS,SAAQC,YAAa,mBAAEA,WAAWO,SAASD,mBAKxDE,mBAAqB,KADF,mBAAE5B,uBACsB6B,KAAI,CAACC,QAASC,SAC3DD,QAAQE,GAAKF,QAAQE,8BAAyBD,OACvCD,QAAQE,MAEnB3B,aAAaoB,aAAa,gBAAiBG,mBAAmBK,KAAK,0BAGjEjC,yBAAyBkC,GAAG,sBAAsB,KAC3B,IAAIxB,gBAAgByB,OAAMf,YAAcA,UAAUE,UAAUC,SAAStB,kBAEtFI,aAAaiB,UAAUc,IAAInC,mBAC3BI,aAAaoB,aAAa,iBAAiB,2BAGjDzB,yBAAyBkC,GAAG,qBAAqB,KAC3B,IAAIxB,gBAAgByB,OAAMf,WAAaA,UAAUE,UAAUC,SAAStB,kBAEpFI,aAAaiB,UAAUE,OAAOvB,mBAC9BI,aAAaoB,aAAa,iBAAiB,OAGnDtB,eAAekC"}
\ No newline at end of file
diff --git a/lib/form/amd/src/collapsesections.js b/lib/form/amd/src/collapsesections.js
index 84e02b0105f..d2a5dff0f04 100644
--- a/lib/form/amd/src/collapsesections.js
+++ b/lib/form/amd/src/collapsesections.js
@@ -27,8 +27,7 @@ import Pending from 'core/pending';
const SELECTORS = {
FORMHEADER: '.fheader',
- FORMCONTAINER: '.fcontainer',
- FIELDSET: 'fieldset',
+ FORMCONTAINER: 'fieldset > .fcontainer',
};
const CLASSES = {
@@ -47,6 +46,8 @@ export const init = collapsesections => {
const pendingPromise = new Pending('core_form/collapsesections');
const collapsemenu = document.querySelector(collapsesections);
const formParent = collapsemenu.closest('form');
+ const formContainers = formParent?.querySelectorAll(SELECTORS.FORMCONTAINER) || [];
+
collapsemenu.addEventListener('keydown', e => {
if (e.key === 'Enter' || e.key === ' ') {
e.preventDefault();
@@ -56,15 +57,13 @@ export const init = collapsesections => {
// Override default collapse class if all visible containers are expanded on page load
let formcontainercount = 0;
- $(SELECTORS.FORMCONTAINER).each((_, container) => {
- const parentFieldset = container.closest(SELECTORS.FIELDSET);
- if (parentFieldset == container.parentElement && !parentFieldset.classList.contains(CLASSES.HIDDEN)) {
+ let expandedcount = 0;
+ formContainers.forEach(container => {
+ const parentFieldset = container.parentElement;
+ if (!parentFieldset.classList.contains(CLASSES.HIDDEN)) {
formcontainercount++;
}
- });
- let expandedcount = 0;
- $(SELECTORS.FORMCONTAINER).each((_, collapsecontainer) => {
- if (collapsecontainer.classList.contains(CLASSES.SHOW)) {
+ if (container.classList.contains(CLASSES.SHOW)) {
expandedcount++;
}
});
@@ -74,15 +73,14 @@ export const init = collapsesections => {
collapsemenu.setAttribute('aria-expanded', true);
}
+ // When the collapse menu is toggled, update each form container to match.
collapsemenu.addEventListener('click', () => {
let action = 'hide';
if (collapsemenu.classList.contains(CLASSES.COLLAPSED)) {
action = 'show';
}
- formParent.querySelectorAll(SELECTORS.FORMCONTAINER).forEach((collapsecontainer) => {
- $(collapsecontainer).collapse(action);
- });
+ formContainers.forEach(container => $(container).collapse(action));
});
// Ensure collapse menu button adds aria-controls attribute referring to each collapsible element.
@@ -93,29 +91,16 @@ export const init = collapsesections => {
});
collapsemenu.setAttribute('aria-controls', collapseElementIds.join(' '));
+ // When any form container is toggled, re-calculate collapse menu state.
$(SELECTORS.FORMCONTAINER).on('hidden.bs.collapse', () => {
- let allCollapsed = true;
-
- formParent.querySelectorAll(SELECTORS.FORMCONTAINER).forEach((collapsecontainer) => {
- if (collapsecontainer.classList.contains(CLASSES.SHOW)) {
- allCollapsed = false;
- }
- });
-
+ const allCollapsed = [...formContainers].every(container => !container.classList.contains(CLASSES.SHOW));
if (allCollapsed) {
collapsemenu.classList.add(CLASSES.COLLAPSED);
collapsemenu.setAttribute('aria-expanded', false);
}
});
$(SELECTORS.FORMCONTAINER).on('shown.bs.collapse', () => {
- let allExpanded = true;
-
- formParent.querySelectorAll(SELECTORS.FORMCONTAINER).forEach((collapsecontainer) => {
- if (!collapsecontainer.classList.contains(CLASSES.SHOW)) {
- allExpanded = false;
- }
- });
-
+ const allExpanded = [...formContainers].every(container => container.classList.contains(CLASSES.SHOW));
if (allExpanded) {
collapsemenu.classList.remove(CLASSES.COLLAPSED);
collapsemenu.setAttribute('aria-expanded', true);
diff --git a/lib/tests/behat/readonlyform.feature b/lib/tests/behat/readonlyform.feature
index 2c4fae6bbd4..00476e5ba3a 100644
--- a/lib/tests/behat/readonlyform.feature
+++ b/lib/tests/behat/readonlyform.feature
@@ -1,4 +1,4 @@
-@core
+@core @core_form
Feature: Read-only forms should work
In order to use certain forms on large Moodle installations
As a user