mirror of
https://github.com/rustmailer/bichon.git
synced 2026-08-03 07:48:34 +02:00
feat: use email 'Date' header for statistics and search filtering #87
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
Reference in New Issue
Block a user