Skip to content

Commit 15e7094

Browse files
committed
Add lazy loading of results. Improve UX.
1 parent de5491d commit 15e7094

File tree

3 files changed

+22
-12
lines changed

3 files changed

+22
-12
lines changed

scala3doc-js/resources/scala3doc-searchbar.css

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
:root {
2-
--inkuire-logo-size: 20px;
3-
}
4-
51
/* button */
62
.search span {
73
background: #ED3522;

scala3doc-js/src/searchbar/SearchbarComponent.scala

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.scalajs.dom.html.Input
66
class SearchbarComponent(val callback: (String) => List[PageEntry]):
77
extension (p: PageEntry)
88
def toHTML =
9-
val wrapper = document.createElement("div")
9+
val wrapper = document.createElement("div").asInstanceOf[html.Div]
1010
wrapper.classList.add("scala3doc-searchbar-result")
1111
wrapper.classList.add("monospace")
1212

@@ -25,8 +25,23 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
2525

2626
def handleNewQuery(query: String) =
2727
val result = callback(query).map(_.toHTML)
28+
resultsDiv.scrollTop = 0
2829
while (resultsDiv.hasChildNodes()) resultsDiv.removeChild(resultsDiv.lastChild)
29-
result.foreach(resultsDiv.appendChild)
30+
val fragment = document.createDocumentFragment()
31+
result.take(100).foreach(fragment.appendChild)
32+
resultsDiv.appendChild(fragment)
33+
def loadMoreResults(result: List[raw.HTMLElement]): Unit = {
34+
resultsDiv.onscroll = (event: Event) => {
35+
if (resultsDiv.scrollHeight - resultsDiv.scrollTop == resultsDiv.clientHeight)
36+
{
37+
val fragment = document.createDocumentFragment()
38+
result.take(100).foreach(fragment.appendChild)
39+
resultsDiv.appendChild(fragment)
40+
loadMoreResults(result.drop(100))
41+
}
42+
}
43+
}
44+
loadMoreResults(result.drop(100))
3045

3146
private val logoClick: html.Div =
3247
val span = document.createElement("span").asInstanceOf[html.Span]
@@ -39,7 +54,7 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
3954
else document.body.appendChild(rootDiv)
4055

4156
val element = createNestingDiv("search-content")(
42-
createNestingDiv("search-conatiner")(
57+
createNestingDiv("search-container")(
4358
createNestingDiv("search")(
4459
span
4560
)
@@ -71,9 +86,9 @@ class SearchbarComponent(val callback: (String) => List[PageEntry]):
7186

7287
private val rootDiv: html.Div =
7388
val element = document.createElement("div").asInstanceOf[html.Div]
74-
element.addEventListener("click", (e: Event) => e.stopPropagation())
75-
logoClick.addEventListener("click", (e: Event) => e.stopPropagation())
76-
document.body.addEventListener("click", (e: Event) =>
89+
element.addEventListener("mousedown", (e: Event) => e.stopPropagation())
90+
logoClick.addEventListener("mousedown", (e: Event) => e.stopPropagation())
91+
document.body.addEventListener("mousedown", (e: Event) =>
7792
if (document.body.contains(element)) {
7893
document.body.removeChild(element)
7994
}

scala3doc-js/src/searchbar/engine/SearchbarEngine.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import math.Ordering.Implicits.seqOrdering
44

55
class SearchbarEngine(pages: List[PageEntry]) {
66
def query(query: List[Matchers]): List[PageEntry] = {
7-
// Results list is limited to 100 entries for performance reasons
8-
pages.map(p => p -> query.map(_(p))).filterNot(_(1).exists(_ < 0)).sortBy(_(1)).map(_(0)).take(100)
7+
pages.map(p => p -> query.map(_(p))).filterNot(_(1).exists(_ < 0)).sortBy(_(1)).map(_(0))
98
}
109
}

0 commit comments

Comments
 (0)