63 lines
1.8 KiB
TypeScript
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;
|
|
}
|