1
- import React , { useState , useEffect , useContext } from "react" ;
1
+ import React , { useCallback , useContext , useEffect , useState } from "react" ;
2
2
import { useSearchParams } from "react-router-dom" ;
3
3
4
4
import { APIContext } from "@mwdb-web/commons/api/context" ;
5
- import { multiFromHashes , addFieldToQuery } from "@mwdb-web/commons/helpers" ;
5
+ import { addFieldToQuery , multiFromHashes } from "@mwdb-web/commons/helpers" ;
6
6
import { View } from "@mwdb-web/commons/ui" ;
7
7
8
8
import RecentViewList from "./RecentViewList" ;
@@ -31,61 +31,108 @@ export default function RecentView(props) {
31
31
// Query error shown under the query bar
32
32
const [ queryError , setQueryError ] = useState ( null ) ;
33
33
const [ objectCount , setObjectCount ] = useState ( null ) ;
34
-
34
+ // const [countingEnabled, setCountingEnabled] = useState(true);
35
+ const countingEnabled = searchParams . get ( "count" ) === "1" ? 1 : 0 ;
35
36
const isLocked = ! queryError && submittedQuery !== currentQuery ;
36
37
37
38
function resetErrors ( ) {
38
39
setError ( null ) ;
39
40
setQueryError ( null ) ;
40
41
}
41
42
42
- function setCurrentQuery ( query ) {
43
- // If query is already submitted: do nothing
44
- if ( query === submittedQuery ) return ;
45
- // Optionally convert query if only hash or hashes were provided
46
- query = multiFromHashes ( query ) ;
47
- // Set query in URL (currentQuery)
48
- setSearchParams ( { q : query } ) ;
49
- }
43
+ const setCurrentQuery = useCallback (
44
+ ( { query, enableCounting = countingEnabled } ) => {
45
+ // Optionally convert query if only hash or hashes were provided
46
+ query = multiFromHashes ( query ) ;
47
+ // Set query in URL (currentQuery, countingEnabled)
48
+ setSearchParams ( { q : query , count : enableCounting } ) ;
49
+ } ,
50
+ [ countingEnabled , setSearchParams ]
51
+ ) ;
50
52
51
- const addToQuery = ( field , value ) => {
52
- return setCurrentQuery ( addFieldToQuery ( submittedQuery , field , value ) ) ;
53
- } ;
53
+ const addToQuery = useCallback (
54
+ ( field , value ) => {
55
+ return setCurrentQuery ( {
56
+ query : addFieldToQuery ( submittedQuery , field , value ) ,
57
+ } ) ;
58
+ } ,
59
+ [ submittedQuery , setCurrentQuery ]
60
+ ) ;
54
61
55
62
// Synchronize input if currentQuery was changed
56
63
useEffect ( ( ) => {
57
64
setQueryInput ( currentQuery ) ;
58
65
resetErrors ( ) ;
59
66
} , [ currentQuery ] ) ;
60
67
61
- // Submit query if currentQuery was changed
62
- useEffect ( ( ) => {
63
- let cancelled = false ;
64
- // If query is already submitted: do nothing
65
- if ( submittedQuery === currentQuery ) return ;
66
- // If query is empty, submit immediately
67
- if ( ! currentQuery ) setSubmittedQuery ( "" ) ;
68
- else {
68
+ const submitQueryWithoutCount = useCallback (
69
+ ( query ) => {
70
+ let cancelled = false ;
71
+ // Only check if query is correct
72
+ api . getObjectList ( props . type , "" , query )
73
+ . then ( ( ) => {
74
+ if ( cancelled ) return ;
75
+ // If ok: commit query
76
+ setSubmittedQuery ( query ) ;
77
+ } )
78
+ . catch ( ( error ) => {
79
+ if ( cancelled ) return ;
80
+ setQueryError ( error ) ;
81
+ } ) ;
82
+ return ( ) => {
83
+ cancelled = true ;
84
+ } ;
85
+ } ,
86
+ [ api , props . type ]
87
+ ) ;
88
+
89
+ const submitQueryWithCount = useCallback (
90
+ ( query ) => {
91
+ let cancelled = false ;
69
92
// Make preflight query to get count of results
70
93
// and check if query is correct
71
- api . getObjectCount ( props . type , currentQuery )
94
+ // First nullify the current count
95
+ setObjectCount ( null ) ;
96
+ api . getObjectCount ( props . type , query )
72
97
. then ( ( response ) => {
73
98
if ( cancelled ) return ;
74
99
// If ok: commit query
75
- setSubmittedQuery ( currentQuery ) ;
100
+ setSubmittedQuery ( query ) ;
76
101
setObjectCount ( response . data [ "count" ] ) ;
77
102
} )
78
103
. catch ( ( error ) => {
79
104
if ( cancelled ) return ;
80
105
setQueryError ( error ) ;
81
106
} ) ;
82
- }
83
- return ( ) => {
84
- // Cancel pending requests after unmount/remount
85
- cancelled = true ;
86
- } ;
87
- // eslint-disable-next-line react-hooks/exhaustive-deps
88
- } , [ currentQuery ] ) ;
107
+
108
+ return ( ) => {
109
+ cancelled = true ;
110
+ } ;
111
+ } ,
112
+ [ api , props . type ]
113
+ ) ;
114
+
115
+ const submitQuery = useCallback (
116
+ ( query ) => {
117
+ setCurrentQuery ( {
118
+ query,
119
+ } ) ;
120
+ return countingEnabled
121
+ ? submitQueryWithCount ( query )
122
+ : submitQueryWithoutCount ( query ) ;
123
+ } ,
124
+ [
125
+ countingEnabled ,
126
+ setCurrentQuery ,
127
+ submitQueryWithCount ,
128
+ submitQueryWithoutCount ,
129
+ ]
130
+ ) ;
131
+
132
+ useEffect ( ( ) => {
133
+ if ( ! currentQuery ) setSubmittedQuery ( "" ) ;
134
+ return submitQuery ( currentQuery ) ;
135
+ } , [ currentQuery , submitQuery ] ) ;
89
136
90
137
const canAddQuickQuery =
91
138
queryInput && ! isLocked && queryInput === submittedQuery ;
@@ -100,23 +147,30 @@ export default function RecentView(props) {
100
147
[ ]
101
148
) ;
102
149
103
- const objectCountMessage =
104
- submittedQuery && objectCount !== null ? (
105
- < div className = "form-hint" >
106
- { objectCount }
107
- { " results found" }
108
- </ div >
109
- ) : (
110
- [ ]
111
- ) ;
150
+ let objectCountMessage = [ ] ;
151
+ if ( submittedQuery && countingEnabled ) {
152
+ if ( objectCount === null ) {
153
+ objectCountMessage = < div className = "form-hint" > Counting...</ div > ;
154
+ } else {
155
+ objectCountMessage = (
156
+ < div className = "form-hint" >
157
+ { objectCount }
158
+ { " results found" }
159
+ </ div >
160
+ ) ;
161
+ }
162
+ }
163
+
112
164
return (
113
165
< View fluid ident = "recentObjects" error = { error } >
114
166
< div className = "table-responsive" >
115
167
< form
116
168
className = "searchForm"
117
169
onSubmit = { ( ev ) => {
118
170
ev . preventDefault ( ) ;
119
- setCurrentQuery ( queryInput ) ;
171
+ setCurrentQuery ( {
172
+ query : queryInput ,
173
+ } ) ;
120
174
} }
121
175
>
122
176
< div className = "input-group" >
@@ -127,7 +181,9 @@ export default function RecentView(props) {
127
181
value = "X"
128
182
onClick = { ( ev ) => {
129
183
ev . preventDefault ( ) ;
130
- setCurrentQuery ( "" ) ;
184
+ setCurrentQuery ( {
185
+ query : "" ,
186
+ } ) ;
131
187
} }
132
188
/>
133
189
</ div >
@@ -140,11 +196,31 @@ export default function RecentView(props) {
140
196
onChange = { ( evt ) => setQueryInput ( evt . target . value ) }
141
197
/>
142
198
< div className = "input-group-append" >
143
- < input
144
- className = "btn btn-outline-success"
145
- type = "submit"
146
- value = "Search"
147
- />
199
+ < div className = "btn-group" >
200
+ < input
201
+ className = "btn btn-outline-success rounded-0"
202
+ type = "submit"
203
+ value = "Search"
204
+ />
205
+ </ div >
206
+ < div className = "btn-group" >
207
+ < input
208
+ type = "submit"
209
+ className = { `btn btn-outline-info rounded-0 ${
210
+ searchParams . get ( "count" ) === "1"
211
+ ? "active"
212
+ : ""
213
+ } `}
214
+ value = "Count"
215
+ onClick = { ( ) => {
216
+ setSearchParams ( {
217
+ q : currentQuery ,
218
+ count : countingEnabled ? "0" : "1" ,
219
+ } ) ;
220
+ } }
221
+ />
222
+ </ div >
223
+
148
224
< a
149
225
href = "https://mwdb.readthedocs.io/en/latest/user-guide/7-Lucene-search.html"
150
226
className = "btn btn-outline-primary"
@@ -159,7 +235,11 @@ export default function RecentView(props) {
159
235
type = { props . type }
160
236
query = { submittedQuery }
161
237
canAddQuickQuery = { canAddQuickQuery }
162
- submitQuery = { ( q ) => setCurrentQuery ( q ) }
238
+ submitQuery = { ( query ) =>
239
+ setCurrentQuery ( {
240
+ query,
241
+ } )
242
+ }
163
243
addToQuery = { addToQuery }
164
244
setQueryError = { setQueryError }
165
245
/>
@@ -173,6 +253,7 @@ export default function RecentView(props) {
173
253
locked = { isLocked }
174
254
disallowEmpty = { props . disallowEmpty }
175
255
setError = { setError }
256
+ setQueryError = { setQueryError }
176
257
addToQuery = { addToQuery }
177
258
/>
178
259
</ div >
0 commit comments