Page MenuHomePhabricator

Freeze leftmost columns (checkbox, status, photo, side-panel) when horizontally scrolling the table
Closed, ResolvedPublic

Description

In the spreadsheet/table view, when a user has many metadata columns enabled and scrolls horizontally, they lose sight of which row they're editing because the photo and row-level controls scroll off the left edge. Pin the four leftmost "row identity / row action" columns so they stay in place while the metadata columns scroll underneath them, similar to Excel's Freeze Panes.

Columns to freeze (left → right):

  1. Selection checkbox
  2. Status indicator
  3. Photo thumbnail
  4. Open-side-panel button

Out of scope: Gallery/grid view (no horizontal scroll there).

Acceptance criteria:

  • In table view, scrolling horizontally keeps columns 1–4 visible against the left edge.
  • Vertical scroll still scrolls the whole row including the frozen columns.
  • Visual treatment makes the freeze boundary obvious (e.g. shadow / divider on the right edge of the frozen block).
  • No regression in row selection, status display, thumbnail click-through, or the side-panel toggle.

Source: User feedback session, 2026-05-08.

Event Timeline

Daanvr triaged this task as Medium priority.
Daanvr moved this task from To do to Doing on the Tool-upload-workbench board.

@Daanvr — implementation done, MR open at https://gitlab.wikimedia.org/daanvr/upload-workbench/-/merge_requests/11.

Blocker — preview deploy serves the wrong HTML. https://upload-workbench.toolforge.org/mr-11/ returns a 200, but with root's index.html (etag e505bd38…, references /assets/index-DlCXJMMf.js) — not the MR build. The MR build's actual assets are present at /mr-11/assets/index-CQ0_y_6C.js (the hash printed by deploy:mr), so the rsync landed correctly; the issue is the toolforge web server serving root index.html for /mr-N/ paths.

Reproducible across all three open MR previews:

$ for url in / /mr-9/ /mr-10/ /mr-11/; do curl -sI "https://upload-workbench.toolforge.org$url" | grep etag; done
etag: "e505bd38793e8efa088ed44f6392f854ba39d408"
etag: "e505bd38793e8efa088ed44f6392f854ba39d408"
etag: "e505bd38793e8efa088ed44f6392f854ba39d408"
etag: "e505bd38793e8efa088ed44f6392f854ba39d408"

/v0.4.0/ returns a directory listing instead of its own index.html (similar root-cause: toolforge static server doesn't autoserve sub-dir index.html). Assets under /mr-11/assets/ resolve fine on direct access.

What I've tried: built locally (npm run build clean), glab ci trace deploy:mr shows the build ran with VITE_BASE_PATH=/mr-11/ and rsync placed files in /data/project/upload-workbench/www/static/mr-11/. The CI step is correct; the problem is server-side path routing on Toolforge.

Question: Is this a known infrastructure gap (the MR-preview feature shipped in v0.4.0 but the static-server config wasn't updated to autoserve sub-directory index.html), or is there a CI-side fix I'm missing? If known/expected, OK to push to Reviewing with the diff alone for now? Same blocker affects T425827 and T425829 (sibling subagents).

Acknowledged — saw the T425851 comment naming this task as unblocked, and verified my build via the nginx URL: https://tools-static.wmflabs.org/upload-workbench/mr-11/ returns HTML referencing /mr-11/assets/index-CxUVOTKD.js (matches the hash from deploy:mr's build log) — confirms the per-MR rsync placed the right build.

Ready to resume verification on upload-workbench.toolforge.org/mr-11/ the moment T425851 merges and you move this back to Doing. Continuing to poll.

Preview infra fix !12 is merged & deployed; webservice restarted. Verified /mr-11/ now serves this MR's own build (etag 15666c63, asset /mr-11/assets/index-CxUVOTKD.js matches the deploy:mr build). Moving to Reviewing.

MR: https://gitlab.wikimedia.org/daanvr/upload-workbench/-/merge_requests/11
Preview: https://upload-workbench.toolforge.org/mr-11/