|
@@ -35,6 +35,7 @@ export function SpoolFormModal({ isOpen, onClose, spool, printersWithCalibration
|
|
|
const [formData, setFormData] = useState<SpoolFormData>(defaultFormData);
|
|
const [formData, setFormData] = useState<SpoolFormData>(defaultFormData);
|
|
|
const [errors, setErrors] = useState<Partial<Record<keyof SpoolFormData, string>>>({});
|
|
const [errors, setErrors] = useState<Partial<Record<keyof SpoolFormData, string>>>({});
|
|
|
const [activeTab, setActiveTab] = useState<TabId>('filament');
|
|
const [activeTab, setActiveTab] = useState<TabId>('filament');
|
|
|
|
|
+ const [weightTouched, setWeightTouched] = useState(false);
|
|
|
|
|
|
|
|
// Cloud presets
|
|
// Cloud presets
|
|
|
const [cloudAuthenticated, setCloudAuthenticated] = useState(false);
|
|
const [cloudAuthenticated, setCloudAuthenticated] = useState(false);
|
|
@@ -195,6 +196,7 @@ export function SpoolFormModal({ isOpen, onClose, spool, printersWithCalibration
|
|
|
}
|
|
}
|
|
|
setErrors({});
|
|
setErrors({});
|
|
|
setActiveTab('filament');
|
|
setActiveTab('filament');
|
|
|
|
|
+ setWeightTouched(false);
|
|
|
}
|
|
}
|
|
|
}, [isOpen, spool]);
|
|
}, [isOpen, spool]);
|
|
|
|
|
|
|
@@ -208,6 +210,7 @@ export function SpoolFormModal({ isOpen, onClose, spool, printersWithCalibration
|
|
|
// Update field helper
|
|
// Update field helper
|
|
|
const updateField = <K extends keyof SpoolFormData>(key: K, value: SpoolFormData[K]) => {
|
|
const updateField = <K extends keyof SpoolFormData>(key: K, value: SpoolFormData[K]) => {
|
|
|
setFormData(prev => ({ ...prev, [key]: value }));
|
|
setFormData(prev => ({ ...prev, [key]: value }));
|
|
|
|
|
+ if (key === 'weight_used') setWeightTouched(true);
|
|
|
if (errors[key]) {
|
|
if (errors[key]) {
|
|
|
setErrors(prev => ({ ...prev, [key]: undefined }));
|
|
setErrors(prev => ({ ...prev, [key]: undefined }));
|
|
|
}
|
|
}
|
|
@@ -333,7 +336,6 @@ export function SpoolFormModal({ isOpen, onClose, spool, printersWithCalibration
|
|
|
rgba: formData.rgba || null,
|
|
rgba: formData.rgba || null,
|
|
|
label_weight: formData.label_weight,
|
|
label_weight: formData.label_weight,
|
|
|
core_weight: formData.core_weight,
|
|
core_weight: formData.core_weight,
|
|
|
- weight_used: formData.weight_used,
|
|
|
|
|
slicer_filament: formData.slicer_filament || null,
|
|
slicer_filament: formData.slicer_filament || null,
|
|
|
slicer_filament_name: presetName,
|
|
slicer_filament_name: presetName,
|
|
|
nozzle_temp_min: null,
|
|
nozzle_temp_min: null,
|
|
@@ -341,6 +343,12 @@ export function SpoolFormModal({ isOpen, onClose, spool, printersWithCalibration
|
|
|
note: formData.note || null,
|
|
note: formData.note || null,
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+ // Only send weight_used when creating or when explicitly changed by the user.
|
|
|
|
|
+ // This prevents stale cached values from overwriting usage-tracker data.
|
|
|
|
|
+ if (!isEditing || weightTouched) {
|
|
|
|
|
+ data.weight_used = formData.weight_used;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
if (isEditing) {
|
|
if (isEditing) {
|
|
|
updateMutation.mutate(data);
|
|
updateMutation.mutate(data);
|
|
|
} else {
|
|
} else {
|