From 5190b1449aefdedfa61b71040ebd95bb7e5a01e8 Mon Sep 17 00:00:00 2001 From: Till-JS <101404291+Till-JS@users.noreply.github.com> Date: Sun, 14 Dec 2025 15:09:16 +0100 Subject: [PATCH] feat(ui): add ConfirmationPopover component for inline confirmations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add new ConfirmationPopover wrapper component in shared-ui - Uses portal pattern to escape overflow constraints - Supports danger/warning/info variants with appropriate styling - Uses elevation-3 for proper layering above overlays - Integrate in QuickEventOverlay for delete confirmation - Fix parseISO bug in QuickEventOverlay (was not imported) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../components/event/QuickEventOverlay.svelte | 43 +- packages/shared-ui/src/index.ts | 3 + .../src/molecules/ConfirmationPopover.svelte | 407 ++++++++++++++++++ packages/shared-ui/src/molecules/index.ts | 3 + 4 files changed, 434 insertions(+), 22 deletions(-) create mode 100644 packages/shared-ui/src/molecules/ConfirmationPopover.svelte diff --git a/apps/calendar/apps/web/src/lib/components/event/QuickEventOverlay.svelte b/apps/calendar/apps/web/src/lib/components/event/QuickEventOverlay.svelte index e71671d04..f20908b53 100644 --- a/apps/calendar/apps/web/src/lib/components/event/QuickEventOverlay.svelte +++ b/apps/calendar/apps/web/src/lib/components/event/QuickEventOverlay.svelte @@ -11,7 +11,7 @@ EventAttendee, } from '@calendar/shared'; import type { ContactSummary, ContactOrManual, ManualContactEntry } from '@manacore/shared-types'; - import { ContactSelector, ContactAvatar } from '@manacore/shared-ui'; + import { ContactSelector, ContactAvatar, ConfirmationPopover } from '@manacore/shared-ui'; import { Users } from 'lucide-svelte'; import { format, addMinutes } from 'date-fns'; import { de } from 'date-fns/locale'; @@ -263,7 +263,7 @@ } const draft = eventsStore.draftEvent; if (draft) { - return typeof draft.startTime === 'string' ? parseISO(draft.startTime) : draft.startTime; + return toDate(draft.startTime); } return startTime || new Date(); }); @@ -274,7 +274,7 @@ } const draft = eventsStore.draftEvent; if (draft) { - return typeof draft.endTime === 'string' ? parseISO(draft.endTime) : draft.endTime; + return toDate(draft.endTime); } return addMinutes(startTime || new Date(), settingsStore.defaultEventDuration); }); @@ -601,10 +601,6 @@ async function handleDelete() { if (!event) return; - if (!confirm('Möchten Sie diesen Termin wirklich löschen?')) { - return; - } - submitting = true; try { const result = await eventsStore.deleteEvent(event.id); @@ -648,22 +644,25 @@ {isEditMode ? 'Termin bearbeiten' : 'Neuer Termin'}
{#if isEditMode} - + + {/if} + +
+ + +{/if} + + diff --git a/packages/shared-ui/src/molecules/index.ts b/packages/shared-ui/src/molecules/index.ts index 1a7f23173..d9ef0b976 100644 --- a/packages/shared-ui/src/molecules/index.ts +++ b/packages/shared-ui/src/molecules/index.ts @@ -47,3 +47,6 @@ export { default as ModalFooter } from './ModalFooter.svelte'; export { default as DataCard } from './DataCard.svelte'; export { default as PageHeader } from './PageHeader.svelte'; export { default as KeyboardShortcutsPanel } from './KeyboardShortcutsPanel.svelte'; + +// Confirmation +export { default as ConfirmationPopover } from './ConfirmationPopover.svelte';