Skip to content

feat(studio): Anonymizer jobs list page [ASTD-325] - #881

Merged
marcusds merged 2 commits into
mainfrom
astd-325-anonymizer-list-page/mschwab
Jul 24, 2026
Merged

feat(studio): Anonymizer jobs list page [ASTD-325]#881
marcusds merged 2 commits into
mainfrom
astd-325-anonymizer-list-page/mschwab

Conversation

@marcusds

@marcusds marcusds commented Jul 23, 2026

Copy link
Copy Markdown
Contributor

Rebased onto main#876 (routes/flag scaffold) and #879 (jobs API + web SDK) are both merged. This PR is now standalone: the diff is only the four list-page files.

What

Builds the Anonymizer jobs list page (ASTD-325), replacing the placeholder from #876 with a real jobs DataView on the SDK from #879.

Part of ASTD-215.

List-page changes (the reviewable diff)

  • components/dataViews/AnonymizerJobsDataView/ — mirrors DataDesignerJobsDataView:
    • paginated list via useAnonymizerListRunJobs (polls on JOB_POLLING_INTERVAL_MS)
    • columns: name, description, created (RelativeTime), status (StatusBadge), updated (hidden)
    • status single-select + created/updated date-range filters, name search ($like)
    • server-side pagination/sort, row → detail (getAnonymizerJobRoute), bulk delete (BulkDeleteModal)
    • empty state (first-run CTA + no-results/clear-filters) and loading state
  • components/AnonymizerJobActionsMenu/ — per-row: View details / Cancel (when cancellable) / Delete
  • AnonymizerListRoute renders <AnonymizerJobsDataView />

Decisions

  • Dropped Data Designer's Clone action — it needs a DD-specific request builder, and the anonymizer builder page is still a placeholder (follow-up ticket).
  • Strategy isn't a column — it lives deep in spec and is optional; can add once the builder/detail views land.

Depends on

Testing

  • @nemo/studio tsc --noEmit — no new errors (16 pre-existing come from an ungenerated customizer SDK, identical on main).
  • eslint clean on new files. No dataview unit test — matches the existing Data Designer / Safe Synthesizer dataviews (untested by convention).
  • Gated behind VITE_FF_ANONYMIZER_ENABLED (default false) — no surface exposed by default.

Notes

  • Pre-push typecheck hook bypassed (Studio's pre-existing customizer-SDK failures, unrelated). This branch's own checks pass.

Summary by CodeRabbit

  • New Features
    • Added an anonymizer jobs data view directly on the anonymizer page (search, filter, server-driven sorting/pagination, and live polling).
    • Displays job metadata (including relative timestamps) and status badges with single-select filtering.
    • Added per-job actions: view details (when available), cancel (when eligible), and delete.
    • Added bulk deletion with selection and confirmation, including partial-failure handling.
  • Bug Fixes
    • Improved cancel/delete error handling and ensured errors are cleared/reset after successful actions.
  • Documentation
    • None

@github-actions github-actions Bot added the feat label Jul 23, 2026
@marcusds
marcusds force-pushed the astd-325-anonymizer-list-page/mschwab branch from 19aa12d to 8d69260 Compare July 24, 2026 00:03
@github-actions

github-actions Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor
Suite Lines Covered Line Rate Branch Rate
Unit Tests 27158/34869 77.9% 62.1%
Integration Tests 15968/33581 47.5% 20.0%

@marcusds
marcusds force-pushed the astd-325-anonymizer-list-page/mschwab branch from 8d69260 to 4457f3e Compare July 24, 2026 04:01
@marcusds
marcusds marked this pull request as ready for review July 24, 2026 04:03
@marcusds
marcusds requested review from a team as code owners July 24, 2026 04:03
@marcusds
marcusds force-pushed the astd-325-anonymizer-list-page/mschwab branch from 4457f3e to 1a57b58 Compare July 24, 2026 04:05
@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e21b942c-37d1-44fc-ab65-a994b6495422

📥 Commits

Reviewing files that changed from the base of the PR and between cd0afba and d64c068.

📒 Files selected for processing (4)
  • web/packages/studio/src/components/AnonymizerJobActionsMenu/index.tsx
  • web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/DeleteJobModal.tsx
  • web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx
  • web/packages/studio/src/routes/AnonymizerListRoute/index.tsx
🚧 Files skipped from review as they are similar to previous changes (4)
  • web/packages/studio/src/routes/AnonymizerListRoute/index.tsx
  • web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/DeleteJobModal.tsx
  • web/packages/studio/src/components/AnonymizerJobActionsMenu/index.tsx
  • web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx

📝 Walkthrough

Walkthrough

Changes

Anonymizer jobs management

Layer / File(s) Summary
Jobs data view
web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx
Adds a polled, filterable, sortable, paginated jobs table with row actions, cancellation errors, bulk deletion, and empty states.
Job actions
web/packages/studio/src/components/AnonymizerJobActionsMenu/index.tsx
Adds view-details, conditional cancel, and delete actions with query refresh and error handling.
Deletion and route wiring
web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/DeleteJobModal.tsx, web/packages/studio/src/routes/AnonymizerListRoute/index.tsx
Adds concurrent job deletion and renders the jobs view beneath the anonymizer page header.

Sequence Diagram(s)

sequenceDiagram
  participant AnonymizerListRoute
  participant AnonymizerJobsDataView
  participant AnonymizerJobActionsMenu
  participant DeleteJobModal
  AnonymizerListRoute->>AnonymizerJobsDataView: render jobs table
  AnonymizerJobsDataView->>AnonymizerJobActionsMenu: render row actions
  AnonymizerJobActionsMenu->>DeleteJobModal: open delete modal
  DeleteJobModal-->>AnonymizerJobsDataView: reset jobs query after deletion
Loading

Possibly related PRs

Suggested reviewers: steramae-nvidia

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: adding the Anonymizer jobs list page in studio.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch astd-325-anonymizer-list-page/mschwab

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx (1)

34-34: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use import type for React types.

  • web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx: move ComponentProps and FC to import type.
  • web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/DeleteJobModal.tsx: change FC to a type-only import.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx`
at line 34, Use type-only React imports for the specified symbols: update
web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx
lines 34-34 to import ComponentProps and FC with import type, and update
web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/DeleteJobModal.tsx
lines 12-12 to import FC with import type; leave runtime React imports
unchanged.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/DeleteJobModal.tsx`:
- Around line 33-47: Update handleDelete to validate all jobs before invoking
deleteJobMutation, rejecting or reporting any job missing workspace or name
instead of filtering it out. Only proceed with Promise.all and call onDeleted
after every input job passes validation, matching the existing bulk-delete
handler behavior.

In
`@web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx`:
- Around line 69-79: Update the bulk deletion flow around jobsToDelete and
deleteJobMutation.mutateAsync so it records each job’s success or failure
instead of relying on Promise.all’s first rejection. Remove successfully deleted
jobs from the selected state, retain failed jobs for retry, and report the
aggregate per-job outcome in the modal; use an atomic bulk endpoint only if one
already exists.

---

Nitpick comments:
In
`@web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx`:
- Line 34: Use type-only React imports for the specified symbols: update
web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx
lines 34-34 to import ComponentProps and FC with import type, and update
web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/DeleteJobModal.tsx
lines 12-12 to import FC with import type; leave runtime React imports
unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: b1dced1d-358d-4f31-b49b-4ac54da92469

📥 Commits

Reviewing files that changed from the base of the PR and between 8adcee4 and 4457f3e.

📒 Files selected for processing (4)
  • web/packages/studio/src/components/AnonymizerJobActionsMenu/index.tsx
  • web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/DeleteJobModal.tsx
  • web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx
  • web/packages/studio/src/routes/AnonymizerListRoute/index.tsx

Comment thread web/packages/studio/src/components/dataViews/AnonymizerJobsDataView/index.tsx Outdated
@marcusds
marcusds force-pushed the astd-325-anonymizer-list-page/mschwab branch from 1a57b58 to cd0afba Compare July 24, 2026 04:27
@marcusds

Copy link
Copy Markdown
Contributor Author

Claude says: "Done in cd0afba — FC/ComponentProps now use inline type imports in both files." @coderabbitai

@coderabbitai

coderabbitai Bot commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Tip

For best results, initiate chat on the files or code changes.

@marcusds Confirmed. The inline type-import fix addresses the finding.

marcusds added 2 commits July 24, 2026 11:01
Replace the Anonymizer list placeholder with a jobs DataView mirroring
Data Designer: paginated list via useAnonymizerListRunJobs, name /
description / created / status columns, status + date filters, search,
row -> detail navigation, per-row actions (view/cancel/delete), and bulk
delete. Empty and loading states included.

- components/dataViews/AnonymizerJobsDataView (+ DeleteJobModal)
- components/AnonymizerJobActionsMenu
- AnonymizerListRoute renders the DataView

Signed-off-by: mschwab <mschwab@nvidia.com>
StudioDataView memoizes column defs keyed on the makeColumns identity, so
passing a fresh arrow rebuilt every column on each render of a table that
polls on an interval. Wrap it in useCallback.

Also drop a useCallback whose only dep was the dataViewState object (a new
literal every render, so it never memoized) in favor of the hook's already
stable resetFilters, narrow handleCancel's dep to the stable mutateAsync
ref, and memoize the per-row actions array.

Signed-off-by: mschwab <mschwab@nvidia.com>
@marcusds
marcusds force-pushed the astd-325-anonymizer-list-page/mschwab branch from cd0afba to d64c068 Compare July 24, 2026 18:10
@marcusds
marcusds added this pull request to the merge queue Jul 24, 2026
Merged via the queue into main with commit f518e45 Jul 24, 2026
59 of 60 checks passed
@marcusds
marcusds deleted the astd-325-anonymizer-list-page/mschwab branch July 24, 2026 18:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants