Add native task metadata, working-day calendar settings, dependency scheduling and rich note editing. Support complete-sheet PNG export with resolution and transparency controls, preserve XMind extensions and update browser regressions.
25 lines
1.0 KiB
TypeScript
25 lines
1.0 KiB
TypeScript
export const DAY = 86_400_000;
|
|
export function dateIndex(date: string) {
|
|
if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) return NaN;
|
|
const timestamp = Date.parse(`${date}T00:00:00Z`);
|
|
return Number.isFinite(timestamp) &&
|
|
new Date(timestamp).toISOString().slice(0, 10) === date
|
|
? timestamp / DAY
|
|
: NaN;
|
|
}
|
|
export const indexDate = (index: number) =>
|
|
new Date(index * DAY).toISOString().slice(0, 10);
|
|
export const addDays = (date: string, days: number) =>
|
|
indexDate(dateIndex(date) + days);
|
|
export function timestampDate(value: unknown) {
|
|
if (typeof value !== "number" || !Number.isFinite(value)) return "";
|
|
const date = new Date(value);
|
|
if (!Number.isFinite(date.getTime())) return "";
|
|
return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, "0")}-${String(date.getDate()).padStart(2, "0")}`;
|
|
}
|
|
export const todayDate = () => timestampDate(Date.now());
|
|
export const dateTimestamp = (date: string, end = false) =>
|
|
Number.isFinite(dateIndex(date))
|
|
? new Date(`${date}T${end ? "23:59:59.999" : "00:00:00"}`).getTime()
|
|
: null;
|