diff --git a/frontend/js/calendar.js b/frontend/js/calendar.js index 7f21fc4..bb048d4 100644 --- a/frontend/js/calendar.js +++ b/frontend/js/calendar.js @@ -830,16 +830,18 @@ function renderCalendarList() { entries.push({ key: `local:${cal.id}`, source: 'local', dataId: `data-cal-id="${cal.id}"`, name: cal.shared_by || cal.name, color: cal.color, enabled: !hiddenLocal.has(cal.id), readOnly, sourceLabel: `${t('shared_with_me')} · ${cal.name}${readOnly ? ' · ' + t('perm_read') : ''}`, + reminders: true, remindersEnabled: cal.reminders_enabled !== false, remove: { icon: EYE_OFF, title: t('hide_cal') } }); }); // Group calendars (owned by the creator or reached via membership) — shown so - // they can be toggled/recoloured. Owned group calendars can also be muted - // (reminders), which the server then syncs; member-reached ones can't (no PUT). + // they can be toggled, recoloured and muted. Muting is per user: the creator + // owns the calendar, and silencing it for themselves must not silence the + // whole group. state.localCalendars.filter(c => c.group).forEach(cal => { entries.push({ key: `local:${cal.id}`, source: 'local', dataId: `data-cal-id="${cal.id}"`, name: cal.name, color: cal.color, enabled: cal.owned !== false ? cal.enabled : !hiddenLocal.has(cal.id), - reminders: cal.owned !== false, remindersEnabled: cal.reminders_enabled !== false, + reminders: true, remindersEnabled: cal.reminders_enabled !== false, sourceLabel: `${t('groups_title')} · ${cal.shared_by || ''}`, isGroupCal: true, groupIcon: groupIconForLocalCal(cal.id), remove: null }); }); @@ -984,7 +986,11 @@ function renderCalendarList() { } if (!cal) return; const newVal = cal.reminders_enabled === false; // toggle - const path = source === 'ical' + // local has a dedicated endpoint so share recipients can mute for + // themselves; the others still take the calendar-wide PUT. + const path = source === 'local' + ? `/local/calendars/${id}/reminders` + : source === 'ical' ? `/ical/subscriptions/${id}` : `/${source}/calendars/${id}`; try { @@ -4432,7 +4438,7 @@ function renderCalendarTable() { const hid = (src, id, isVisible) => ``; const rem = (src, id, on) => - ``; + ``; const dot = (color, fb) => ``; @@ -4565,7 +4571,8 @@ function renderCalendarTable() { rows += ` ${dot(cal.color, '#34a853')}${escHtml(cal.shared_by || cal.name)} ${escHtml(cal.name)} ${readOnly ? t('perm_read') : t('perm_read_write')} - ${hid('shared', cal.id, !sharedHidden.has(cal.id))}———— + ${hid('shared', cal.id, !sharedHidden.has(cal.id))} + ${rem('local', cal.id, cal.reminders_enabled !== false)}——— `; rowCount++; } @@ -4577,7 +4584,7 @@ function renderCalendarTable() { container.innerHTML = ` - + ${rows}
NameHerkunftSichtbarBenachrichtigungenExport / ImportSyncNameHerkunftSichtbar${t('calendar_reminders_col')}Export / ImportSync
`; @@ -4622,7 +4629,9 @@ function renderCalendarTable() { 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}`; + const path = src === 'local' ? `/local/calendars/${id}/reminders` + : 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; } diff --git a/frontend/js/i18n.js b/frontend/js/i18n.js index bd45bb4..287e667 100644 --- a/frontend/js/i18n.js +++ b/frontend/js/i18n.js @@ -202,6 +202,7 @@ const translations = { reminders_calendar_off: 'Für diesen Kalender sind Benachrichtigungen deaktiviert – Erinnerungen werden nicht ausgeführt.', calendar_reminders_on: 'Benachrichtigungen aktiviert', calendar_reminders_off: 'Benachrichtigungen deaktiviert', + calendar_reminders_col: 'Benachrichtigungen', copy: 'Kopieren', caldav_publish: 'CalDAV veröffentlichen', caldav_unpublish: 'CalDAV deaktivieren', @@ -596,6 +597,7 @@ const translations = { reminders_calendar_off: 'Für dä Kalender sind Benachrichtigunge deaktiviert – Erinnerige werded nöd usgfüert.', calendar_reminders_on: 'Benachrichtigunge aktiviert', calendar_reminders_off: 'Benachrichtigunge deaktiviert', + calendar_reminders_col: 'Benachrichtigunge', copy: 'Kopierä', caldav_publish: 'CalDAV veröffentlichä', caldav_unpublish: 'CalDAV deaktivierä', @@ -1028,6 +1030,7 @@ const translations = { reminders_calendar_off: 'Reminders are disabled for this calendar – they will not fire.', calendar_reminders_on: 'Reminders enabled', calendar_reminders_off: 'Reminders disabled', + calendar_reminders_col: 'Notifications', copy: 'Copy', caldav_publish: 'Publish via CalDAV', caldav_unpublish: 'Unpublish CalDAV', @@ -1422,6 +1425,7 @@ const translations = { reminders_calendar_off: 'Les rappels sont désactivés pour cet agenda – ils ne se déclencheront pas.', calendar_reminders_on: 'Rappels activés', calendar_reminders_off: 'Rappels désactivés', + calendar_reminders_col: 'Notifications', copy: 'Copier', caldav_publish: 'Publier via CalDAV', caldav_unpublish: 'Dépublier CalDAV', @@ -1816,6 +1820,7 @@ const translations = { reminders_calendar_off: 'I promemoria sono disattivati per questo calendario – non verranno attivati.', calendar_reminders_on: 'Promemoria attivati', calendar_reminders_off: 'Promemoria disattivati', + calendar_reminders_col: 'Notifiche', copy: 'Copia', caldav_publish: 'Pubblica via CalDAV', caldav_unpublish: 'Annulla pubblicazione CalDAV', @@ -2210,6 +2215,7 @@ const translations = { reminders_calendar_off: 'Herinneringen zijn uitgeschakeld voor deze agenda – ze worden niet geactiveerd.', calendar_reminders_on: 'Herinneringen ingeschakeld', calendar_reminders_off: 'Herinneringen uitgeschakeld', + calendar_reminders_col: 'Meldingen', copy: 'Kopiëren', caldav_publish: 'Publiceren via CalDAV', caldav_unpublish: 'CalDAV-publicatie stoppen', @@ -2604,6 +2610,7 @@ const translations = { reminders_calendar_off: 'Påmindelser er slået fra for denne kalender – de bliver ikke udløst.', calendar_reminders_on: 'Påmindelser slået til', calendar_reminders_off: 'Påmindelser slået fra', + calendar_reminders_col: 'Notifikationer', copy: 'Kopiér', caldav_publish: 'Udgiv via CalDAV', caldav_unpublish: 'Stop CalDAV-udgivelse', @@ -2998,6 +3005,7 @@ const translations = { reminders_calendar_off: 'Påminnelser er slått av for denne kalenderen – de blir ikke utløst.', calendar_reminders_on: 'Påminnelser slått på', calendar_reminders_off: 'Påminnelser slått av', + calendar_reminders_col: 'Varsler', copy: 'Kopier', caldav_publish: 'Publiser via CalDAV', caldav_unpublish: 'Stopp CalDAV-publisering', @@ -3392,6 +3400,7 @@ const translations = { reminders_calendar_off: 'Påminnelser är avstängda för den här kalendern – de kommer inte att utlösas.', calendar_reminders_on: 'Påminnelser aktiverade', calendar_reminders_off: 'Påminnelser avstängda', + calendar_reminders_col: 'Aviseringar', copy: 'Kopiera', caldav_publish: 'Publicera via CalDAV', caldav_unpublish: 'Sluta publicera via CalDAV', @@ -3786,6 +3795,7 @@ const translations = { reminders_calendar_off: 'Muistutukset on poistettu käytöstä tässä kalenterissa – niitä ei laukaista.', calendar_reminders_on: 'Muistutukset käytössä', calendar_reminders_off: 'Muistutukset pois käytöstä', + calendar_reminders_col: 'Ilmoitukset', copy: 'Kopioi', caldav_publish: 'Julkaise CalDAV:n kautta', caldav_unpublish: 'Lopeta CalDAV-julkaisu',