diff --git a/frontend/src/components/AssignSpoolModal.tsx b/frontend/src/components/AssignSpoolModal.tsx
index 10011af81..222e84391 100644
--- a/frontend/src/components/AssignSpoolModal.tsx
+++ b/frontend/src/components/AssignSpoolModal.tsx
@@ -177,7 +177,7 @@ export function AssignSpoolModal({ isOpen, onClose, printerId, amsId, trayId, tr
{spool.color_name || ''}
{spool.label_weight ? ` - ${spool.label_weight}g` : ''}
- {spool.weight_used > 0 ? ` (${Math.round(spool.weight_used)}g used)` : ''}
+ {spool.label_weight ? ` (${Math.max(0, Math.round(spool.label_weight - spool.weight_used))}g ${t('ams.remainingUnit')})` : ''}
{selectedSpoolId === spool.id && (
diff --git a/frontend/src/components/FilamentHoverCard.tsx b/frontend/src/components/FilamentHoverCard.tsx
index f1adb160c..503d02868 100644
--- a/frontend/src/components/FilamentHoverCard.tsx
+++ b/frontend/src/components/FilamentHoverCard.tsx
@@ -24,7 +24,7 @@ interface SpoolmanConfig {
interface InventoryConfig {
onAssignSpool?: () => void;
onUnassignSpool?: () => void;
- assignedSpool?: { id: number; material: string; brand: string | null; color_name: string | null } | null;
+ assignedSpool?: { id: number; material: string; brand: string | null; color_name: string | null; remainingWeightGrams?: number | null } | null;
}
interface ConfigureSlotConfig {
@@ -148,6 +148,7 @@ export function FilamentHoverCard({ data, children, disabled, className = '', sp
};
const colorHex = data.colorHex ? `#${data.colorHex.replace('#', '')}` : null;
+ const assignedRemainingWeight = inventory?.assignedSpool?.remainingWeightGrams ?? null;
return (
- {data.fillLevel !== null ? `${data.fillLevel}%` : '—'}
+ {data.fillLevel !== null ? `${data.fillLevel}%` : '—'}
+ {assignedRemainingWeight !== null && data.fillLevel !== null && (
+ • {assignedRemainingWeight}g
+ )}
{data.fillSource === 'spoolman' && data.fillLevel !== null && (
{t('spoolman.fillSourceLabel')}
)}
diff --git a/frontend/src/i18n/locales/de.ts b/frontend/src/i18n/locales/de.ts
index 2c4b87003..90ed1151d 100644
--- a/frontend/src/i18n/locales/de.ts
+++ b/frontend/src/i18n/locales/de.ts
@@ -2682,6 +2682,8 @@ export default {
kFactor: 'K-Faktor',
fill: 'Füllstand',
configure: 'Konfigurieren',
+ used: 'verwendet',
+ remainingUnit: 'verbleibend',
},
// Print modal
diff --git a/frontend/src/i18n/locales/en.ts b/frontend/src/i18n/locales/en.ts
index 36a4a9f43..4a60844a7 100644
--- a/frontend/src/i18n/locales/en.ts
+++ b/frontend/src/i18n/locales/en.ts
@@ -2686,6 +2686,8 @@ export default {
kFactor: 'K Factor',
fill: 'Fill',
configure: 'Configure',
+ used: 'used',
+ remainingUnit: 'remaining',
},
// Print modal
diff --git a/frontend/src/i18n/locales/fr.ts b/frontend/src/i18n/locales/fr.ts
index 08e10d7d8..f176a0fb6 100644
--- a/frontend/src/i18n/locales/fr.ts
+++ b/frontend/src/i18n/locales/fr.ts
@@ -2674,6 +2674,8 @@ export default {
kFactor: 'Facteur K',
fill: 'Remplir',
configure: 'Configurer',
+ used: 'utilisé',
+ remainingUnit: 'restant',
},
// Print modal
diff --git a/frontend/src/i18n/locales/it.ts b/frontend/src/i18n/locales/it.ts
index 1afc233be..e9ca369e6 100644
--- a/frontend/src/i18n/locales/it.ts
+++ b/frontend/src/i18n/locales/it.ts
@@ -2347,7 +2347,7 @@ export default {
kProfiles: 'K-Profiles',
addKProfile: 'Aggiungi K-Profile',
assignSpool: 'Assegna Bobina',
- unassignSpool: 'Deassegna',
+ unassignSpool: 'Scollega',
assignSuccess: 'Bobina assegnata e slot AMS configurato',
assignFailed: 'Assegnazione bobina fallita',
selectSpool: 'Seleziona una bobina da assegnare a questo slot',
@@ -2397,8 +2397,10 @@ export default {
externalSpool: 'Bobina esterna',
profile: 'Profilo',
kFactor: 'K Factor',
- fill: 'Riempi',
+ fill: 'Livello',
configure: 'Configura',
+ used: 'utilizzato',
+ remainingUnit: 'rimanente',
},
// Print modal
diff --git a/frontend/src/i18n/locales/ja.ts b/frontend/src/i18n/locales/ja.ts
index 390012f88..2637cd2e1 100644
--- a/frontend/src/i18n/locales/ja.ts
+++ b/frontend/src/i18n/locales/ja.ts
@@ -2604,6 +2604,8 @@ export default {
kFactor: 'K値',
fill: '充填率',
configure: '設定',
+ used: '使用済み',
+ remainingUnit: '残り',
},
printModal: {
flowCalibration: 'フローキャリブレーション',
diff --git a/frontend/src/pages/PrintersPage.tsx b/frontend/src/pages/PrintersPage.tsx
index 0bb9cea71..859be1fa1 100644
--- a/frontend/src/pages/PrintersPage.tsx
+++ b/frontend/src/pages/PrintersPage.tsx
@@ -2907,6 +2907,7 @@ function PrinterCard({
material: assignment.spool.material,
brand: assignment.spool.brand,
color_name: assignment.spool.color_name,
+ remainingWeightGrams: Math.max(0, Math.round(assignment.spool.label_weight - assignment.spool.weight_used)),
} : null,
onAssignSpool: filamentData.vendor !== 'Bambu Lab' ? () => setAssignSpoolModal({
printerId: printer.id,
@@ -3144,6 +3145,7 @@ function PrinterCard({
material: assignment.spool.material,
brand: assignment.spool.brand,
color_name: assignment.spool.color_name,
+ remainingWeightGrams: Math.max(0, Math.round(assignment.spool.label_weight - assignment.spool.weight_used)),
} : null,
onAssignSpool: filamentData.vendor !== 'Bambu Lab' ? () => setAssignSpoolModal({
printerId: printer.id,
@@ -3330,6 +3332,7 @@ function PrinterCard({
material: assignment.spool.material,
brand: assignment.spool.brand,
color_name: assignment.spool.color_name,
+ remainingWeightGrams: Math.max(0, Math.round(assignment.spool.label_weight - assignment.spool.weight_used)),
} : null,
onAssignSpool: () => setAssignSpoolModal({
printerId: printer.id,