@@ -311,52 +311,128 @@ pub fn home() -> Html {
311
311
} )
312
312
} ;
313
313
314
- let filtered_data: Vec < TableLine > = mock_data. data
315
- . iter ( )
316
- . enumerate ( )
317
- . filter ( |( _, entry) | {
318
- let element = & entry. element ;
319
- let nucleons = & entry. nucleons ;
320
- let reaction = & entry. reaction ;
321
- let mt = & entry. mt ;
322
- let library = & entry. library ;
323
-
324
- let element_match = match element_search {
325
- Some ( ref term) => element. to_lowercase ( ) . contains ( & term. to_lowercase ( ) ) ,
326
- None => true ,
327
- } ;
328
- let nucleons_match = match nucleons_search {
329
- Some ( ref term) => nucleons. to_string ( ) . contains ( & * term) ,
330
- None => true ,
331
- } ;
332
- let reaction_match = match reaction_search {
333
- Some ( ref term) => reaction. to_lowercase ( ) . contains ( & term. to_lowercase ( ) ) ,
334
- None => true ,
335
- } ;
336
- let mt_match = match mt_search {
337
- Some ( ref term) => mt. to_string ( ) . contains ( & * term) ,
338
- None => true ,
339
- } ;
340
- let library_match = match library_search {
341
- Some ( ref term) => library. to_lowercase ( ) . contains ( & term. to_lowercase ( ) ) ,
342
- None => true ,
343
- } ;
344
-
345
- element_match && nucleons_match && reaction_match && mt_match && library_match
346
- } )
347
- . map ( |( index, entry) | TableLine {
348
- original_index : index,
349
- id : entry. id ,
350
- element : entry. element . clone ( ) ,
351
- nucleons : entry. nucleons . clone ( ) ,
352
- reaction : entry. reaction . clone ( ) ,
353
- mt : entry. mt . clone ( ) ,
354
- library : entry. library . clone ( ) ,
355
- temperature : entry. temperature . clone ( ) ,
356
- checked : selected_indexes. current ( ) . contains ( & index) ,
357
- sum_callback : callback_sum. clone ( ) ,
358
- } )
359
- . collect ( ) ;
314
+ let filtered_data: Vec < TableLine > = {
315
+ // First pass: check for exact matches across all entries
316
+ let has_element_exact = match element_search {
317
+ Some ( ref term) => {
318
+ let term_lower = term. to_lowercase ( ) ;
319
+ mock_data. data . iter ( ) . any ( |entry| entry. element . to_lowercase ( ) == term_lower)
320
+ }
321
+ None => true ,
322
+ } ;
323
+ let has_nucleons_exact = match nucleons_search {
324
+ Some ( ref term) => {
325
+ mock_data. data . iter ( ) . any ( |entry| entry. nucleons . to_string ( ) == * term)
326
+ }
327
+ None => true ,
328
+ } ;
329
+ let has_reaction_exact = match reaction_search {
330
+ Some ( ref term) => {
331
+ let term_lower = term. to_lowercase ( ) ;
332
+ mock_data. data . iter ( ) . any ( |entry| entry. reaction . to_lowercase ( ) == term_lower)
333
+ }
334
+ None => true ,
335
+ } ;
336
+ let has_mt_exact = match mt_search {
337
+ Some ( ref term) => {
338
+ mock_data. data . iter ( ) . any ( |entry| entry. mt . to_string ( ) == * term)
339
+ }
340
+ None => true ,
341
+ } ;
342
+ let has_library_exact = match library_search {
343
+ Some ( ref term) => {
344
+ let term_lower = term. to_lowercase ( ) ;
345
+ mock_data. data . iter ( ) . any ( |entry| entry. library . to_lowercase ( ) == term_lower)
346
+ }
347
+ None => true ,
348
+ } ;
349
+
350
+ // Second pass: filter based on match criteria
351
+ mock_data. data
352
+ . iter ( )
353
+ . enumerate ( )
354
+ . filter ( |( _, entry) | {
355
+ let element = & entry. element ;
356
+ let nucleons = & entry. nucleons ;
357
+ let reaction = & entry. reaction ;
358
+ let mt = & entry. mt ;
359
+ let library = & entry. library ;
360
+
361
+ let element_match = match element_search {
362
+ Some ( ref term) => {
363
+ let term_lower = term. to_lowercase ( ) ;
364
+ let element_lower = element. to_lowercase ( ) ;
365
+ if has_element_exact {
366
+ element_lower == term_lower
367
+ } else {
368
+ element_lower. starts_with ( & term_lower)
369
+ }
370
+ }
371
+ None => true ,
372
+ } ;
373
+ let nucleons_match = match nucleons_search {
374
+ Some ( ref term) => {
375
+ let nucleons_str = nucleons. to_string ( ) ;
376
+ if has_nucleons_exact {
377
+ nucleons_str == * term
378
+ } else {
379
+ nucleons_str. starts_with ( term)
380
+ }
381
+ }
382
+ None => true ,
383
+ } ;
384
+ let reaction_match = match reaction_search {
385
+ Some ( ref term) => {
386
+ let term_lower = term. to_lowercase ( ) ;
387
+ let reaction_lower = reaction. to_lowercase ( ) ;
388
+ if has_reaction_exact {
389
+ reaction_lower == term_lower
390
+ } else {
391
+ reaction_lower. starts_with ( & term_lower)
392
+ }
393
+ }
394
+ None => true ,
395
+ } ;
396
+ let mt_match = match mt_search {
397
+ Some ( ref term) => {
398
+ let mt_str = mt. to_string ( ) ;
399
+ if has_mt_exact {
400
+ mt_str == * term
401
+ } else {
402
+ mt_str. starts_with ( term)
403
+ }
404
+ }
405
+ None => true ,
406
+ } ;
407
+ let library_match = match library_search {
408
+ Some ( ref term) => {
409
+ let term_lower = term. to_lowercase ( ) ;
410
+ let library_lower = library. to_lowercase ( ) ;
411
+ if has_library_exact {
412
+ library_lower == term_lower
413
+ } else {
414
+ library_lower. starts_with ( & term_lower)
415
+ }
416
+ }
417
+ None => true ,
418
+ } ;
419
+
420
+ element_match && nucleons_match && reaction_match && mt_match && library_match
421
+ } )
422
+ . map ( |( index, entry) | TableLine {
423
+ original_index : index,
424
+ id : entry. id ,
425
+ element : entry. element . clone ( ) ,
426
+ nucleons : entry. nucleons . clone ( ) ,
427
+ reaction : entry. reaction . clone ( ) ,
428
+ mt : entry. mt . clone ( ) ,
429
+ library : entry. library . clone ( ) ,
430
+ temperature : entry. temperature . clone ( ) ,
431
+ checked : selected_indexes. current ( ) . contains ( & index) ,
432
+ sum_callback : callback_sum. clone ( ) ,
433
+ } )
434
+ . collect ( )
435
+ } ;
360
436
361
437
let limit = 10 ;
362
438
let current_page = if filtered_data. is_empty ( ) {
0 commit comments