Skip to content

Commit 478df64

Browse files
Merge branch 'develop' into fix/CORE-217/fixing-room-search-filter-persistence
2 parents 4e7731c + a4d8a2b commit 478df64

File tree

84 files changed

+1516
-338
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+1516
-338
lines changed

.changeset/clever-guests-invent.md

-8
This file was deleted.

.changeset/fair-peaches-cough.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@rocket.chat/meteor": patch
3+
"@rocket.chat/livechat": patch
4+
---
5+
6+
Fixes the livechat client ignoring the `livechat_fileuploads_enabled` setting when uploading files

.changeset/lemon-schools-double.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@rocket.chat/meteor": patch
3+
---
4+
5+
fixed an issue where mentioning a team would trigger the bot message warning that the team is not a part of the channel

.changeset/shaggy-yaks-train.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@rocket.chat/meteor": patch
3+
---
4+
5+
Fixed an issue where Rocket.Chat would ask admins to confirm fingerprint change (new workspace vs configuration update), even when `AUTO_ACCEPT_FINGERPRINT` environment variable set to `"true"`.

.changeset/soft-shrimps-beg.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@rocket.chat/meteor": patch
3+
---
4+
5+
This PR have made enhancements to the select and multiselect inputs related to Omnichannel Departments, now the options properly display the complete department names, ensuring clarity for users and added text wrapping for long department names, enhancing readability and UX.

.changeset/swift-readers-speak.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@rocket.chat/meteor": minor
3+
"@rocket.chat/i18n": minor
4+
---
5+
6+
Added "Enable Users" option under "Sync User Active State" LDAP setting to allow only re-enabling users found on LDAP background sync

.changeset/thin-peaches-own.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@rocket.chat/meteor': patch
3+
---
4+
5+
Fixes an issue where message reactions are vertically misaligned when zooming out

apps/meteor/app/cloud/server/functions/saveRegistrationData.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
import { applyLicense } from '@rocket.chat/license';
12
import { Settings } from '@rocket.chat/models';
23

3-
import { applyLicense } from '../../../../ee/app/license/server/applyLicense';
44
import { settings } from '../../../settings/server';
55
import { syncCloudData } from './syncWorkspace/syncCloudData';
66

apps/meteor/app/lib/server/functions/addUserToDefaultChannels.ts

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Subscriptions } from '@rocket.chat/models';
44

55
import { callbacks } from '../../../../lib/callbacks';
66
import { getSubscriptionAutotranslateDefaultConfig } from '../../../../server/lib/getSubscriptionAutotranslateDefaultConfig';
7+
import { getDefaultSubscriptionPref } from '../../../utils/lib/getDefaultSubscriptionPref';
78
import { getDefaultChannels } from './getDefaultChannels';
89

910
export const addUserToDefaultChannels = async function (user: IUser, silenced?: boolean): Promise<void> {
@@ -23,6 +24,7 @@ export const addUserToDefaultChannels = async function (user: IUser, silenced?:
2324
groupMentions: 0,
2425
...(room.favorite && { f: true }),
2526
...autoTranslateConfig,
27+
...getDefaultSubscriptionPref(user),
2628
});
2729

2830
// Insert user joined message

apps/meteor/app/lib/server/functions/addUserToRoom.ts

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { RoomMemberActions } from '../../../../definition/IRoomTypeConfig';
99
import { callbacks } from '../../../../lib/callbacks';
1010
import { getSubscriptionAutotranslateDefaultConfig } from '../../../../server/lib/getSubscriptionAutotranslateDefaultConfig';
1111
import { roomCoordinator } from '../../../../server/lib/rooms/roomCoordinator';
12+
import { getDefaultSubscriptionPref } from '../../../utils/lib/getDefaultSubscriptionPref';
1213

1314
export const addUserToRoom = async function (
1415
rid: string,
@@ -81,6 +82,7 @@ export const addUserToRoom = async function (
8182
userMentions: 1,
8283
groupMentions: 0,
8384
...autoTranslateConfig,
85+
...getDefaultSubscriptionPref(userToBeAdded as IUser),
8486
});
8587

8688
if (!userToBeAdded.username) {

apps/meteor/app/lib/server/functions/createRoom.ts

+9-8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Meteor } from 'meteor/meteor';
1010
import { callbacks } from '../../../../lib/callbacks';
1111
import { beforeCreateRoomCallback } from '../../../../lib/callbacks/beforeCreateRoomCallback';
1212
import { getSubscriptionAutotranslateDefaultConfig } from '../../../../server/lib/getSubscriptionAutotranslateDefaultConfig';
13+
import { getDefaultSubscriptionPref } from '../../../utils/lib/getDefaultSubscriptionPref';
1314
import { getValidRoomName } from '../../../utils/server/lib/getValidRoomName';
1415
import { createDirectRoom } from './createDirectRoom';
1516

@@ -36,14 +37,14 @@ async function createUsersSubscriptions({
3637
options?: ICreateRoomParams['options'];
3738
}) {
3839
if (shouldBeHandledByFederation) {
39-
const extra: Partial<ISubscriptionExtraData> = options?.subscriptionExtra || {};
40-
extra.open = true;
41-
extra.ls = now;
42-
extra.roles = ['owner'];
43-
44-
if (room.prid) {
45-
extra.prid = room.prid;
46-
}
40+
const extra: Partial<ISubscriptionExtraData> = {
41+
...options?.subscriptionExtra,
42+
open: true,
43+
ls: now,
44+
roles: ['owner'],
45+
...(room.prid && { prid: room.prid }),
46+
...getDefaultSubscriptionPref(owner),
47+
};
4748

4849
await Subscriptions.createWithRoomAndUser(room, owner, extra);
4950

apps/meteor/app/lib/server/startup/mentionUserNotInChannel.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ callbacks.add(
6262
return message;
6363
}
6464

65-
const mentions = message.mentions.filter(({ _id }) => _id !== 'all' && _id !== 'here');
65+
const mentions = message.mentions.filter(({ _id, type }) => _id !== 'all' && _id !== 'here' && type !== 'team');
6666
if (!mentions.length) {
6767
return message;
6868
}

apps/meteor/app/livechat/imports/server/rest/upload.ts

+8
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,14 @@ API.v1.addRoute('livechat/upload/:rid', {
1414
return API.v1.unauthorized();
1515
}
1616

17+
const canUpload = settings.get<boolean>('Livechat_fileupload_enabled') && settings.get<boolean>('FileUpload_Enabled');
18+
19+
if (!canUpload) {
20+
return API.v1.failure({
21+
reason: 'error-file-upload-disabled',
22+
});
23+
}
24+
1725
const visitorToken = this.request.headers['x-visitor-token'];
1826
const visitor = await LivechatVisitors.getVisitorByToken(visitorToken as string, {});
1927

apps/meteor/ee/app/license/server/getStatistics.ts apps/meteor/app/statistics/server/lib/getEEStatistics.ts

+6-21
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,15 @@
11
import { log } from 'console';
22

33
import { Analytics } from '@rocket.chat/core-services';
4+
import type { IStats } from '@rocket.chat/core-typings';
45
import { License } from '@rocket.chat/license';
56
import { CannedResponse, OmnichannelServiceLevelAgreements, LivechatRooms, LivechatTag, LivechatUnit, Users } from '@rocket.chat/models';
67

7-
type ENTERPRISE_STATISTICS = GenericStats & Partial<EEOnlyStats>;
8-
9-
type GenericStats = {
10-
modules: string[];
11-
tags: string[];
12-
seatRequests: number;
13-
};
14-
15-
type EEOnlyStats = {
16-
livechatTags: number;
17-
cannedResponses: number;
18-
priorities: number;
19-
slas: number;
20-
businessUnits: number;
21-
omnichannelPdfTranscriptRequested: number;
22-
omnichannelPdfTranscriptSucceeded: number;
23-
omnichannelRoomsWithSlas: number;
24-
omnichannelRoomsWithPriorities: number;
25-
livechatMonitors: number;
26-
};
8+
type ENTERPRISE_STATISTICS = IStats['enterprise'];
9+
10+
type GenericStats = Pick<ENTERPRISE_STATISTICS, 'modules' | 'tags' | 'seatRequests'>;
11+
12+
type EEOnlyStats = Omit<ENTERPRISE_STATISTICS, keyof GenericStats>;
2713

2814
export async function getStatistics(): Promise<ENTERPRISE_STATISTICS> {
2915
const genericStats: GenericStats = {
@@ -42,7 +28,6 @@ export async function getStatistics(): Promise<ENTERPRISE_STATISTICS> {
4228
return statistics;
4329
}
4430

45-
// These models are only available on EE license so don't import them inside CE license as it will break the build
4631
async function getEEStatistics(): Promise<EEOnlyStats | undefined> {
4732
if (!License.hasModule('livechat-enterprise')) {
4833
return;

apps/meteor/app/statistics/server/lib/statistics.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import {
2929
import { MongoInternals } from 'meteor/mongo';
3030
import moment from 'moment';
3131

32-
import { getStatistics as getEnterpriseStatistics } from '../../../../ee/app/license/server/getStatistics';
3332
import { readSecondaryPreferred } from '../../../../server/database/readSecondaryPreferred';
3433
import { isRunningMs } from '../../../../server/lib/isRunningMs';
3534
import { getControl } from '../../../../server/lib/migrations';
@@ -40,6 +39,7 @@ import { settings } from '../../../settings/server';
4039
import { Info } from '../../../utils/rocketchat.info';
4140
import { getMongoInfo } from '../../../utils/server/functions/getMongoInfo';
4241
import { getAppsStatistics } from './getAppsStatistics';
42+
import { getStatistics as getEnterpriseStatistics } from './getEEStatistics';
4343
import { getImporterStatistics } from './getImporterStatistics';
4444
import { getServicesStatistics } from './getServicesStatistics';
4545

apps/meteor/client/components/AutoCompleteDepartment.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ const AutoCompleteDepartment = ({
5151

5252
return (
5353
<PaginatedSelectFiltered
54-
{...props}
5554
withTitle
55+
{...props}
5656
value={value}
5757
onChange={onChange}
5858
filter={departmentsFilter}

apps/meteor/client/components/AutoCompleteDepartmentMultiple.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { PaginatedMultiSelectFiltered } from '@rocket.chat/fuselage';
1+
import { Option, PaginatedMultiSelectFiltered } from '@rocket.chat/fuselage';
22
import type { PaginatedMultiSelectOption } from '@rocket.chat/fuselage';
33
import { useDebouncedValue } from '@rocket.chat/fuselage-hooks';
44
import { useTranslation } from '@rocket.chat/ui-contexts';
@@ -65,6 +65,7 @@ const AutoCompleteDepartmentMultiple = ({
6565
return loadMoreDepartments(start, Math.min(50, departmentsTotal));
6666
}
6767
}
68+
renderItem={({ label, ...props }) => <Option {...props} label={<span style={{ whiteSpace: 'normal' }}>{label}</span>} />}
6869
/>
6970
);
7071
};

apps/meteor/client/components/FilterByText.tsx

+12-10
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import { Box, Icon, TextInput, Button, Margins } from '@rocket.chat/fuselage';
2+
import { useAutoFocus, useMergedRefs } from '@rocket.chat/fuselage-hooks';
23
import { useTranslation } from '@rocket.chat/ui-contexts';
3-
import type { ReactNode, ChangeEvent, FormEvent, ReactElement } from 'react';
4-
import React, { memo, useCallback, useEffect, useState } from 'react';
4+
import type { ReactNode, ChangeEvent, FormEvent } from 'react';
5+
import React, { forwardRef, memo, useCallback, useEffect, useState } from 'react';
56

67
type FilterByTextCommonProps = {
78
children?: ReactNode | undefined;
89
placeholder?: string;
9-
inputRef?: () => void;
1010
onChange: (filter: { text: string }) => void;
11-
autoFocus?: boolean;
1211
};
1312

1413
type FilterByTextPropsWithButton = FilterByTextCommonProps & {
@@ -22,10 +21,14 @@ type FilterByTextProps = FilterByTextCommonProps | FilterByTextPropsWithButton;
2221
const isFilterByTextPropsWithButton = (props: any): props is FilterByTextPropsWithButton =>
2322
'displayButton' in props && props.displayButton === true;
2423

25-
const FilterByText = ({ placeholder, onChange: setFilter, inputRef, children, autoFocus, ...props }: FilterByTextProps): ReactElement => {
24+
const FilterByText = forwardRef<HTMLElement, FilterByTextProps>(function FilterByText(
25+
{ placeholder, onChange: setFilter, children, ...props },
26+
ref,
27+
) {
2628
const t = useTranslation();
27-
2829
const [text, setText] = useState('');
30+
const autoFocusRef = useAutoFocus();
31+
const mergedRefs = useMergedRefs(ref, autoFocusRef);
2932

3033
const handleInputChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {
3134
setText(event.currentTarget.value);
@@ -44,11 +47,10 @@ const FilterByText = ({ placeholder, onChange: setFilter, inputRef, children, au
4447
<Box mi={4} display='flex' flexGrow={1}>
4548
<TextInput
4649
placeholder={placeholder ?? t('Search')}
47-
ref={inputRef}
50+
ref={mergedRefs}
4851
addon={<Icon name='magnifier' size='x20' />}
4952
onChange={handleInputChange}
5053
value={text}
51-
autoFocus={autoFocus}
5254
flexGrow={2}
5355
minWidth='x220'
5456
/>
@@ -62,6 +64,6 @@ const FilterByText = ({ placeholder, onChange: setFilter, inputRef, children, au
6264
)}
6365
</Box>
6466
);
65-
};
67+
});
6668

67-
export default memo<FilterByTextProps>(FilterByText);
69+
export default memo(FilterByText);

apps/meteor/client/components/ImageGallery/ImageGallery.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ export const ImageGallery = ({ images, onClose, loadMore }: { images: IUpload[];
128128
return createPortal(
129129
<FocusScope contain autoFocus>
130130
<Box className={swiperStyle}>
131-
<div className='swiper-container' onClick={onClose}>
131+
<div role='presentation' className='swiper-container' onClick={onClose}>
132132
<ButtonGroup className='rcx-swiper-controls' onClick={preventPropagation}>
133133
{zoomScale !== 1 && <IconButton small icon='arrow-collapse' title='Resize' rcx-swiper-zoom-out onClick={handleResize} />}
134134
<IconButton small icon='h-bar' title='Zoom out' rcx-swiper-zoom-out onClick={handleZoomOut} disabled={zoomScale === 1} />
@@ -155,7 +155,10 @@ export const ImageGallery = ({ images, onClose, loadMore }: { images: IUpload[];
155155
{images?.map(({ _id, url }) => (
156156
<SwiperSlide key={_id}>
157157
<div className='swiper-zoom-container'>
158-
<img src={url} loading='lazy' onClick={preventPropagation} />
158+
<span tabIndex={0} role='link' onClick={preventPropagation} onKeyDown={preventPropagation}>
159+
<img src={url} loading='lazy' alt='' />
160+
</span>
161+
159162
<div className='rcx-lazy-preloader'>
160163
<Throbber inheritColor />
161164
</div>

apps/meteor/client/components/Omnichannel/modals/ForwardChatModal.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
Divider,
1111
FieldLabel,
1212
FieldRow,
13+
Option,
1314
} from '@rocket.chat/fuselage';
1415
import { useDebouncedValue } from '@rocket.chat/fuselage-hooks';
1516
import { useEndpoint, useSetting, useTranslation } from '@rocket.chat/ui-contexts';
@@ -106,7 +107,7 @@ const ForwardChatModal = ({
106107
<FieldLabel>{t('Forward_to_department')}</FieldLabel>
107108
<FieldRow>
108109
<PaginatedSelectFiltered
109-
withTitle
110+
withTitle={false}
110111
filter={departmentsFilter as string}
111112
setFilter={setDepartmentsFilter}
112113
options={departments}
@@ -118,6 +119,7 @@ const ForwardChatModal = ({
118119
}}
119120
flexGrow={1}
120121
endReached={endReached}
122+
renderItem={({ label, ...props }) => <Option {...props} label={<span style={{ whiteSpace: 'normal' }}>{label}</span>} />}
121123
/>
122124
</FieldRow>
123125
</Field>

apps/meteor/client/components/message/IgnoredContent.tsx

+8-2
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,15 @@ const IgnoredContent = ({ onShowMessageIgnored }: IgnoredContentProps): ReactEle
1919
return (
2020
<MessageBody data-qa-type='message-body' dir='auto'>
2121
<Box display='flex' alignItems='center' fontSize='c2' color='hint'>
22-
<p role='button' onClick={showMessageIgnored} style={{ cursor: 'pointer' }}>
22+
<span
23+
tabIndex={0}
24+
role='button'
25+
onClick={showMessageIgnored}
26+
onKeyDown={(e) => e.code === 'Enter' && showMessageIgnored(e)}
27+
style={{ cursor: 'pointer' }}
28+
>
2329
<Icon name='chevron-left' /> {t('Message_Ignored')}
24-
</p>
30+
</span>
2531
</Box>
2632
</MessageBody>
2733
);

apps/meteor/client/components/message/content/Reactions.tsx

+16-19
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,22 @@ const Reactions = ({ message, ...props }: ReactionsProps): ReactElement => {
2323
const { toolbarProps } = useToolbar(props, ref);
2424

2525
return (
26-
<MessageReactions>
27-
{message.reactions && (
28-
<div ref={ref} {...toolbarProps} {...props}>
29-
{Object.entries(message.reactions).map(([name, reactions]) => (
30-
<Reaction
31-
key={name}
32-
counter={reactions.usernames.length}
33-
hasReacted={hasReacted}
34-
name={name}
35-
names={reactions.usernames.filter((user) => user !== username).map((username) => `@${username}`)}
36-
messageId={message._id}
37-
onKeyDown={(e: KeyboardEvent) =>
38-
(e.code === 'Space' || e.code === 'Enter') && toggleReactionMutation.mutate({ mid: message._id, reaction: name })
39-
}
40-
onClick={() => toggleReactionMutation.mutate({ mid: message._id, reaction: name })}
41-
/>
42-
))}
43-
</div>
44-
)}
26+
<MessageReactions ref={ref} {...toolbarProps} {...props}>
27+
{message.reactions &&
28+
Object.entries(message.reactions).map(([name, reactions]) => (
29+
<Reaction
30+
key={name}
31+
counter={reactions.usernames.length}
32+
hasReacted={hasReacted}
33+
name={name}
34+
names={reactions.usernames.filter((user) => user !== username).map((username) => `@${username}`)}
35+
messageId={message._id}
36+
onKeyDown={(e: KeyboardEvent) =>
37+
(e.code === 'Space' || e.code === 'Enter') && toggleReactionMutation.mutate({ mid: message._id, reaction: name })
38+
}
39+
onClick={() => toggleReactionMutation.mutate({ mid: message._id, reaction: name })}
40+
/>
41+
))}
4542
<MessageReactionAction
4643
title={t('Add_Reaction')}
4744
onKeyDown={(e: KeyboardEvent) => (e.code === 'Space' || e.code === 'Enter') && openEmojiPicker(e)}

apps/meteor/client/components/message/content/attachments/structure/AttachmentImage.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ const AttachmentImage: FC<AttachmentImageProps> = ({ id, previewUrl, dataSrc, lo
8383
className='gallery-item'
8484
data-src={dataSrc || src}
8585
src={src}
86+
alt=''
8687
width={dimensions.width}
8788
height={dimensions.height}
8889
/>

0 commit comments

Comments
 (0)