From ed5af66839a4c5b6f768db0f762379b602e94258 Mon Sep 17 00:00:00 2001 From: Chanakyan Date: Mon, 18 May 2026 16:04:42 +0530 Subject: [PATCH] feat(inventory): show spool ID in edit modal and AMS hover card (#1385) (#1402) feat(inventory): show spool ID in edit modal and AMS hover card (#1385) --- .../components/FilamentHoverCard.test.tsx | 15 +++++ .../components/SpoolFormModal.test.tsx | 64 +++++++++++++++++++ frontend/src/components/FilamentHoverCard.tsx | 13 ++-- frontend/src/components/SpoolFormModal.tsx | 5 +- 4 files changed, 91 insertions(+), 6 deletions(-) diff --git a/frontend/src/__tests__/components/FilamentHoverCard.test.tsx b/frontend/src/__tests__/components/FilamentHoverCard.test.tsx index 484f1ee81..83f8dc7c4 100644 --- a/frontend/src/__tests__/components/FilamentHoverCard.test.tsx +++ b/frontend/src/__tests__/components/FilamentHoverCard.test.tsx @@ -310,6 +310,21 @@ describe('FilamentHoverCard', () => { }); expect(screen.queryAllByTitle('Open in Inventory')).toHaveLength(1); }); + + it('shows the spool ID in the assigned-spool block', async () => { + renderWithHover( + +
trigger
+
+ ); + vi.advanceTimersByTime(100); + await waitFor(() => { + expect(screen.getByText('#42')).toBeInTheDocument(); + }); + }); }); }); diff --git a/frontend/src/__tests__/components/SpoolFormModal.test.tsx b/frontend/src/__tests__/components/SpoolFormModal.test.tsx index b677399f4..32cea5070 100644 --- a/frontend/src/__tests__/components/SpoolFormModal.test.tsx +++ b/frontend/src/__tests__/components/SpoolFormModal.test.tsx @@ -1117,3 +1117,67 @@ describe('SpoolFormModal copy mode', () => { expect((payload as Record).weight_used).toBe(0); }); }); + +// The "#" affordance in the modal header (#1385) is only meaningful when +// editing an existing spool — there's no ID yet on create, and the copy path +// is producing a new spool too. Guard all three cases so a future refactor +// can't quietly start leaking the source spool's ID into the Copy modal. +describe('SpoolFormModal header spool ID (#1385)', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('shows # next to the title when editing an existing spool', async () => { + render( + + ); + + await waitFor(() => { + expect(screen.getByText('Edit Spool')).toBeInTheDocument(); + }); + // existingSpool.id is 1; render as "#1" in the modal header. + expect(screen.getByText('#1')).toBeInTheDocument(); + }); + + it('does not show an ID when creating a new spool', async () => { + render( + + ); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: 'Add Spool' })).toBeInTheDocument(); + }); + // No spool exists yet → header carries no "#..." token. + expect(screen.queryByText(/^#\d+$/)).not.toBeInTheDocument(); + }); + + it('does not leak the source spool ID when copying', async () => { + // Copying produces a fresh spool — surfacing the source ID in the + // "Copy Spool" header would mislead the user into thinking the new + // spool inherits it. + render( + + ); + + await waitFor(() => { + expect(screen.getByRole('heading', { name: 'Copy Spool' })).toBeInTheDocument(); + }); + expect(screen.queryByText(/^#\d+$/)).not.toBeInTheDocument(); + }); +}); diff --git a/frontend/src/components/FilamentHoverCard.tsx b/frontend/src/components/FilamentHoverCard.tsx index b20dfa45a..fdd244518 100644 --- a/frontend/src/components/FilamentHoverCard.tsx +++ b/frontend/src/components/FilamentHoverCard.tsx @@ -366,11 +366,14 @@ export function FilamentHoverCard({ data, children, disabled, className = '', sp {t('inventory.assigned')} -

- {inventory.assignedSpool.brand ? `${inventory.assignedSpool.brand} ` : ''} - {inventory.assignedSpool.material} - {inventory.assignedSpool.color_name ? ` - ${inventory.assignedSpool.color_name}` : ''} -

+
+

+ {inventory.assignedSpool.brand ? `${inventory.assignedSpool.brand} ` : ''} + {inventory.assignedSpool.material} + {inventory.assignedSpool.color_name ? ` - ${inventory.assignedSpool.color_name}` : ''} +

+ #{inventory.assignedSpool.id} +
{(!spoolman?.linkedSpoolId || inventory.assignedSpool!.id !== spoolman.linkedSpoolId) && (