From c4c596e1a315aa0128916a32cc9da8394fed9aba Mon Sep 17 00:00:00 2001 From: PerryLink Date: Sun, 1 Nov 2026 22:47:18 +0800 Subject: [PATCH] fix(web): clip the suite version cells that still overflow #1040 clipped the pinned version column in the suite member table and the version ledger's member list. Two cells in the same feature kept rendering the same 60+ character immutable snapshot versions unclipped: - the version ledger's own version cell, in an 84px grid column; - the bundle operation detail's member cell, in a 90px grid column. Both bleed into the neighbouring status/visibility columns. Clip them with the truncate + title pattern used elsewhere in these tables, and assert the clipped cell in the existing operation-detail test. Regenerate docs/frontend-analytics-manifest.json: the marker in suite-bundle-operation-detail.tsx moved three lines down. Signed-off-by: PerryLink --- docs/frontend-analytics-manifest.json | 6 ++-- .../suite-bundle-operation-detail.test.tsx | 31 +++++++++++++++++++ .../suite/suite-bundle-operation-detail.tsx | 7 +++-- .../features/suite/suite-version-ledger.tsx | 8 ++--- 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/docs/frontend-analytics-manifest.json b/docs/frontend-analytics-manifest.json index 3b230fb59..6e280c546 100644 --- a/docs/frontend-analytics-manifest.json +++ b/docs/frontend-analytics-manifest.json @@ -352,9 +352,9 @@ {"file":"web/src/features/suite/suite-bundle-operation-detail.tsx","line":131,"host":"Button","prop":"data-analytics-id","event":"click","ids":["suite.draft.open"]}, {"file":"web/src/features/suite/suite-bundle-operation-detail.tsx","line":137,"host":"Button","prop":"data-analytics-id","event":"click","ids":["suite.operation.restart"]}, {"file":"web/src/features/suite/suite-bundle-operation-detail.tsx","line":181,"host":"Button","prop":"data-analytics-id","event":"click","ids":["suite.operation.refresh"]}, - {"file":"web/src/features/suite/suite-bundle-operation-detail.tsx","line":280,"host":"Button","prop":"data-analytics-id","event":"click","ids":["skill.detail.open"]}, - {"file":"web/src/features/suite/suite-bundle-operation-detail.tsx","line":310,"host":"ConfirmDialog","prop":"confirmAnalyticsId","event":"click","ids":["suite.operation.cancel.confirm"]}, - {"file":"web/src/features/suite/suite-bundle-operation-detail.tsx","line":310,"host":"ConfirmDialog","prop":"cancelAnalyticsId","event":"click","ids":["suite.operation.cancel.cancel"]}, + {"file":"web/src/features/suite/suite-bundle-operation-detail.tsx","line":283,"host":"Button","prop":"data-analytics-id","event":"click","ids":["skill.detail.open"]}, + {"file":"web/src/features/suite/suite-bundle-operation-detail.tsx","line":313,"host":"ConfirmDialog","prop":"confirmAnalyticsId","event":"click","ids":["suite.operation.cancel.confirm"]}, + {"file":"web/src/features/suite/suite-bundle-operation-detail.tsx","line":313,"host":"ConfirmDialog","prop":"cancelAnalyticsId","event":"click","ids":["suite.operation.cancel.cancel"]}, {"file":"web/src/features/suite/suite-management-actions.tsx","line":123,"host":"Button","prop":"data-analytics-id","event":"click","ids":["suite.draft.reopen"]}, {"file":"web/src/features/suite/suite-management-actions.tsx","line":128,"host":"Button","prop":"data-analytics-id","event":"click","ids":["suite.version.create"]}, {"file":"web/src/features/suite/suite-management-actions.tsx","line":131,"host":"Button","prop":"data-analytics-id","event":"click","ids":["suite.version.yank"]}, diff --git a/web/src/features/suite/suite-bundle-operation-detail.test.tsx b/web/src/features/suite/suite-bundle-operation-detail.test.tsx index 7823be0f6..21c086c4e 100644 --- a/web/src/features/suite/suite-bundle-operation-detail.test.tsx +++ b/web/src/features/suite/suite-bundle-operation-detail.test.tsx @@ -93,6 +93,37 @@ describe('SuiteBundleOperationDetail', () => { }) }) + it('clips a long immutable member version so it cannot bleed into the status column', () => { + const version = `snapshot-${'a'.repeat(60)}` + mocks.operation.data = { + operationId: 'operation-1', + status: 'CANCELLED', + mode: 'CREATE', + targetCoordinate: '@global/care-suite', + targetVersion: '1.0.0', + updatedAt: '2026-09-14T04:00:00Z', + members: [{ + position: 0, + redacted: false, + coordinate: '@global/member-under-review', + status: 'CANCELLED', + version, + sourceType: 'PACKAGE', + relationship: 'ADDED', + publishAction: 'CREATE_VERSION', + visibility: 'PUBLIC', + errors: [], + warnings: [], + }], + } + + render() + + const cell = screen.getByTitle(`v${version}`) + expect(cell.className).toContain('truncate') + expect(cell.textContent).toBe(`v${version}`) + }) + it('explains when a new member Skill does not exist yet', () => { mocks.operation.data = { operationId: 'operation-planned', diff --git a/web/src/features/suite/suite-bundle-operation-detail.tsx b/web/src/features/suite/suite-bundle-operation-detail.tsx index 4780f4b44..b44ae730e 100644 --- a/web/src/features/suite/suite-bundle-operation-detail.tsx +++ b/web/src/features/suite/suite-bundle-operation-detail.tsx @@ -264,8 +264,11 @@ export function SuiteBundleOperationDetail({ operationId }: { operationId: strin {member.publishAction ? ` · ${t(`suite.bundle.action.${member.publishAction}`)}` : null}

) : —} -

- {member.visibility ?? '—'}
v{member.version ?? '—'} +

+ {member.visibility ?? '—'}
+ + v{member.version ?? '—'} +