fixed search

This commit is contained in:
HotSwapp
2025-08-11 11:26:16 -05:00
parent 85ce0f82ec
commit 278eb7c5d4
3 changed files with 53 additions and 43 deletions

View File

@@ -314,7 +314,7 @@ async def get_search_facets(
).all() ).all()
# States # States
states = db.query(State.abrev, State.name).filter( states = db.query(State.abbreviation, State.name).filter(
State.active == True State.active == True
).order_by(State.name).all() ).order_by(State.name).all()
@@ -381,7 +381,7 @@ async def search_files(
async def _search_customers(criteria: AdvancedSearchCriteria, db: Session) -> List[SearchResult]: async def _search_customers(criteria: AdvancedSearchCriteria, db: Session) -> List[SearchResult]:
"""Search customers with advanced criteria""" """Search customers with advanced criteria"""
query = db.query(Rolodex).options(joinedload(Rolodex.phones)) query = db.query(Rolodex).options(joinedload(Rolodex.phone_numbers))
if criteria.query: if criteria.query:
search_conditions = [] search_conditions = []
@@ -392,8 +392,7 @@ async def _search_customers(criteria: AdvancedSearchCriteria, db: Session) -> Li
search_conditions.append( search_conditions.append(
or_( or_(
func.concat(Rolodex.first, ' ', Rolodex.last).contains(search_term), func.concat(Rolodex.first, ' ', Rolodex.last).contains(search_term),
Rolodex.memo1.contains(search_term), Rolodex.memo.contains(search_term)
Rolodex.memo2.contains(search_term)
) )
) )
else: else:
@@ -408,8 +407,7 @@ async def _search_customers(criteria: AdvancedSearchCriteria, db: Session) -> Li
Rolodex.first.contains(term), Rolodex.first.contains(term),
Rolodex.city.contains(term), Rolodex.city.contains(term),
Rolodex.email.contains(term), Rolodex.email.contains(term),
Rolodex.memo1.contains(term), Rolodex.memo.contains(term)
Rolodex.memo2.contains(term)
) )
) )
else: else:
@@ -420,8 +418,7 @@ async def _search_customers(criteria: AdvancedSearchCriteria, db: Session) -> Li
Rolodex.first.ilike(f"%{term}%"), Rolodex.first.ilike(f"%{term}%"),
Rolodex.city.ilike(f"%{term}%"), Rolodex.city.ilike(f"%{term}%"),
Rolodex.email.ilike(f"%{term}%"), Rolodex.email.ilike(f"%{term}%"),
Rolodex.memo1.ilike(f"%{term}%"), Rolodex.memo.ilike(f"%{term}%")
Rolodex.memo2.ilike(f"%{term}%")
) )
) )
@@ -460,7 +457,7 @@ async def _search_customers(criteria: AdvancedSearchCriteria, db: Session) -> Li
highlight = _create_customer_highlight(customer, criteria.query or "") highlight = _create_customer_highlight(customer, criteria.query or "")
# Get phone numbers # Get phone numbers
phone_numbers = [p.phone for p in customer.phones] if customer.phones else [] phone_numbers = [p.phone for p in customer.phone_numbers] if customer.phone_numbers else []
results.append(SearchResult( results.append(SearchResult(
type="customer", type="customer",
@@ -499,8 +496,7 @@ async def _search_files(criteria: AdvancedSearchCriteria, db: Session) -> List[S
File.id.contains(term), File.id.contains(term),
File.regarding.contains(term), File.regarding.contains(term),
File.file_type.contains(term), File.file_type.contains(term),
File.memo1.contains(term), File.memo.contains(term)
File.memo2.contains(term)
) )
) )
else: else:
@@ -510,8 +506,7 @@ async def _search_files(criteria: AdvancedSearchCriteria, db: Session) -> List[S
File.id.ilike(f"%{term}%"), File.id.ilike(f"%{term}%"),
File.regarding.ilike(f"%{term}%"), File.regarding.ilike(f"%{term}%"),
File.file_type.ilike(f"%{term}%"), File.file_type.ilike(f"%{term}%"),
File.memo1.ilike(f"%{term}%"), File.memo.ilike(f"%{term}%")
File.memo2.ilike(f"%{term}%")
) )
) )
@@ -702,10 +697,10 @@ async def _search_qdros(criteria: AdvancedSearchCriteria, db: Session) -> List[S
search_conditions.append( search_conditions.append(
or_( or_(
QDRO.file_no.contains(term), QDRO.file_no.contains(term),
QDRO.title.contains(term), QDRO.form_name.contains(term),
QDRO.participant_name.contains(term), QDRO.pet.contains(term),
QDRO.spouse_name.contains(term), QDRO.res.contains(term),
QDRO.plan_name.contains(term), QDRO.case_number.contains(term),
QDRO.notes.contains(term) QDRO.notes.contains(term)
) )
) )
@@ -713,10 +708,10 @@ async def _search_qdros(criteria: AdvancedSearchCriteria, db: Session) -> List[S
search_conditions.append( search_conditions.append(
or_( or_(
QDRO.file_no.ilike(f"%{term}%"), QDRO.file_no.ilike(f"%{term}%"),
QDRO.title.ilike(f"%{term}%"), QDRO.form_name.ilike(f"%{term}%"),
QDRO.participant_name.ilike(f"%{term}%"), QDRO.pet.ilike(f"%{term}%"),
QDRO.spouse_name.ilike(f"%{term}%"), QDRO.res.ilike(f"%{term}%"),
QDRO.plan_name.ilike(f"%{term}%"), QDRO.case_number.ilike(f"%{term}%"),
QDRO.notes.ilike(f"%{term}%") QDRO.notes.ilike(f"%{term}%")
) )
) )
@@ -734,16 +729,16 @@ async def _search_qdros(criteria: AdvancedSearchCriteria, db: Session) -> List[S
results.append(SearchResult( results.append(SearchResult(
type="qdro", type="qdro",
id=qdro.id, id=qdro.id,
title=qdro.title or f"QDRO v{qdro.version}", title=qdro.form_name or f"QDRO v{qdro.version}",
description=f"File: {qdro.file_no} | Status: {qdro.status} | Participant: {qdro.participant_name or 'N/A'}", description=f"File: {qdro.file_no} | Status: {qdro.status} | Case: {qdro.case_number or 'N/A'}",
url=f"/documents?qdro_id={qdro.id}", url=f"/documents?qdro_id={qdro.id}",
metadata={ metadata={
"file_no": qdro.file_no, "file_no": qdro.file_no,
"version": qdro.version, "version": qdro.version,
"status": qdro.status, "status": qdro.status,
"participant": qdro.participant_name, "petitioner": qdro.pet,
"spouse": qdro.spouse_name, "respondent": qdro.res,
"plan": qdro.plan_name "case_number": qdro.case_number
}, },
relevance_score=relevance, relevance_score=relevance,
highlight=highlight, highlight=highlight,
@@ -818,7 +813,7 @@ async def _search_templates(criteria: AdvancedSearchCriteria, db: Session) -> Li
async def _search_phones(criteria: AdvancedSearchCriteria, db: Session) -> List[SearchResult]: async def _search_phones(criteria: AdvancedSearchCriteria, db: Session) -> List[SearchResult]:
"""Search phone numbers""" """Search phone numbers"""
query = db.query(Phone).options(joinedload(Phone.person)) query = db.query(Phone).options(joinedload(Phone.rolodex_entry))
if criteria.query: if criteria.query:
# Clean phone number for search (remove non-digits) # Clean phone number for search (remove non-digits)
@@ -837,17 +832,17 @@ async def _search_phones(criteria: AdvancedSearchCriteria, db: Session) -> List[
results = [] results = []
for phone in phones: for phone in phones:
owner_name = "" owner_name = ""
if phone.person: if phone.rolodex_entry:
owner_name = f"{phone.person.first or ''} {phone.person.last}".strip() owner_name = f"{phone.rolodex_entry.first or ''} {phone.rolodex_entry.last}".strip()
results.append(SearchResult( results.append(SearchResult(
type="phone", type="phone",
id=f"{phone.id}_{phone.phone}", id=f"{phone.id}_{phone.phone}",
title=phone.phone, title=phone.phone,
description=f"Owner: {owner_name} | Location: {phone.location or 'Unknown'}", description=f"Owner: {owner_name} | Location: {phone.location or 'Unknown'}",
url=f"/customers?id={phone.id}", url=f"/customers?id={phone.rolodex_id}",
metadata={ metadata={
"owner_id": phone.id, "owner_id": phone.rolodex_id,
"owner_name": owner_name, "owner_name": owner_name,
"location": phone.location "location": phone.location
}, },
@@ -1019,21 +1014,21 @@ def _calculate_qdro_relevance(qdro: QDRO, query: str) -> float:
score = 0.0 score = 0.0
query_lower = query.lower() query_lower = query.lower()
# Title exact match # Form name exact match
if qdro.title and query_lower == qdro.title.lower(): if qdro.form_name and query_lower == qdro.form_name.lower():
score += 10.0 score += 10.0
elif qdro.title and query_lower in qdro.title.lower(): elif qdro.form_name and query_lower in qdro.form_name.lower():
score += 5.0 score += 5.0
# Participant names # Party names
if qdro.participant_name and query_lower in qdro.participant_name.lower(): if qdro.pet and query_lower in qdro.pet.lower():
score += 6.0 score += 6.0
if qdro.spouse_name and query_lower in qdro.spouse_name.lower(): if qdro.res and query_lower in qdro.res.lower():
score += 6.0 score += 6.0
# Plan name # Case number
if qdro.plan_name and query_lower in qdro.plan_name.lower(): if qdro.case_number and query_lower in qdro.case_number.lower():
score += 4.0 score += 4.0
return max(score, 0.1) return max(score, 0.1)
@@ -1111,10 +1106,13 @@ def _create_qdro_highlight(qdro: QDRO, query: str) -> str:
if not query: if not query:
return "" return ""
if qdro.title and query.lower() in qdro.title.lower(): if qdro.form_name and query.lower() in qdro.form_name.lower():
return f"Title: {qdro.title}" return f"Form: {qdro.form_name}"
if qdro.participant_name and query.lower() in qdro.participant_name.lower(): if qdro.pet and query.lower() in qdro.pet.lower():
return f"Participant: {qdro.participant_name}" return f"Petitioner: {qdro.pet}"
if qdro.case_number and query.lower() in qdro.case_number.lower():
return f"Case: {qdro.case_number}"
return "" return ""

View File

@@ -42,6 +42,16 @@
headers.set(CORRELATION_HEADER, outgoingCid); headers.set(CORRELATION_HEADER, outgoingCid);
} }
// Inject Authorization header if JWT token is available and not already provided
try {
const storedToken = (window.app && window.app.token) || (typeof localStorage !== 'undefined' && localStorage.getItem('auth_token'));
if (storedToken && !headers.has('Authorization')) {
headers.set('Authorization', `Bearer ${storedToken}`);
}
} catch (_) {
// Ignore storage access errors (e.g., privacy mode)
}
const requestInit = { ...options, headers }; const requestInit = { ...options, headers };
const response = await originalFetch(resource, requestInit); const response = await originalFetch(resource, requestInit);

View File

@@ -362,6 +362,8 @@
</script> </script>
<!-- Custom JavaScript --> <!-- Custom JavaScript -->
<!-- Fetch wrapper must be loaded first to augment global fetch() before other scripts -->
<script src="/static/js/fetch-wrapper.js"></script>
<!-- Load main.js first so global handlers are registered before other scripts --> <!-- Load main.js first so global handlers are registered before other scripts -->
<script src="/static/js/main.js"></script> <script src="/static/js/main.js"></script>
<script src="/static/js/alerts.js"></script> <script src="/static/js/alerts.js"></script>