diff --git a/apps/web/src/lib/ui/data/TaskItem.svelte b/apps/web/src/lib/ui/data/TaskItem.svelte index bcd1f25..6597b45 100644 --- a/apps/web/src/lib/ui/data/TaskItem.svelte +++ b/apps/web/src/lib/ui/data/TaskItem.svelte @@ -8,6 +8,8 @@ } from "$lib/utils/date"; import { success, error as toastError } from "$lib/stores/toasts"; import { tick } from "svelte"; + import Popover from "$lib/ui/feedback/Popover.svelte"; + import { normalizeDigits, buildWaMeUrl } from "$lib/utils/phone"; export let id: number; export let description: string; @@ -32,6 +34,15 @@ let dateValue: string = due_date ?? ""; let busy = false; + // Popover de responsables + let showAssignees = false; + let assigneesButtonEl: HTMLButtonElement | null = null; + $: assigneesCount = Array.isArray(assignees) ? assignees.length : 0; + $: assigneesLabel = + assigneesCount === 0 + ? "Sin responsable" + : `Responsables: ${assigneesCount}${isAssigned ? " (tú)" : ""}`; + // Edición de texto (inline) let editingText = false; let descEl: HTMLElement | null = null; @@ -270,13 +281,20 @@ {/if} - {#if assignees?.length} -
- {#each assignees as a} - 👤 - {/each} -
- {/if} +
+ +
{#if !completed} {#if !isAssigned} @@ -356,6 +374,28 @@ {/if} {/if}
+ { tick().then(() => assigneesButtonEl?.focus()); }}> +

Responsables

+ {#if assigneesCount === 0} +

No hay responsables asignados.

+ {:else} + + {/if} +
+ +
+
diff --git a/apps/web/src/lib/ui/feedback/Popover.svelte b/apps/web/src/lib/ui/feedback/Popover.svelte new file mode 100644 index 0000000..f7ce341 --- /dev/null +++ b/apps/web/src/lib/ui/feedback/Popover.svelte @@ -0,0 +1,111 @@ + + +{#if open} +
+ +{/if} + + diff --git a/apps/web/src/lib/utils/phone.ts b/apps/web/src/lib/utils/phone.ts new file mode 100644 index 0000000..94de330 --- /dev/null +++ b/apps/web/src/lib/utils/phone.ts @@ -0,0 +1,8 @@ +export function normalizeDigits(input: string | null | undefined): string { + return String(input ?? '').replace(/\D+/g, ''); +} + +export function buildWaMeUrl(input: string): string { + const digits = normalizeDigits(input); + return `https://wa.me/${digits}`; +}