ultisuite-client/lib/mail-search/search-params.ts
R3D347HR4Y ad1370ea7e
Some checks are pending
E2E / Playwright e2e (push) Waiting to run
feat: enhance configuration and add new demo layouts
- Introduced turbopack alias for canvas in next.config.mjs.
- Updated package.json scripts for development and branding tasks.
- Added new dependencies for Tiptap extensions.
- Implemented new demo layouts for agenda, contacts, drive, and mail applications.
- Enhanced globals.css for improved theming and splash screen animations.
- Added OAuth callback handling for drive mounts.
- Updated layout components to integrate new demo shells and improve structure.
2026-06-12 19:10:24 +02:00

130 lines
3.7 KiB
TypeScript

export interface SearchParams {
q: string
from: string
to: string
subject: string
hasWords: string
doesNotHave: string
has: string[]
after: string
before: string
within: string
size: string
sizeUnit: "Mo" | "Ko"
sizeOp: "gt" | "lt"
/** Folder/label to search in. "all" = all except spam, "all-spam" = everything. */
in: string
excludeChats: boolean
}
export const EMPTY_SEARCH_PARAMS: SearchParams = {
q: "",
from: "",
to: "",
subject: "",
hasWords: "",
doesNotHave: "",
has: [],
after: "",
before: "",
within: "",
size: "",
sizeUnit: "Mo",
sizeOp: "gt",
in: "all",
excludeChats: false,
}
export const DATE_RANGE_OPTIONS = [
{ value: "1d", label: "1 jour" },
{ value: "3d", label: "3 jours" },
{ value: "1w", label: "7 jours" },
{ value: "2w", label: "2 semaines" },
{ value: "1m", label: "1 mois" },
{ value: "2m", label: "2 mois" },
{ value: "6m", label: "6 mois" },
{ value: "1y", label: "1 an" },
] as const
export const SEARCH_IN_OPTIONS = [
{ value: "all", label: "Tous les messages" },
{ value: "all-spam", label: "Tous les messages, Spam et Corbeille inclus" },
{ value: "inbox", label: "Boîte de réception" },
{ value: "starred", label: "Messages suivis" },
{ value: "sent", label: "Messages envoyés" },
{ value: "drafts", label: "Brouillons" },
{ value: "spam", label: "Indésirables" },
{ value: "trash", label: "Corbeille" },
] as const
export function parseSearchParams(urlParams: URLSearchParams): SearchParams {
return {
q: urlParams.get("q") ?? "",
from: urlParams.get("from") ?? "",
to: urlParams.get("to") ?? "",
subject: urlParams.get("subject") ?? "",
hasWords: urlParams.get("hasWords") ?? "",
doesNotHave: urlParams.get("doesNotHave") ?? "",
has: urlParams.getAll("has"),
after: urlParams.get("after") ?? "",
before: urlParams.get("before") ?? "",
within: urlParams.get("within") ?? "",
size: urlParams.get("size") ?? "",
sizeUnit: (urlParams.get("sizeUnit") as "Mo" | "Ko") || "Mo",
sizeOp: (urlParams.get("sizeOp") as "gt" | "lt") || "gt",
in: urlParams.get("in") ?? "all",
excludeChats: urlParams.get("excludeChats") === "true",
}
}
export function searchParamsToURLSearchParams(
params: Partial<SearchParams>
): URLSearchParams {
const out = new URLSearchParams()
if (params.q) out.set("q", params.q)
if (params.from) out.set("from", params.from)
if (params.to) out.set("to", params.to)
if (params.subject) out.set("subject", params.subject)
if (params.hasWords) out.set("hasWords", params.hasWords)
if (params.doesNotHave) out.set("doesNotHave", params.doesNotHave)
if (params.has?.length) {
for (const h of params.has) out.append("has", h)
}
if (params.after) out.set("after", params.after)
if (params.before) out.set("before", params.before)
if (params.within) out.set("within", params.within)
if (params.size) {
out.set("size", params.size)
out.set("sizeUnit", params.sizeUnit ?? "Mo")
out.set("sizeOp", params.sizeOp ?? "gt")
}
if (params.in && params.in !== "all") out.set("in", params.in)
if (params.excludeChats) out.set("excludeChats", "true")
return out
}
export function buildSearchUrl(
params: Partial<SearchParams>,
routeRoot = "mail"
): string {
const qs = searchParamsToURLSearchParams(params).toString()
const root = routeRoot.split("/").filter(Boolean).join("/")
return `/${root}/search${qs ? `?${qs}` : ""}`
}
export function isSearchEmpty(params: SearchParams): boolean {
return (
!params.q &&
!params.from &&
!params.to &&
!params.subject &&
!params.hasWords &&
!params.doesNotHave &&
params.has.length === 0 &&
!params.after &&
!params.before &&
!params.within &&
!params.size
)
}