From 51301bc497c6789895965f22169dd65a01f912b2 Mon Sep 17 00:00:00 2001 From: mARTin Date: Thu, 26 Mar 2026 12:09:20 +0100 Subject: [PATCH] fix: redesign recurring delete as overlay with loading indicator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace inline delete buttons (Dieses/Künftige/Alle) with a proper overlay dialog matching the recurring edit overlay style. Shows animated dots on the active delete option while processing. Other options dim during deletion. v1.75.7 Co-Authored-By: Claude Opus 4.6 --- package.json | 2 +- src/components/CalendarEventModal.tsx | 103 +++++++++++++++++++------- 2 files changed, 76 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 790ce58..3457e22 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "my-weekly-todo-list", - "version": "1.75.6", + "version": "1.75.7", "description": "A web-based weekly task management application that organizes to-dos and calendar events in a single, intuitive weekly view", "main": "index.js", "scripts": { diff --git a/src/components/CalendarEventModal.tsx b/src/components/CalendarEventModal.tsx index 7f4737c..a1a601e 100644 --- a/src/components/CalendarEventModal.tsx +++ b/src/components/CalendarEventModal.tsx @@ -161,6 +161,7 @@ export default function CalendarEventModal({ const [allDay, setAllDay] = useState(!!event?.allDay); const [isSaving, setIsSaving] = useState(false); const [isDeleting, setIsDeleting] = useState(false); + const [deletingMode, setDeletingMode] = useState(null); const [error, setError] = useState(''); const [isCalendarSelectorOpen, setIsCalendarSelectorOpen] = useState(false); const calendarSelectorRef = useRef(null); @@ -269,12 +270,14 @@ export default function CalendarEventModal({ } setIsDeleting(true); + setDeletingMode(mode || 'all'); try { await onDelete(event.id, event.calendarId, mode || 'all'); onClose(); } catch (err: any) { setError(err.message || 'Failed to delete event'); setIsDeleting(false); + setDeletingMode(null); setIsDeleteConfirming(false); setShowRecurringDeleteOptions(false); } @@ -874,34 +877,21 @@ export default function CalendarEventModal({ {isDeleting ? '...' : isDeleteConfirming ? (language === 'de' ? 'Bestätigen?' : 'Confirm?') : (language === 'de' ? 'Löschen' : 'Delete')} )} - {event && onDelete && showRecurringDeleteOptions && ( -
- {[ - { mode: 'this', label: language === 'de' ? 'Dieses' : 'This' }, - { mode: 'future', label: language === 'de' ? 'Künftige' : 'Future' }, - { mode: 'all', label: language === 'de' ? 'Alle' : 'All' }, - ].map(({ mode, label }) => ( - - ))} - -
+ {event && onDelete && showRecurringDeleteOptions && !isDeleting && ( + + )} + {event && onDelete && isDeleting && ( + + {language === 'de' ? 'Lösche' : 'Deleting'} + )} {!event && ( } + +
+ {([ + { value: 'this' as const, title: language === 'de' ? 'Nur dieses Ereignis' : 'This event only', desc: language === 'de' ? 'Alle anderen bleiben erhalten.' : 'All other events stay the same.' }, + { value: 'future' as const, title: language === 'de' ? 'Dieses und folgende' : 'This and following', desc: language === 'de' ? 'Dieses und alle zukünftigen werden gelöscht.' : 'This and all future events will be deleted.' }, + { value: 'all' as const, title: language === 'de' ? 'Alle Ereignisse' : 'All events', desc: language === 'de' ? 'Die gesamte Serie wird gelöscht.' : 'The entire series will be deleted.' }, + ]).map(opt => ( + + ))} +
+ + + )} ); }