Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
78653b6
chore: bump fuselage@dev
dougfabris Jun 6, 2025
2ca459a
feat: New sidebar filters categories (#36174)
dougfabris Jun 6, 2025
a0b70be
feat: Introduce consolidated `SidePanelItem` (#36187)
dougfabris Jun 10, 2025
c0156c9
feat: Add unread badges in sidebar filters items (#36199)
dougfabris Jun 11, 2025
01deb19
feat: New team collab sidebar filters (#36196)
dougfabris Jun 11, 2025
571bb93
chore: sidePanelFiltersConfig
dougfabris Jun 12, 2025
c6c28ed
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jun 13, 2025
468a1d2
feat: Responsive navigation filters (#36227)
dougfabris Jun 18, 2025
dafeccd
fix: remove `selected` state from filters item
dougfabris Jun 18, 2025
8098fcf
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jun 20, 2025
7fb2e74
chore: Remove display modes and options from new navigation (#36152)
yash-rajpal Jun 23, 2025
a52f68b
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jun 24, 2025
72f63a6
feat: Room notification preferences options on sidebar room menu (#36…
yash-rajpal Jun 24, 2025
8523151
fix: Teams not showing up on mentions sidebar filter (#36297)
yash-rajpal Jun 24, 2025
c5367ce
chore: sidebar item focus tweaks
dougfabris Jun 24, 2025
3a7835e
feat: Remove team sidepanel feature preview settings (#36301)
yash-rajpal Jun 27, 2025
bcf06aa
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jul 2, 2025
66e3219
chore: apply fuselage snapshot only in meteor
dougfabris Jul 2, 2025
8bcb42b
chore: move sidepanel component to navigation folder
dougfabris Jul 1, 2025
1a6a2f7
chore: use `useButtonPattern`
dougfabris Jul 1, 2025
89e529b
feat: Sidebar filters for teams/channels/dms (#36322)
dougfabris Jul 9, 2025
1a3cce3
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jul 9, 2025
06388f0
fix: Sidebar groups expanded and filters (#36395)
yash-rajpal Jul 10, 2025
78606a7
fix: not highlighting `room.alert` in filters
dougfabris Jul 11, 2025
ca2daf5
i18n: fix typo
dougfabris Jul 11, 2025
30c7240
chore: fix some dms and rooms not displaying in sidepanel
yash-rajpal Jul 14, 2025
4e7fe53
chore: change discussion filter icon
dougfabris Jul 15, 2025
c203167
fix: room filters item icon not highlighted when unread
dougfabris Jul 15, 2025
5bba393
chore: wrong color value in NavBarSearchListbox
dougfabris Jul 15, 2025
443af43
fix: spacing in sidepanel filter title and back button
dougfabris Jul 15, 2025
0e10289
chore: Remove parent room tag on room filters (#36414)
yash-rajpal Jul 15, 2025
dbd02fc
chore: rename toggleUnread function
dougfabris Jul 15, 2025
de059eb
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jul 16, 2025
08c67cd
fix: Sidebar and sidepanel behavior in mobile view (#36450)
yash-rajpal Jul 16, 2025
fa6407c
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jul 22, 2025
188ab4d
fix: sidepanel filters empty state variations
dougfabris Jul 17, 2025
242d112
feat: Omnichannel filters (#36467)
yash-rajpal Jul 21, 2025
1e0ca07
fix: missing encrypted message preview in SidePanelItem
dougfabris Jul 22, 2025
6aa3087
feat: New Omnichannel Priorities Tag (#36501)
dougfabris Jul 24, 2025
9baa922
feat: Sidepanel parent room tag (#36489)
yash-rajpal Jul 24, 2025
3d7c067
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jul 25, 2025
3ecf23b
chore: Show MAC limit warning on omnichannel rooms (#36517)
yash-rajpal Jul 24, 2025
7abbdf7
chore: persist main room on top when rooms filter
dougfabris Jul 25, 2025
682c45d
chore: remove icon in rooms filters empty state
dougfabris Jul 25, 2025
1fde39a
chore: check array length for `tunreadUser` and `tunreadGroup`
dougfabris Jul 25, 2025
ac981d8
fix: missing empty states
dougfabris Jul 25, 2025
2bc5ac7
chore: filter review
dougfabris Jul 25, 2025
337adb8
chore: add E2E tests for sidebar filters (#36394)
yash-rajpal Jul 29, 2025
7f28868
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jul 29, 2025
861ec16
chore: simplify `SidePanelTagIcon`
dougfabris Jul 29, 2025
939096f
fix: don't render empty collapser
yash-rajpal Jul 29, 2025
959315f
Merge branch 'develop' into feat/sidebar-filters
dougfabris Jul 30, 2025
5892865
fix: react-virtuoso zero sized element issue
yash-rajpal Jul 31, 2025
bdada3f
fix: sidepanel toggle switch value not reactive
dougfabris Jul 31, 2025
c894c06
fix(sidebarV2): Hide filters based on settings and permissions (#36588)
yash-rajpal Jul 31, 2025
da21dd0
Merge branch 'develop' into feat/sidebar-filters
dougfabris Aug 2, 2025
a38260f
chore: move omnichannel tabs to its scope
dougfabris Aug 7, 2025
776d1fa
fix: sanitize `SubscriptionWithRoom` and `ILivechatInquireRecord`
dougfabris Aug 8, 2025
e13f985
chore: remove nullish return in `RoomListFilters`
dougfabris Aug 8, 2025
ae885d0
chore: remove Sidebar unnecessary className filter
dougfabris Aug 14, 2025
df2ff81
chore: remove `useSetting` assertion
dougfabris Aug 8, 2025
a49d848
chore: simplify `shouldDisplaySidePanel`
dougfabris Aug 8, 2025
00af1bb
chore: simplify `useParentTeamData`
dougfabris Aug 8, 2025
73e55a3
fix: JSDoc not being applied to the correct function
dougfabris Aug 8, 2025
5dd1cc4
chore: `PriorityIcon` nullish return
dougfabris Aug 8, 2025
23f2d80
test: revert test to serial
dougfabris Aug 14, 2025
d2b9199
fix: prevent anchor default action for sidebar filters
dougfabris Aug 14, 2025
e999269
Merge branch 'develop' into feat/sidebar-filters
dougfabris Aug 14, 2025
47e76f2
chore: create `navigation-region` constant
dougfabris Aug 14, 2025
83f5922
chore: add `RoomListFiltersItemBadge` annotation
dougfabris Aug 14, 2025
27124b6
chore: remove excessive filters enums
dougfabris Aug 15, 2025
6e0a0b8
chore: changeset
dougfabris Aug 15, 2025
6b0a9b9
chore: use `SidePanelAll` as fallback
dougfabris Aug 15, 2025
c9be854
chore: use teams related query hooks
dougfabris Aug 15, 2025
60e5d2e
chore: `isLivechatInquiryRecord`
dougfabris Aug 15, 2025
2191ace
chore: Side panel internationalized
dougfabris Aug 15, 2025
fa39c4b
chore: refactor `useRoomMenuActions`
dougfabris Aug 15, 2025
0130d8d
chore: update feature preview img and description
dougfabris Aug 15, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions .changeset/twenty-wasps-attend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
'@rocket.chat/mock-providers': minor
'@rocket.chat/core-services': minor
'@rocket.chat/model-typings': minor
'@rocket.chat/core-typings': minor
'@rocket.chat/rest-typings': minor
'@rocket.chat/ui-contexts': minor
'@rocket.chat/ui-client': minor
'@rocket.chat/models': minor
'@rocket.chat/i18n': minor
'@rocket.chat/meteor': minor
---

Introduces the side navigation with a new filtering system. The update adds new filters for All, Mentions, Favorites, and Discussions, as well as dedicated filters for Omnichannel conversations and grouping by Teams, Channels, and DMs.
> This change is being tested under `Enhanced navigation experience` feature preview, in order to check it you need to enabled it
11 changes: 3 additions & 8 deletions apps/meteor/app/api/server/v1/rooms.ts
Original file line number Diff line number Diff line change
Expand Up @@ -363,13 +363,8 @@ API.v1.addRoute(
}

await Promise.all(
Object.keys(notifications as Notifications).map(async (notificationKey) =>
saveNotificationSettingsMethod(
this.userId,
roomId,
notificationKey as NotificationFieldType,
notifications[notificationKey as keyof Notifications],
),
Object.entries(notifications as Notifications).map(async ([notificationKey, notificationValue]) =>
saveNotificationSettingsMethod(this.userId, roomId, notificationKey as NotificationFieldType, notificationValue),
),
);

Expand Down Expand Up @@ -463,7 +458,7 @@ API.v1.addRoute(
const discussionParent =
room.prid &&
(await Rooms.findOneById<Pick<IRoom, 'name' | 'fname' | 't' | 'prid' | 'u'>>(room.prid, {
projection: { name: 1, fname: 1, t: 1, prid: 1, u: 1, sidepanel: 1 },
projection: { name: 1, fname: 1, t: 1, prid: 1, u: 1 },
}));
const { team, parentRoom } = await Team.getRoomInfo(room);
const parent = discussionParent || parentRoom;
Expand Down
9 changes: 2 additions & 7 deletions apps/meteor/app/api/server/v1/teams.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Team } from '@rocket.chat/core-services';
import type { ITeam, UserStatus } from '@rocket.chat/core-typings';
import { TEAM_TYPE, isValidSidepanel } from '@rocket.chat/core-typings';
import { TEAM_TYPE } from '@rocket.chat/core-typings';
import { Users, Rooms } from '@rocket.chat/models';
import {
isTeamsConvertToChannelProps,
Expand Down Expand Up @@ -78,11 +78,7 @@ API.v1.addRoute(
}),
);

const { name, type, members, room, owner, sidepanel } = this.bodyParams;

if (sidepanel?.items && !isValidSidepanel(sidepanel)) {
throw new Error('error-invalid-sidepanel');
}
const { name, type, members, room, owner } = this.bodyParams;

const team = await Team.create(this.userId, {
team: {
Expand All @@ -92,7 +88,6 @@ API.v1.addRoute(
room,
members,
owner,
sidepanel,
});

return API.v1.success({ team });
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Team } from '@rocket.chat/core-services';
import type { IRoom, IRoomWithRetentionPolicy, IUser, MessageTypesValues } from '@rocket.chat/core-typings';
import { TEAM_TYPE, isValidSidepanel } from '@rocket.chat/core-typings';
import { TEAM_TYPE } from '@rocket.chat/core-typings';
import type { ServerMethods } from '@rocket.chat/ddp-client';
import { Rooms, Users } from '@rocket.chat/models';
import { Match } from 'meteor/check';
Expand Down Expand Up @@ -47,7 +47,6 @@ type RoomSettings = {
favorite: boolean;
defaultValue: boolean;
};
sidepanel?: IRoom['sidepanel'];
};

type RoomSettingsValidators = {
Expand Down Expand Up @@ -79,23 +78,6 @@ const validators: RoomSettingsValidators = {
});
}
},
async sidepanel({ room, userId, value }) {
if (!room.teamMain) {
throw new Meteor.Error('error-action-not-allowed', 'Invalid room', {
method: 'saveRoomSettings',
});
}

if (!(await hasPermissionAsync(userId, 'edit-team', room._id))) {
throw new Meteor.Error('error-action-not-allowed', 'You do not have permission to change sidepanel items', {
method: 'saveRoomSettings',
});
}

if (!isValidSidepanel(value)) {
throw new Meteor.Error('error-invalid-sidepanel');
}
},

async roomType({ userId, room, value }) {
if (value === room.t) {
Expand Down Expand Up @@ -249,11 +231,6 @@ const settingSavers: RoomSettingsSavers = {
await saveRoomTopic(rid, value, user);
}
},
async sidepanel({ value, rid, room }) {
if (JSON.stringify(value) !== JSON.stringify(room.sidepanel)) {
await Rooms.setSidepanelById(rid, value);
}
},
async roomAnnouncement({ value, room, rid, user }) {
if (!value && !room.announcement) {
return;
Expand Down Expand Up @@ -376,7 +353,6 @@ const fields: (keyof RoomSettings)[] = [
'retentionOverrideGlobal',
'encrypted',
'favorite',
'sidepanel',
];

const validate = <TRoomSetting extends keyof RoomSettings>(
Expand Down
2 changes: 0 additions & 2 deletions apps/meteor/app/lib/server/functions/createRoom.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,6 @@ export const createRoom = async <T extends RoomType>(
readOnly?: boolean,
roomExtraData?: Partial<IRoom>,
options?: ICreateRoomParams['options'],
sidepanel?: ICreateRoomParams['sidepanel'],
): Promise<
ICreatedRoom & {
rid: string;
Expand Down Expand Up @@ -202,7 +201,6 @@ export const createRoom = async <T extends RoomType>(
},
ts: now,
ro: readOnly === true,
...(sidepanel && { sidepanel }),
};

if (teamId) {
Expand Down
18 changes: 0 additions & 18 deletions apps/meteor/client/NavBarV2/NavBarPagesGroup/NavBarItemSort.tsx

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import NavBarItemCreateNew from './NavBarItemCreateNew';
import NavBarItemDirectoryPage from './NavBarItemDirectoryPage';
import NavBarItemHomePage from './NavBarItemHomePage';
import NavBarItemMarketPlaceMenu from './NavBarItemMarketPlaceMenu';
import NavBarItemSort from './NavBarItemSort';
import NavBarPagesStackMenu from './NavBarPagesStackMenu';

const NavBarPagesGroup = () => {
Expand All @@ -28,7 +27,6 @@ const NavBarPagesGroup = () => {
)}
{showMarketplace && !isMobile && <NavBarItemMarketPlaceMenu />}
<NavBarItemCreateNew />
{!isMobile && <NavBarItemSort />}
</NavBarGroup>
);
};
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import type { SidepanelItem } from '@rocket.chat/core-typings';
import {
Box,
Button,
Expand All @@ -15,15 +14,13 @@ import {
FieldHint,
Accordion,
AccordionItem,
Divider,
ModalHeader,
ModalTitle,
ModalClose,
ModalContent,
ModalFooter,
ModalFooterControllers,
} from '@rocket.chat/fuselage';
import { FeaturePreview, FeaturePreviewOff, FeaturePreviewOn } from '@rocket.chat/ui-client';
import {
useEndpoint,
usePermission,
Expand All @@ -49,8 +46,6 @@ type CreateTeamModalInputs = {
encrypted: boolean;
broadcast: boolean;
members?: string[];
showDiscussions?: boolean;
showChannels?: boolean;
};

type CreateTeamModalProps = { onClose: () => void };
Expand Down Expand Up @@ -108,8 +103,6 @@ const CreateTeamModal = ({ onClose }: CreateTeamModalProps) => {
encrypted: (e2eEnabledForPrivateByDefault as boolean) ?? false,
broadcast: false,
members: [],
showChannels: true,
showDiscussions: true,
},
});

Expand Down Expand Up @@ -139,10 +132,7 @@ const CreateTeamModal = ({ onClose }: CreateTeamModalProps) => {
topic,
broadcast,
encrypted,
showChannels,
showDiscussions,
}: CreateTeamModalInputs): Promise<void> => {
const sidepanelItem = [showChannels && 'channels', showDiscussions && 'discussions'].filter(Boolean) as [SidepanelItem, SidepanelItem?];
const params = {
name,
members,
Expand All @@ -155,7 +145,6 @@ const CreateTeamModal = ({ onClose }: CreateTeamModalProps) => {
encrypted,
},
},
...((showChannels || showDiscussions) && { sidepanel: { items: sidepanelItem } }),
};

try {
Expand All @@ -177,8 +166,6 @@ const CreateTeamModal = ({ onClose }: CreateTeamModalProps) => {
const encryptedId = useId();
const broadcastId = useId();
const addMembersId = useId();
const showChannelsId = useId();
const showDiscussionsId = useId();

return (
<Modal
Expand Down Expand Up @@ -265,56 +252,6 @@ const CreateTeamModal = ({ onClose }: CreateTeamModalProps) => {
</FieldGroup>
<Accordion>
<AccordionItem title={t('Advanced_settings')}>
<FeaturePreview feature='sidepanelNavigation'>
<FeaturePreviewOff>{null}</FeaturePreviewOff>
<FeaturePreviewOn>
<FieldGroup>
<Box is='h5' fontScale='h5' color='titles-labels'>
{t('Navigation')}
</Box>
<Field>
<FieldRow>
<FieldLabel htmlFor={showChannelsId}>{t('Channels')}</FieldLabel>
<Controller
control={control}
name='showChannels'
render={({ field: { onChange, value, ref } }): ReactElement => (
<ToggleSwitch
aria-describedby={`${showChannelsId}-hint`}
id={showChannelsId}
onChange={onChange}
checked={value}
ref={ref}
/>
)}
/>
</FieldRow>
<FieldDescription id={`${showChannelsId}-hint`}>{t('Show_channels_description')}</FieldDescription>
</Field>

<Field>
<FieldRow>
<FieldLabel htmlFor={showDiscussionsId}>{t('Discussions')}</FieldLabel>
<Controller
control={control}
name='showDiscussions'
render={({ field: { onChange, value, ref } }): ReactElement => (
<ToggleSwitch
aria-describedby={`${showDiscussionsId}-hint`}
id={showDiscussionsId}
onChange={onChange}
checked={value}
ref={ref}
/>
)}
/>
</FieldRow>
<FieldDescription id={`${showDiscussionsId}-hint`}>{t('Show_discussions_description')}</FieldDescription>
</Field>
</FieldGroup>
<Divider mb={36} />
</FeaturePreviewOn>
</FeaturePreview>
<FieldGroup>
<Box is='h5' fontScale='h5' color='titles-labels'>
{t('Security_and_permissions')}
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Loading
Loading