From 7edd7c2e3517c4fb756979450d8d0793741f39d2 Mon Sep 17 00:00:00 2001 From: ktdd <13239117+ktdd@users.noreply.github.com> Date: Tue, 6 Jan 2026 12:33:09 +0200 Subject: [PATCH] Updated presets and added a 'sort by' feature. --- src/modules/indexer/manager.rs | 21 ++++++++++++-- src/modules/message/search.rs | 2 ++ web/src/features/search/index.tsx | 37 +++++++++++++++++++++---- web/src/features/search/search-form.tsx | 8 ++++-- web/src/hooks/use-search-messages.ts | 6 +++- web/src/locales/ar.json | 4 +-- web/src/locales/da.json | 4 +-- web/src/locales/de.json | 4 +-- web/src/locales/en.json | 6 ++-- web/src/locales/es.json | 4 +-- web/src/locales/fi.json | 6 ++-- web/src/locales/fr.json | 4 +-- web/src/locales/it.json | 4 +-- web/src/locales/jp.json | 4 +-- web/src/locales/ko.json | 4 +-- web/src/locales/nl.json | 4 +-- web/src/locales/no.json | 4 +-- web/src/locales/pl.json | 4 +-- web/src/locales/pt.json | 4 +-- web/src/locales/ru.json | 4 +-- web/src/locales/sv.json | 4 +-- web/src/locales/zh-tw.json | 4 +-- web/src/locales/zh.json | 4 +-- 23 files changed, 103 insertions(+), 47 deletions(-) diff --git a/src/modules/indexer/manager.rs b/src/modules/indexer/manager.rs index c54cb52..8fb5692 100644 --- a/src/modules/indexer/manager.rs +++ b/src/modules/indexer/manager.rs @@ -621,6 +621,7 @@ impl EnvelopeIndexManager { page: u64, page_size: u64, desc: bool, + sort_by: String ) -> BichonResult> { assert!(page > 0, "Page number must be greater than 0"); assert!(page_size > 0, "Page size must be greater than 0"); @@ -653,7 +654,20 @@ impl EnvelopeIndexManager { } let order = if desc { Order::Desc } else { Order::Asc }; - let mailbox_docs: Vec<(i64, DocAddress)> = searcher + let mailbox_docs: Vec; + + if sort_by == "size" { + let size_docs: Vec<(u64, DocAddress)> = searcher + .search( + &query, + &TopDocs::with_limit(page_size as usize) + .and_offset(offset as usize) + .order_by_fast_field(F_SIZE, order), + ) + .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + mailbox_docs = size_docs.into_iter().map(|(_, addr)| addr).collect(); + } else { + let date_docs: Vec<(i64, DocAddress)> = searcher .search( &query, &TopDocs::with_limit(page_size as usize) @@ -661,9 +675,12 @@ impl EnvelopeIndexManager { .order_by_fast_field(F_DATE, order), ) .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; + mailbox_docs = date_docs.into_iter().map(|(_, addr)| addr).collect(); + } + let mut result = Vec::new(); - for (_, doc_address) in mailbox_docs { + for doc_address in mailbox_docs { let doc: TantivyDocument = searcher .doc_async(doc_address) .await diff --git a/src/modules/message/search.rs b/src/modules/message/search.rs index 7a78c19..f258a94 100644 --- a/src/modules/message/search.rs +++ b/src/modules/message/search.rs @@ -54,6 +54,7 @@ pub struct SearchRequest { filter: SearchFilter, page: u64, page_size: u64, + sort_by: String } impl SearchRequest { pub fn validate(&self) -> BichonResult<()> { @@ -85,6 +86,7 @@ pub async fn search_messages_impl( request.page, request.page_size, true, + request.sort_by ) .await } diff --git a/web/src/features/search/index.tsx b/web/src/features/search/index.tsx index b8c2b76..e7e18d4 100644 --- a/web/src/features/search/index.tsx +++ b/web/src/features/search/index.tsx @@ -39,6 +39,14 @@ import { EditTagsDialog } from './add-tag-dialog'; import { useTranslation } from 'react-i18next'; import Logo from '@/assets/logo.svg' import { RestoreMessageDialog } from './restore-message-dialog'; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select'; +import { Label } from '@/components/ui/label'; export default function Search() { const { t } = useTranslation() @@ -56,8 +64,10 @@ export default function Search() { isFetching, page, pageSize, + sortBy, setPage, setPageSize, + setSortBy, onSubmit, reset, filter @@ -121,10 +131,27 @@ export default function Search() {
- +
+ + +
{isLoading && ( @@ -207,4 +234,4 @@ export default function Search() { ); -} \ No newline at end of file +} diff --git a/web/src/features/search/search-form.tsx b/web/src/features/search/search-form.tsx index e021553..b057314 100644 --- a/web/src/features/search/search-form.tsx +++ b/web/src/features/search/search-form.tsx @@ -67,7 +67,7 @@ const getSearchFilterSchema = (t: (key: string) => string) => z.object({ before: z.date().optional(), account_id: z.number().optional().or(z.literal("")), mailbox_id: z.number().optional().or(z.literal("")), - size_preset: z.enum(['any', 'tiny', 'small', 'medium', 'large']).optional(), + size_preset: z.enum(['any', 'tiny', 'small', 'medium', 'large', 'huge']).optional(), message_id: z.string().optional().or(z.literal("")), }); @@ -107,8 +107,10 @@ function withSizePreset(values: Record) { case 'small': return { ...rest, max_size: 2 * 1024 * 1024 }; case 'medium': - return { ...rest, max_size: 20 * 1024 * 1024 }; + return { ...rest, min_size: 2 * 1024 * 1024, max_size: 10 * 1024 * 1024 }; case 'large': + return { ...rest, min_size: 10 * 1024 * 1024, max_size: 20 * 1024 * 1024 }; + case 'huge': return { ...rest, min_size: 20 * 1024 * 1024 }; default: return rest; @@ -496,4 +498,4 @@ export function SearchFormDialog({ onSubmit, isLoading, reset, open, onOpenChang ); -} \ No newline at end of file +} diff --git a/web/src/hooks/use-search-messages.ts b/web/src/hooks/use-search-messages.ts index d74e378..3c5185e 100644 --- a/web/src/hooks/use-search-messages.ts +++ b/web/src/hooks/use-search-messages.ts @@ -29,6 +29,7 @@ export function useSearchMessages() { const [filter, setFilter] = useState>({}); const [page, setPage] = useState(1); const [pageSize, setPageSize] = useState(30); + const [sortBy, setSortBy] = useState<"date" | "size">("date"); const onSubmit = (cleaned: Record) => { if ('has_attachment' in cleaned && cleaned.has_attachment === false) { @@ -59,12 +60,13 @@ export function useSearchMessages() { error, isFetching, } = useQuery>({ - queryKey: ['search-messages', filter, page, pageSize], + queryKey: ['search-messages', filter, page, pageSize, sortBy], queryFn: () => search_messages({ filter: filter, page, page_size: pageSize, + sort_by: sortBy }), staleTime: 1000, retry: false, @@ -76,6 +78,8 @@ export function useSearchMessages() { totalPages: data?.total_pages ?? 1, pageSize: data?.page_size ?? pageSize, setPageSize, + sortBy, + setSortBy, isLoading, isError, error: error as Error | null, diff --git a/web/src/locales/ar.json b/web/src/locales/ar.json index 58fe739..dac9cf9 100644 --- a/web/src/locales/ar.json +++ b/web/src/locales/ar.json @@ -412,8 +412,8 @@ "any": "الكل", "tiny": "صغير جدًا (<15 كيلوبايت)", "small": "صغير (<2 ميغابايت)", - "medium": "متوسط (<20 ميغابايت)", - "large": "كبير (≥20 ميغابايت)", + "medium": "متوسط (2 - 10 ميغابايت)", + "large": "كبير (10 - 20 ميغابايت)", "sizeDescription": "يشير الحجم إلى الحجم الإجمالي للبريد الإلكتروني، بما في ذلك المرفقات.", "title": "بحث", "searching": "جارٍ البحث، يرجى الانتظار...", diff --git a/web/src/locales/da.json b/web/src/locales/da.json index 5b32e48..bc6e2d0 100644 --- a/web/src/locales/da.json +++ b/web/src/locales/da.json @@ -412,8 +412,8 @@ "any": "Alle", "tiny": "Meget lille (<15 KB)", "small": "Lille (<2 MB)", - "medium": "Mellem (<20 MB)", - "large": "Stor (≥20 MB)", + "medium": "Mellem (2 - 10 MB)", + "large": "Stor (10 - 20 MB)", "sizeDescription": "Størrelsen henviser til den samlede e-mailstørrelse, inklusive vedhæftede filer.", "title": "Søg", "searching": "Søger, vent venligst...", diff --git a/web/src/locales/de.json b/web/src/locales/de.json index 06c97cd..236a22a 100644 --- a/web/src/locales/de.json +++ b/web/src/locales/de.json @@ -412,8 +412,8 @@ "any": "Beliebig", "tiny": "Sehr klein (<15 KB)", "small": "Klein (<2 MB)", - "medium": "Mittel (<20 MB)", - "large": "Groß (≥20 MB)", + "medium": "Mittel (2 - 10 MB)", + "large": "Groß (10 - 20 MB)", "sizeDescription": "Die Größe bezieht sich auf die gesamte E-Mail inklusive Anhängen.", "title": "Suchen", "searching": "Wird gesucht, bitte warten Sie...", diff --git a/web/src/locales/en.json b/web/src/locales/en.json index e6b83f4..4b2dea2 100644 --- a/web/src/locales/en.json +++ b/web/src/locales/en.json @@ -412,8 +412,10 @@ "any": "Any", "tiny": "Tiny (<15 KB)", "small": "Small (<2 MB)", - "medium": "Medium (<20 MB)", - "large": "Large (≥20 MB)", + "medium": "Medium (2 - 10 MB)", + "large": "Large (10 - 20 MB)", + "huge": "Huge (≥20 MB)", + "sortBy": "Sort by", "sizeDescription": "The size refers to the total email size, including attachments.", "title": "Search", "searching": "Searching, please wait…", diff --git a/web/src/locales/es.json b/web/src/locales/es.json index 75f9ee2..4faa675 100644 --- a/web/src/locales/es.json +++ b/web/src/locales/es.json @@ -412,8 +412,8 @@ "any": "Cualquiera", "tiny": "Muy pequeño (<15 KB)", "small": "Pequeño (<2 MB)", - "medium": "Mediano (<20 MB)", - "large": "Grande (≥20 MB)", + "medium": "Mediano (2 - 10 MB)", + "large": "Grande (10 - 20 MB)", "sizeDescription": "El tamaño se refiere al tamaño total del correo electrónico, incluidos los archivos adjuntos.", "title": "Buscar", "searching": "Buscando, por favor espera...", diff --git a/web/src/locales/fi.json b/web/src/locales/fi.json index 13dc8a7..a97fb6c 100644 --- a/web/src/locales/fi.json +++ b/web/src/locales/fi.json @@ -412,8 +412,10 @@ "any": "Kaikki", "tiny": "Erittäin pieni (<15 KB)", "small": "Pieni (<2 MB)", - "medium": "Keskikokoinen (<20 MB)", - "large": "Suuri (≥20 MB)", + "medium": "Keskikokoinen (2 - 10 MB)", + "large": "Suuri (10 - 20 MB)", + "huge": "Valtava (≥20 MB)", + "sortBy": "Lajittele", "sizeDescription": "Koko tarkoittaa sähköpostin kokonaiskokoa, liitteet mukaan lukien.", "title": "Hae", "searching": "Haetaan, odota hetki...", diff --git a/web/src/locales/fr.json b/web/src/locales/fr.json index ca95cc3..4f6402f 100644 --- a/web/src/locales/fr.json +++ b/web/src/locales/fr.json @@ -412,8 +412,8 @@ "any": "Toutes", "tiny": "Très petite (<15 KB)", "small": "Petite (<2 MB)", - "medium": "Moyenne (<20 MB)", - "large": "Grande (≥20 MB)", + "medium": "Moyenne (2 - 10 MB)", + "large": "Grande (10 - 20 MB)", "sizeDescription": "La taille correspond à la taille totale de l’e-mail, pièces jointes incluses.", "title": "Recherche", "searching": "Recherche en cours, veuillez patienter...", diff --git a/web/src/locales/it.json b/web/src/locales/it.json index c697dee..14790bc 100644 --- a/web/src/locales/it.json +++ b/web/src/locales/it.json @@ -412,8 +412,8 @@ "any": "Qualsiasi", "tiny": "Molto piccolo (<15 KB)", "small": "Piccolo (<2 MB)", - "medium": "Medio (<20 MB)", - "large": "Grande (≥20 MB)", + "medium": "Medio (2 - 10 MB)", + "large": "Grande (10 - 20 MB)", "sizeDescription": "La dimensione indica la dimensione totale dell’email, inclusi gli allegati.", "title": "Cerca", "searching": "Ricerca in corso, attendere prego...", diff --git a/web/src/locales/jp.json b/web/src/locales/jp.json index 28d18b8..12b53a7 100644 --- a/web/src/locales/jp.json +++ b/web/src/locales/jp.json @@ -412,8 +412,8 @@ "any": "指定なし", "tiny": "極小(15 KB 未満)", "small": "小(2 MB 未満)", - "medium": "中(20 MB 未満)", - "large": "大(20 MB 以上)", + "medium": "中(2 - 10 MB)", + "large": "大(10 - 20 MB)", "sizeDescription": "サイズは添付ファイルを含むメール全体の容量を指します。", "title": "検索", "searching": "検索中です。お待ちください…", diff --git a/web/src/locales/ko.json b/web/src/locales/ko.json index 191b493..b2614c4 100644 --- a/web/src/locales/ko.json +++ b/web/src/locales/ko.json @@ -412,8 +412,8 @@ "any": "전체", "tiny": "아주 작음 (<15 KB)", "small": "작음 (<2 MB)", - "medium": "중간 (<20 MB)", - "large": "큼 (≥20 MB)", + "medium": "중간 (2 - 10 MB)", + "large": "큼 (10 - 20 MB)", "sizeDescription": "크기는 첨부 파일을 포함한 이메일 전체 크기를 의미합니다.", "title": "검색", "searching": "검색 중입니다. 잠시 기다려 주십시오...", diff --git a/web/src/locales/nl.json b/web/src/locales/nl.json index 4ef06fa..5cd9048 100644 --- a/web/src/locales/nl.json +++ b/web/src/locales/nl.json @@ -412,8 +412,8 @@ "any": "Alle", "tiny": "Zeer klein (<15 KB)", "small": "Klein (<2 MB)", - "medium": "Middelgroot (<20 MB)", - "large": "Groot (≥20 MB)", + "medium": "Middelgroot (2 - 10 MB)", + "large": "Groot (10 - 20 MB)", "sizeDescription": "De grootte verwijst naar de totale e-mailgrootte, inclusief bijlagen.", "title": "Zoeken", "searching": "Bezig met zoeken, even geduld alstublieft…", diff --git a/web/src/locales/no.json b/web/src/locales/no.json index a45f9ff..3ec9017 100644 --- a/web/src/locales/no.json +++ b/web/src/locales/no.json @@ -412,8 +412,8 @@ "any": "Alle", "tiny": "Svært liten (<15 KB)", "small": "Liten (<2 MB)", - "medium": "Middels (<20 MB)", - "large": "Stor (≥20 MB)", + "medium": "Middels (2 - 10 MB)", + "large": "Stor (10 - 20 MB)", "sizeDescription": "Størrelsen viser til e-postens totale størrelse, inkludert vedlegg.", "title": "Søk", "searching": "Søker, vennligst vent…", diff --git a/web/src/locales/pl.json b/web/src/locales/pl.json index f26b69d..61d853f 100644 --- a/web/src/locales/pl.json +++ b/web/src/locales/pl.json @@ -412,8 +412,8 @@ "any": "Dowolny", "tiny": "Bardzo mały (<15 KB)", "small": "Mały (<2 MB)", - "medium": "Średni (<20 MB)", - "large": "Duży (≥20 MB)", + "medium": "Średni (2 - 10 MB)", + "large": "Duży (10 - 20 MB)", "sizeDescription": "Rozmiar odnosi się do całkowitego rozmiaru wiadomości e-mail, łącznie z załącznikami.", "title": "Szukaj", "searching": "Wyszukiwanie, proszę czekać...", diff --git a/web/src/locales/pt.json b/web/src/locales/pt.json index bfb2570..375fea3 100644 --- a/web/src/locales/pt.json +++ b/web/src/locales/pt.json @@ -412,8 +412,8 @@ "any": "Qualquer", "tiny": "Muito pequeno (<15 KB)", "small": "Pequeno (<2 MB)", - "medium": "Médio (<20 MB)", - "large": "Grande (≥20 MB)", + "medium": "Médio (2 - 10 MB)", + "large": "Grande (10 - 20 MB)", "sizeDescription": "O tamanho refere-se ao tamanho total do e-mail, incluindo anexos.", "title": "Pesquisa", "searching": "Pesquisando, por favor, aguarde...", diff --git a/web/src/locales/ru.json b/web/src/locales/ru.json index 63b00b2..815d719 100644 --- a/web/src/locales/ru.json +++ b/web/src/locales/ru.json @@ -412,8 +412,8 @@ "any": "Любой", "tiny": "Очень маленький (<15 КБ)", "small": "Маленький (<2 МБ)", - "medium": "Средний (<20 МБ)", - "large": "Большой (≥20 МБ)", + "medium": "Средний (2 - 10 МБ)", + "large": "Большой (10 - 20 МБ)", "sizeDescription": "Размер означает общий размер электронного письма, включая вложения.", "title": "Поиск", "searching": "Поиск, пожалуйста, подождите...", diff --git a/web/src/locales/sv.json b/web/src/locales/sv.json index 1ccb39a..e9e59e1 100644 --- a/web/src/locales/sv.json +++ b/web/src/locales/sv.json @@ -412,8 +412,8 @@ "any": "Alla", "tiny": "Mycket liten (<15 KB)", "small": "Liten (<2 MB)", - "medium": "Medelstor (<20 MB)", - "large": "Stor (≥20 MB)", + "medium": "Medelstor (2 - 10 MB)", + "large": "Stor (10 - 20 MB)", "sizeDescription": "Storleken avser e-postens totala storlek, inklusive bilagor.", "title": "Sök", "searching": "Söker, vänligen vänta…", diff --git a/web/src/locales/zh-tw.json b/web/src/locales/zh-tw.json index c04525f..3c45ff7 100644 --- a/web/src/locales/zh-tw.json +++ b/web/src/locales/zh-tw.json @@ -412,8 +412,8 @@ "any": "不限", "tiny": "很小(<15 KB)", "small": "小(<2 MB)", - "medium": "中(<20 MB)", - "large": "大(≥20 MB)", + "medium": "中(2 - 10 MB)", + "large": "大(10 - 20 MB)", "sizeDescription": "大小指的是整封郵件的大小,包含附件。", "title": "搜尋", "searching": "正在搜尋,請稍候...", diff --git a/web/src/locales/zh.json b/web/src/locales/zh.json index a1275e5..899cc03 100644 --- a/web/src/locales/zh.json +++ b/web/src/locales/zh.json @@ -412,8 +412,8 @@ "any": "不限", "tiny": "很小(<15 KB)", "small": "小(<2 MB)", - "medium": "中(<20 MB)", - "large": "大(≥20 MB)", + "medium": "中(2 - 10 MB)", + "large": "大(10 - 20 MB)", "sizeDescription": "大小指的是邮件整体大小,包含附件。", "title": "搜索", "searching": "搜索中,请稍候…",