diff --git a/app/modules/sag/backend/router.py b/app/modules/sag/backend/router.py index 5559324..125e740 100644 --- a/app/modules/sag/backend/router.py +++ b/app/modules/sag/backend/router.py @@ -1893,11 +1893,25 @@ async def add_sag_email_link(sag_id: int, payload: dict): async def get_sag_emails(sag_id: int): """Get emails linked to a case.""" query = """ - SELECT e.* - FROM email_messages e - JOIN sag_emails se ON e.id = se.email_id - WHERE se.sag_id = %s - ORDER BY e.received_date DESC + WITH linked_emails AS ( + SELECT + e.*, + COALESCE( + NULLIF(REGEXP_REPLACE(TRIM(COALESCE(e.in_reply_to, '')), '[<>\\s]', '', 'g'), ''), + NULLIF(REGEXP_REPLACE((REGEXP_SPLIT_TO_ARRAY(COALESCE(e.email_references, ''), E'[\\s,]+'))[1], '[<>\\s]', '', 'g'), ''), + NULLIF(REGEXP_REPLACE(TRIM(COALESCE(e.message_id, '')), '[<>\\s]', '', 'g'), ''), + CONCAT('email-', e.id::text) + ) AS thread_key + FROM email_messages e + JOIN sag_emails se ON e.id = se.email_id + WHERE se.sag_id = %s + ) + SELECT + linked_emails.*, + COUNT(*) OVER (PARTITION BY linked_emails.thread_key) AS thread_message_count, + MAX(linked_emails.received_date) OVER (PARTITION BY linked_emails.thread_key) AS thread_last_received_date + FROM linked_emails + ORDER BY thread_last_received_date DESC NULLS LAST, received_date DESC """ return execute_query(query, (sag_id,)) or [] @@ -1969,6 +1983,8 @@ async def upload_sag_email(sag_id: int, file: UploadFile = File(...)): email_data = { 'message_id': msg.get('Message-ID', f"eml-{temp_id}"), + 'in_reply_to': _decode_header_str(msg.get('In-Reply-To', '')), + 'email_references': _decode_header_str(msg.get('References', '')), 'subject': _decode_header_str(msg.get('Subject', 'No Subject')), 'sender_email': _decode_header_str(msg.get('From', '')), 'sender_name': _decode_header_str(msg.get('From', '')), diff --git a/app/modules/sag/templates/detail.html b/app/modules/sag/templates/detail.html index 44a4afe..7fdf89c 100644 --- a/app/modules/sag/templates/detail.html +++ b/app/modules/sag/templates/detail.html @@ -5837,20 +5837,40 @@ return; } setModuleContentState('emails', true); - container.innerHTML = emails.map(e => ` -