@@ -311,52 +311,128 @@ pub fn home() -> Html {
311311 } )
312312 } ;
313313
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+ } ;
360436
361437 let limit = 10 ;
362438 let current_page = if filtered_data. is_empty ( ) {
0 commit comments