@@ -19,7 +19,7 @@ const appElement = document.querySelector(appSelector);
19
19
20
20
const app = createApp ( {
21
21
props : {
22
- url : String ,
22
+ searchApiServer : String ,
23
23
initialTimeout : Number ,
24
24
moreTimeout : Number ,
25
25
minChars : Number ,
@@ -85,8 +85,8 @@ const app = createApp({
85
85
hasHits ( ) {
86
86
return this . search . result . hits . length > 0
87
87
} ,
88
- cardHits ( ) {
89
- return this . search . result . hits . map ( hit => this . guidesPathToCardHtmlElement . get ( hit . id ) ) . filter ( e => e )
88
+ searchHits ( ) {
89
+ return this . search . result . hits
90
90
}
91
91
} ,
92
92
mounted ( ) {
@@ -101,7 +101,37 @@ const app = createApp({
101
101
cards = appElement . querySelectorAll ( cardSelector )
102
102
}
103
103
this . guidesPathToCardHtmlElement = new Map ( Array . from ( cards )
104
- . map ( element => [ new URL ( element . querySelector ( 'a' ) . href ) . pathname , element ] ) )
104
+ . map ( element => {
105
+ const link = element . querySelector ( 'h4 a' )
106
+ if ( link ) {
107
+ // new versions:
108
+ const url = link . getAttribute ( 'href' ) ;
109
+ return [
110
+ new URL ( link . href ) . pathname ,
111
+ {
112
+ url : url ,
113
+ className : element . className ,
114
+ title : link . innerHTML ,
115
+ summary : element . querySelector ( 'div .description' ) . innerHTML ,
116
+ keywords : element . querySelector ( 'div .keywords' ) . innerHTML ,
117
+ categories : element . querySelector ( 'div .categories' ) . innerHTML ,
118
+ origin : element . querySelector ( 'div .origin' ) ?. innerHTML
119
+ } ] ;
120
+ } else {
121
+ // older Quarkus versions:
122
+ const url = element . querySelector ( 'a' ) . getAttribute ( 'href' )
123
+ return [
124
+ url ,
125
+ {
126
+ url : url ,
127
+ className : element . className ,
128
+ title : element . querySelector ( 'p.title' ) . innerHTML ,
129
+ summary : element . querySelector ( 'div.description' ) . innerHTML ,
130
+ keywords : element . querySelector ( 'div.keywords' ) . innerHTML ,
131
+ origin : element . querySelector ( 'div.origin' ) ?. innerHTML
132
+ } ] ;
133
+ }
134
+ } ) )
105
135
106
136
// Load more results on scroll
107
137
document . addEventListener ( 'scroll' , e => {
@@ -157,11 +187,14 @@ const app = createApp({
157
187
}
158
188
const queryParams = {
159
189
page : this . search . page ,
160
- version : this . quarkusVersion
190
+ version : this . quarkusVersion ,
191
+ contentSnippets : 2 ,
192
+ contentSnippetsLength : 120 ,
193
+ highlightCssClass : 'highlighted'
161
194
}
162
195
Object . assign ( queryParams , this . search . input )
163
196
const result = await this . _jsonFetch ( controller , 'GET' , queryParams , timeout )
164
- this . search . result . hits = this . search . result . hits . concat ( result . hits )
197
+ this . search . result . hits = this . search . result . hits . concat ( this . _processHits ( result . hits ) )
165
198
this . search . result . hasMoreHits = result . hits . length > 0
166
199
}
167
200
catch ( error ) {
@@ -182,9 +215,15 @@ const app = createApp({
182
215
}
183
216
}
184
217
} ,
218
+ _processHits ( serverHits ) {
219
+ return serverHits . map ( hit => {
220
+ hit . content = hit ?. content . map ( paragraph => `...${ paragraph } ...` )
221
+ return hit ;
222
+ } )
223
+ } ,
185
224
async _jsonFetch ( controller , method , queryParams , timeout ) {
186
225
const timeoutId = setTimeout ( ( ) => controller . abort ( ) , timeout )
187
- const response = await fetch ( this . url + '?' + ( new URLSearchParams ( queryParams ) ) . toString ( ) , {
226
+ const response = await fetch ( ` ${ this . searchApiServer } api/guides/search? ${ new URLSearchParams ( queryParams ) } ` , {
188
227
method : method ,
189
228
signal : controller . signal ,
190
229
body : null
@@ -203,21 +242,20 @@ const app = createApp({
203
242
204
243
return Array . from ( this . guidesPathToCardHtmlElement )
205
244
. filter ( ( [ path , card ] ) => this . _javascriptFilter ( card , terms , categories ) )
206
- . map ( ( [ path , _ ] ) => { return { id : path } } )
245
+ . map ( ( [ _ , card ] ) => card )
207
246
} ,
208
247
_javascriptFilter ( card , terms , categories ) {
209
248
let match = true
210
249
if ( match && categories ) {
211
- const categoriesElem = card . getElementsByClassName ( 'categories' ) . item ( 0 )
212
- match = categoriesElem && this . _containsAllCaseInsensitive ( categoriesElem , categories )
250
+ match = this . _containsAllCaseInsensitive ( card . categories , categories )
213
251
}
214
252
if ( match && terms ) {
215
- match = this . _containsAllCaseInsensitive ( card , terms )
253
+ match = this . _containsAllCaseInsensitive ( ` ${ card . keywords } ${ card . summary } ${ card . title } ${ card . categories } ` , terms )
216
254
}
217
255
return match
218
256
} ,
219
257
_containsAllCaseInsensitive ( elem , terms ) {
220
- const text = ( elem . textContent || elem . innerText || '' ) . toLowerCase ( )
258
+ const text = ( elem ? elem : '' ) . toLowerCase ( ) ;
221
259
for ( let i in terms ) {
222
260
if ( text . indexOf ( terms [ i ] . toLowerCase ( ) ) < 0 ) {
223
261
return false
0 commit comments