diff --git a/frontend/css/app.css b/frontend/css/app.css
index 21d6757..2fac119 100644
--- a/frontend/css/app.css
+++ b/frontend/css/app.css
@@ -1455,9 +1455,9 @@ a { color: var(--primary); text-decoration: none; }
.ct-dot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; margin-right: 5px; vertical-align: middle; flex-shrink: 0; }
.ct-empty { color: var(--text-3); font-size: 13px; padding: 16px 0; text-align: center; }
.ct-toggle { cursor: pointer; }
-.ct-eye { opacity: .55; transition: opacity .15s; }
-.ct-eye[data-ct-visible="1"] { opacity: 1; }
-.ct-eye:hover { opacity: 1; }
+.ct-eye, .ct-bell { opacity: .45; transition: opacity .15s; }
+.ct-eye[data-ct-visible="1"], .ct-bell[data-ct-on="1"] { opacity: 1; }
+.ct-eye:hover, .ct-bell:hover { opacity: 1; }
/* ── Month View (spanning bars) ─────────────────────────── */
.month-body {
diff --git a/frontend/js/calendar.js b/frontend/js/calendar.js
index e893a34..e0ebb94 100644
--- a/frontend/js/calendar.js
+++ b/frontend/js/calendar.js
@@ -3356,14 +3356,16 @@ function renderCalendarTable() {
if (!container) return;
const TRASH = ``;
- const EYE_ON = ``;
- const EYE_OFF = ``;
+ const EYE_ON = ``;
+ const EYE_OFF = ``;
+ const BELL_ON = ``;
+ const BELL_OFF = ``;
let rowCount = 0;
const hid = (src, id, isVisible) =>
``;
- const rem = (src, id, checked) =>
- ``;
+ const rem = (src, id, on) =>
+ ``;
const dot = (color, fb) =>
``;
@@ -3503,20 +3505,22 @@ function renderCalendarTable() {
});
});
- // Reminders toggle
- container.querySelectorAll('.ct-toggle[data-ct-rem]').forEach(cb => {
- cb.addEventListener('change', async () => {
- const src = cb.dataset.ctRem, id = parseInt(cb.dataset.ctId), enabled = cb.checked;
+ // Reminders bell toggle
+ container.querySelectorAll('.ct-bell[data-ct-rem]').forEach(btn => {
+ btn.addEventListener('click', async () => {
+ const src = btn.dataset.ctRem, id = parseInt(btn.dataset.ctId);
+ const enabled = btn.dataset.ctOn !== '1'; // currently on → turn off, currently off → turn on
const path = src === 'ical' ? `/ical/subscriptions/${id}` : `/${src === 'ha' ? 'homeassistant' : src}/calendars/${id}`;
try {
await api.put(path, { reminders_enabled: enabled });
- if (src === 'local') { const c = state.localCalendars.find(c => c.id === id); if (c) c.reminders_enabled = enabled; }
- else if (src === 'ical') { const s = state.icalSubscriptions.find(s => s.id === id); if (s) s.reminders_enabled = enabled; }
- else if (src === 'caldav') { for (const acc of state.accounts) { const c = acc.calendars.find(c => c.id === id); if (c) c.reminders_enabled = enabled; } }
+ if (src === 'local') { const c = state.localCalendars.find(c => c.id === id); if (c) c.reminders_enabled = enabled; }
+ else if (src === 'ical') { const s = state.icalSubscriptions.find(s => s.id === id); if (s) s.reminders_enabled = enabled; }
+ else if (src === 'caldav') { for (const acc of state.accounts) { const c = acc.calendars.find(c => c.id === id); if (c) c.reminders_enabled = enabled; } }
else if (src === 'google') { for (const acc of state.googleAccounts) { const c = acc.calendars.find(c => c.id === id); if (c) c.reminders_enabled = enabled; } }
else if (src === 'ha') { for (const acc of state.haAccounts) { const c = acc.calendars.find(c => c.id === id); if (c) c.reminders_enabled = enabled; } }
+ renderCalendarTable();
renderCalendarList();
- } catch (e) { showToast(e.message, true); cb.checked = !cb.checked; }
+ } catch (e) { showToast(e.message, true); }
});
});
diff --git a/frontend/js/version.js b/frontend/js/version.js
index ff8bd7c..54a26e6 100644
--- a/frontend/js/version.js
+++ b/frontend/js/version.js
@@ -1,2 +1,2 @@
// Increment APP_VERSION with every code change
-export const APP_VERSION = 'v53';
+export const APP_VERSION = 'v54';