diff --git a/backend/services/falukantService.js b/backend/services/falukantService.js index 777268e..1dac9d0 100644 --- a/backend/services/falukantService.js +++ b/backend/services/falukantService.js @@ -4180,7 +4180,7 @@ class FalukantService extends BaseService { limit: 1 }); if (lastHealthActivity) { - throw new Error('too close'); + throw new PreconditionError('tr:falukant.healthview.errors.tooClose'); } const activityObject = FalukantService.HEALTH_ACTIVITIES.find((a) => a.tr === activity); if (!activityObject) { diff --git a/frontend/src/i18n/locales/de/falukant.json b/frontend/src/i18n/locales/de/falukant.json index fb31654..fc1d3c3 100644 --- a/frontend/src/i18n/locales/de/falukant.json +++ b/frontend/src/i18n/locales/de/falukant.json @@ -918,6 +918,9 @@ "success": "Erfolg", "selectMeasure": "Maßnahme", "perform": "Durchführen", + "errors": { + "tooClose": "Aktionen zu dicht hintereinander (maximal 1× pro 24 Stunden)." + }, "measures": { "pill": "Tablette", "doctor": "Arztbesuch", diff --git a/frontend/src/i18n/locales/en/falukant.json b/frontend/src/i18n/locales/en/falukant.json index 8e6869d..5ef1a1d 100644 --- a/frontend/src/i18n/locales/en/falukant.json +++ b/frontend/src/i18n/locales/en/falukant.json @@ -100,6 +100,12 @@ "bad": "Bad", "very_bad": "Very bad" }, + "healthview": { + "title": "Health", + "errors": { + "tooClose": "Actions too close together (max once per 24 hours)." + } + }, "moneyHistory": { "title": "Money history", "filter": "Filter", diff --git a/frontend/src/views/falukant/HealthView.vue b/frontend/src/views/falukant/HealthView.vue index 9ac86b0..3cb7e2d 100644 --- a/frontend/src/views/falukant/HealthView.vue +++ b/frontend/src/views/falukant/HealthView.vue @@ -129,13 +129,22 @@ export default { async performMeasure() { if (!this.selectedMeasure) return; try { - await apiClient.post('/api/falukant/health', { + const { data } = await apiClient.post('/api/falukant/health', { measureTr: this.selectedTr }); + // Feedback via global message dialog + const title = this.$t('falukant.healthview.title'); + const body = data?.delta != null + ? `${this.$t(`falukant.healthview.measures.${this.selectedTr}`)}: ${data.delta > 0 ? '+' : ''}${data.delta}` + : this.$t('message.success'); + this.$root.$refs.messageDialog?.open(body, title); await this.loadHealthData(); this.selectedTr = ''; } catch (err) { console.error('Error performing measure', err); + const title = this.$t('falukant.healthview.title'); + const remoteMsg = err?.response?.data?.error || err?.message || String(err); + this.$root.$refs.messageDialog?.open(remoteMsg, title); } }, handleDaemonMessage(evt) {