Repository navigation
Conversation
Lay the keys table out fixed with widths for API Key, Active and Actions, so Description takes the remaining width and wraps a long unbroken value instead of widening the table. Edit and Delete sit in one nowrap container so they no longer stack. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ritwik-g
left a comment
There was a problem hiding this comment.
Review — round 1 (self-review-loop), tip 1363ff641
Verdict — REQUEST CHANGES
Mode: LITE — single-pass, 19/19 lenses, one reader, no subagents. Eligible: 2 files / 24 lines, no disqualifiers.
Summary — Critical: 0 · High: 0 · Medium: 1 · Low: 0 · Lenses run: 19/19
Findings
1. [Medium] [Lens 3] — Fixed px column width can't hold the ch-sized key, so Show/Hide spills into the next column
- Location:
frontend/src/components/deployments/manage-keys/ManageKeys.jsx:L267-L268 - Failure mode: the API Key column is fixed at
390px, but its content scales with font size:.manage-keys__keyhasmin-width: 36ch(ManageKeys.css:L29), and the buttons and gaps use rem-based Tailwind sizes. At Chrome's "Large" font setting (20px root) the cell overflows enough that the Actions column's Edit icon sits on top of the Show key button. The click lands on Edit, so the key can't be revealed. At the default 16px root the eye button already ends 8px past its cell. - Evidence: headless Chromium, harness rendering
ManageKeysat tip. 16px root: cell right edge 715, eye button right edge 723. 20px root: Playwright's click onShow API keyfails with "lucide-pencil… from<td …text-center>subtree intercepts pointer events". - Suggested fix: size the columns in relative units, and let the key flex inside the cell with an ellipsis, so Show/Hide is pinned to the cell's right edge and can't overlap the next column.
- Confidence: High
- Verification:
VERIFIED — headless Chromium (playwright 1228 shell) on a Vite harness, root font-size 16px and 20px; bounding-rect measurements and the intercepted click above
Lens checklist
- Spec & intent — Clean
- Architectural fit & precedent — Clean
- Correctness & edge cases — See findings #1
- Security — Clean
- Data integrity & migrations — N/A — no data or schema touched
- Concurrency — N/A — no shared state or async ordering changed
- API & contract compatibility — N/A — no wire format, endpoint or payload touched
- Reliability & resilience — N/A — no external calls
- Performance & cost — Clean
- Observability — N/A — no new code path that logs or meters
- Operational safety — N/A — presentational change, no rollout surface
- LLM/agent-specific — N/A — no model, prompt or tool path
- Testing — Clean
- Dependencies & build — N/A — no dependency or build change
- Code quality — Clean
- Doc & comment accuracy — Clean
- Cross-document rule consistency — Clean
- On-prem deployment experience — N/A — no chart, values, schema, on-prem settings or on-prem docs touched
- Scaling & workload lifecycle — N/A — no worker, autoscaling or lifecycle settings touched
Notes on the lenses:
- Lens 1: the title follows
TICKET [TYPE] text, as the workspace CLAUDE.md requires. - Lens 2:
tableLayout="fixed"matches theResourceTableprecedent. - Lens 4: the masking and reveal logic is untouched, and the key text isn't put into any new attribute or tooltip.
- Lens 13: the existing 9 tests pass and none were edited. The change adds no branching logic, and jsdom can't measure layout, so I verified it by rendering.
- Lens 15:
biome check's warnings are all on pre-existing lines, and formatting is clean. - Lens 17: the sweep found no other references to
keys-tableor the new classes.git log <mb>..origin/mainis empty, so the branch is current.
Open questions for the author
- With a 700px modal, Description gets about 100px once API Key holds a full UUID, so a two-word description like "Production ingest" wraps. Is that acceptable, or should the modal widen? Changing the width is a visual choice.
Assumptions made
- The Chromium in the harness, with no app shell, lays out the table the same way the app does. The before state reproduced the reported stacking and horizontal scroll, which supports this.
boundary-sweep: not triggered (no outbound client, endpoint, log line or error path)
rule-storage-check: not covered — no markdown in the diff
| dataIndex: "api_key", | ||
| key: "api_key", | ||
| // Copy, a revealed UUID key (.manage-keys__key) and Show/Hide. | ||
| width: 390, |
There was a problem hiding this comment.
[Medium] [Lens 3] — Fixed px column width can't hold the ch-sized key, so Show/Hide spills into the next column (finding #1, round 1, tip 1363ff641)
390px doesn't scale, but the cell's content does (.manage-keys__key { min-width: 36ch } and the rem-based buttons). At a 20px root font, the Actions column's Edit icon covers the Show key button, so the click hits Edit and the key can't be revealed. At 16px the eye button already ends 8px past the cell (715 vs 723).
Suggested fix: relative column units, and a key that flexes inside the cell with an ellipsis, so Show/Hide stays pinned inside the cell.
Verification: VERIFIED. Headless Chromium on a Vite harness at 16px and 20px root font, with bounding-rect measurements and a Playwright click intercepted by lucide-pencil.
The API Key column was a fixed 390px while the key's 36ch minimum width and the rem-sized buttons grow with the font. At a 20px root font the Edit icon covered the Show key button. The key now fills the cell between Copy and Show/Hide and truncates with an ellipsis; column widths are relative (62%, 4.5rem, 5.5rem). The full key stays in the text for Copy and the UI regression specs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|



What
tableLayout="fixed"with relative widths for API Key (62%), Active (4.5rem) and Actions (5.5rem). Description takes the remaining width and wraps a long value inside its cell.inline-flex,nowrapcontainer, so they stay side by side.Why
inline-flexicons wrapped onto two lines. A long description with no break points widened the table past the modal, which put Active and Actions behind a horizontal scroll (UN-4553 test report c47593). Toggling Active reset that scroll; with no scroll left, that goes away too.How
tableLayoutnote inDataTable.jsx;ResourceTablealready usesfixedfor the same reason). Withfixed, the declared widths hold.<td>, with no wrapper element. The UI regression specs find a key's row with//td[text()='<name>']and//td[contains(text(),'API Key')], so the wrap is done with CSS on.keys-table td:first-child(overflow-wrap: anywhere) and not with a truncatingTypography.Text.Can this PR break any existing features. If yes, please list possible items. If no, please explain why. (PS: Admins do not merge the PR without this section filled)
ManageKeys.test.jsxpasses (9/9). I checked the locators the UI regression specs use for this modal (api-deploy-page.ts,pipeline-page.tsfrom unstract-ui-test-automation#369) against the rendered DOM. Row by description, keyspan,Show API keybutton,role=switchand thetrashicon each resolve to exactly one element.pipeline-page.ts'sapiKeyCopyLocator(//th[text()='API Key']…) matches nothing because DataTable wraps every header title in a<span>. Nothing calls that getter.Database Migrations
Env Config
Relevant Docs
Related Issues or PRs
Dependencies Versions
Notes on Testing
scrollWidth1082px in a 650px box (horizontal scroll); the Delete icon sits 30px below Edit on every row.Screenshots
Before/after screenshots were taken locally (headless harness above). The measurements are in Notes on Testing; I can attach the images on request.
Checklist
I have read and understood the Contribution Guidelines.
🤖 Generated with Claude Code