lib/amd/src/showmore.js

  1. // This file is part of Moodle - http://moodle.org/
  2. //
  3. // Moodle is free software: you can redistribute it and/or modify
  4. // it under the terms of the GNU General Public License as published by
  5. // the Free Software Foundation, either version 3 of the License, or
  6. // (at your option) any later version.
  7. //
  8. // Moodle is distributed in the hope that it will be useful,
  9. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. // GNU General Public License for more details.
  12. //
  13. // You should have received a copy of the GNU General Public License
  14. // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
  15. /**
  16. * Initializes and handles events fow 'showmore' components.
  17. *
  18. * @module core/showmore
  19. * @copyright 2023 Mikel Martín <mikel@moodle.com>
  20. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  21. */
  22. const Selectors = {
  23. actions: {
  24. toggleContent: '[data-action="toggle-content"]'
  25. },
  26. regions: {
  27. main: '[data-region="showmore"]'
  28. }
  29. };
  30. let initialized = false;
  31. /**
  32. * Initialise module
  33. *
  34. * @method
  35. */
  36. export const init = () => {
  37. if (initialized) {
  38. // We already added the event listeners (can be called multiple times by mustache template).
  39. return;
  40. }
  41. // Listen for click events.
  42. document.addEventListener('click', (event) => {
  43. const toggleContent = event.target.closest(Selectors.actions.toggleContent);
  44. if (toggleContent) {
  45. const region = toggleContent.closest(Selectors.regions.main);
  46. region.classList.toggle('collapsed');
  47. const toggleButton = region.querySelector(Selectors.actions.toggleContent);
  48. toggleButton.setAttribute('aria-expanded', !region.classList.contains('collapsed'));
  49. }
  50. });
  51. initialized = true;
  52. };