Files
tickettracker/frontend/src/todos.ts
T
2026-09-08 16:48:28 +02:00

63 lines
1.8 KiB
TypeScript

import type { TicketTodo } from "./types";
function parseDateOnly(value: string) {
const [year, month, day] = value.split("-").map(Number);
return new Date(year, month - 1, day);
}
export function formatDateOnly(date: Date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
return `${year}-${month}-${day}`;
}
export function formatTodoDate(value: string) {
return new Intl.DateTimeFormat("de-DE", {
day: "2-digit",
month: "2-digit",
year: "numeric"
}).format(parseDateOnly(value));
}
export function formatTodoPeriod(todo: Pick<TicketTodo, "starts_on" | "ends_on">) {
if (!todo.starts_on && !todo.ends_on) {
return null;
}
if (todo.starts_on && todo.ends_on && todo.starts_on === todo.ends_on) {
return `am ${formatTodoDate(todo.starts_on)}`;
}
if (todo.starts_on && todo.ends_on) {
return `${formatTodoDate(todo.starts_on)} - ${formatTodoDate(todo.ends_on)}`;
}
if (todo.starts_on) {
return `ab ${formatTodoDate(todo.starts_on)}`;
}
return `bis ${formatTodoDate(todo.ends_on!)}`;
}
export function isTodoActiveOnDay(todo: Pick<TicketTodo, "starts_on" | "ends_on" | "status">, day: string) {
if (todo.status !== "open") {
return false;
}
if (!todo.starts_on && !todo.ends_on) {
return false;
}
return (!todo.starts_on || todo.starts_on <= day) && (!todo.ends_on || todo.ends_on >= day);
}
export function isTodoFixedOnDay(todo: Pick<TicketTodo, "starts_on" | "ends_on" | "status">, day: string) {
return todo.status === "open" && todo.starts_on === day && todo.ends_on === day;
}
export function isTodoOverdue(todo: Pick<TicketTodo, "ends_on" | "status">, today: string) {
return todo.status === "open" && Boolean(todo.ends_on) && todo.ends_on! < today;
}