diff --git a/web/src/lib/components/BoardView.svelte b/web/src/lib/components/BoardView.svelte
index c62e587..f11e47e 100644
--- a/web/src/lib/components/BoardView.svelte
+++ b/web/src/lib/components/BoardView.svelte
@@ -64,7 +64,7 @@
// The unsectioned column comes first, as it does in the list view: it is where
// quick add puts things, so it is where new work appears.
let columns = $derived([
- { id: '', name: 'Uden sektion' },
+ { id: '', name: t('project.noSection') },
...sections.map((s) => ({ id: s.id, name: s.name }))
]);
diff --git a/web/src/lib/components/TaskDetail.svelte b/web/src/lib/components/TaskDetail.svelte
index 4d26252..fd94c79 100644
--- a/web/src/lib/components/TaskDetail.svelte
+++ b/web/src/lib/components/TaskDetail.svelte
@@ -14,6 +14,7 @@
import { app, projectName } from '$lib/stores.svelte.js';
import { focusOnMount } from '$lib/focus.js';
import { t } from '$lib/i18n.svelte.js';
+ import { REPEATS } from '$lib/when.js';
let { task, onclose } = $props();
@@ -29,17 +30,6 @@
/** Who the task can be given to. Only ever more than one on a shared project. */
let members = $state([]);
- // The rules worth a menu entry. Anything more specific is typed into the
- // title, where the parser understands far more than a list ever could.
- const REPEATS = [
- { rule: '', label: 'Aldrig' },
- { rule: 'FREQ=DAILY', label: 'Hver dag' },
- { rule: 'FREQ=WEEKLY', label: 'Hver uge' },
- { rule: 'FREQ=WEEKLY;INTERVAL=2', label: 'Hver anden uge' },
- { rule: 'FREQ=MONTHLY', label: t('detail.monthly') },
- { rule: 'FREQ=YEARLY', label: t('detail.yearly') }
- ];
-
let subtasks = $state([]);
let comments = $state([]);
let attachments = $state([]);
@@ -452,13 +442,13 @@
diff --git a/web/src/lib/components/TaskRow.svelte b/web/src/lib/components/TaskRow.svelte
index 57f77b5..b4470dd 100644
--- a/web/src/lib/components/TaskRow.svelte
+++ b/web/src/lib/components/TaskRow.svelte
@@ -10,9 +10,12 @@
*/
import { app } from '$lib/stores.svelte.js';
import { t, tag } from '$lib/i18n.svelte.js';
+ import { repeatLabel } from '$lib/when.js';
let { task, onedit } = $props();
+ let repeats = $derived(repeatLabel(task.recurrence_rule, task.recurrence_text));
+
let leaving = $state(false);
const priorityLabel = (p) => (p === 4 ? t('task.noPriority') : t('task.priority', { n: p }));
@@ -84,7 +87,7 @@
{task.description}
{/if}
- {#if assignee || due || task.labels?.length || task.recurrence_text || task.subtask_count || task.attachment_count}
+ {#if assignee || due || task.labels?.length || repeats || task.subtask_count || task.attachment_count}
{#if assignee}
{eventName(entry.event)}{#if eventDetail(entry)}
- {eventDetail(entry)}{/if}{eventName(entry.event)}{#if eventDetail(entry)}{' '}{eventDetail(entry)}{/if}
{entry.project_name}
diff --git a/web/src/routes/projekt/[id]/+page.svelte b/web/src/routes/projekt/[id]/+page.svelte
index 5ed5a8e..a8df623 100644
--- a/web/src/routes/projekt/[id]/+page.svelte
+++ b/web/src/routes/projekt/[id]/+page.svelte
@@ -581,8 +581,9 @@
>{entry.user_name || t('history.deletedAccount')}
- {eventName(entry.event)}{#if eventDetail(entry)}
- {eventDetail(entry)}{/if}
+ {eventName(entry.event)}{#if eventDetail(entry)}{' '}{eventDetail(entry)}{/if}
{when(entry.created_at)}
diff --git a/web/src/routes/upcoming/+page.svelte b/web/src/routes/upcoming/+page.svelte
index 9caf3a1..635f807 100644
--- a/web/src/routes/upcoming/+page.svelte
+++ b/web/src/routes/upcoming/+page.svelte
@@ -20,7 +20,7 @@
import TaskRow from '$lib/components/TaskRow.svelte';
import QuickAdd from '$lib/components/QuickAdd.svelte';
import CalendarView from '$lib/components/CalendarView.svelte';
- import { t } from '$lib/i18n.svelte.js';
+ import { t, tag } from '$lib/i18n.svelte.js';
let days = $state([]);
@@ -48,9 +48,9 @@
const today = new Date(new Date().toDateString());
const diff = Math.round((day - today) / 86400000);
- if (diff === 0) return 'I dag';
- if (diff === 1) return 'I morgen';
- return day.toLocaleDateString('da-DK', { weekday: 'long', day: 'numeric', month: 'short' });
+ if (diff === 0) return t('task.today');
+ if (diff === 1) return t('task.tomorrow');
+ return day.toLocaleDateString(tag(), { weekday: 'long', day: 'numeric', month: 'short' });
}
// Reading tasks back out of the store keeps a completed row disappearing