57 lines
2.2 KiB
JavaScript
57 lines
2.2 KiB
JavaScript
/**
|
||
* @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
|
||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||
*/
|
||
|
||
/**
|
||
* Toggles the display of inline help DIVs
|
||
*
|
||
* @param {String} toggleClass The class name of the DIVs to toggle display for
|
||
*/
|
||
Joomla.toggleInlineHelp = toggleClass => {
|
||
[].slice.call(document.querySelectorAll(`div.${toggleClass}`)).forEach(elDiv => {
|
||
// Toggle the visibility of the node by toggling the 'd-none' Bootstrap class.
|
||
elDiv.classList.toggle('d-none');
|
||
// The ID of the description whose visibility is toggled.
|
||
const myId = elDiv.id;
|
||
// The ID of the control described by this node (same ID, minus the '-desc' suffix).
|
||
const controlId = myId ? myId.substr(0, myId.length - 5) : null;
|
||
// Get the control described by this node.
|
||
const elControl = controlId ? document.getElementById(controlId) : null;
|
||
// Is this node hidden?
|
||
const isHidden = elDiv.classList.contains('d-none');
|
||
|
||
// If we do not have a control we will exit early
|
||
if (!controlId || !elControl) {
|
||
return;
|
||
}
|
||
|
||
// Unset the aria-describedby attribute in the control when the description is hidden and vice–versa.
|
||
if (isHidden && elControl.hasAttribute('aria-describedby')) {
|
||
elControl.removeAttribute('aria-describedby');
|
||
} else if (!isHidden) {
|
||
elControl.setAttribute('aria-describedby', myId);
|
||
}
|
||
});
|
||
};
|
||
|
||
// Initialisation. Clicking on anything with the button-inlinehelp class will toggle the inline help.
|
||
[].slice.call(document.querySelectorAll('.button-inlinehelp')).forEach(elToggler => {
|
||
var _elToggler$dataset$cl;
|
||
// The class of the DIVs to toggle visibility on is defined by the data-class attribute of the click target.
|
||
const toggleClass = (_elToggler$dataset$cl = elToggler.dataset.class) != null ? _elToggler$dataset$cl : 'hide-aware-inline-help';
|
||
const collection = document.getElementsByClassName(toggleClass);
|
||
|
||
// no description => hide inlinehelp button
|
||
if (collection.length === 0) {
|
||
elToggler.classList.add('d-none');
|
||
return;
|
||
}
|
||
|
||
// Add the click handler.
|
||
elToggler.addEventListener('click', event => {
|
||
event.preventDefault();
|
||
Joomla.toggleInlineHelp(toggleClass);
|
||
});
|
||
});
|