fix(ux): replace native confirm() dialogs, add undo-toast, fix prefers-reduced-motion
- Replace all 13 native confirm() calls with confirmModal() across 7 page modules - Add confirmModal() to modal.js (Promise-based, danger variant, focus management) - Fix double-confirm bug in contacts.js and budget.js (modal + deleteContact/deleteEntry) - Extend showToast() with onUndo callback and max-3-toast limit - Implement optimistic undo-toast (4s window) for shopping item and bulk-checked delete - Add prefers-reduced-motion guard to btnSuccess() and btnError() in modal.js - Add btn--error-static CSS class as motion-reduced fallback for btnError() - Add toast__undo button styles to layout.css - Add common.confirm and common.undo i18n keys (de, en, it, sv) - Add shopping.itemDeletedToast i18n key (de, en, it, sv)
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
import { api, auth } from '/api.js';
|
||||
import { confirmModal } from '/components/modal.js';
|
||||
import { t, formatDate, formatTime } from '/i18n.js';
|
||||
import { esc } from '/utils/html.js';
|
||||
import '/components/oikos-locale-picker.js';
|
||||
@@ -423,7 +424,7 @@ function bindEvents(container, user) {
|
||||
const googleDisconnectBtn = container.querySelector('#google-disconnect-btn');
|
||||
if (googleDisconnectBtn) {
|
||||
googleDisconnectBtn.addEventListener('click', async () => {
|
||||
if (!confirm(t('settings.googleDisconnectConfirm'))) return;
|
||||
if (!await confirmModal(t('settings.googleDisconnectConfirm'), { danger: true })) return;
|
||||
try {
|
||||
await api.delete('/calendar/google/disconnect');
|
||||
window.oikos?.showToast(t('settings.disconnectedToast', { provider: 'Google Calendar' }), 'default');
|
||||
@@ -456,7 +457,7 @@ function bindEvents(container, user) {
|
||||
const appleDisconnectBtn = container.querySelector('#apple-disconnect-btn');
|
||||
if (appleDisconnectBtn) {
|
||||
appleDisconnectBtn.addEventListener('click', async () => {
|
||||
if (!confirm(t('settings.appleDisconnectConfirm'))) return;
|
||||
if (!await confirmModal(t('settings.appleDisconnectConfirm'), { danger: true })) return;
|
||||
try {
|
||||
await api.delete('/calendar/apple/disconnect');
|
||||
window.oikos?.showToast(t('settings.disconnectedToast', { provider: 'Apple Calendar' }), 'default');
|
||||
@@ -571,7 +572,7 @@ function bindDeleteButtons(container, user) {
|
||||
btn.addEventListener('click', async () => {
|
||||
const id = parseInt(btn.dataset.deleteUser, 10);
|
||||
const name = btn.dataset.name;
|
||||
if (!confirm(t('settings.deleteMemberConfirm', { name }))) return;
|
||||
if (!await confirmModal(t('settings.deleteMemberConfirm', { name }), { danger: true, confirmLabel: t('common.delete') })) return;
|
||||
try {
|
||||
await auth.deleteUser(id);
|
||||
btn.closest('.settings-member').remove();
|
||||
|
||||
Reference in New Issue
Block a user