fix: correct onSave pattern for ICS edit modal

onSave(panel) is a setup hook, not a submit handler. Bind the form's
submit event inside it and call closeModal({ force: true }) on success.
Also add explicit submit/cancel buttons to the modal content.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Ulas Kalayci
2026-04-29 10:39:17 +02:00
parent 06adc0f3f5
commit 99783ca600
+29 -18
View File
@@ -1791,26 +1791,37 @@ function bindIcsEvents(container, user, initialSubs) {
<label class="form-label" for="ics-edit-shared" style="margin:0">${t('settings.ics.form.shared')}</label> <label class="form-label" for="ics-edit-shared" style="margin:0">${t('settings.ics.form.shared')}</label>
</div> </div>
</div> </div>
<p id="ics-edit-error" class="form-error" hidden></p> <div id="ics-edit-error" class="form-error" hidden></div>
<div class="settings-form-actions">
<button type="button" class="btn btn--secondary" id="ics-edit-cancel">${t('common.cancel')}</button>
<button type="submit" class="btn btn--primary">${t('settings.ics.actions.save')}</button>
</div>
</form> </form>
`, `,
onSave: async (modalEl, close) => { onSave(panel) {
const name = modalEl.querySelector('#ics-edit-name').value.trim(); panel.querySelector('#ics-edit-cancel')?.addEventListener('click', () => closeModal());
const color = modalEl.querySelector('#ics-edit-color').value; panel.querySelector('#ics-edit-form')?.addEventListener('submit', async (e) => {
const shared = modalEl.querySelector('#ics-edit-shared').checked ? 1 : 0; e.preventDefault();
const errEl = modalEl.querySelector('#ics-edit-error'); const submitBtn = panel.querySelector('[type=submit]');
errEl.hidden = true; const errEl = panel.querySelector('#ics-edit-error');
try { const name = panel.querySelector('#ics-edit-name').value.trim();
const res = await api.patch(`/calendar/subscriptions/${id}`, { name, color, shared }); const color = panel.querySelector('#ics-edit-color').value;
const idx = subs.findIndex((s) => s.id === id); const shared = panel.querySelector('#ics-edit-shared').checked ? 1 : 0;
if (idx >= 0) subs[idx] = res.data; errEl.hidden = true;
renderIcsList(container, subs, user); submitBtn.disabled = true;
window.oikos?.showToast(t('settings.ics.updatedToast'), 'success'); try {
close(); const res = await api.patch(`/calendar/subscriptions/${id}`, { name, color, shared });
} catch (err) { const idx = subs.findIndex((s) => s.id === id);
errEl.textContent = err.message ?? t('common.errorGeneric'); if (idx >= 0) subs[idx] = res.data;
errEl.hidden = false; renderIcsList(container, subs, user);
} window.oikos?.showToast(t('settings.ics.updatedToast'), 'success');
closeModal({ force: true });
} catch (err) {
errEl.textContent = err.message ?? t('common.errorGeneric');
errEl.hidden = false;
submitBtn.disabled = false;
}
});
}, },
}); });
} }