Typahead stuff
This commit is contained in:
parent
5bbfe714d0
commit
0b4db89d4b
|
@ -39,14 +39,14 @@
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="form-inline my-2 my-lg-0">
|
<div class="form-inline my-2 my-lg-0">
|
||||||
<input id="search" class="form-control mr-sm-2" type="text" placeholder="Search">
|
<input id="search" class="typeahead form-control mr-sm-2" type="text" placeholder="Search">
|
||||||
|
<!-- <a href="#" id="search-results-trigger" data-toggle="dropdown"></a>
|
||||||
|
<div class="dropdown-menu" id="search-results"></div> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="dropdown-menu" id="search-results"></div>
|
|
||||||
|
|
||||||
<div class="main-content container">
|
<div class="main-content container">
|
||||||
{{ content }}
|
{{ content }}
|
||||||
</div>
|
</div>
|
||||||
|
@ -78,6 +78,7 @@
|
||||||
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
|
||||||
<script src="/js/tether.min.js"></script>
|
<script src="/js/tether.min.js"></script>
|
||||||
<script src="/js/bootstrap.min.js"></script>
|
<script src="/js/bootstrap.min.js"></script>
|
||||||
|
<script src="/js/typeahead.js"></script>
|
||||||
<script src="/js/main.js"></script>
|
<script src="/js/main.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
110
js/main.js
110
js/main.js
|
@ -1,43 +1,87 @@
|
||||||
|
let searchData;
|
||||||
|
function getSearchData() {
|
||||||
|
if (searchData) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
resolve(searchData);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return fetch("/search.json")
|
||||||
|
.then(res => res.json());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function matcher(q, cb) {
|
||||||
|
getSearchData()
|
||||||
|
.then(data => {
|
||||||
|
cb(Object.keys(data)
|
||||||
|
.map(fuzzy_match.bind(null, q))
|
||||||
|
.sort((a, b) => b[1] - a[1])
|
||||||
|
.slice(0, 5)
|
||||||
|
.map(res => {
|
||||||
|
const formatted = res[3];
|
||||||
|
const url = data[res[2]];
|
||||||
|
return `<a href="${url}">${formatted}</a>`;
|
||||||
|
}));
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
$(document).ready(() => {
|
$(document).ready(() => {
|
||||||
$("[data-toggle='tooltip']").tooltip();
|
$("[data-toggle='tooltip']").tooltip();
|
||||||
|
|
||||||
$("#search").on("input", () => {
|
|
||||||
const results = $("#search-results");
|
|
||||||
const q = $("#search").val().trim();
|
|
||||||
|
|
||||||
if (q.length == 0) {
|
|
||||||
results.hide();
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
results.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
getSearchData()
|
$("#search").typeahead({
|
||||||
.then(data => {
|
hint: true,
|
||||||
results.html(Object.keys(data)
|
highlight: true,
|
||||||
.map(fuzzy_match.bind(null, q))
|
minLength: 1
|
||||||
.sort((a, b) => b[1] - a[1])
|
}, {
|
||||||
.slice(0, 5)
|
name: "search",
|
||||||
.map(res => {
|
source: matcher
|
||||||
const formatted = res[3];
|
|
||||||
const url = data[res[2]];
|
|
||||||
return `<a href="${url}" class="dropdown-item">${formatted}</a>`;
|
|
||||||
})
|
|
||||||
.join(""));
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let searchData;
|
// let dropdownShown = false;
|
||||||
function getSearchData() {
|
// $("#search-results-trigger").on("shown.bs.dropdown", () => {
|
||||||
if (searchData) {
|
// console.log("shown");
|
||||||
return new Promise((resolve, reject) => {
|
// dropdownShown = true;
|
||||||
resolve(searchData);
|
// });
|
||||||
});
|
// $("#search-results-trigger").on("hidden.bs.dropdown", () => {
|
||||||
} else {
|
// console.log("hidden");
|
||||||
return fetch("/search.json")
|
// dropdownShown = false;
|
||||||
.then(res => res.json());
|
// });
|
||||||
}
|
|
||||||
}
|
// $("#search").on("input", () => {
|
||||||
|
// const results = $("#search-results");
|
||||||
|
// const q = $("#search").val().trim();
|
||||||
|
|
||||||
|
// if (q.length == 0) {
|
||||||
|
// if (dropdownShown) {
|
||||||
|
// $("#search-results-trigger").dropdown("toggle");
|
||||||
|
// $("#search").focus();
|
||||||
|
// }
|
||||||
|
// // results.hide();
|
||||||
|
// return;
|
||||||
|
// } else {
|
||||||
|
// if (!dropdownShown) {
|
||||||
|
// $("#search-results-trigger").dropdown("toggle");
|
||||||
|
// $("#search").focus();
|
||||||
|
// }
|
||||||
|
// // results.show();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// getSearchData()
|
||||||
|
// .then(data => {
|
||||||
|
// results.html(Object.keys(data)
|
||||||
|
// .map(fuzzy_match.bind(null, q))
|
||||||
|
// .sort((a, b) => b[1] - a[1])
|
||||||
|
// .slice(0, 5)
|
||||||
|
// .map(res => {
|
||||||
|
// const formatted = res[3];
|
||||||
|
// const url = data[res[2]];
|
||||||
|
// return `<a href="${url}" class="dropdown-item">${formatted}</a>`;
|
||||||
|
// })
|
||||||
|
// .join(""));
|
||||||
|
// });
|
||||||
|
// });
|
||||||
});
|
});
|
||||||
|
|
||||||
// Source: https://github.com/forrestthewoods/lib_fts
|
// Source: https://github.com/forrestthewoods/lib_fts
|
||||||
|
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue