1+ package dotty .dokka
2+
3+ import org .scalajs .dom ._
4+ import org .scalajs .dom .html .Input
5+
6+ class SearchbarComponent (val callback : (String ) => List [PageEntry ]) {
7+ extension (p : PageEntry )
8+ def toHTML = {
9+ val wrapper = document.createElement(" div" )
10+ wrapper.classList.add(" scala3doc-searchbar-result" )
11+ wrapper.classList.add(" monospace" )
12+
13+ val resultA = document.createElement(" a" ).asInstanceOf [html.Anchor ]
14+ resultA.href = Globals .pathToRoot + p.location
15+ resultA.text = s " ${p.name}"
16+
17+ val location = document.createElement(" span" )
18+ location.classList.add(" pull-right" )
19+ location.classList.add(" scala3doc-searchbar-location" )
20+ location.textContent = p.description
21+
22+ wrapper.appendChild(resultA)
23+ wrapper.appendChild(location)
24+ wrapper
25+ }
26+
27+ def handleNewQuery (query : String ) = {
28+ val result = callback(query).map(_.toHTML)
29+ while (resultsDiv.hasChildNodes()) resultsDiv.removeChild(resultsDiv.lastChild)
30+ result.foreach(resultsDiv.appendChild)
31+ }
32+
33+ private val logoClick : html.Span = {
34+ val element = document.createElement(" span" ).asInstanceOf [html.Span ]
35+ element.id = " scala3doc-search"
36+ element.onclick = (event : Event ) =>
37+ if (rootDiv.className.contains(" hidden" ))
38+ rootDiv.className = rootShowClasses
39+ else rootDiv.className = rootHiddenClasses
40+ document.getElementById(" searchBar" ).appendChild(element)
41+ element
42+ }
43+
44+ private val input : html.Input = {
45+ val element = document.createElement(" input" ).asInstanceOf [html.Input ]
46+ element.id = " scala3doc-searchbar-input"
47+ element.addEventListener(" keyup" , (e) => handleNewQuery(e.target.asInstanceOf [html.Input ].value))
48+ element
49+ }
50+
51+ private val resultsDiv : html.Div = {
52+ val element = document.createElement(" div" ).asInstanceOf [html.Div ]
53+ element.id = " scala3doc-searchbar-results"
54+ element
55+ }
56+
57+ private val rootHiddenClasses = " hidden"
58+ private val rootShowClasses = " "
59+ private val rootDiv : html.Div = {
60+ val element = document.createElement(" div" ).asInstanceOf [html.Div ]
61+ element.addEventListener(" click" , (e : Event ) => e.stopPropagation())
62+ logoClick.addEventListener(" click" , (e : Event ) => e.stopPropagation())
63+ document.body.addEventListener(" click" , (e : Event ) => element.className = rootHiddenClasses)
64+ element.className = rootHiddenClasses
65+ element.id = " scala3doc-searchbar"
66+ element.appendChild(input)
67+ element.appendChild(resultsDiv)
68+ document.body.appendChild(element)
69+ element
70+ }
71+
72+ handleNewQuery(" " )
73+ }
0 commit comments