From 7e0fe3b1b9d20547c10342da66f48cdb39d71bd5 Mon Sep 17 00:00:00 2001 From: jubnl Date: Sun, 5 Apr 2026 22:26:55 +0200 Subject: [PATCH] fix(reservations): hide price/budget fields when budget addon is disabled Closes #440 --- .../components/Planner/ReservationModal.tsx | 74 +++++++++++-------- 1 file changed, 42 insertions(+), 32 deletions(-) diff --git a/client/src/components/Planner/ReservationModal.tsx b/client/src/components/Planner/ReservationModal.tsx index bc8c34f..2d8e4ca 100644 --- a/client/src/components/Planner/ReservationModal.tsx +++ b/client/src/components/Planner/ReservationModal.tsx @@ -2,6 +2,7 @@ import { useState, useEffect, useRef, useMemo } from 'react' import { useParams } from 'react-router-dom' import apiClient from '../../api/client' import { useTripStore } from '../../store/tripStore' +import { useAddonStore } from '../../store/addonStore' import Modal from '../shared/Modal' import CustomSelect from '../shared/CustomSelect' import { Plane, Hotel, Utensils, Train, Car, Ship, Ticket, FileText, Users, Paperclip, X, ExternalLink, Link2 } from 'lucide-react' @@ -71,6 +72,7 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p const { t, locale } = useTranslation() const fileInputRef = useRef(null) + const isBudgetEnabled = useAddonStore(s => s.isEnabled('budget')) const budgetItems = useTripStore(s => s.budgetItems) const budgetCategories = useMemo(() => { const cats = new Set() @@ -196,8 +198,10 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p if (form.end_date) { combinedEndTime = form.reservation_end_time ? `${form.end_date}T${form.reservation_end_time}` : form.end_date } - if (form.price) metadata.price = form.price - if (form.budget_category) metadata.budget_category = form.budget_category + if (isBudgetEnabled) { + if (form.price) metadata.price = form.price + if (form.budget_category) metadata.budget_category = form.budget_category + } const saveData: Record = { title: form.title, type: form.type, status: form.status, reservation_time: form.reservation_time, reservation_end_time: combinedEndTime, @@ -208,9 +212,11 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p metadata: Object.keys(metadata).length > 0 ? metadata : null, } // Auto-create/update budget entry if price is set, or signal removal if cleared - saveData.create_budget_entry = form.price && parseFloat(form.price) > 0 - ? { total_price: parseFloat(form.price), category: form.budget_category || t(`reservations.type.${form.type}`) || 'Other' } - : { total_price: 0 } + if (isBudgetEnabled) { + saveData.create_budget_entry = form.price && parseFloat(form.price) > 0 + ? { total_price: parseFloat(form.price), category: form.budget_category || t(`reservations.type.${form.type}`) || 'Other' } + : { total_price: 0 } + } // If hotel with place + days, pass hotel data for auto-creation or update if (form.type === 'hotel' && form.hotel_place_id && form.hotel_start_day && form.hotel_end_day) { saveData.create_accommodation = { @@ -643,33 +649,37 @@ export function ReservationModal({ isOpen, onClose, onSave, reservation, days, p - {/* Price + Budget Category */} -
-
- - { const v = e.target.value; if (v === '' || /^\d*\.?\d{0,2}$/.test(v)) set('price', v) }} - placeholder="0.00" - style={inputStyle} /> -
-
- - set('budget_category', v)} - options={[ - { value: '', label: t('reservations.budgetCategoryAuto') }, - ...budgetCategories.map(c => ({ value: c, label: c })), - ]} - placeholder={t('reservations.budgetCategoryAuto')} - size="sm" - /> -
-
- {form.price && parseFloat(form.price) > 0 && ( -
- {t('reservations.budgetHint')} -
+ {/* Price + Budget Category — only shown when budget addon is enabled */} + {isBudgetEnabled && ( + <> +
+
+ + { const v = e.target.value; if (v === '' || /^\d*\.?\d{0,2}$/.test(v)) set('price', v) }} + placeholder="0.00" + style={inputStyle} /> +
+
+ + set('budget_category', v)} + options={[ + { value: '', label: t('reservations.budgetCategoryAuto') }, + ...budgetCategories.map(c => ({ value: c, label: c })), + ]} + placeholder={t('reservations.budgetCategoryAuto')} + size="sm" + /> +
+
+ {form.price && parseFloat(form.price) > 0 && ( +
+ {t('reservations.budgetHint')} +
+ )} + )} {/* Actions */}