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:
+29
-18
@@ -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;
|
||||||
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user