mirror of
https://github.com/vector-im/element-web.git
synced 2024-11-25 18:08:14 +08:00
cf8b87fd14
* Create new method for header button behaviour With the introduction of tabs, the behaviour of the header buttons is changed as follows: - Close any right panel if open - Open the correct right panel if no panel was open before The old method (and behaviour) is retained as showOrHidePhase. * Implement tabs in the right panel There are three tabs: Info, People and Threads * Remove unwanted code from RoomSummaryCard - Remove the menu item for opening the memberlist since that is now taken of by the tabs. - Remove the close button * Remove code for focusing close button from tac item See https://github.com/matrix-org/matrix-react-sdk/pull/12410 There's no longer a close button to focus so we instead focus the thread tab. This is done in RightPaneltabs.tsx so we just need to remove this code. * Introduce a room info icon to the header This was previously present in the legacy room header but not in the new header. * BaseCard changes - Adds id, ariaLabelledBy and role props to implement tab accessibility. - Adds hideHeaderButtons prop to hide header buttons (think back and close buttons). - Change confusing header rendering code: header is not rendered ONLY when no header is passed AND hideHeaderButtons is true. * Refactor repeated code into function Created a new function createSpaceScopeHeader which returns the component if the room is a space room. Previously this code was duplicated in every component that uses SpaceScopeHeader component. * Pass BaseCard attributes and use helper function Actually using the code from the last two commits * Add, update and remove tests/screenshots/snapshots * Fix distance between search bar and tabs * Update compound * Update screenshots/snapshots
173 lines
6.4 KiB
TypeScript
173 lines
6.4 KiB
TypeScript
/*
|
|
*
|
|
* Copyright 2024 The Matrix.org Foundation C.I.C.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
* /
|
|
*/
|
|
|
|
import { expect, test } from ".";
|
|
import { CommandOrControl } from "../../utils";
|
|
|
|
test.describe("Threads Activity Centre", () => {
|
|
test.use({
|
|
displayName: "Alice",
|
|
botCreateOpts: { displayName: "Other User" },
|
|
labsFlags: ["threadsActivityCentre"],
|
|
});
|
|
|
|
test("should have the button correctly aligned and displayed in the space panel when expanded", async ({
|
|
util,
|
|
}) => {
|
|
// Open the space panel
|
|
await util.expandSpacePanel();
|
|
// The buttons in the space panel should be aligned when expanded
|
|
await expect(util.getSpacePanel()).toMatchScreenshot("tac-button-expanded.png");
|
|
});
|
|
|
|
test("should not show indicator when there is no thread", async ({ room1, util }) => {
|
|
// No indicator should be shown
|
|
await util.assertNoTacIndicator();
|
|
|
|
await util.goTo(room1);
|
|
await util.receiveMessages(room1, ["Msg1"]);
|
|
|
|
// A message in the main timeline should not affect the indicator
|
|
await util.assertNoTacIndicator();
|
|
});
|
|
|
|
test("should show a notification indicator when there is a message in a thread", async ({ room1, util, msg }) => {
|
|
await util.goTo(room1);
|
|
await util.receiveMessages(room1, ["Msg1", msg.threadedOff("Msg1", "Resp1")]);
|
|
|
|
// The indicator should be shown
|
|
await util.assertNotificationTac();
|
|
});
|
|
|
|
test("should show a highlight indicator when there is a mention in a thread", async ({ room1, util, msg }) => {
|
|
await util.goTo(room1);
|
|
await util.receiveMessages(room1, [
|
|
"Msg1",
|
|
msg.threadedOff("Msg1", {
|
|
"body": "User",
|
|
"format": "org.matrix.custom.html",
|
|
"formatted_body": "<a href='https://matrix.to/#/@user:localhost'>User</a>",
|
|
"m.mentions": {
|
|
user_ids: ["@user:localhost"],
|
|
},
|
|
}),
|
|
]);
|
|
|
|
// The indicator should be shown
|
|
await util.assertHighlightIndicator();
|
|
});
|
|
|
|
test("should show the rooms with unread threads", async ({ room1, room2, util, msg }) => {
|
|
await util.goTo(room2);
|
|
await util.populateThreads(room1, room2, msg);
|
|
// The indicator should be shown
|
|
await util.assertHighlightIndicator();
|
|
|
|
// Verify that we have the expected rooms in the TAC
|
|
await util.openTac();
|
|
await util.assertRoomsInTac([
|
|
{ room: room2.name, notificationLevel: "highlight" },
|
|
{ room: room1.name, notificationLevel: "notification" },
|
|
]);
|
|
|
|
// Verify that we don't have a visual regression
|
|
await expect(util.getTacPanel()).toMatchScreenshot("tac-panel-mix-unread.png");
|
|
});
|
|
|
|
test("should update with a thread is read", async ({ room1, room2, util, msg }) => {
|
|
await util.goTo(room2);
|
|
await util.populateThreads(room1, room2, msg);
|
|
|
|
// Click on the first room in TAC
|
|
await util.openTac();
|
|
await util.clickRoomInTac(room2.name);
|
|
|
|
// Verify that the thread panel is opened after a click on the room in the TAC
|
|
await util.assertThreadPanelIsOpened();
|
|
|
|
// Open a thread and mark it as read
|
|
// The room 2 doesn't have a mention anymore in its unread, so the highest notification level is notification
|
|
await util.openThread("Msg1");
|
|
await util.assertNotificationTac();
|
|
await util.openTac();
|
|
await util.assertRoomsInTac([
|
|
{ room: room1.name, notificationLevel: "notification" },
|
|
{ room: room2.name, notificationLevel: "notification" },
|
|
]);
|
|
await expect(util.getTacPanel()).toMatchScreenshot("tac-panel-notification-unread.png");
|
|
});
|
|
|
|
test("should order by recency after notification level", async ({ room1, room2, util, msg }) => {
|
|
await util.goTo(room2);
|
|
await util.populateThreads(room1, room2, msg, false);
|
|
|
|
await util.openTac();
|
|
await util.assertRoomsInTac([
|
|
{ room: room1.name, notificationLevel: "notification" },
|
|
{ room: room2.name, notificationLevel: "notification" },
|
|
]);
|
|
});
|
|
|
|
test("should block the Spotlight to open when the TAC is opened", async ({ util, page }) => {
|
|
const toggleSpotlight = () => page.keyboard.press(`${CommandOrControl}+k`);
|
|
|
|
// Sanity check
|
|
// Open and close the spotlight
|
|
await toggleSpotlight();
|
|
await expect(page.locator(".mx_SpotlightDialog")).toBeVisible();
|
|
await toggleSpotlight();
|
|
|
|
await util.openTac();
|
|
// The spotlight should not be opened
|
|
await toggleSpotlight();
|
|
await expect(page.locator(".mx_SpotlightDialog")).not.toBeVisible();
|
|
});
|
|
|
|
test("should have the correct hover state", async ({ util, page }) => {
|
|
await util.hoverTacButton();
|
|
await expect(util.getSpacePanel()).toMatchScreenshot("tac-hovered.png");
|
|
|
|
// Expand the space panel, hover the button and take a screenshot
|
|
await util.expandSpacePanel();
|
|
await util.hoverTacButton();
|
|
await expect(util.getSpacePanel()).toMatchScreenshot("tac-hovered-expanded.png");
|
|
});
|
|
|
|
test("should mark all threads as read", async ({ room1, room2, util, msg, page }) => {
|
|
await util.receiveMessages(room1, ["Msg1", msg.threadedOff("Msg1", "Resp1")]);
|
|
|
|
await util.assertNotificationTac();
|
|
|
|
await util.openTac();
|
|
await util.clickRoomInTac(room1.name);
|
|
|
|
util.clickMarkAllThreadsRead();
|
|
|
|
await util.assertNoTacIndicator();
|
|
});
|
|
|
|
test("should focus the thread tab when clicking an item in the TAC", async ({ room1, room2, util, msg }) => {
|
|
await util.receiveMessages(room1, ["Msg1", msg.threadedOff("Msg1", "Resp1")]);
|
|
|
|
await util.openTac();
|
|
await util.clickRoomInTac(room1.name);
|
|
|
|
await util.assertThreadTabFocused();
|
|
});
|
|
});
|