From c796d3ad6ff150c0bf1f00b2ebdf563af0072fa8 Mon Sep 17 00:00:00 2001 From: ulsklyc Date: Thu, 26 Mar 2026 12:22:21 +0100 Subject: [PATCH] feat: migrate remaining 5 modules to shared modal system Migrate budget, contacts, notes, meals, calendar to use the shared openModal/closeModal from components/modal.js. Each module now gets focus-trap, escape-handler, overlay-click, focus-restore, scroll-lock. Removed ~460 lines of duplicate modal CSS (.budget-modal-overlay, .contact-modal-overlay, .note-modal-overlay, .meal-modal-overlay, .event-modal-overlay and their children). Content-specific styles (color-picker, autocomplete, ingredient-list, etc.) are preserved. Co-Authored-By: Claude Opus 4.6 --- public/pages/budget.js | 250 +++++++++++++++---------------- public/pages/calendar.js | 271 +++++++++++++++------------------ public/pages/contacts.js | 188 +++++++++++------------ public/pages/meals.js | 298 ++++++++++++++++++------------------- public/pages/notes.js | 180 ++++++++++------------ public/styles/budget.css | 88 +---------- public/styles/calendar.css | 98 +----------- public/styles/contacts.css | 85 ----------- public/styles/meals.css | 107 +------------ public/styles/notes.css | 84 +---------- 10 files changed, 552 insertions(+), 1097 deletions(-) diff --git a/public/pages/budget.js b/public/pages/budget.js index eefd4c4..b63b8e1 100644 --- a/public/pages/budget.js +++ b/public/pages/budget.js @@ -6,6 +6,7 @@ */ import { api } from '/api.js'; +import { openModal as openSharedModal, closeModal } from '/components/modal.js'; // -------------------------------------------------------- // Konstanten @@ -134,7 +135,7 @@ function wireNav() { renderBody(); updateLabel(); }); - const addHandler = () => openModal({ mode: 'create' }); + const addHandler = () => openBudgetModal({ mode: 'create' }); _container.querySelector('#budget-add').addEventListener('click', addHandler); _container.querySelector('#fab-new-budget').addEventListener('click', addHandler); updateLabel(); @@ -208,7 +209,7 @@ function renderBody() { const item = e.target.closest('.budget-entry[data-id]'); if (item && !e.target.closest('[data-action]')) { const entry = state.entries.find((e) => e.id === parseInt(item.dataset.id, 10)); - if (entry) openModal({ mode: 'edit', entry }); + if (entry) openBudgetModal({ mode: 'edit', entry }); } }); } @@ -276,150 +277,133 @@ function formatEntryDate(dateStr) { // Modal // -------------------------------------------------------- -function openModal({ mode, entry = null }) { - document.querySelector('#budget-modal-overlay')?.remove(); - +function openBudgetModal({ mode, entry = null }) { const isEdit = mode === 'edit'; const today = new Date().toISOString().slice(0, 10); - const isExpense = isEdit ? entry.amount < 0 : true; // Standard: Ausgabe + const isExpense = isEdit ? entry.amount < 0 : true; const absAmount = isEdit ? Math.abs(entry.amount).toFixed(2) : ''; const catOpts = CATEGORIES.map((c) => `` ).join(''); - const overlay = document.createElement('div'); - overlay.id = 'budget-modal-overlay'; - overlay.className = 'budget-modal-overlay'; - overlay.innerHTML = ` -