feat: use email 'Date' header for statistics and search filtering #87

This commit is contained in:
rustmailer
2025-12-30 22:21:53 +08:00
parent fb0be8c5d1
commit 7fb6575f8d
4 changed files with 15 additions and 15 deletions
+8 -8
View File
@@ -34,8 +34,8 @@ use crate::{
indexer::{ indexer::{
envelope::Envelope, envelope::Envelope,
fields::{ fields::{
F_ACCOUNT_ID, F_FROM, F_HAS_ATTACHMENT, F_INTERNAL_DATE, F_MAILBOX_ID, F_SIZE, F_ACCOUNT_ID, F_DATE, F_FROM, F_HAS_ATTACHMENT, F_MAILBOX_ID, F_SIZE, F_TAGS,
F_TAGS, F_THREAD_ID, F_UID, F_THREAD_ID, F_UID,
}, },
schema::SchemaTools, schema::SchemaTools,
}, },
@@ -335,13 +335,13 @@ impl EnvelopeIndexManager {
} }
let start_bound = if let Some(from) = filter.since { let start_bound = if let Some(from) = filter.since {
Bound::Included(Term::from_field_i64(f.f_internal_date, from)) Bound::Included(Term::from_field_i64(f.f_date, from))
} else { } else {
Bound::Unbounded Bound::Unbounded
}; };
let end_bound = if let Some(to) = filter.before { let end_bound = if let Some(to) = filter.before {
Bound::Included(Term::from_field_i64(f.f_internal_date, to)) Bound::Included(Term::from_field_i64(f.f_date, to))
} else { } else {
Bound::Unbounded Bound::Unbounded
}; };
@@ -658,7 +658,7 @@ impl EnvelopeIndexManager {
&query, &query,
&TopDocs::with_limit(page_size as usize) &TopDocs::with_limit(page_size as usize)
.and_offset(offset as usize) .and_offset(offset as usize)
.order_by_fast_field(F_INTERNAL_DATE, order), .order_by_fast_field(F_DATE, order),
) )
.map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?;
let mut result = Vec::new(); let mut result = Vec::new();
@@ -721,7 +721,7 @@ impl EnvelopeIndexManager {
query.as_ref(), query.as_ref(),
&TopDocs::with_limit(page_size as usize) &TopDocs::with_limit(page_size as usize)
.and_offset(offset as usize) .and_offset(offset as usize)
.order_by_fast_field(F_INTERNAL_DATE, order), .order_by_fast_field(F_DATE, order),
) )
.map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?;
let mut result = Vec::new(); let mut result = Vec::new();
@@ -786,7 +786,7 @@ impl EnvelopeIndexManager {
query.as_ref(), query.as_ref(),
&TopDocs::with_limit(page_size as usize) &TopDocs::with_limit(page_size as usize)
.and_offset(offset as usize) .and_offset(offset as usize)
.order_by_fast_field(F_INTERNAL_DATE, order), .order_by_fast_field(F_DATE, order),
) )
.map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?;
let mut result = Vec::new(); let mut result = Vec::new();
@@ -1006,7 +1006,7 @@ impl EnvelopeIndexManager {
}, },
"recent_30d_histogram": { "recent_30d_histogram": {
"histogram": { "histogram": {
"field": F_INTERNAL_DATE, "field": F_DATE,
"interval": 86400000, "interval": 86400000,
"hard_bounds": { "hard_bounds": {
"min": week_ago_ms, "min": week_ago_ms,
+3 -3
View File
@@ -104,7 +104,7 @@ function CustomLabel({
alignItems: 'center', alignItems: 'center',
}} }}
> >
<FolderIcon className="mr-2"/> <FolderIcon className="mr-2" />
<span className="font-medium text-sm text-inherit"> <span className="font-medium text-sm text-inherit">
{children} {children}
</span> </span>
@@ -354,8 +354,8 @@ export function Mail({
<MailList <MailList
isLoading={isMessagesLoading} isLoading={isMessagesLoading}
items={(envelopes?.items ?? []).sort((a, b) => { items={(envelopes?.items ?? []).sort((a, b) => {
const dateA = a.internal_date; const dateA = a.date;
const dateB = b.internal_date; const dateB = b.date;
return dateB - dateA; return dateB - dateA;
})} })}
/> />
@@ -116,11 +116,11 @@ export function MailThreadDialog({ open, onOpenChange }: MailThreadDialogProps)
)} )}
{allMessages {allMessages
.sort((a, b) => a.internal_date - b.internal_date) .sort((a, b) => a.date - b.date)
.map((msg) => { .map((msg) => {
const isExpanded = expandedIds.has(msg.id); const isExpanded = expandedIds.has(msg.id);
const preview = msg.text?.slice(0, 120) + (msg.text?.length > 120 ? '...' : ''); const preview = msg.text?.slice(0, 120) + (msg.text?.length > 120 ? '...' : '');
const date = new Date(msg.internal_date); const date = new Date(msg.date);
const formattedDate = isNaN(date.getTime()) const formattedDate = isNaN(date.getTime())
? t('mailbox.thread.invalidDate') ? t('mailbox.thread.invalidDate')
: format(date, 'yyyy-MM-dd HH:mm:ss'); : format(date, 'yyyy-MM-dd HH:mm:ss');
+2 -2
View File
@@ -113,13 +113,13 @@ export function MailThreadDialog({ open, onOpenChange }: MailThreadDialogProps)
)} )}
{allMessages {allMessages
.sort((a, b) => a.internal_date - b.internal_date) .sort((a, b) => a.date - b.date)
.map((msg) => { .map((msg) => {
const isExpanded = expandedIds.has(msg.id); const isExpanded = expandedIds.has(msg.id);
const preview = const preview =
msg.text?.slice(0, 120) + msg.text?.slice(0, 120) +
(msg.text?.length > 120 ? '...' : ''); (msg.text?.length > 120 ? '...' : '');
const date = new Date(msg.internal_date); const date = new Date(msg.date);
const formattedDate = isNaN(date.getTime()) const formattedDate = isNaN(date.getTime())
? t('search.thread.invalidDate') ? t('search.thread.invalidDate')
: format(date, 'yyyy-MM-dd HH:mm:ss'); : format(date, 'yyyy-MM-dd HH:mm:ss');