Files
notifications-admin/app/assets/javascripts/liveSearch.js
T

100 lines
2.4 KiB
JavaScript
Raw Normal View History

2025-10-06 09:38:54 -04:00
(function(window) {
"use strict";
2025-10-06 09:38:54 -04:00
var Modules = window.NotifyModules;
2020-09-16 22:01:36 +01:00
let state;
let normalize = (string) => string.toLowerCase().replace(/ /g,'');
2020-09-16 22:01:36 +01:00
let resultsSummary = (num) => {
if (num === 0) {
return "no results";
} else {
return num + (num === 1 ? " result" : " results");
}
};
2025-10-21 11:06:08 -04:00
let filter = (searchBox, searchLabel, liveRegion, targets) => () => {
2025-10-21 11:06:08 -04:00
let query = normalize(searchBox.value);
2020-09-16 22:01:36 +01:00
let results = 0;
2025-10-21 11:06:08 -04:00
let noResultsMessage = document.querySelector('.js-live-search-no-results');
2025-10-21 11:06:08 -04:00
targets.forEach(function(target) {
2025-10-21 11:06:08 -04:00
let relevantElement = target.querySelector('.live-search-relevant');
let content = relevantElement ? relevantElement.textContent : target.textContent;
2025-10-21 11:06:08 -04:00
if (target.querySelector(':checked')) {
target.classList.remove('js-hidden');
2020-09-16 22:01:36 +01:00
results++;
2018-12-05 11:24:16 +00:00
return;
}
if (query == '') {
2025-10-21 11:06:08 -04:00
target.classList.remove('js-hidden');
2020-09-16 22:01:36 +01:00
results++;
return;
}
let isMatch = normalize(content).includes(normalize(query));
if (isMatch) {
2025-10-21 11:06:08 -04:00
target.classList.remove('js-hidden');
results++;
} else {
2025-10-21 11:06:08 -04:00
target.classList.add('js-hidden');
}
});
2025-10-21 11:06:08 -04:00
if (noResultsMessage) {
if (query !== '' && results === 0) {
noResultsMessage.classList.remove('js-hidden');
} else {
noResultsMessage.classList.add('js-hidden');
}
2025-05-28 11:59:54 -07:00
}
2020-09-16 22:01:36 +01:00
if (state === 'loaded') {
if (query !== '') {
2025-10-21 11:06:08 -04:00
searchBox.setAttribute('aria-label', searchLabel.textContent.trim() + ', ' + resultsSummary(results));
2020-09-16 22:01:36 +01:00
}
state = 'active';
} else {
2025-10-21 11:06:08 -04:00
searchBox.removeAttribute('aria-label');
liveRegion.textContent = resultsSummary(results);
2020-09-16 22:01:36 +01:00
}
2018-12-21 14:37:01 +00:00
};
2025-10-06 09:38:54 -04:00
Modules['live-search'] = function() {
this.start = function(component) {
2025-10-21 11:06:08 -04:00
let searchBox = component.querySelector('input');
let searchLabel = component.querySelector('label');
let liveRegion = component.querySelector('.live-search__status');
2025-10-21 11:06:08 -04:00
let targetsSelector = component.dataset.targets;
let targets = Array.from(document.querySelectorAll(targetsSelector));
let filterFunc = filter(
2025-10-21 11:06:08 -04:00
searchBox,
searchLabel,
liveRegion,
targets
);
2020-09-16 22:01:36 +01:00
state = 'loaded';
2025-10-21 11:06:08 -04:00
searchBox.addEventListener('keyup', filterFunc);
searchBox.addEventListener('input', filterFunc);
filterFunc();
};
};
2025-10-06 09:38:54 -04:00
})(window);