diff --git a/.changeset/chilled-chicken-drop.md b/.changeset/chilled-chicken-drop.md new file mode 100644 index 0000000000000..139b3c00c82dd --- /dev/null +++ b/.changeset/chilled-chicken-drop.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/ddp-streamer": patch +--- + +Adds deprecation warning on `livechat:setupConnection` diff --git a/.changeset/clever-cycles-sing.md b/.changeset/clever-cycles-sing.md new file mode 100644 index 0000000000000..d52d892103f1d --- /dev/null +++ b/.changeset/clever-cycles-sing.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Adds deprecation warning on `sendFileLivechatMessage` diff --git a/.changeset/lemon-kings-approve.md b/.changeset/lemon-kings-approve.md new file mode 100644 index 0000000000000..1a6999c545273 --- /dev/null +++ b/.changeset/lemon-kings-approve.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue where messages are not being translated immediately in omnichannel rooms diff --git a/.changeset/rare-schools-laugh.md b/.changeset/rare-schools-laugh.md new file mode 100644 index 0000000000000..69cd0af9040d6 --- /dev/null +++ b/.changeset/rare-schools-laugh.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixes real-time monitoring displaying incorrect data diff --git a/.changeset/slow-tomatoes-try.md b/.changeset/slow-tomatoes-try.md new file mode 100644 index 0000000000000..91b762e4f8bf6 --- /dev/null +++ b/.changeset/slow-tomatoes-try.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue where pagination is not working properly in โ€œusers in roleโ€ table diff --git a/apps/meteor/app/autotranslate/client/lib/autotranslate.ts b/apps/meteor/app/autotranslate/client/lib/autotranslate.ts index 3cea977c8b4e4..76b45d04e18fa 100644 --- a/apps/meteor/app/autotranslate/client/lib/autotranslate.ts +++ b/apps/meteor/app/autotranslate/client/lib/autotranslate.ts @@ -148,7 +148,6 @@ export const createAutoTranslateMessageStreamHandler = (): ((message: ITranslate (record) => record._id === message._id, ({ autoTranslateFetching: _, ...record }) => ({ ...record, - autoTranslateShowInverse: true, }), ); delete AutoTranslate.messageIdsToWait[message._id]; diff --git a/apps/meteor/app/livechat/client/lib/chartHandler.ts b/apps/meteor/app/livechat/client/lib/chartHandler.ts index 55f4baafd5924..9e86c5d323513 100644 --- a/apps/meteor/app/livechat/client/lib/chartHandler.ts +++ b/apps/meteor/app/livechat/client/lib/chartHandler.ts @@ -209,3 +209,12 @@ export const updateChart = async ( chart.update(); }; + +export const resetChart = (chart: chartjs.Chart): void => { + chart.data.labels = []; + chart.data.datasets.forEach((dataset) => { + dataset.data = []; + }); + + chart.update(); +}; diff --git a/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.ts b/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.ts index ef12cf728c733..7369cd450a6b9 100644 --- a/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.ts +++ b/apps/meteor/app/livechat/server/methods/sendFileLivechatMessage.ts @@ -13,6 +13,7 @@ import { Meteor } from 'meteor/meteor'; import { sendMessageLivechat } from './sendMessageLivechat'; import { FileUpload } from '../../../file-upload/server'; +import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; interface ISendFileLivechatMessage { roomId: string; @@ -112,6 +113,7 @@ export const sendFileLivechatMessage = async ({ roomId, visitorToken, file, msgD Meteor.methods({ async sendFileLivechatMessage(roomId, visitorToken, file, msgData = {}) { + methodDeprecationLogger.method('sendFileLivechatMessage', '8.0.0', '/v1/livechat/upload/:rid'); return sendFileLivechatMessage({ roomId, visitorToken, file, msgData }); }, }); diff --git a/apps/meteor/app/livechat/server/methods/setUpConnection.ts b/apps/meteor/app/livechat/server/methods/setUpConnection.ts index d6f05c9af03f1..4aea4caa7c6fd 100644 --- a/apps/meteor/app/livechat/server/methods/setUpConnection.ts +++ b/apps/meteor/app/livechat/server/methods/setUpConnection.ts @@ -3,6 +3,7 @@ import type { ServerMethods } from '@rocket.chat/ddp-client'; import { check } from 'meteor/check'; import { Meteor } from 'meteor/meteor'; +import { methodDeprecationLogger } from '../../../lib/server/lib/deprecationWarningLogger'; import { notifyGuestStatusChanged } from '../lib/guests'; declare module '@rocket.chat/ddp-client' { @@ -24,6 +25,7 @@ declare module 'meteor/meteor' { Meteor.methods({ 'livechat:setUpConnection'(data) { + methodDeprecationLogger.method('livechat:setUpConnection', '8.0.0', 'This functionality is no longer supported'); check(data, { token: String, }); diff --git a/apps/meteor/client/components/GenericTable/hooks/usePagination.ts b/apps/meteor/client/components/GenericTable/hooks/usePagination.ts index 803752fda45ef..f7723283fd7ee 100644 --- a/apps/meteor/client/components/GenericTable/hooks/usePagination.ts +++ b/apps/meteor/client/components/GenericTable/hooks/usePagination.ts @@ -5,6 +5,9 @@ import { useItemsPerPage } from './useItemsPerPage'; import { useItemsPerPageLabel } from './useItemsPerPageLabel'; import { useShowingResultsLabel } from './useShowingResultsLabel'; +/** + * TODO: Move `usePagination` outside from `GenericTable` folder + */ export const usePagination = (): { current: ReturnType[0]; setCurrent: ReturnType[1]; diff --git a/apps/meteor/client/components/UserInfo/UserInfo.spec.tsx b/apps/meteor/client/components/UserInfo/UserInfo.spec.tsx new file mode 100644 index 0000000000000..6e2c772e368a3 --- /dev/null +++ b/apps/meteor/client/components/UserInfo/UserInfo.spec.tsx @@ -0,0 +1,18 @@ +import { composeStories } from '@storybook/react'; +import { render } from '@testing-library/react'; +import { axe } from 'jest-axe'; + +import * as stories from './UserInfo.stories'; + +const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]); +test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => { + const { baseElement } = render(); + expect(baseElement).toMatchSnapshot(); +}); + +test.each(testCases)('%s should have no a11y violations', async (_storyname, Story) => { + const { container } = render(); + + const results = await axe(container); + expect(results).toHaveNoViolations(); +}); diff --git a/apps/meteor/client/components/UserInfo/UserInfo.stories.tsx b/apps/meteor/client/components/UserInfo/UserInfo.stories.tsx index d6bd2cf662e1d..9e76aa0064590 100644 --- a/apps/meteor/client/components/UserInfo/UserInfo.stories.tsx +++ b/apps/meteor/client/components/UserInfo/UserInfo.stories.tsx @@ -1,8 +1,9 @@ import type { Meta, StoryFn } from '@storybook/react'; -import { Contextualbar } from '../Contextualbar'; +import { ContextualbarDialog } from '../Contextualbar'; import * as Status from '../UserStatus'; import UserInfo from './UserInfo'; +import { UserCardRole } from '../UserCard'; export default { component: UserInfo, @@ -10,32 +11,32 @@ export default { layout: 'fullscreen', actions: { argTypesRegex: '^on.*' }, }, - decorators: [(fn) => {fn()}], + decorators: [ + (fn) => ( + + {fn()} + + ), + ], } satisfies Meta; -const Template: StoryFn = (args) => ; - -export const Default = Template.bind({}); -Default.args = { +const defaultArgs = { name: 'Guilherme Gazzo', username: 'guilherme.gazzo', + nickname: 'gazzo', statusText: '๐Ÿ›ด currently working on User Card', - bio: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tempus, eros convallis vulputate cursus, nisi neque eleifend libero, eget lacinia justo purus nec est. In at sodales ipsum. Sed lacinia quis purus eget pulvinar. Aenean eu pretium nunc, at aliquam magna. Praesent dignissim, tortor sed volutpat mattis, mauris diam pulvinar leo, porta commodo risus est non purus. Mauris in justo vel lorem ullamcorper hendrerit. Nam est metus, viverra a pellentesque vitae, ornare eget odio. Morbi tempor feugiat mattis. Morbi non felis tempor, aliquam justo sed, sagittis nibh. Mauris consequat ex metus. Praesent sodales sit amet nibh a vulputate. Integer commodo, mi vel bibendum sollicitudin, urna lectus accumsan ante, eget faucibus augue ex id neque. Aenean consectetur, orci a pellentesque mattis, tortor tellus fringilla elit, non ullamcorper risus nunc feugiat risus. Fusce sit amet nisi dapibus turpis commodo placerat. In tortor ante, vehicula sit amet augue et, imperdiet porta sem.', - // actions: [, ], - utcOffset: -3, + bio: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tempus, eros convallis vulputate cursus, nisi neque eleifend libero, eget lacinia justo purus nec est. In at sodales ipsum. Sed lacinia quis purus eget pulvinar. Aenean eu pretium nunc, at aliquam magna. Praesent dignissim, tortor sed volutpat mattis, mauris diam pulvinar leo, porta commodo risus est non purus.', email: 'rocketchat@rocket.chat', status: , + roles: [admin, user], }; -export const WithNickname = Template.bind({}); -WithNickname.args = { - name: 'Guilherme Gazzo', - username: 'guilherme.gazzo', - statusText: '๐Ÿ›ด currently working on User Card', - bio: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla tempus, eros convallis vulputate cursus, nisi neque eleifend libero, eget lacinia justo purus nec est. In at sodales ipsum. Sed lacinia quis purus eget pulvinar. Aenean eu pretium nunc, at aliquam magna. Praesent dignissim, tortor sed volutpat mattis, mauris diam pulvinar leo, porta commodo risus est non purus. Mauris in justo vel lorem ullamcorper hendrerit. Nam est metus, viverra a pellentesque vitae, ornare eget odio. Morbi tempor feugiat mattis. Morbi non felis tempor, aliquam justo sed, sagittis nibh. Mauris consequat ex metus. Praesent sodales sit amet nibh a vulputate. Integer commodo, mi vel bibendum sollicitudin, urna lectus accumsan ante, eget faucibus augue ex id neque. Aenean consectetur, orci a pellentesque mattis, tortor tellus fringilla elit, non ullamcorper risus nunc feugiat risus. Fusce sit amet nisi dapibus turpis commodo placerat. In tortor ante, vehicula sit amet augue et, imperdiet porta sem.', - // actions: [, ], - utcOffset: -3, - email: 'rocketchat@rocket.chat', - status: , - nickname: 'Nickname', +const Template: StoryFn = (args) => ; + +export const Default = Template.bind({}); + +export const WithABACAttributes = Template.bind({}); +WithABACAttributes.args = { + // @ts-expect-error - abacAttributes is not yet implemented in Users properties + abacAttributes: ['Classified', 'Top Secret', 'Confidential'], }; diff --git a/apps/meteor/client/components/UserInfo/UserInfo.tsx b/apps/meteor/client/components/UserInfo/UserInfo.tsx index 4a0413d912870..58bbbc1a52ee5 100644 --- a/apps/meteor/client/components/UserInfo/UserInfo.tsx +++ b/apps/meteor/client/components/UserInfo/UserInfo.tsx @@ -22,6 +22,7 @@ import { import MarkdownText from '../MarkdownText'; import UTCClock from '../UTCClock'; import { UserCardRoles } from '../UserCard'; +import UserInfoABACAttributes from './UserInfoABACAttributes'; import UserInfoAvatar from './UserInfoAvatar'; type UserInfoDataProps = Serialized< @@ -70,6 +71,8 @@ const UserInfo = ({ canViewAllInfo, actions, reason, + // @ts-expect-error - abacAttributes is not yet implemented in Users properties + abacAttributes = null, ...props }: UserInfoProps): ReactElement => { const { t } = useTranslation(); @@ -113,7 +116,7 @@ const UserInfo = ({ )} - {roles.length !== 0 && ( + {roles?.length !== 0 && ( {t('Roles')} {roles} @@ -127,10 +130,12 @@ const UserInfo = ({ )} - {Number.isInteger(utcOffset) && ( + {utcOffset && Number.isInteger(utcOffset) && ( {t('Local_Time')} - {utcOffset && } + + + )} @@ -175,6 +180,12 @@ const UserInfo = ({ )} + {abacAttributes?.length > 0 && ( + + {t('ABAC_Attributes')} + + + )} {userCustomFields?.map( (customField) => customField?.value && ( diff --git a/apps/meteor/client/components/UserInfo/UserInfoABACAttribute.tsx b/apps/meteor/client/components/UserInfo/UserInfoABACAttribute.tsx new file mode 100644 index 0000000000000..5605bd91d7cd7 --- /dev/null +++ b/apps/meteor/client/components/UserInfo/UserInfoABACAttribute.tsx @@ -0,0 +1,11 @@ +import { Tag } from '@rocket.chat/fuselage'; + +type UserInfoABACAttributeProps = { + attribute: string; +}; + +const UserInfoABACAttribute = ({ attribute }: UserInfoABACAttributeProps) => { + return ; +}; + +export default UserInfoABACAttribute; diff --git a/apps/meteor/client/components/UserInfo/UserInfoABACAttributes.tsx b/apps/meteor/client/components/UserInfo/UserInfoABACAttributes.tsx new file mode 100644 index 0000000000000..b9cf2870d3d64 --- /dev/null +++ b/apps/meteor/client/components/UserInfo/UserInfoABACAttributes.tsx @@ -0,0 +1,23 @@ +import { Box, Margins } from '@rocket.chat/fuselage'; + +import UserInfoABACAttribute from './UserInfoABACAttribute'; + +type UserInfoABACAttributesProps = { + abacAttributes: string[]; +}; + +const UserInfoABACAttributes = ({ abacAttributes }: UserInfoABACAttributesProps) => { + return ( + + + {abacAttributes.map((attribute, index) => ( + + + + ))} + + + ); +}; + +export default UserInfoABACAttributes; diff --git a/apps/meteor/client/components/UserInfo/__snapshots__/UserInfo.spec.tsx.snap b/apps/meteor/client/components/UserInfo/__snapshots__/UserInfo.spec.tsx.snap new file mode 100644 index 0000000000000..33c5d0d0d537b --- /dev/null +++ b/apps/meteor/client/components/UserInfo/__snapshots__/UserInfo.spec.tsx.snap @@ -0,0 +1,574 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`renders Default without crashing 1`] = ` + +
+