mirror of
https://github.com/quatalog/site.git
synced 2024-11-25 08:13:08 +00:00
81 lines
2.6 KiB
JavaScript
81 lines
2.6 KiB
JavaScript
|
// parses URL params
|
||
|
const params = window
|
||
|
.location
|
||
|
.search
|
||
|
.slice(1)
|
||
|
.split("&")
|
||
|
.map(p => p.split("="))
|
||
|
.reduce((obj,[key,value]) =>
|
||
|
({ ...obj, [key]: decodeURIComponent(value) }),
|
||
|
{}
|
||
|
);
|
||
|
|
||
|
const search_term = params["search"];
|
||
|
|
||
|
const getSVG = function(name) {
|
||
|
return '<svg><use href="./icons.svg#'+name+'"></use></svg>';
|
||
|
}
|
||
|
|
||
|
const fuzzy_search_config = {
|
||
|
limit: 25,
|
||
|
includeScore: true,
|
||
|
ignoreLocation: true,
|
||
|
useExtendedSearch: true,
|
||
|
threshold: 0.01,
|
||
|
keys: [
|
||
|
{
|
||
|
name: 'code',
|
||
|
weight: 0.1
|
||
|
},
|
||
|
{
|
||
|
name: 'description',
|
||
|
weight: 0.1
|
||
|
},
|
||
|
{
|
||
|
name: 'name',
|
||
|
weight: 0.8
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
|
||
|
const attr_to_icon = {
|
||
|
'CI': 'message',
|
||
|
'HInq': 'magnifying',
|
||
|
'PDII': 'briefcase',
|
||
|
'WI': 'pencil',
|
||
|
'CulmExp': 'cubes'
|
||
|
}
|
||
|
|
||
|
const display_search_results = function(searchable_catalog) {
|
||
|
const fuse = new Fuse(searchable_catalog,fuzzy_search_config);
|
||
|
console.log("Searching for " + search_term + "...");
|
||
|
const results = fuse.search(search_term,{limit:fuzzy_search_config.limit});
|
||
|
const table = document.getElementById("searchResultsContainer");
|
||
|
results.forEach(function(search_entry) {
|
||
|
const entry = search_entry.item;
|
||
|
const tr = table.insertRow(-1);
|
||
|
var elemInnerHtml = '<a href="courses/'
|
||
|
+ entry.code + '">'
|
||
|
+ '<h3><div><span class="courseName">'
|
||
|
+ entry.name
|
||
|
+ '</span><span class="courseCode">'
|
||
|
+ entry.code + '</span><span class="pill">'
|
||
|
+ entry.credits + "</span>";
|
||
|
if(entry.attributes)
|
||
|
entry.attributes.forEach(function(attr) {
|
||
|
elemInnerHtml += '<span class="pill ' + attr + '-pill">'
|
||
|
+ attr + '<svg><use href="./icons.svg#' + attr_to_icon[attr] + '"></use></svg></span>';
|
||
|
});
|
||
|
elemInnerHtml += "</div></h3><p>" + entry.description + "</p></a>" + '\n';
|
||
|
tr.innerHTML = elemInnerHtml;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
window.onload = function() {
|
||
|
// smart quotes
|
||
|
document.getElementById("searchTerm").innerHTML = "“" + search_term + "”";
|
||
|
fetch("json/searchable_catalog.json")
|
||
|
.then(r => r.json())
|
||
|
.then(display_search_results);
|
||
|
}
|