Skip to content

Move assessment evaluation form into a modal#7579

Merged
kruulik merged 27 commits intomainfrom
2872-generate-assessment-modal
Mar 6, 2026
Merged

Move assessment evaluation form into a modal#7579
kruulik merged 27 commits intomainfrom
2872-generate-assessment-modal

Conversation

@kruulik
Copy link
Copy Markdown
Contributor

@kruulik kruulik commented Mar 5, 2026

Ticket ENG-2872

Description Of Changes

Move the assessment evaluation form from a dedicated page (/privacy-assessments/evaluate) into a modal triggered from the assessments list page. Since the API doesn't yet support the additional fields needed for manual assessment creation (name, DPO/owner, description), the "Generate Assessments" and "Create New Assessment" flows were identical — so we consolidated into a single modal.

Code Changes

  • clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx - New modal component with the evaluation form (template multi-select, system select, AI-assisted toggle)
  • clients/admin-ui/src/features/privacy-assessments/index.ts - Export the new modal
  • clients/admin-ui/src/pages/privacy-assessments/index.tsx - Replace page link with button that opens the modal, wire EmptyState to modal
  • clients/admin-ui/src/features/privacy-assessments/EmptyState.tsx - Accept onRunAssessment callback instead of linking to a page
  • clients/admin-ui/src/pages/privacy-assessments/evaluate.tsx - Deleted
  • clients/admin-ui/src/features/common/nav/routes.ts - Remove evaluate route

Steps to Confirm

  1. Navigate to Privacy Assessments page
  2. Click "Generate assessments" button — modal should open with template select, system select, and AI toggle
  3. When no assessments exist, click "Run assessment" in the empty state — same modal should open
  4. Verify /privacy-assessments/evaluate no longer resolves (404)

Pre-Merge Checklist

  • Issue requirements met
  • All CI pipelines succeeded
  • CHANGELOG.md updated
    • Updates unreleased work already in Changelog, no new entry necessary
  • UX feedback:
    • All UX related changes have been reviewed by a designer
  • Followup issues:
    • No followup issues
  • Database migrations:
    • No migrations
  • Documentation:
    • No documentation updates required

Summary by CodeRabbit

  • Changed

    • Assessment evaluation moved from a standalone page into an in-place modal on the privacy assessments dashboard; navigation no longer goes to a separate evaluation page.
    • Empty-state flow now opens the modal instead of navigating away; route alias for the removed page is no longer used.
  • New Features

    • "Generate Assessments" modal: multi-select templates, system selection, optional AI-assisted answers, per-template details, and loading/error feedback.
    • Creating assessments now refreshes both assessment and task data automatically.

@vercel
Copy link
Copy Markdown
Contributor

vercel bot commented Mar 5, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
fides-plus-nightly Ready Ready Preview, Comment Mar 6, 2026 7:49pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
fides-privacy-center Ignored Ignored Mar 6, 2026 7:49pm

Request Review

@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Mar 5, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

The privacy-assessment evaluation flow was moved from a standalone page into a modal. A new GenerateAssessmentsModal component was added and integrated into the privacy assessments listing and empty state; the old evaluate page and its route constant were removed. createPrivacyAssessment now invalidates assessment-related cache tags.

Changes

Cohort / File(s) Summary
Changelog
changelog/7579-assessment-evaluation-modal.yaml
Adds changelog entry documenting move of assessment evaluation from page to modal.
Routing
clients/admin-ui/src/features/common/nav/routes.ts
Removed PRIVACY_ASSESSMENTS_EVALUATE_ROUTE ("/privacy-assessments/evaluate").
New Modal
clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx
Adds modal component for selecting templates/systems, AI toggle, submission via createPrivacyAssessment, success/error handling, and export.
UI Wiring
clients/admin-ui/src/features/privacy-assessments/EmptyState.tsx, clients/admin-ui/src/pages/privacy-assessments/index.tsx
Replaces navigation-to-page flow with a callback/state that opens GenerateAssessmentsModal; EmptyState gains onRunAssessment prop.
Exports
clients/admin-ui/src/features/privacy-assessments/index.ts
Exports GenerateAssessmentsModal.
API / Cache
clients/admin-ui/src/features/privacy-assessments/privacy-assessments.slice.ts
createPrivacyAssessment mutation now invalidates Privacy Assessment and Privacy Assessment Tasks tags.
Page Removal
clients/admin-ui/src/pages/privacy-assessments/evaluate.tsx
Removes standalone Evaluate Assessment page and its form, data-fetching, and navigation logic.
Task Status
clients/admin-ui/src/features/privacy-assessments/AssessmentTaskStatusIndicator.tsx
Adds dispatch to invalidate Privacy Assessment tag on active→idle transition; updates effect deps.

Sequence Diagram

sequenceDiagram
    participant User
    participant Page as Privacy Assessments Page
    participant Modal as GenerateAssessmentsModal
    participant API as RTK Query API
    participant Cache as RTK Cache

    User->>Page: Click "Generate Assessments"
    Page->>Modal: set open = true
    User->>Modal: Select templates & systems, toggle AI
    User->>Modal: Click Submit
    Modal->>API: createPrivacyAssessment(payload)
    API->>Cache: invalidate "Privacy Assessment", "Privacy Assessment Tasks"
    API-->>Modal: success / error
    Modal->>User: show success or error
    Modal->>Page: onClose (close modal)
    Page->>Page: refresh UI / read updated data
Loading

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly Related PRs

Suggested labels

Privacy Assessments

Suggested Reviewers

  • lucanovera

Poem

🐰 I hopped from page to cozy pane,
A modal snug where forms remain,
Templates picked and systems set,
A tiny click — the cache is met,
Assessments bloom; I twirl my cane!

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Move assessment evaluation form into a modal' accurately and concisely summarizes the main change: relocating the evaluation form from a dedicated page to a modal component.
Description check ✅ Passed The PR description follows the repository template with ticket reference, detailed code changes, confirmation steps, and pre-merge checklist. Most critical sections are completed, though CI pipeline status and CHANGELOG update are noted as pending.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch 2872-generate-assessment-modal

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

@kruulik kruulik marked this pull request as ready for review March 5, 2026 20:03
@kruulik kruulik requested a review from a team as a code owner March 5, 2026 20:03
@kruulik kruulik requested review from speaker-ender and removed request for a team March 5, 2026 20:03
@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Mar 5, 2026

Greptile Summary

This PR consolidates the privacy assessment evaluation flow by moving the standalone /privacy-assessments/evaluate page into a GenerateAssessmentsModal triggered from the assessments list page. It also correctly wires the EmptyState component to the same modal via a callback prop, and adds the previously missing invalidatesTags to the createPrivacyAssessment mutation so the list refreshes automatically after submission.

  • New GenerateAssessmentsModal.tsx: Extracts the form logic from the deleted page into a reusable modal — form state is correctly reset on both cancel and successful submission.
  • privacy-assessments.slice.ts: Adds invalidatesTags: ["Privacy Assessment"] to createPrivacyAssessment, fixing a gap where the list would not refresh after creating an assessment.
  • EmptyState.tsx: Decoupled from routing — now accepts an onRunAssessment callback, making it more reusable.
  • routes.ts: PRIVACY_ASSESSMENTS_EVALUATE_ROUTE constant is cleanly removed alongside the deleted page.
  • Minor style issue: renderTemplateOption in GenerateAssessmentsModal.tsx wraps its content in a bare <div> that should be replaced with Flex per the project's frontend guidelines.

Confidence Score: 4/5

  • This PR is safe to merge — it is a focused UI refactor with no data-model or API changes, and the one bug fix (missing invalidatesTags) is correct.
  • The changes are straightforward: a page is deleted, its form is moved into a modal, and a missing cache invalidation tag is added. Logic is correct, form resets are handled, and the UX flows match the PR description. The only outstanding item is a minor style-guide violation (div in renderTemplateOption) that does not affect functionality.
  • No files require special attention.

Important Files Changed

Filename Overview
clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx New modal component migrating the evaluation form from a standalone page. Logic is sound (form reset on cancel/success, proper error handling). One minor style issue: renderTemplateOption uses a bare <div> wrapper that should be replaced with Flex.
clients/admin-ui/src/features/privacy-assessments/privacy-assessments.slice.ts Added missing invalidatesTags: ["Privacy Assessment"] to createPrivacyAssessment mutation — a correct and important fix that ensures the assessments list auto-refreshes after creation.
clients/admin-ui/src/pages/privacy-assessments/index.tsx Cleanly removes the route link, adds generateModalOpen state, and wires the GenerateAssessmentsModal and EmptyState callbacks. The <div className="py-6"> is padding-only, which is an acceptable use of div per the style guide.
clients/admin-ui/src/features/privacy-assessments/EmptyState.tsx Straightforward refactor — replaces the NextLink navigation with an onRunAssessment callback prop, decoupling the empty state from routing.
clients/admin-ui/src/features/common/nav/routes.ts Removes the now-deleted PRIVACY_ASSESSMENTS_EVALUATE_ROUTE constant. Clean and complete.

Last reviewed commit: 8a1b509

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
clients/admin-ui/src/features/privacy-assessments/EmptyState.tsx (1)

20-22: Align CTA copy with the page-level trigger.

This button says “Run assessment” while the header action says “Generate assessments” (clients/admin-ui/src/pages/privacy-assessments/index.tsx, Lines 83-85). Consider using one label consistently.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@clients/admin-ui/src/features/privacy-assessments/EmptyState.tsx` around
lines 20 - 22, The CTA text in the EmptyState component is inconsistent with the
page-level action; update the Button label inside EmptyState (the Button
rendering with icon={<Icons.Add />} and prop onClick={onRunAssessment}) to use
"Generate assessments" so it matches the header action ("Generate assessments")
used elsewhere (e.g., the page-level trigger). Ensure the change is made only to
the Button's displayed text and leave the handler name onRunAssessment
unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx`:
- Line 103: The user-facing messages in GenerateAssessmentsModal.tsx (component
GenerateAssessmentsModal) use singular wording but the modal can queue multiple
templates; update the success string ("Assessment evaluation queued. Results
will appear on the assessments page shortly,") and the corresponding failure
string near the other occurrence (line referenced as 111) to use plural wording
(e.g., "Assessments queued. Results will appear on the assessments page
shortly." and "Failed to queue assessments.") so messages accurately reflect
multi-select behavior.

---

Nitpick comments:
In `@clients/admin-ui/src/features/privacy-assessments/EmptyState.tsx`:
- Around line 20-22: The CTA text in the EmptyState component is inconsistent
with the page-level action; update the Button label inside EmptyState (the
Button rendering with icon={<Icons.Add />} and prop onClick={onRunAssessment})
to use "Generate assessments" so it matches the header action ("Generate
assessments") used elsewhere (e.g., the page-level trigger). Ensure the change
is made only to the Button's displayed text and leave the handler name
onRunAssessment unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 3bde305b-80af-45cd-abd5-9ed09834f19e

📥 Commits

Reviewing files that changed from the base of the PR and between e7fa470 and 8a1b509.

📒 Files selected for processing (8)
  • changelog/7579-assessment-evaluation-modal.yaml
  • clients/admin-ui/src/features/common/nav/routes.ts
  • clients/admin-ui/src/features/privacy-assessments/EmptyState.tsx
  • clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx
  • clients/admin-ui/src/features/privacy-assessments/index.ts
  • clients/admin-ui/src/features/privacy-assessments/privacy-assessments.slice.ts
  • clients/admin-ui/src/pages/privacy-assessments/evaluate.tsx
  • clients/admin-ui/src/pages/privacy-assessments/index.tsx
💤 Files with no reviewable changes (2)
  • clients/admin-ui/src/pages/privacy-assessments/evaluate.tsx
  • clients/admin-ui/src/features/common/nav/routes.ts

…ssmentsModal.tsx

Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx (1)

101-111: ⚠️ Potential issue | 🟡 Minor

Use plural user messaging for multi-template queueing

Since assessment_types is multi-select (Line 141), the strings on Line 102 and Line 110 should be plural.

Proposed wording update
       message.success(
-        "Assessment evaluation queued. Results will appear on the assessments page shortly.",
+        "Assessments queued. Results will appear on the assessments page shortly.",
       );
@@
       message.error(
-        `Failed to queue assessment: ${getErrorMessage(error as RTKErrorResult["error"])}`,
+        `Failed to queue assessments: ${getErrorMessage(error as RTKErrorResult["error"])}`,
       );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx`
around lines 101 - 111, Update the user-facing messages in
GenerateAssessmentsModal.tsx to use plural wording for multi-template queueing:
change the success message passed to message.success (currently "Assessment
evaluation queued. Results will appear on the assessments page shortly.") to a
plural form like "Assessments queued for evaluation. Results will appear on the
assessments page shortly." and change the error prefix in the message.error call
(currently "Failed to queue assessment:") to "Failed to queue assessments:" so
messaging aligns with the multi-select field assessment_types and the behavior
in the submit handler that processes multiple template IDs (see
functions/variables form.resetFields, setSelectedTemplateIds, and
assessment_types).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx`:
- Around line 40-51: The JSX return in renderTemplateOption (function handling
TemplateOptionData) is missing the closing parenthesis for the multi-line
return; fix by adding the closing ')' immediately after the closing </Flex>
element so the return reads return ( ... ); and then close the function with the
existing '};' — this restores correct JSX/paren pairing and resolves the syntax
error.

---

Duplicate comments:
In
`@clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx`:
- Around line 101-111: Update the user-facing messages in
GenerateAssessmentsModal.tsx to use plural wording for multi-template queueing:
change the success message passed to message.success (currently "Assessment
evaluation queued. Results will appear on the assessments page shortly.") to a
plural form like "Assessments queued for evaluation. Results will appear on the
assessments page shortly." and change the error prefix in the message.error call
(currently "Failed to queue assessment:") to "Failed to queue assessments:" so
messaging aligns with the multi-select field assessment_types and the behavior
in the submit handler that processes multiple template IDs (see
functions/variables form.resetFields, setSelectedTemplateIds, and
assessment_types).

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: ae2abbd3-44b2-47d5-84e3-0b91acfb4a33

📥 Commits

Reviewing files that changed from the base of the PR and between 8a1b509 and 66d3785.

📒 Files selected for processing (1)
  • clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx (1)

67-68: Hardcoded pagination may miss templates if more than 100 exist.

The query uses a fixed limit of 100 templates per page. While the modal includes client-side search via the Select component, this only filters the fetched results—users won't be able to discover templates beyond the first 100. Consider fetching all pages or implementing dynamic pagination. Note that this pattern is used consistently elsewhere in the codebase (e.g., AssessmentTaskStatusIndicator.tsx, privacy-assessments/index.tsx), suggesting awareness of the limitation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx`
around lines 67 - 68, The query in GenerateAssessmentsModal uses a hardcoded
page/size ({ page: 1, size: 100 }) when calling useGetAssessmentTemplatesQuery
(templatesData, isLoadingTemplates), which can omit templates beyond the first
100 and breaks client-side search; update the data fetching to either (a)
paginate through all pages and concatenate results before passing to the Select,
or (b) add dynamic pagination/virtualized loading tied to the Select (infinite
scroll or server-side search) so you don't rely on a fixed size; locate
useGetAssessmentTemplatesQuery usage in GenerateAssessmentsModal and implement
the chosen approach (looping requests until templatesData.meta.total/pages are
exhausted, or wiring the Select's onSearch/onScroll to request additional pages)
and ensure the component consumes the aggregated template list rather than only
the first page.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@clients/admin-ui/src/features/privacy-assessments/AssessmentTaskStatusIndicator.tsx`:
- Line 132: The effect that depends on activeTask/lastCompletedTask uses the
onTaskFinish callback inside the notification button but omits it from the
dependency array, risking a stale closure; fix by either (A) capturing the
latest onTaskFinish via a ref (create onTaskFinishRef, update it in useEffect/on
prop change, and call onTaskFinishRef.current inside the notification handler)
or (B) if omission is intentional, add an explanatory comment and keep
onTaskFinish out of the dependency array to satisfy the linter; references:
onTaskFinish, the effect with dependency array [activeTask, lastCompletedTask,
notificationApi, dispatch], and the notification button callback.

---

Nitpick comments:
In
`@clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx`:
- Around line 67-68: The query in GenerateAssessmentsModal uses a hardcoded
page/size ({ page: 1, size: 100 }) when calling useGetAssessmentTemplatesQuery
(templatesData, isLoadingTemplates), which can omit templates beyond the first
100 and breaks client-side search; update the data fetching to either (a)
paginate through all pages and concatenate results before passing to the Select,
or (b) add dynamic pagination/virtualized loading tied to the Select (infinite
scroll or server-side search) so you don't rely on a fixed size; locate
useGetAssessmentTemplatesQuery usage in GenerateAssessmentsModal and implement
the chosen approach (looping requests until templatesData.meta.total/pages are
exhausted, or wiring the Select's onSearch/onScroll to request additional pages)
and ensure the component consumes the aggregated template list rather than only
the first page.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 031c955c-b441-41a8-af6f-72f281eb7cc7

📥 Commits

Reviewing files that changed from the base of the PR and between 3c0ad3f and 148431f.

📒 Files selected for processing (2)
  • clients/admin-ui/src/features/privacy-assessments/AssessmentTaskStatusIndicator.tsx
  • clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx (1)

102-112: ⚠️ Potential issue | 🟡 Minor

Use plural toast copy for multi-template submissions.

The form allows multiple templates, but the success and failure messages are singular. Update both strings to plural so they match actual behavior.

Suggested text update
-      message.success(
-        "Assessment evaluation queued. Results will appear on the assessments page shortly.",
-      );
+      message.success(
+        "Assessments queued. Results will appear on the assessments page shortly.",
+      );
@@
-      message.error(
-        `Failed to queue assessment: ${getErrorMessage(error as RTKErrorResult["error"])}`,
-      );
+      message.error(
+        `Failed to queue assessments: ${getErrorMessage(error as RTKErrorResult["error"])}`,
+      );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx`
around lines 102 - 112, The success and error toast text in
GenerateAssessmentsModal use singular wording but the form can submit multiple
templates; update the strings passed to message.success and message.error to
plural copy (e.g., "Assessments evaluation queued. Results will appear on the
assessments page shortly." and "Failed to queue assessments: …") so they reflect
multi-template submissions—keep calls to message.success, message.error and the
error formatting via getErrorMessage(RTKErrorResult["error"]) unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In
`@clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx`:
- Around line 102-112: The success and error toast text in
GenerateAssessmentsModal use singular wording but the form can submit multiple
templates; update the strings passed to message.success and message.error to
plural copy (e.g., "Assessments evaluation queued. Results will appear on the
assessments page shortly." and "Failed to queue assessments: …") so they reflect
multi-template submissions—keep calls to message.success, message.error and the
error formatting via getErrorMessage(RTKErrorResult["error"]) unchanged.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 6219022c-c8d5-4fbf-bb76-736fdc016a3e

📥 Commits

Reviewing files that changed from the base of the PR and between 148431f and 7ee923a.

📒 Files selected for processing (2)
  • clients/admin-ui/src/features/privacy-assessments/GenerateAssessmentsModal.tsx
  • clients/admin-ui/src/pages/privacy-assessments/index.tsx

Copy link
Copy Markdown
Contributor

@lucanovera lucanovera left a comment

Choose a reason for hiding this comment

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

Modal looks good, the notification on every assessment is a nice improvement. Approved!

@kruulik kruulik added this pull request to the merge queue Mar 6, 2026
Merged via the queue into main with commit 8e40b98 Mar 6, 2026
47 checks passed
@kruulik kruulik deleted the 2872-generate-assessment-modal branch March 6, 2026 20:23
mfbrown pushed a commit that referenced this pull request Mar 12, 2026
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
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.

2 participants