From 2abd5342c274b6da11de1d1a44ada65d18f13df8 Mon Sep 17 00:00:00 2001 From: Florian D Date: Thu, 13 Feb 2025 16:49:09 +0100 Subject: [PATCH] New room list: add search section (#29251) * feat(new room list): move `RoomListView` to its own folder and add styling * feat(new room list): add search section * test(new room list): add tests for `RoomListSearch` * test(new room list): add tests for `RoomListView` * test(e2e): add method to close notification toast to `ElementAppPage` * test(e2e): add tests for the search section * test(e2e): add tests for the room list view * refactor: use Flex component * fix: loop icon size in search button * refactor: remove `focus_room_filter` listener --- .../room-list-view/room-list-search.spec.ts | 53 +++++++ .../room-list-view/room-list-view.spec.ts | 34 +++++ .../security-user-settings-tab.spec.ts | 8 +- playwright/pages/ElementAppPage.ts | 11 ++ .../search-section-linux.png | Bin 0 -> 3970 bytes .../room-list-view-linux.png | Bin 0 -> 6399 bytes res/css/_components.pcss | 2 + .../rooms/RoomListView/_RoomListSearch.pcss | 39 +++++ .../rooms/RoomListView/_RoomListView.pcss | 12 ++ src/components/structures/LeftPanel.tsx | 2 +- src/components/views/rooms/RoomListView.tsx | 14 -- .../rooms/RoomListView/RoomListSearch.tsx | 69 +++++++++ .../views/rooms/RoomListView/RoomListView.tsx | 33 ++++ .../views/rooms/RoomListView/index.ts | 8 + .../RoomListView/RoomListSearch-test.tsx | 84 +++++++++++ .../rooms/RoomListView/RoomListView-test.tsx | 43 ++++++ .../RoomListSearch-test.tsx.snap | 142 ++++++++++++++++++ .../__snapshots__/RoomListView-test.tsx.snap | 76 ++++++++++ 18 files changed, 609 insertions(+), 21 deletions(-) create mode 100644 playwright/e2e/left-panel/room-list-view/room-list-search.spec.ts create mode 100644 playwright/e2e/left-panel/room-list-view/room-list-view.spec.ts create mode 100644 playwright/snapshots/left-panel/room-list-view/room-list-search.spec.ts/search-section-linux.png create mode 100644 playwright/snapshots/left-panel/room-list-view/room-list-view.spec.ts/room-list-view-linux.png create mode 100644 res/css/views/rooms/RoomListView/_RoomListSearch.pcss create mode 100644 res/css/views/rooms/RoomListView/_RoomListView.pcss delete mode 100644 src/components/views/rooms/RoomListView.tsx create mode 100644 src/components/views/rooms/RoomListView/RoomListSearch.tsx create mode 100644 src/components/views/rooms/RoomListView/RoomListView.tsx create mode 100644 src/components/views/rooms/RoomListView/index.ts create mode 100644 test/unit-tests/components/views/rooms/RoomListView/RoomListSearch-test.tsx create mode 100644 test/unit-tests/components/views/rooms/RoomListView/RoomListView-test.tsx create mode 100644 test/unit-tests/components/views/rooms/RoomListView/__snapshots__/RoomListSearch-test.tsx.snap create mode 100644 test/unit-tests/components/views/rooms/RoomListView/__snapshots__/RoomListView-test.tsx.snap diff --git a/playwright/e2e/left-panel/room-list-view/room-list-search.spec.ts b/playwright/e2e/left-panel/room-list-view/room-list-search.spec.ts new file mode 100644 index 0000000000..028503f622 --- /dev/null +++ b/playwright/e2e/left-panel/room-list-view/room-list-search.spec.ts @@ -0,0 +1,53 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type Page } from "@playwright/test"; + +import { test, expect } from "../../../element-web-test"; + +test.describe("Search section of the room list", () => { + test.use({ + labsFlags: ["feature_new_room_list"], + }); + + /** + * Get the search section of the room list + * @param page + */ + function getSearchSection(page: Page) { + return page.getByRole("search"); + } + + test.beforeEach(async ({ page, app, user }) => { + // The notification toast is displayed above the search section + await app.closeNotificationToast(); + }); + + test("should render the search section", { tag: "@screenshot" }, async ({ page, app, user }) => { + const searchSection = getSearchSection(page); + // exact=false to ignore the shortcut which is related to the OS + await expect(searchSection.getByRole("button", { name: "Search", exact: false })).toBeVisible(); + await expect(searchSection).toMatchScreenshot("search-section.png"); + }); + + test("should open the spotlight when the search button is clicked", async ({ page, app, user }) => { + const searchSection = getSearchSection(page); + await searchSection.getByRole("button", { name: "Search", exact: false }).click(); + // The spotlight should be displayed + await expect(page.getByRole("dialog", { name: "Search Dialog" })).toBeVisible(); + }); + + test("should open the room directory when the search button is clicked", async ({ page, app, user }) => { + const searchSection = getSearchSection(page); + await searchSection.getByRole("button", { name: "Explore rooms" }).click(); + const dialog = page.getByRole("dialog", { name: "Search Dialog" }); + // The room directory should be displayed + await expect(dialog).toBeVisible(); + // The public room filter should be displayed + await expect(dialog.getByText("Public rooms")).toBeVisible(); + }); +}); diff --git a/playwright/e2e/left-panel/room-list-view/room-list-view.spec.ts b/playwright/e2e/left-panel/room-list-view/room-list-view.spec.ts new file mode 100644 index 0000000000..7cd5122e8a --- /dev/null +++ b/playwright/e2e/left-panel/room-list-view/room-list-view.spec.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import { type Page } from "@playwright/test"; + +import { test, expect } from "../../../element-web-test"; + +test.describe("Search section of the room list", () => { + test.use({ + labsFlags: ["feature_new_room_list"], + }); + + /** + * Get the room list view + * @param page + */ + function getRoomListView(page: Page) { + return page.getByTestId("room-list-view"); + } + + test.beforeEach(async ({ page, app, user }) => { + // The notification toast is displayed above the search section + await app.closeNotificationToast(); + }); + + test("should render the room list view", { tag: "@screenshot" }, async ({ page, app, user }) => { + const roomListView = getRoomListView(page); + await expect(roomListView).toMatchScreenshot("room-list-view.png"); + }); +}); diff --git a/playwright/e2e/settings/security-user-settings-tab.spec.ts b/playwright/e2e/settings/security-user-settings-tab.spec.ts index b723d1398f..9b9439796d 100644 --- a/playwright/e2e/settings/security-user-settings-tab.spec.ts +++ b/playwright/e2e/settings/security-user-settings-tab.spec.ts @@ -25,13 +25,9 @@ test.describe("Security user settings tab", () => { }, }); - test.beforeEach(async ({ page, user }) => { + test.beforeEach(async ({ page, app, user }) => { // Dismiss "Notification" toast - await page - .locator(".mx_Toast_toast", { hasText: "Notifications" }) - .getByRole("button", { name: "Dismiss" }) - .click(); - + await app.closeNotificationToast(); await page.locator(".mx_Toast_buttons").getByRole("button", { name: "Yes" }).click(); // Allow analytics }); diff --git a/playwright/pages/ElementAppPage.ts b/playwright/pages/ElementAppPage.ts index d530c75b54..15b475a5d1 100644 --- a/playwright/pages/ElementAppPage.ts +++ b/playwright/pages/ElementAppPage.ts @@ -202,4 +202,15 @@ export class ElementAppPage { } return this.page.locator(`id=${labelledById ?? describedById}`); } + + /** + * Close the notification toast + */ + public closeNotificationToast(): Promise { + // Dismiss "Notification" toast + return this.page + .locator(".mx_Toast_toast", { hasText: "Notifications" }) + .getByRole("button", { name: "Dismiss" }) + .click(); + } } diff --git a/playwright/snapshots/left-panel/room-list-view/room-list-search.spec.ts/search-section-linux.png b/playwright/snapshots/left-panel/room-list-view/room-list-search.spec.ts/search-section-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2684e84964c41f2614af19fe003ca9c2518f73 GIT binary patch literal 3970 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 { return (
- +
); diff --git a/src/components/views/rooms/RoomListView.tsx b/src/components/views/rooms/RoomListView.tsx deleted file mode 100644 index c5f593decf..0000000000 --- a/src/components/views/rooms/RoomListView.tsx +++ /dev/null @@ -1,14 +0,0 @@ -/* -Copyright 2025 New Vector Ltd. - -SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial -Please see LICENSE files in the repository root for full details. -*/ - -import React from "react"; - -type IProps = unknown; - -export const RoomListView: React.FC = (props: IProps) => { - return
New Room List
; -}; diff --git a/src/components/views/rooms/RoomListView/RoomListSearch.tsx b/src/components/views/rooms/RoomListView/RoomListSearch.tsx new file mode 100644 index 0000000000..415e817ad9 --- /dev/null +++ b/src/components/views/rooms/RoomListView/RoomListSearch.tsx @@ -0,0 +1,69 @@ +/* + * Copyright 2025 New Vector Ltd. + * + * SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial + * Please see LICENSE files in the repository root for full details. + */ + +import React, { type JSX } from "react"; +import { Button } from "@vector-im/compound-web"; +import ExploreIcon from "@vector-im/compound-design-tokens/assets/web/icons/explore"; +import SearchIcon from "@vector-im/compound-design-tokens/assets/web/icons/search"; + +import { IS_MAC, Key } from "../../../../Keyboard"; +import { _t } from "../../../../languageHandler"; +import { ALTERNATE_KEY_NAME } from "../../../../accessibility/KeyboardShortcuts"; +import { shouldShowComponent } from "../../../../customisations/helpers/UIComponents"; +import { UIComponent } from "../../../../settings/UIFeature"; +import { MetaSpace } from "../../../../stores/spaces"; +import { Action } from "../../../../dispatcher/actions"; +import PosthogTrackers from "../../../../PosthogTrackers"; +import defaultDispatcher from "../../../../dispatcher/dispatcher"; +import { Flex } from "../../../utils/Flex"; + +type RoomListSearchProps = { + /** + * Current active space + * The explore button is only displayed in the Home meta space + */ + activeSpace: string; +}; + +/** + * A search component to be displayed at the top of the room list + * The `Explore` button is displayed only in the Home meta space and when UIComponent.ExploreRooms is enabled. + */ +export function RoomListSearch({ activeSpace }: RoomListSearchProps): JSX.Element { + const displayExploreButton = activeSpace === MetaSpace.Home && shouldShowComponent(UIComponent.ExploreRooms); + + return ( + + + {displayExploreButton && ( + + + + +`; + +exports[` should hide the explore button when UIComponent.ExploreRooms is disabled 1`] = ` + + + +`; + +exports[` should hide the explore button when the active space is not MetaSpace.Home 1`] = ` + + + +`; diff --git a/test/unit-tests/components/views/rooms/RoomListView/__snapshots__/RoomListView-test.tsx.snap b/test/unit-tests/components/views/rooms/RoomListView/__snapshots__/RoomListView-test.tsx.snap new file mode 100644 index 0000000000..4ddc9ac5ec --- /dev/null +++ b/test/unit-tests/components/views/rooms/RoomListView/__snapshots__/RoomListView-test.tsx.snap @@ -0,0 +1,76 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[` should not render the RoomListSearch component when UIComponent.FilterContainer is at false 1`] = ` + +
+ +`; + +exports[` should render the RoomListSearch component when UIComponent.FilterContainer is at true 1`] = ` + +
+ +
+
+`;