in index.js [661:699]
function filterProposals () {
var filterElement = document.querySelector('#search-filter')
var filter = filterElement.value
var clearButton = document.querySelector('#clear-button')
if (filter.length === 0) {
clearButton.classList.add('hidden')
} else {
clearButton.classList.remove('hidden')
}
var matchingSets = [proposals.concat()]
// Comma-separated lists of proposal IDs are treated as an "or" search.
if (filter.match(/(SE-\d\d\d\d)($|((,SE-\d\d\d\d)+))/i)) {
var proposalIDs = filter.split(',').map(function (id) {
return id.toUpperCase()
})
matchingSets[0] = matchingSets[0].filter(function (proposal) {
return proposalIDs.indexOf(proposal.id) !== -1
})
} else if (filter.trim().length !== 0) {
// The search input treats words as order-independent.
matchingSets = filter.split(/\s/)
.filter(function (s) { return s.length > 0 })
.map(function (part) { return _searchProposals(part) })
}
var intersection = matchingSets.reduce(function (intersection, candidates) {
return intersection.filter(function (alreadyIncluded) { return candidates.indexOf(alreadyIncluded) !== -1 })
}, matchingSets[0] || [])
_applyFilter(intersection)
_updateURIFragment()
determineNumberOfProposals(intersection)
updateFilterStatus()
}