Skip to content

fix: improve object browser responsiveness and configure batch size - #281

Merged
cxymds merged 1 commit into
mainfrom
cxymds/issue-274-object-browser-performance
Oct 28, 2026
Merged

cxymds merged 1 commit into
mainfrom
cxymds/issue-274-object-browser-performance

Conversation

@cxymds

@cxymds cxymds commented Oct 28, 2026

Copy link
Copy Markdown
Member

Pull Request

Description

The Object Browser mounts every loaded object row, which makes details and preview interactions sluggish in large listings. Render only the visible object rows and let users choose a smaller request batch size.

  • Add an Objects per batch selector with 100, 250, 500, and 1,000 options; keep 1,000 as the default.
  • Persist the preference in local storage and pass it to ListObjectsV2.MaxKeys.
  • Preserve sequential continuation-token loading and ignore stale responses after a batch-size change.
  • Add opt-in window virtualization to the shared DataTable and enable it for the Object Browser. Other tables retain their existing rendering behavior.
  • Translate the label across all 14 supported locales and add regression coverage.

Type of Change

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Documentation update
  • Code refactoring
  • Performance improvement
  • Test improvements
  • Security fix

Testing

  • Unit tests added/updated
  • Manual testing completed

All local checks passed, including 811/811 tests and the production build/static export:

nvm use v22
pnpm install --frozen-lockfile
pnpm type-check
pnpm lint
pnpm format:check
pnpm test:run
pnpm build
git diff --check

Browser verification used the real application with mocked S3/API responses:

  • Verified all four max-keys values, reload persistence, sequential loading through 3,000 objects, and stale-response handling when switching batch sizes.
  • With 1,000 loaded objects, the tested desktop viewport mounted approximately 22 object rows; the baseline mounted all 1,000. Mounted rows remained in the dozens after loading 3,000 objects.
  • Exercised details, preview, selection across scrolling, sorting, filtering, no matching results, empty buckets, and recovery from a 403 error.
  • Checked dark mode and a 390 × 844 mobile viewport; no page-level horizontal overflow or browser page errors were observed.
  • Regression tests cover supported/invalid batch sizes, virtual row mounting and scrolling, append/reload states, and unchanged rendering for tables without virtualization.

Checklist

  • Code follows the project's style guidelines
  • Self-review completed
  • TypeScript types are properly defined
  • All commit messages are in English (Conventional Commits)
  • All existing tests pass
  • No new dependencies added, or they are justified

Related Issues

Closes #274

Screenshots (if applicable)

The before/after captures use the same mocked 1,000-object listing.

Desktop — before Desktop — after
Desktop before Desktop after
Mobile — before Mobile — after
Mobile before Mobile after
Additional states: batch selector, dark mode, empty bucket, and error

Mobile batch selector:

Mobile batch selector

Dark mode with batch selector:

Dark mode

Empty bucket:

Empty bucket

403 error:

403 error

Additional Notes

  • Uses the existing @tanstack/react-virtual dependency; no new dependencies.
  • Browser checks validate UI behavior and DOM row counts with mocked responses. They do not establish backend throughput or production interaction latency.
  • Screenshot assets are kept on the separate cxymds/issue-274-screenshots branch, outside this PR's code diff.
  • Includes the Next.js-generated heading adjustment in AGENTS.md, as required by the repository guidance.

Loading
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] Object Browser becomes sluggish with 1,000 loaded objects — request configurable lazy-loading batch size

1 participant