From 7dcd4750361ab33395553819f9c809475efa296d Mon Sep 17 00:00:00 2001 From: kristianwind Date: Thu, 27 Aug 2026 12:27:52 +0200 Subject: [PATCH 1/2] feat(tasks): mark a delegated task with a hand-off arrow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- web/src/lib/components/TaskRow.svelte | 29 ++++++++++++++++++++++++--- web/src/lib/locales/da.js | 1 + web/src/lib/locales/en.js | 1 + 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/web/src/lib/components/TaskRow.svelte b/web/src/lib/components/TaskRow.svelte index ceca249..10d1c52 100644 --- a/web/src/lib/components/TaskRow.svelte +++ b/web/src/lib/components/TaskRow.svelte @@ -113,8 +113,14 @@ {#if assignee} - + 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. --> + + {assignee.name[0]?.toUpperCase() ?? '?'} @@ -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 { diff --git a/web/src/lib/locales/da.js b/web/src/lib/locales/da.js index 579d933..a15519d 100644 --- a/web/src/lib/locales/da.js +++ b/web/src/lib/locales/da.js @@ -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}', diff --git a/web/src/lib/locales/en.js b/web/src/lib/locales/en.js index 62ca65a..d04aea9 100644 --- a/web/src/lib/locales/en.js +++ b/web/src/lib/locales/en.js @@ -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}', From 15495255ef03e3829a2465890b5a0a7f553be2b9 Mon Sep 17 00:00:00 2001 From: kristianwind Date: Thu, 27 Aug 2026 12:36:48 +0200 Subject: [PATCH 2/2] 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 --- web/e2e/smoke.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/e2e/smoke.spec.js b/web/e2e/smoke.spec.js index a91fb81..b8c717a 100644 --- a/web/e2e/smoke.spec.js +++ b/web/e2e/smoke.spec.js @@ -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');