@@ -3,7 +3,7 @@ import { RFS_GlobalModalContext } from "@/components/RFS_GlobalModalContext"
3
3
import { FairDOSearchContext } from "@/components/FairDOSearchContext"
4
4
import { useStore } from "zustand/index"
5
5
import { resultCache } from "@/lib/ResultCache"
6
- import { autoUnwrap , autoUnwrapArray } from "@/components/result/utils"
6
+ import { autoUnwrap , autoUnwrapArray , toArray } from "@/components/result/utils"
7
7
import { DateTime } from "luxon"
8
8
import { BasicRelationNode } from "@/lib/RelationNode"
9
9
import { BookText , ChevronDown , GitFork , ImageOff , LinkIcon , Microscope } from "lucide-react"
@@ -64,9 +64,9 @@ export interface GenericResultViewProps {
64
64
relatedItemPidsField ?: string
65
65
66
66
/**
67
- * Options for prefetching of related items in the relations graph. It is recommended to defined this if the default settings don't work properly.
67
+ * Options for prefetching of related items in the relations graph. It is recommended to define this if the default settings don't work properly.
68
68
*/
69
- relatedItemsPrefetch ?: { prefetchAmount ?: number ; searchFields ?: Record < string , SearchFieldConfiguration > }
69
+ relatedItemsPrefetch ?: { searchFields ?: Record < string , SearchFieldConfiguration > }
70
70
71
71
/**
72
72
* The elastic field where the unique identifier of the parent item (metadata item) of the current FDO will be read from. Will be accessible via a `Find Metadata` button
@@ -111,7 +111,7 @@ export function GenericResultView({
111
111
parentItemPidField = "hasMetadata" ,
112
112
creationDateField = "creationDate" ,
113
113
additionalIdentifierField = "identifier" ,
114
- relatedItemsPrefetch = { prefetchAmount : 20 , searchFields : { pid : { } } } ,
114
+ relatedItemsPrefetch = { searchFields : { pid : { } } } ,
115
115
tags = [ ] ,
116
116
showOpenInFairDoScope = true
117
117
} : GenericResultViewProps ) {
@@ -207,8 +207,9 @@ export function GenericResultView({
207
207
} , [ getField , additionalIdentifierField ] )
208
208
209
209
const isMetadataFor = useMemo ( ( ) => {
210
- return getArrayField ( relatedItemPidsField ?? "isMetadataFor" )
211
- } , [ getArrayField , relatedItemPidsField ] )
210
+ const val = getArrayOrSingleField ( relatedItemPidsField ?? "isMetadataFor" )
211
+ return val ? toArray ( val ) : undefined
212
+ } , [ getArrayOrSingleField , relatedItemPidsField ] )
212
213
213
214
const creationDate = useMemo ( ( ) => {
214
215
const value = getField ( creationDateField ?? "dateCreated" )
@@ -218,54 +219,85 @@ export function GenericResultView({
218
219
} , [ creationDateField , getField ] )
219
220
220
221
const hasMetadata = useMemo ( ( ) => {
221
- return getField ( parentItemPidField ?? "hasMetadata" )
222
- } , [ getField , parentItemPidField ] )
223
-
224
- const fetchRelatedItems = useCallback ( async ( ) => {
225
- const search = await elasticConnector ?. onSearch (
226
- { searchTerm : pid , resultsPerPage : relatedItemsPrefetch ?. prefetchAmount } ,
227
- {
228
- result_fields : { } ,
229
- searchTerm : pid ,
230
- search_fields : relatedItemsPrefetch ?. searchFields ?? { [ pidField ?? "pid" ] : { } } ,
231
- resultsPerPage : relatedItemsPrefetch ?. prefetchAmount
222
+ const val = getArrayOrSingleField ( parentItemPidField ?? "hasMetadata" )
223
+ return val ? toArray ( val ) : undefined
224
+ } , [ getArrayOrSingleField , parentItemPidField ] )
225
+
226
+ const fetchRelatedItems = useCallback (
227
+ async ( term : string , amount : number ) => {
228
+ const search = await elasticConnector ?. onSearch (
229
+ { searchTerm : term , resultsPerPage : amount } ,
230
+ {
231
+ result_fields : { } ,
232
+ searchTerm : term ,
233
+ search_fields : relatedItemsPrefetch ?. searchFields ?? { [ pidField ?? "pid" ] : { } } ,
234
+ resultsPerPage : amount
235
+ }
236
+ )
237
+
238
+ if ( search ) {
239
+ for ( const entry of search . results ) {
240
+ const pid = autoUnwrap ( entry [ pidField ?? "pid" ] )
241
+ if ( ! pid ) continue
242
+ addToResultCache ( pid , {
243
+ pid,
244
+ name : autoUnwrap ( entry [ titleField ?? "name" ] ) ?? ""
245
+ } )
246
+ }
232
247
}
233
- )
234
-
235
- if ( search ) {
236
- for ( const entry of search . results ) {
237
- const pid = autoUnwrap ( entry [ pidField ?? "pid" ] )
238
- if ( ! pid ) continue
239
- addToResultCache ( pid , {
240
- pid,
241
- name : autoUnwrap ( entry [ titleField ?? "name" ] ) ?? ""
248
+ } ,
249
+ [ addToResultCache , elasticConnector , pidField , relatedItemsPrefetch ?. searchFields , titleField ]
250
+ )
251
+
252
+ const showRelatedItemsGraph = useCallback ( async ( ) => {
253
+ if ( ! isMetadataFor || ! pid ) return
254
+ await fetchRelatedItems ( pid , isMetadataFor . length )
255
+
256
+ if ( isMetadataFor . length === 1 ) {
257
+ searchFor ( isMetadataFor [ 0 ] )
258
+ } else {
259
+ openRelationGraph (
260
+ [
261
+ {
262
+ id : pid ?? "source" ,
263
+ label : title ?? "Source" ,
264
+ tag : "Current" ,
265
+ remoteURL : doLocation ,
266
+ searchQuery : pid
267
+ }
268
+ ] ,
269
+ isMetadataFor . map ( ( pid ) => {
270
+ const cached = getResultFromCache ( pid )
271
+ return new BasicRelationNode ( pid , "Related" , cached ?. name )
242
272
} )
243
- }
273
+ )
244
274
}
245
- } , [ addToResultCache , elasticConnector , pid , pidField , relatedItemsPrefetch ?. prefetchAmount , relatedItemsPrefetch ?. searchFields , titleField ] )
246
-
247
- const showRelatedItems = useCallback ( async ( ) => {
248
- await fetchRelatedItems ( )
249
-
250
- openRelationGraph (
251
- {
252
- id : pid ?? "source" ,
253
- label : title ?? "Source" ,
254
- tag : "Current" ,
255
- remoteURL : doLocation ,
256
- searchQuery : pid
257
- } ,
258
- isMetadataFor . map ( ( pid ) => {
259
- const cached = getResultFromCache ( pid )
260
- return new BasicRelationNode ( pid , "Related" , cached ?. name )
261
- } )
262
- )
263
- } , [ doLocation , fetchRelatedItems , getResultFromCache , isMetadataFor , openRelationGraph , pid , title ] )
275
+ } , [ doLocation , fetchRelatedItems , getResultFromCache , isMetadataFor , openRelationGraph , pid , searchFor , title ] )
264
276
265
- const goToMetadata = useCallback ( ( ) => {
277
+ const showHasMetadataGraph = useCallback ( async ( ) => {
266
278
if ( ! hasMetadata ) return
267
- searchFor ( hasMetadata )
268
- } , [ hasMetadata , searchFor ] )
279
+ await fetchRelatedItems ( hasMetadata . join ( " " ) , hasMetadata . length )
280
+
281
+ if ( hasMetadata . length === 1 ) {
282
+ searchFor ( hasMetadata [ 0 ] )
283
+ } else {
284
+ openRelationGraph (
285
+ hasMetadata . map ( ( pid ) => {
286
+ const cached = getResultFromCache ( pid )
287
+ return new BasicRelationNode ( pid , "Metadata" , cached ?. name )
288
+ } ) ,
289
+ [
290
+ {
291
+ id : pid ?? "current" ,
292
+ label : title ?? "Current" ,
293
+ tag : "Current" ,
294
+ remoteURL : doLocation ,
295
+ searchQuery : pid
296
+ }
297
+ ]
298
+ )
299
+ }
300
+ } , [ doLocation , fetchRelatedItems , getResultFromCache , hasMetadata , openRelationGraph , pid , searchFor , title ] )
269
301
270
302
const exactPidMatch = useMemo ( ( ) => {
271
303
return searchTerm === pid || searchTerm === doLocation
@@ -282,10 +314,10 @@ export function GenericResultView({
282
314
283
315
return (
284
316
< div
285
- className = { `rfs-m-2 rfs-rounded-lg rfs-border rfs-border-border rfs-p-4 rfs-group/resultView ${ exactPidMatch ? "rfs-animate-outline-ping" : "" } ` }
317
+ className = { `rfs-m-2 rfs-rounded-lg rfs-border rfs-border-border rfs-p-4 rfs-group/resultView ${ exactPidMatch ? "rfs-animate-rfs- outline-ping" : "" } ` }
286
318
>
287
319
< div
288
- className = { `rfs-grid ${ imageField ? "rfs-grid-rows-[100px_1fr ] md:rfs-grid-cols-[200px_1fr] md:rfs-grid-rows-1" : "" } rfs-gap-4 rfs-overflow-x-auto md:rfs-max-w-full` }
320
+ className = { `rfs-grid ${ imageField ? "rfs-grid-rows-[150px_1fr ] md:rfs-grid-cols-[200px_1fr] md:rfs-grid-rows-1" : "" } rfs-gap-4 rfs-overflow-x-auto md:rfs-max-w-full` }
289
321
>
290
322
{ imageField && (
291
323
< div
@@ -295,7 +327,11 @@ export function GenericResultView({
295
327
Array . isArray ( previewImage ) ? (
296
328
< GenericResultViewImageCarousel images = { previewImage } title = { title } />
297
329
) : (
298
- < img className = "md:rfs-size-[200px]" src = { previewImage } alt = { `Preview for ${ title } ` } />
330
+ < img
331
+ className = "md:rfs-max-h-[200px] md:rfs-max-w-[200px] rfs-object-contain"
332
+ src = { previewImage }
333
+ alt = { `Preview for ${ title } ` }
334
+ />
299
335
)
300
336
) : (
301
337
< div className = "rfs-flex rfs-flex-col rfs-justify-center dark:rfs-text-background" >
@@ -324,30 +360,30 @@ export function GenericResultView({
324
360
</ div >
325
361
< div className = "rfs-grow" > { description } </ div >
326
362
< div className = "rfs-mt-8 rfs-flex rfs-flex-col rfs-flex-wrap rfs-justify-end rfs-gap-2 md:rfs-flex-row md:rfs-items-center md:rfs-gap-4" >
327
- { isMetadataFor . length > 0 && (
363
+ { isMetadataFor && isMetadataFor . length > 0 && (
328
364
< div className = "rfs-flex rfs-items-center" >
329
- < Button className = "rfs-grow rfs-rounded-r-none" size = "sm" variant = "secondary" onClick = { showRelatedItems } >
365
+ < Button className = "rfs-grow rfs-rounded-r-none" size = "sm" variant = "secondary" onClick = { showRelatedItemsGraph } >
330
366
< GitFork className = "rfs-mr-1 rfs-size-4" /> Show Related Items
331
367
</ Button >
332
368
< Button
333
369
className = "rfs-rounded-l-none rfs-border-l rfs-border-l-border rfs-text-xs rfs-font-bold"
334
370
size = "sm"
335
371
variant = "secondary"
336
- onClick = { showRelatedItems }
372
+ onClick = { showRelatedItemsGraph }
337
373
>
338
374
{ isMetadataFor . length }
339
375
</ Button >
340
376
</ div >
341
377
) }
342
378
{ hasMetadata && (
343
- < Button className = "" size = "sm" variant = "secondary" onClick = { goToMetadata } >
379
+ < Button className = "" size = "sm" variant = "secondary" onClick = { showHasMetadataGraph } >
344
380
< BookText className = "rfs-mr-1 rfs-size-4" /> Find Metadata
345
381
</ Button >
346
382
) }
347
383
348
384
{ landingPageLocation && (
349
385
< div className = "rfs-flex rfs-items-center" >
350
- < a href = { landingPageLocation } target = "_blank" className = "grow" >
386
+ < a href = { landingPageLocation } target = "_blank" className = "rfs- grow" >
351
387
< Button size = "sm" className = "rfs-w-full rfs-rounded-r-none rfs-px-4" >
352
388
Open
353
389
</ Button >
0 commit comments