Update page_files/Categorized_Search.py

#8
by AbhijitClemson - opened
Files changed (1) hide show
  1. page_files/Categorized_Search.py +118 -37
page_files/Categorized_Search.py CHANGED
@@ -8,14 +8,24 @@ from PIL import Image
8
 
9
  from data_loader import get_all_sections, load_material_data
10
  import streamlit.components.v1 as components
11
-
12
- def switch_tab(index):
 
 
 
 
 
 
13
  components.html(f"""
14
  <script>
 
15
  var tabs = window.parent.document.querySelectorAll('[data-testid="stTabs"] button[role="tab"]');
16
  if (tabs.length > {index}) tabs[{index}].click();
17
  </script>
18
  """, height=0)
 
 
 
19
  st.markdown(
20
  """
21
  <style>
@@ -382,13 +392,17 @@ def toggle_class(material_class: str):
382
  st.session_state.active_classes = []
383
  else:
384
  st.session_state.active_classes = [material_class]
 
385
  st.session_state.current_page = 0
386
  st.session_state.selected_row = None
387
  st.session_state["last_synced_abbr"] = None
 
388
  df_key = f"materials_df_0"
389
  if df_key in st.session_state:
390
  st.session_state[df_key] = {"selection": {"rows": [], "columns": [], "cells": []}}
391
  st.session_state["_switch_to_tab"] = 0
 
 
392
 
393
 
394
  def visible_page_numbers(current_page: int, total_pages: int):
@@ -420,7 +434,10 @@ defaults = {
420
  for key, value in defaults.items():
421
  if key not in st.session_state:
422
  st.session_state[key] = value
423
-
 
 
 
424
  if "material_type" in st.session_state:
425
  incoming_type = st.session_state.pop("material_type")
426
  if incoming_type in ["Composites", "Polymers", "Fibers"]:
@@ -431,10 +448,9 @@ if "selected_section" in st.session_state:
431
  st.session_state._reset_prop_checks = True
432
 
433
  if "search_term" in st.session_state:
434
- st.session_state._search_term = st.session_state.pop("search_term")
435
-
436
- if st.session_state._search_term and not st.session_state.top_search_input:
437
- st.session_state.top_search_input = st.session_state._search_term
438
 
439
  all_data = load_all_data()
440
  if "user_uploaded_data" in st.session_state:
@@ -504,7 +520,17 @@ st.session_state.current_page = min(st.session_state.current_page, total_pages -
504
  start = st.session_state.current_page * PAGE_SIZE
505
  end = start + PAGE_SIZE
506
  page_meta = filtered_meta.iloc[start:end].reset_index(drop=True)
507
-
 
 
 
 
 
 
 
 
 
 
508
  left_col, right_col = st.columns([1.03, 3.07], gap="small")
509
 
510
  with left_col:
@@ -621,39 +647,69 @@ with left_col:
621
  disabled=st.session_state.selected_row is None,
622
  ):
623
  st.info("Open the Inspect tab on the right panel.")
624
- switch_tab(1)
625
  if st.session_state.selected_row:
626
  selected_abbr, selected_name = st.session_state.selected_row
627
  st.markdown(
628
  f"<div class='aim-selected'><b>Selected</b><br>{selected_name}<br><span style='font-family:monospace'>{selected_abbr}</span></div>",
629
  unsafe_allow_html=True,
630
  )
631
-
 
 
 
 
 
 
 
 
 
632
  with right_col:
633
- #with st.container(border=True):
634
- # with st.container(key="top_search_row"):
635
- # input_col, btn_col = st.columns([0.82, 0.18], gap="small")
636
- # with input_col:
637
- # search_query = st.text_input(
638
- # label="Search",
639
- # placeholder="Search by material name, property, or abbreviation...",
640
- # label_visibility="collapsed",
641
- # key="top_search_input",
642
- # )
643
- # with btn_col:
644
- # search_clicked = st.button("Search", key="top_search_btn", use_container_width=True)
645
-
646
- #if search_clicked:
647
- # query = (search_query or "").strip()
648
- # st.session_state._search_term = query if query else None
649
- # st.session_state.current_page = 0
650
- # st.rerun()
651
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
652
  with st.container(border=True):
653
  st.markdown(
654
  """
655
  <div style='padding:14px 18px 0;'>
656
- <div class='aim-breadcrumb'><span>MATERIALS DATABASE</span></div>
657
  <div class='aim-title'>Materials Database</div>
658
  </div>
659
  """,
@@ -664,7 +720,8 @@ with right_col:
664
  ["All Materials", "Inspect"]
665
  )
666
  if st.session_state.get("_switch_to_tab") is not None:
667
- switch_tab(st.session_state["_switch_to_tab"])
 
668
  del st.session_state["_switch_to_tab"]
669
  with tab_materials:
670
  filter_label = (
@@ -739,32 +796,56 @@ with right_col:
739
  selected_cells = event.selection.cells
740
 
741
  if selected_rows:
 
 
742
  row_idx = selected_rows[0]
 
 
 
 
 
743
  chosen = page_meta.iloc[row_idx]
744
  abbr = chosen["material_abbreviation"]
745
  name = chosen["material_name"]
 
746
  if not (st.session_state.selected_row and st.session_state.selected_row[0] == abbr):
747
- st.session_state.selected_row = (abbr, name)
748
- st.rerun()
 
749
  else:
750
- if st.session_state.selected_row is not None and not selected_cells:
 
 
 
 
 
 
751
  st.session_state.selected_row = None
752
- st.rerun()
753
 
 
754
  if selected_cells:
 
755
  row_idx = selected_cells[0][0]
 
 
 
 
756
  chosen = page_meta.iloc[row_idx]
757
  abbr = chosen["material_abbreviation"]
758
  name = chosen["material_name"]
759
  if st.session_state.selected_row and st.session_state.selected_row[0] == abbr:
760
  st.session_state.selected_row = None
761
- st.session_state["pending_row_select"] = None
 
762
  st.rerun()
763
- elif st.session_state.selected_row is None or st.session_state.selected_row[0] != abbr:
764
  st.session_state.selected_row = (abbr, name)
765
  st.session_state["pending_row_select"] = row_idx
 
766
  st.rerun()
767
 
 
768
  info_col, nav_col = st.columns([2.4, 2.0])
769
  with info_col:
770
  st.markdown(
 
8
 
9
  from data_loader import get_all_sections, load_material_data
10
  import streamlit.components.v1 as components
11
+ def clear_search():
12
+ """Clear the search box and search term. Called as a callback from other widgets."""
13
+ st.session_state._search_term = None
14
+ st.session_state["_pending_clear_search"] = True
15
+
16
+ def switch_tab(index, clear=True):
17
+ count = st.session_state.get('_tab_switch_count', 0) + 1
18
+ st.session_state['_tab_switch_count'] = count
19
  components.html(f"""
20
  <script>
21
+ var _unique = {count};
22
  var tabs = window.parent.document.querySelectorAll('[data-testid="stTabs"] button[role="tab"]');
23
  if (tabs.length > {index}) tabs[{index}].click();
24
  </script>
25
  """, height=0)
26
+ st.session_state.current_tab = index
27
+ if clear:
28
+ clear_search()
29
  st.markdown(
30
  """
31
  <style>
 
392
  st.session_state.active_classes = []
393
  else:
394
  st.session_state.active_classes = [material_class]
395
+
396
  st.session_state.current_page = 0
397
  st.session_state.selected_row = None
398
  st.session_state["last_synced_abbr"] = None
399
+ # Clear the dataframe selection for page 0
400
  df_key = f"materials_df_0"
401
  if df_key in st.session_state:
402
  st.session_state[df_key] = {"selection": {"rows": [], "columns": [], "cells": []}}
403
  st.session_state["_switch_to_tab"] = 0
404
+ clear_search()
405
+
406
 
407
 
408
  def visible_page_numbers(current_page: int, total_pages: int):
 
434
  for key, value in defaults.items():
435
  if key not in st.session_state:
436
  st.session_state[key] = value
437
+ if st.session_state.get("_last_page") != "Categorized_Search":
438
+ st.session_state._search_term = None
439
+ st.session_state.top_search_input = ""
440
+ st.session_state._last_page = "Categorized_Search"
441
  if "material_type" in st.session_state:
442
  incoming_type = st.session_state.pop("material_type")
443
  if incoming_type in ["Composites", "Polymers", "Fibers"]:
 
448
  st.session_state._reset_prop_checks = True
449
 
450
  if "search_term" in st.session_state:
451
+ incoming_term = st.session_state.pop("search_term")
452
+ st.session_state._search_term = incoming_term
453
+ st.session_state.top_search_input = incoming_term
 
454
 
455
  all_data = load_all_data()
456
  if "user_uploaded_data" in st.session_state:
 
520
  start = st.session_state.current_page * PAGE_SIZE
521
  end = start + PAGE_SIZE
522
  page_meta = filtered_meta.iloc[start:end].reset_index(drop=True)
523
+ if st.session_state.pop("_restore_selection_highlight", False):
524
+ st.session_state.pop("_search_just_changed", None)
525
+ if st.session_state.selected_row:
526
+ abbr = st.session_state.selected_row[0]
527
+ match = page_meta[page_meta["material_abbreviation"] == abbr]
528
+ if not match.empty:
529
+ st.session_state["pending_row_select"] = match.index[0]
530
+ else:
531
+ st.session_state.pop("pending_row_select", None) # ← clear stale index
532
+ st.session_state["_clear_df_selection"] = True # ← clear wrong highlight
533
+ st.session_state["_search_just_changed"] = True
534
  left_col, right_col = st.columns([1.03, 3.07], gap="small")
535
 
536
  with left_col:
 
647
  disabled=st.session_state.selected_row is None,
648
  ):
649
  st.info("Open the Inspect tab on the right panel.")
650
+ st.session_state["_switch_to_tab"] = 1
651
  if st.session_state.selected_row:
652
  selected_abbr, selected_name = st.session_state.selected_row
653
  st.markdown(
654
  f"<div class='aim-selected'><b>Selected</b><br>{selected_name}<br><span style='font-family:monospace'>{selected_abbr}</span></div>",
655
  unsafe_allow_html=True,
656
  )
657
+ if st.session_state.pop("_pending_clear_search", False):
658
+ st.session_state.top_search_input = ""
659
+ if st.session_state._search_term != st.session_state.get("_previous_search_term"):
660
+ if st.session_state.top_search_input:
661
+ st.session_state._search_term = st.session_state.top_search_input
662
+ if st.session_state._search_term:
663
+ st.session_state.selected_row = None
664
+ st.session_state["_clear_df_selection"] = True
665
+ switch_tab(0, clear=False)
666
+ st.session_state["_previous_search_term"] = st.session_state._search_term
667
  with right_col:
668
+
669
+ with st.container(border=True):
670
+ with st.container(key="top_search_row"):
671
+ input_col, btn_col = st.columns([0.82, 0.18], gap="small")
672
+ with input_col:
673
+ search_query = st.text_input(
674
+ label="Search",
675
+ placeholder="Search material name or abbreviation...",
676
+ label_visibility="collapsed",
677
+ key="top_search_input",
678
+ on_change=lambda: None,
679
+ )
680
+ with btn_col:
681
+ search_clicked = st.button("Search", key="top_search_btn", width="stretch")
682
+
683
+ current_input = (search_query or "").strip()
684
+ previous_term = st.session_state._search_term or ""
685
+ st.write(f"DEBUG: fired, current='{current_input}', prev='{previous_term}'")
686
+ if search_clicked:
687
+ if current_input:
688
+ st.session_state["_switch_to_tab"] = 0
689
+ st.session_state._search_term = current_input if current_input else None
690
+ st.session_state.current_page = 0
691
+ if current_input:
692
+ st.session_state.selected_row = None
693
+ st.session_state["_clear_df_selection"] = True
694
+ st.rerun()
695
+ elif current_input != previous_term:
696
+ st.session_state._search_term = current_input if current_input else None
697
+ st.session_state.current_page = 0
698
+ if current_input:
699
+ st.session_state.selected_row = None
700
+ st.session_state["_clear_df_selection"] = True
701
+ else:
702
+ st.session_state.pop("pending_row_select", None) # ← clear stale index
703
+ #st.session_state["_clear_df_selection"] = True # ← clear visual highlight
704
+ st.session_state["_restore_selection_highlight"] = True
705
+ st.session_state["_search_just_changed"] = True
706
+
707
+ st.rerun()
708
  with st.container(border=True):
709
  st.markdown(
710
  """
711
  <div style='padding:14px 18px 0;'>
712
+ <div class='aim-breadcrumb'>INVENTORY / <span>MATERIALS DATABASE</span></div>
713
  <div class='aim-title'>Materials Database</div>
714
  </div>
715
  """,
 
720
  ["All Materials", "Inspect"]
721
  )
722
  if st.session_state.get("_switch_to_tab") is not None:
723
+ tab_index = st.session_state["_switch_to_tab"]
724
+ switch_tab(tab_index, clear=(tab_index != 1))
725
  del st.session_state["_switch_to_tab"]
726
  with tab_materials:
727
  filter_label = (
 
796
  selected_cells = event.selection.cells
797
 
798
  if selected_rows:
799
+
800
+
801
  row_idx = selected_rows[0]
802
+ if row_idx >= len(page_meta):
803
+ st.session_state.selected_row = None
804
+ st.session_state["_clear_df_selection"] = True
805
+ st.rerun()
806
+
807
  chosen = page_meta.iloc[row_idx]
808
  abbr = chosen["material_abbreviation"]
809
  name = chosen["material_name"]
810
+
811
  if not (st.session_state.selected_row and st.session_state.selected_row[0] == abbr):
812
+ st.session_state.selected_row = (abbr, name)
813
+
814
+ st.rerun()
815
  else:
816
+
817
+
818
+ if (
819
+ st.session_state.selected_row is not None
820
+ and not selected_cells
821
+ and not st.session_state.pop("_search_just_changed", False)
822
+ ):
823
  st.session_state.selected_row = None
824
+
825
 
826
+ st.rerun()
827
  if selected_cells:
828
+
829
  row_idx = selected_cells[0][0]
830
+ if row_idx >= len(page_meta):
831
+ st.session_state["_clear_df_selection"] = True
832
+ st.rerun()
833
+
834
  chosen = page_meta.iloc[row_idx]
835
  abbr = chosen["material_abbreviation"]
836
  name = chosen["material_name"]
837
  if st.session_state.selected_row and st.session_state.selected_row[0] == abbr:
838
  st.session_state.selected_row = None
839
+ st.session_state["_clear_df_selection"] = True
840
+
841
  st.rerun()
842
+ if st.session_state.selected_row is None or st.session_state.selected_row[0] != abbr:
843
  st.session_state.selected_row = (abbr, name)
844
  st.session_state["pending_row_select"] = row_idx
845
+
846
  st.rerun()
847
 
848
+
849
  info_col, nav_col = st.columns([2.4, 2.0])
850
  with info_col:
851
  st.markdown(