fixed search
This commit is contained in:
@@ -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 ""
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user