1
1
import app from '../../forum/app' ;
2
- import highlight from '../../common/helpers/highlight' ;
3
2
import LinkButton from '../../common/components/LinkButton' ;
4
- import Link from '../../common/components/Link' ;
5
3
import { SearchSource } from './Search' ;
6
4
import type Mithril from 'mithril' ;
7
5
import Discussion from '../../common/models/Discussion' ;
6
+ import DiscussionsSearchItem from './DiscussionsSearchItem' ;
8
7
9
8
/**
10
9
* The `DiscussionsSearchSource` finds and displays discussion search results in
11
10
* the search dropdown.
12
11
*/
13
12
export default class DiscussionsSearchSource implements SearchSource {
14
13
protected results = new Map < string , Discussion [ ] > ( ) ;
14
+ queryString : string | null = null ;
15
15
16
16
async search ( query : string ) : Promise < void > {
17
17
query = query . toLowerCase ( ) ;
18
18
19
19
this . results . set ( query , [ ] ) ;
20
20
21
+ this . setQueryString ( query ) ;
22
+
21
23
const params = {
22
- filter : { q : query } ,
23
- page : { limit : 3 } ,
24
- include : 'mostRelevantPost' ,
24
+ filter : { q : this . queryString || query } ,
25
+ page : { limit : this . limit ( ) } ,
26
+ include : this . includes ( ) . join ( ',' ) ,
25
27
} ;
26
28
27
29
return app . store . find < Discussion [ ] > ( 'discussions' , params ) . then ( ( results ) => {
@@ -36,26 +38,33 @@ export default class DiscussionsSearchSource implements SearchSource {
36
38
const results = ( this . results . get ( query ) || [ ] ) . map ( ( discussion ) => {
37
39
const mostRelevantPost = discussion . mostRelevantPost ( ) ;
38
40
39
- return (
40
- < li className = "DiscussionSearchResult" data-index = { 'discussions' + discussion . id ( ) } >
41
- < Link href = { app . route . discussion ( discussion , ( mostRelevantPost && mostRelevantPost . number ( ) ) || 0 ) } >
42
- < div className = "DiscussionSearchResult-title" > { highlight ( discussion . title ( ) , query ) } </ div >
43
- { ! ! mostRelevantPost && (
44
- < div className = "DiscussionSearchResult-excerpt" > { highlight ( mostRelevantPost . contentPlain ( ) ?? '' , query , 100 ) } </ div >
45
- ) }
46
- </ Link >
47
- </ li >
48
- ) ;
41
+ return < DiscussionsSearchItem query = { query } discussion = { discussion } mostRelevantPost = { mostRelevantPost } /> ;
49
42
} ) as Array < Mithril . Vnode > ;
50
43
51
44
return [
52
45
< li className = "Dropdown-header" > { app . translator . trans ( 'core.forum.search.discussions_heading' ) } </ li > ,
53
46
< li >
54
- < LinkButton icon = "fas fa-search" href = { app . route ( 'index' , { q : query } ) } >
47
+ < LinkButton icon = "fas fa-search" href = { app . route ( 'index' , { q : this . queryString } ) } >
55
48
{ app . translator . trans ( 'core.forum.search.all_discussions_button' , { query } ) }
56
49
</ LinkButton >
57
50
</ li > ,
58
51
...results ,
59
52
] ;
60
53
}
54
+
55
+ includes ( ) : string [ ] {
56
+ return [ 'mostRelevantPost' ] ;
57
+ }
58
+
59
+ limit ( ) : number {
60
+ return 3 ;
61
+ }
62
+
63
+ queryMutators ( ) : string [ ] {
64
+ return [ ] ;
65
+ }
66
+
67
+ setQueryString ( query : string ) : void {
68
+ this . queryString = query + ' ' + this . queryMutators ( ) . join ( ' ' ) ;
69
+ }
61
70
}
0 commit comments