From d1fc4828325feeb8ac5b432ec8fe966a32cea497 Mon Sep 17 00:00:00 2001 From: Alejandro Bailo <59607668+alejandrobailo@users.noreply.github.com> Date: Thu, 23 Apr 2026 17:36:32 +0200 Subject: [PATCH] feat(ui): improve Mutelist UX and mute modal (#10846) --- ui/CHANGELOG.md | 1 + .../simple/mute-rule-edit-form.test.tsx | 132 ++++++++ .../simple/mute-rule-edit-form.tsx | 192 +++++++---- .../simple/mute-rule-target-previews.test.ts | 103 ++++++ .../simple/mute-rule-target-previews.ts | 72 +++++ .../simple/mute-rule-targets-modal.tsx | 78 +++++ .../simple/mute-rules-columns.test.tsx | 73 +++++ .../_components/simple/mute-rules-columns.tsx | 34 +- .../simple/mute-rules-table-client.test.tsx | 199 ++++++++++++ .../simple/mute-rules-table-client.tsx | 152 +++++---- .../simple/mute-rules-table.test.tsx | 39 +++ .../_components/simple/mute-rules-table.tsx | 162 ++++++---- .../findings/mute-findings-modal.test.tsx | 29 +- .../findings/mute-findings-modal.tsx | 306 ++++++++++-------- .../table/column-standalone-findings.tsx | 1 + .../table/notification-indicator.test.tsx | 106 ++++++ .../findings/table/notification-indicator.tsx | 24 ++ .../resource-detail-drawer-content.tsx | 29 +- .../table/resource-findings-columns.tsx | 1 + ui/components/shadcn/modal/modal.tsx | 5 + .../use-finding-group-resource-state.test.ts | 130 +++++++- ui/hooks/use-finding-group-resource-state.ts | 2 +- ui/hooks/use-mute-rule-action.test.ts | 114 +++++++ ui/hooks/use-mute-rule-action.ts | 67 ++++ ui/lib/index.ts | 1 + ui/lib/mute-rules.ts | 21 ++ 26 files changed, 1720 insertions(+), 353 deletions(-) create mode 100644 ui/app/(prowler)/mutelist/_components/simple/mute-rule-edit-form.test.tsx create mode 100644 ui/app/(prowler)/mutelist/_components/simple/mute-rule-target-previews.test.ts create mode 100644 ui/app/(prowler)/mutelist/_components/simple/mute-rule-target-previews.ts create mode 100644 ui/app/(prowler)/mutelist/_components/simple/mute-rule-targets-modal.tsx create mode 100644 ui/app/(prowler)/mutelist/_components/simple/mute-rules-columns.test.tsx create mode 100644 ui/app/(prowler)/mutelist/_components/simple/mute-rules-table-client.test.tsx create mode 100644 ui/app/(prowler)/mutelist/_components/simple/mute-rules-table.test.tsx create mode 100644 ui/components/findings/table/notification-indicator.test.tsx create mode 100644 ui/hooks/use-mute-rule-action.test.ts create mode 100644 ui/hooks/use-mute-rule-action.ts create mode 100644 ui/lib/mute-rules.ts diff --git a/ui/CHANGELOG.md b/ui/CHANGELOG.md index 92dbb7ecc1..e6e2ba7a1e 100644 --- a/ui/CHANGELOG.md +++ b/ui/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to the **Prowler UI** are documented in this file. - Allows tenant owners to expel users from their organizations [(#10787)](https://github.com/prowler-cloud/prowler/pull/10787) - Shared filter dropdowns now support local option search and auto-scroll to the first visible match across table and provider filters [(#10859)](https://github.com/prowler-cloud/prowler/pull/10859) - Backward-compatibility middleware redirect from `/sign-up?invitation_token=…` to `/invitation/accept?invitation_token=…`; new invitation emails use `/invitation/accept` directly [(#10797)](https://github.com/prowler-cloud/prowler/pull/10797) +- Mutelist improvements: table now supports name/reason search and visual count badges for finding targets [(#10846)](https://github.com/prowler-cloud/prowler/pull/10846) --- diff --git a/ui/app/(prowler)/mutelist/_components/simple/mute-rule-edit-form.test.tsx b/ui/app/(prowler)/mutelist/_components/simple/mute-rule-edit-form.test.tsx new file mode 100644 index 0000000000..70b90187b6 --- /dev/null +++ b/ui/app/(prowler)/mutelist/_components/simple/mute-rule-edit-form.test.tsx @@ -0,0 +1,132 @@ +import { fireEvent, render, screen, waitFor } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { describe, expect, it, vi } from "vitest"; + +const { updateMuteRuleMock, toastMock } = vi.hoisted(() => ({ + updateMuteRuleMock: vi.fn(), + toastMock: vi.fn(), +})); + +vi.mock("@/actions/mute-rules", () => ({ + updateMuteRule: updateMuteRuleMock, +})); + +vi.mock("@/components/ui", () => ({ + useToast: () => ({ + toast: toastMock, + }), +})); + +vi.mock("@/components/ui/form", () => ({ + FormButtons: ({ + onCancel, + submitText = "Save", + isDisabled, + }: { + onCancel?: () => void; + submitText?: string; + isDisabled?: boolean; + }) => ( +
+ + +
+ ), +})); + +vi.mock("@/components/shadcn", () => ({ + Input: ({ + defaultValue, + ...props + }: React.InputHTMLAttributes) => ( + + ), + Textarea: ({ + value, + ...props + }: React.TextareaHTMLAttributes) => ( +