You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

118 lines
2.9 KiB

<script lang="ts">
import { onMount } from "svelte";
import { endOfMonth, endOfWeek, endOfYear, formatFormTime, lastMonth, monthName, nextMonth, startOfMonth, startOfWeek, startOfYear } from "../utils/time";
import EveryMinute from "./EveryMinute.svelte";
interface DateOption {
id: string
label: string
value: Date
}
export let value: string;
export let disabled: boolean;
let selected: string = "custom";
let options: DateOption[] = [];
let now: Date = new Date();
onMount(() => {
if (value === "") {
selected = "none";
return;
}
for (const option of options) {
if (formatFormTime(option.value) === value) {
selected = option.id;
}
}
});
$: {
if (options.length === 0) {
let current = startOfMonth(now);
const nextWeek = new Date(now.getTime() + (86400000 * 7));
const lastWeek = new Date(now.getTime() - (86400000 * 7));
options.push({
id: "none",
label: "No deadline",
value: new Date(Number.NaN),
});
options.push({
id: "this_week",
label: "End of this Week",
value: endOfWeek(now),
});
options.push({
id: "next_week",
label: "End of next Week",
value: endOfWeek(nextWeek),
});
options.push({
id: "last_week",
label: "End of last Week",
value: endOfWeek(lastWeek),
});
options.push({
id: "this_month",
label: "End of this month",
value: endOfMonth(current),
});
options.push({
id: "next_month",
label: "End of next month",
value: endOfMonth(nextMonth(current)),
});
options.push({
id: "last_month",
label: "End of last month",
value: endOfMonth(lastMonth(current)),
});
options.push({
id: "this_year",
label: "End of this year",
value: endOfYear(now),
});
options.push({
id: "next_year",
label: "End of next year",
value: endOfYear(new Date(Date.now() + (365.25 * 86400000))),
});
options.push({
id: "last_year",
label: "End of last year",
value: endOfYear(new Date(Date.now() - (365.25 * 86400000))),
});
options.push({
id: "custom",
label: "Specific Date",
value: null,
});
}
}
$: {
if (selected !== "custom") {
const option = options.find(o => o.id === selected);
if (option != null) {
value = formatFormTime(option.value);
}
}
}
</script>
<EveryMinute bind:now={now} />
<select name="endTime" disabled={disabled} bind:value={selected}>
{#each options as option (option.id)}
<option value={option.id}>{option.label}</option>
{/each}
</select>
{#if selected === "custom"}
<input disabled={disabled} name="value" type="datetime-local" bind:value={value} />
{/if}