From 4ed1fbfc676710ada494b7da98f4d6b59e643e7e Mon Sep 17 00:00:00 2001 From: Donkie Date: Mon, 3 Aug 2026 20:09:42 +0200 Subject: [PATCH] client_v2: let a label print the spool's own tare weight MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The v1 client offered the spool's empty-spool weight and its filament's as two separate label tokens. v2 kept only the filament's, so `{spool_weight}` in a migrated v1 design had no equivalent to map to and resolved to "?" — and a design rebuilt in v2 could only print the filament's figure, which is not necessarily the one that spool is measured against. `spool.spoolWeight` falls back to the filament the way `spool.price` already does, so a `spool.*` token prints what actually applies to that spool. --- client_v2/src/lib/labels/migrateV1.test.ts | 7 +++++++ client_v2/src/lib/labels/migrateV1.ts | 4 ++++ client_v2/src/lib/labels/template.ts | 4 ++++ 3 files changed, 15 insertions(+) diff --git a/client_v2/src/lib/labels/migrateV1.test.ts b/client_v2/src/lib/labels/migrateV1.test.ts index f4746d22..77eca7dd 100644 --- a/client_v2/src/lib/labels/migrateV1.test.ts +++ b/client_v2/src/lib/labels/migrateV1.test.ts @@ -25,6 +25,13 @@ describe('migrateTemplate', () => { expect(migrateTemplate('{filament.spool_weight}')).toBe('{filament.spoolWeight}'); }); + // v1's two tare weights are different fields, and a label that printed the + // spool's own must not silently start printing its filament's (#1013). + it("keeps the spool's own tare weight apart from its filament's", () => { + expect(migrateTemplate('{spool_weight}')).toBe('{spool.spoolWeight}'); + expect(migrateTemplate('{filament.spool_weight}')).toBe('{filament.spoolWeight}'); + }); + it('leaves paths that are already identical in both versions', () => { for (const t of ['{filament.name}', '{filament.material}', '{filament.density}']) { expect(migrateTemplate(t)).toBe(t); diff --git a/client_v2/src/lib/labels/migrateV1.ts b/client_v2/src/lib/labels/migrateV1.ts index 38f92a11..73d71f16 100644 --- a/client_v2/src/lib/labels/migrateV1.ts +++ b/client_v2/src/lib/labels/migrateV1.ts @@ -72,6 +72,10 @@ const PATH_MAP: Record = { remaining_weight: 'spool.remaining', initial_weight: 'spool.initial', used_weight: 'spool.used', + // v1 offered the spool's own tare weight as a bare `spool_weight`. It had no v2 + // equivalent until the spool gained the field back (#1013), so a migrated design + // using it resolved to "?". + spool_weight: 'spool.spoolWeight', // Filament 'filament.spool_weight': 'filament.spoolWeight', 'filament.settings_extruder_temp': 'filament.nozzleTemp', diff --git a/client_v2/src/lib/labels/template.ts b/client_v2/src/lib/labels/template.ts index 3bb780b1..343f7117 100644 --- a/client_v2/src/lib/labels/template.ts +++ b/client_v2/src/lib/labels/template.ts @@ -39,7 +39,10 @@ const RESOLVERS: Record string | number | null | un 'spool.remaining': (b) => fmtNum(b.spool?.remaining), 'spool.initial': (b) => fmtNum(b.spool?.initial), 'spool.used': (b) => (b.spool ? fmtNum(b.spool.initial - b.spool.remaining) : null), + // Both of these fall back to the filament, the way the spool itself does: a + // `spool.*` token has to print the figure that actually applies to that spool. 'spool.price': (b) => fmtNum(b.spool?.price ?? b.filament?.price), + 'spool.spoolWeight': (b) => fmtNum(b.spool?.spoolWeight ?? b.filament?.spoolWeight), 'spool.registered': (b) => b.spool?.registeredLabel, 'spool.firstUsed': (b) => b.spool?.firstUsedLabel, 'spool.lastUsed': (b) => b.spool?.lastUsedLabel, @@ -149,6 +152,7 @@ const FIXED_GROUPS: PlaceholderGroup[] = [ { token: 'spool.remaining', labelKey: m['labels.fields.remainingG'] }, { token: 'spool.initial', labelKey: m['labels.fields.initialG'] }, { token: 'spool.used', labelKey: m['spool.fields.usedWeight'] }, + { token: 'spool.spoolWeight', labelKey: m['spool.fields.spoolWeight'] }, { token: 'spool.price', labelKey: m['spool.fields.price'] }, { token: 'spool.registered', labelKey: m['spool.fields.registered'] }, { token: 'spool.firstUsed', labelKey: m['spool.fields.firstUsed'] },