code: function updateIssuesGroups() {
  		// Get all groups.
  		var groupHeaderElements = document.querySelectorAll('[data-groupName]');
  
  		for (var i = 0; i < groupHeaderElements.length; i++) {
  			var groupHeader = groupHeaderElements[i];
  			var issuesGroupId = groupHeader.getAttribute('data-expandableElement');
  			var groupName = groupHeader.getAttribute('data-groupName');
  			var groupNumber = groupHeader.getAttribute('data-groupNumber');
  			// Get all rules for the current group.
  			var rules = document.querySelectorAll('#' + issuesGroupId + ' > tr');
  			var numberOfUnfilteredIssues = 0;
  			var numberOfUnfilteredRules = 0;
  
  			// Hide the rule section if no issues. Otherwise update count.
  			for (var k = 0; k < rules.length; k++) {
  				var rule = rules[k];
  				var unfilteredIssuesForRule = rule.querySelectorAll('tr.filterable:not(.filtered)');
  				var numberOfUnfilteredIssuesForRule = unfilteredIssuesForRule.length;
  				if (numberOfUnfilteredIssuesForRule === 0) {
  					rule.classList.add('filtered');
  				} else {
  					numberOfUnfilteredRules++;
  					numberOfUnfilteredIssues += numberOfUnfilteredIssuesForRule;
  					rule.querySelector('span.rule-issue-number').innerText = '(' + numberOfUnfilteredIssuesForRule + ' issues)';
  				}
  			}
  
  			// Hide the group section if no issues. Otherwise update count.
  			if (numberOfUnfilteredRules === 0) {
  				groupHeader.classList.add('filtered');
  			} else {
  				groupHeader.classList.remove('filtered');
  				groupHeader.querySelector('span').innerText = ' ' + groupNumber + '. ' + groupName + ' (' + numberOfUnfilteredRules + ' rules, ' + numberOfUnfilteredIssues + ' issues)';
  			}
  		}
  	}
docs: Used to update the groups counters and hide/show group headers if all of the elements are filtered.