61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 * @file
 | 
						|
 * Customization of comments.
 | 
						|
 */
 | 
						|
 | 
						|
((Drupal, once) => {
 | 
						|
  /**
 | 
						|
   * Initialize show/hide button for the comments.
 | 
						|
   *
 | 
						|
   * @param {Element} comments
 | 
						|
   *   The comment wrapper element.
 | 
						|
   */
 | 
						|
  function init(comments) {
 | 
						|
    comments
 | 
						|
      .querySelectorAll('[data-drupal-selector="comment"]')
 | 
						|
      .forEach((comment) => {
 | 
						|
        if (comment.nextElementSibling?.matches('.indented')) {
 | 
						|
          comment.classList.add('has-children');
 | 
						|
        }
 | 
						|
      });
 | 
						|
 | 
						|
    comments.querySelectorAll('.indented').forEach((commentGroup) => {
 | 
						|
      const showHideWrapper = document.createElement('div');
 | 
						|
      showHideWrapper.setAttribute('class', 'show-hide-wrapper');
 | 
						|
 | 
						|
      const toggleCommentsBtn = document.createElement('button');
 | 
						|
      toggleCommentsBtn.setAttribute('type', 'button');
 | 
						|
      toggleCommentsBtn.setAttribute('aria-expanded', 'true');
 | 
						|
      toggleCommentsBtn.setAttribute('class', 'show-hide-btn');
 | 
						|
      toggleCommentsBtn.innerText = Drupal.t('Replies');
 | 
						|
 | 
						|
      commentGroup.parentNode.insertBefore(showHideWrapper, commentGroup);
 | 
						|
      showHideWrapper.appendChild(toggleCommentsBtn);
 | 
						|
 | 
						|
      toggleCommentsBtn.addEventListener('click', (e) => {
 | 
						|
        commentGroup.classList.toggle('hidden');
 | 
						|
        e.currentTarget.setAttribute(
 | 
						|
          'aria-expanded',
 | 
						|
          commentGroup.classList.contains('hidden') ? 'false' : 'true',
 | 
						|
        );
 | 
						|
      });
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Attaches the comment behavior to comments.
 | 
						|
   *
 | 
						|
   * @type {Drupal~behavior}
 | 
						|
   *
 | 
						|
   * @prop {Drupal~behaviorAttach} attach
 | 
						|
   *   Attaches the show/hide behavior for indented comments.
 | 
						|
   */
 | 
						|
  Drupal.behaviors.comments = {
 | 
						|
    attach(context) {
 | 
						|
      once('comments', '[data-drupal-selector="comments"]', context).forEach(
 | 
						|
        init,
 | 
						|
      );
 | 
						|
    },
 | 
						|
  };
 | 
						|
})(Drupal, once);
 |