Show actual API error details in modal save/create failures
Previously modals showed generic "Failed to add/save" messages. Now they extract and display the actual error detail from the API response (e.g., "URL is required", "Name already exists"). Handles Pydantic validation arrays by joining msg fields. Fixed in 8 files: device-discovery, devices, calibration, advanced-calibration, scene-presets, automations, command-palette. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -319,7 +319,10 @@ export async function activateScenePreset(presetId) {
|
||||
method: 'POST',
|
||||
});
|
||||
if (!resp.ok) {
|
||||
showToast(t('scenes.error.activate_failed'), 'error');
|
||||
const errData = await resp.json().catch(() => ({}));
|
||||
const detail = errData.detail || errData.message || '';
|
||||
const detailStr = Array.isArray(detail) ? detail.map(d => d.msg || d).join('; ') : String(detail);
|
||||
showToast(detailStr || t('scenes.error.activate_failed'), 'error');
|
||||
return;
|
||||
}
|
||||
const result = await resp.json();
|
||||
@@ -352,11 +355,14 @@ export async function recaptureScenePreset(presetId) {
|
||||
scenePresetsCache.invalidate();
|
||||
_reloadScenesTab();
|
||||
} else {
|
||||
showToast(t('scenes.error.recapture_failed'), 'error');
|
||||
const errData = await resp.json().catch(() => ({}));
|
||||
const detail = errData.detail || errData.message || '';
|
||||
const detailStr = Array.isArray(detail) ? detail.map(d => d.msg || d).join('; ') : String(detail);
|
||||
showToast(detailStr || t('scenes.error.recapture_failed'), 'error');
|
||||
}
|
||||
} catch (error) {
|
||||
if (error.isAuth) return;
|
||||
showToast(t('scenes.error.recapture_failed'), 'error');
|
||||
showToast(error.message || t('scenes.error.recapture_failed'), 'error');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -425,11 +431,14 @@ export async function deleteScenePreset(presetId) {
|
||||
scenePresetsCache.invalidate();
|
||||
_reloadScenesTab();
|
||||
} else {
|
||||
showToast(t('scenes.error.delete_failed'), 'error');
|
||||
const errData = await resp.json().catch(() => ({}));
|
||||
const detail = errData.detail || errData.message || '';
|
||||
const detailStr = Array.isArray(detail) ? detail.map(d => d.msg || d).join('; ') : String(detail);
|
||||
showToast(detailStr || t('scenes.error.delete_failed'), 'error');
|
||||
}
|
||||
} catch (error) {
|
||||
if (error.isAuth) return;
|
||||
showToast(t('scenes.error.delete_failed'), 'error');
|
||||
showToast(error.message || t('scenes.error.delete_failed'), 'error');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user