diff --git a/apps/web/modules/data-table/components/segment/FilterSegmentSelect.tsx b/apps/web/modules/data-table/components/segment/FilterSegmentSelect.tsx index 8a54814ec0..71563d447a 100644 --- a/apps/web/modules/data-table/components/segment/FilterSegmentSelect.tsx +++ b/apps/web/modules/data-table/components/segment/FilterSegmentSelect.tsx @@ -1,27 +1,25 @@ -import { useSession } from "next-auth/react"; -import { useState, useMemo } from "react"; - import { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner"; +import { useDataTable } from "@calcom/features/data-table/hooks"; +import type { + CombinedFilterSegment, + FilterSegmentOutput, + SystemFilterSegmentInternal, + UserFilterSegment, +} from "@calcom/features/data-table/lib/types"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { Button } from "@calcom/ui/components/button"; import { Dropdown, DropdownItem, - DropdownMenuPortal, DropdownMenuContent, DropdownMenuItem, - DropdownMenuTrigger, DropdownMenuLabel, + DropdownMenuPortal, + DropdownMenuTrigger, } from "@calcom/ui/components/dropdown"; import { Icon, type IconName } from "@calcom/ui/components/icon"; - -import { useDataTable } from "@calcom/features/data-table/hooks"; -import type { - FilterSegmentOutput, - CombinedFilterSegment, - SystemFilterSegmentInternal, - UserFilterSegment, -} from "@calcom/features/data-table/lib/types"; +import { useSession } from "next-auth/react"; +import { useMemo, useState } from "react"; import { DeleteSegmentDialog } from "./DeleteSegmentDialog"; import { DuplicateSegmentDialog } from "./DuplicateSegmentDialog"; import { RenameSegmentDialog } from "./RenameSegmentDialog"; @@ -43,7 +41,7 @@ export function FilterSegmentSelect({ shortLabel }: Props = {}) { const { t } = useLocale(); const session = useSession(); const isAdminOrOwner = checkAdminOrOwner(session.data?.user?.org?.role); - const { segments, selectedSegment, segmentId, setSegmentId, isSegmentEnabled } = useDataTable(); + const { segments, selectedSegment, segmentId, setSegmentId, isSegmentEnabled, clearAll } = useDataTable(); const [segmentToRename, setSegmentToRename] = useState(); const [segmentToDuplicate, setSegmentToDuplicate] = useState(); const [segmentToDelete, setSegmentToDelete] = useState(); @@ -192,7 +190,7 @@ export function FilterSegmentSelect({ shortLabel }: Props = {}) { segment={segment} onSelect={() => { if (segmentId && segmentId.type === segment.type && segmentId.id === segment.id) { - setSegmentId(null); + clearAll(); } else { if (segment.type === "system") { setSegmentId({ id: segment.id, type: "system" }); @@ -247,9 +245,7 @@ function DropdownItemWithSubmenu({ const [isOpen, setIsOpen] = useState(false); return ( - +
{children}
diff --git a/apps/web/playwright/filter-segment.e2e.ts b/apps/web/playwright/filter-segment.e2e.ts index 2511540de2..b98f223bf9 100644 --- a/apps/web/playwright/filter-segment.e2e.ts +++ b/apps/web/playwright/filter-segment.e2e.ts @@ -1,17 +1,18 @@ -import { expect } from "@playwright/test"; - import { MembershipRole } from "@calcom/prisma/enums"; +import { expect } from "@playwright/test"; import { applySelectFilter, - createFilterSegment, - selectSegment, - deleteSegment, - listSegments, clearFilters, - openSegmentSubmenu, - locateSelectedSegmentName, + createFilterSegment, + deleteSegment, + expectSegmentCleared, + expectSegmentSelected, getByTableColumnText, + listSegments, + locateSelectedSegmentName, + openSegmentSubmenu, + selectSegment, } from "./filter-helpers"; import { test } from "./lib/fixtures"; @@ -362,4 +363,34 @@ test.describe("Filter Segment Functionality", () => { ).toBeHidden(); }); }); + + test("Deselecting a segment clears all active filters", async ({ page, users }) => { + const orgOwner = await users.create(undefined, { + hasTeam: true, + isOrg: true, + }); + const { team: org } = await orgOwner.getOrgMembership(); + + await orgOwner.apiLogin(); + await page.goto(`/settings/organizations/${org.slug}/members`); + + const dataTable = page.getByTestId("user-list-data-table").first(); + await expect(dataTable).toBeVisible(); + + await applySelectFilter(page, "role", "admin"); + const segmentName = "Test Deselect Segment"; + await createFilterSegment(page, segmentName); + + await expectSegmentSelected(page, segmentName); + const urlWithSegment = page.url(); + expect(urlWithSegment).toContain("activeFilters"); + + await selectSegment(page, segmentName); + await expectSegmentCleared(page); + + const urlAfterDeselect = page.url(); + expect(urlAfterDeselect).not.toContain("activeFilters"); + + await deleteSegment(page, segmentName); + }); }); diff --git a/apps/web/playwright/system-segments.e2e.ts b/apps/web/playwright/system-segments.e2e.ts index 11ac507727..e4602e8f7e 100644 --- a/apps/web/playwright/system-segments.e2e.ts +++ b/apps/web/playwright/system-segments.e2e.ts @@ -1,7 +1,7 @@ -import { expect } from "@playwright/test"; import type { Page } from "@playwright/test"; +import { expect } from "@playwright/test"; -import { addFilter, selectSegment, expectSegmentCleared, expectSegmentSelected } from "./filter-helpers"; +import { addFilter, expectSegmentCleared, expectSegmentSelected, selectSegment } from "./filter-helpers"; import { test } from "./lib/fixtures"; test.describe.configure({ mode: "parallel" });