Compare commits

..
Author SHA1 Message Date
kristianwindandClaude Opus 4.8 15495255ef test(e2e): the delegated chip's title is now "Uddelegeret til"
The assignee chip reads as a delegation now, so its title changed from
"Ansvarlig: {name}" to "Uddelegeret til {name}". Point the role-edit
smoke test at the new title.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-27 12:36:48 +02:00
kristianwindandClaude Opus 4.8 7dcd475036 feat(tasks): mark a delegated task with a hand-off arrow
A task assigned to somebody who is not you is out of your hands and into
theirs, but the row only showed their name — the same weight as any
other meta. The assignee is now a bordered chip led by an outgoing arrow
in the accent colour, so a list reads at a glance as which tasks are
yours to do and which you are waiting on. Covers the board too: its
cards render a TaskRow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-27 12:27:52 +02:00
Kristian Wind 2da679d629 Merge pull request #28 from kristianwind/task-snooze
CI / OpenAPI is valid (push) Successful in 11s
CI / End-to-end (push) Successful in 8m11s
CI / Docker image builds (push) Successful in 1m35s
Release / Build and publish image (push) Failing after 5s
CI / Go (push) Failing after 14m17s
Snooze: park a task at the bottom until a time
2026-08-25 11:07:39 +02:00
4 changed files with 29 additions and 4 deletions
+1 -1
View File
@@ -937,7 +937,7 @@ test('en rolle kan rettes uden at fjerne personen', async ({ browser, page }) =>
await page.keyboard.press('Escape');
const row = page.locator('.row').filter({ hasText: 'brænde kaffe' });
await expect(row.getByTitle('Ansvarlig: andreas')).toBeVisible();
await expect(row.getByTitle('Uddelegeret til andreas')).toBeVisible();
// And not on a task that is nobody's.
await page.getByLabel('Ny opgave').fill('min egen');
await page.getByLabel('Ny opgave').press('Enter');
+26 -3
View File
@@ -113,8 +113,14 @@
{#if assignee}
<!-- First in the row, because "who" changes what the rest of the line
means: a date on somebody else's task is their deadline, not
yours. -->
<span class="assignee" title={t('task.assignee', { name: assignee.name })}>
yours. The hand-off arrow marks it as delegated — out of your
hands and into theirs — so a list reads at a glance as which are
yours to do and which you are waiting on. -->
<span class="assignee" title={t('task.delegatedTo', { name: assignee.name })}>
<svg class="handoff" viewBox="0 0 24 24" aria-hidden="true">
<path d="M13 5l7 7-7 7" />
<path d="M20 12H4" />
</svg>
<span class="face" style="background: {assignee.avatar_color}">
{assignee.name[0]?.toUpperCase() ?? '?'}
</span>
@@ -358,8 +364,25 @@
.assignee {
display: inline-flex;
align-items: center;
gap: var(--s1);
gap: 4px;
color: var(--ink-muted);
background: var(--surface-raised);
border: 1px solid var(--line);
border-radius: var(--radius-full);
padding: 1px var(--s2) 1px 4px;
}
/* The delegation mark: an arrow leaving, in the accent so the chip reads as
handed-off rather than as just another name. */
.handoff {
width: 12px;
height: 12px;
fill: none;
stroke: var(--accent);
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
flex: none;
}
.face {
+1
View File
@@ -188,6 +188,7 @@ export const da = {
'repeat.everyN.month': 'hver {n}. måned',
'repeat.everyN.year': 'hvert {n}. år',
'task.assignee': 'Ansvarlig: {name}',
'task.delegatedTo': 'Uddelegeret til {name}',
'task.subtasks': '{done} af {total} undertasks er lukket',
'task.attachments': '{n} vedhæftet',
'task.priority': 'Prioritet {n}',
+1
View File
@@ -184,6 +184,7 @@ export const en = {
'repeat.everyN.month': 'every {n} months',
'repeat.everyN.year': 'every {n} years',
'task.assignee': 'Assigned to {name}',
'task.delegatedTo': 'Delegated to {name}',
'task.subtasks': '{done} of {total} sub-tasks are done',
'task.attachments': '{n} attached',
'task.priority': 'Priority {n}',