Fixed-value EXIF chips for read-only camera columns (T426450)

Summary

  • Replaces the muted "uneditable" rendering of the six read-only EXIF columns (camera, lens, focal length, ISO, aperture, shutter) with a fixed chip pill — non-removable, non-editable, click-to-info — so the cells stop reading as "greyed out for some reason" and start reading as "this is fixed structured data baked into the file".
  • Each chip's click opens an info popover that names the field, shows the value, explains why the workbench can't suppress it on publish, and lists every other raw EXIF tag the API surfaced for the file (so the user knows the full picture beyond the visible columns).
  • Visual primitive (.chip-pill) is shared with the chip-template editor landing in T425887/!54 — same shape, this MR adds a .chip-pill--fixed modifier with a neutral/subtle tone (the user can't act on it, the colour shouldn't promise an action).

Phabricator

  • T426450 — chips for fixed values

Cells in scope

camera, lens, focal, iso, aperture, shutter — the six tone:"exif" + editable:false + immutable:true columns in getAllColumns (src/table.jsx:97-102).

Cells deliberately NOT in scope

  • dateTaken, cameraLocation — EXIF-default but user-overridable (editable:true); keep the inline editor.
  • size, dimensions, status — immutable but not EXIF (computed from upload state); keep their existing rendering.
  • wikitext — immutable launcher cell; unchanged.

Cross-MR coordination with !54 (T425887)

.chip-pill is the shared visual primitive. T425887/!54 introduces a richer set of .chip-pill__btn / .chip-pill__text / .chip-pill__icon rules for actively-editable chips in the cell editor; this MR defines the same minimal .chip-pill base + a .chip-pill--fixed modifier unique to fixed EXIF cells. The two definitions are compatible and the cross-MR merge is order-independent in either direction. If !54 lands first, the modifier override here just rides on top of !54's base. If this MR lands first, the base will be slightly upgraded by !54.

Test plan

  • Open the preview (https://upload-workbench.toolforge.org/mr-<IID>/).
  • In a stash with at least one camera-EXIF-bearing file, the camera / lens / focal / ISO / aperture / shutter cells render as chip pills (rounded outline, neutral tone, inline lock icon) instead of greyed text.
  • Cells with no value (file has no Make/Model, etc.) still render as placeholder. No empty chip.
  • Hover the chip → cursor turns to cursor: help, border darkens.
  • Click the chip → info popover anchors to the chip, names the field, shows the value, explains "embedded in the file", and lists every other EXIF tag the API exposed for that file (or "No other EXIF data" when the API only returned the curated fields).
  • Click outside the popover or press Esc → popover closes.
  • Clicking blank space in the cell (to the right of the chip) does NOT open the popover, and (consistent with the existing immutable-cell behaviour) lets the row click bubble to open the row detail.
  • No chip removal control (no ×).
  • No edit affordance — clicking the cell does not open an inline editor.
  • Published files with EXIF (in the Upload history section) also get the chip treatment.
  • npm run build (incl. scripts/check-undefined-refs.mjs) passes.
  • Re-running the build against main post-merge still passes (no cross-MR orphan refs).

🤖 Generated with Claude Code

Merge request reports

Loading