From 5469cfe141ed3a8e0a01120310d3783947348a77 Mon Sep 17 00:00:00 2001 From: rocketchat-github-ci Date: Tue, 21 May 2024 12:58:47 +0000 Subject: [PATCH 01/29] Release 6.9.0-rc.0 --- .changeset/pre.json | 94 +++++++++++++++++++ apps/meteor/CHANGELOG.md | 94 +++++++++++++++++++ apps/meteor/app/utils/rocketchat.info | 2 +- apps/meteor/ee/server/services/CHANGELOG.md | 14 +++ apps/meteor/ee/server/services/package.json | 2 +- apps/meteor/package.json | 2 +- ee/apps/account-service/CHANGELOG.md | 13 +++ ee/apps/account-service/package.json | 2 +- ee/apps/authorization-service/CHANGELOG.md | 13 +++ ee/apps/authorization-service/package.json | 2 +- ee/apps/ddp-streamer/CHANGELOG.md | 15 +++ ee/apps/ddp-streamer/package.json | 2 +- ee/apps/omnichannel-transcript/CHANGELOG.md | 14 +++ ee/apps/omnichannel-transcript/package.json | 2 +- ee/apps/presence-service/CHANGELOG.md | 13 +++ ee/apps/presence-service/package.json | 2 +- ee/apps/queue-worker/CHANGELOG.md | 13 +++ ee/apps/queue-worker/package.json | 2 +- ee/apps/stream-hub-service/CHANGELOG.md | 12 +++ ee/apps/stream-hub-service/package.json | 2 +- ee/packages/api-client/CHANGELOG.md | 10 ++ ee/packages/api-client/package.json | 2 +- ee/packages/ddp-client/CHANGELOG.md | 10 ++ ee/packages/ddp-client/package.json | 2 +- ee/packages/license/CHANGELOG.md | 9 ++ ee/packages/license/package.json | 2 +- ee/packages/omnichannel-services/CHANGELOG.md | 18 ++++ ee/packages/omnichannel-services/package.json | 2 +- ee/packages/pdf-worker/CHANGELOG.md | 11 +++ ee/packages/pdf-worker/package.json | 2 +- ee/packages/presence/CHANGELOG.md | 11 +++ ee/packages/presence/package.json | 2 +- package.json | 2 +- packages/apps/CHANGELOG.md | 10 ++ packages/apps/package.json | 2 +- packages/core-services/CHANGELOG.md | 16 ++++ packages/core-services/package.json | 2 +- packages/core-typings/CHANGELOG.md | 15 +++ packages/core-typings/package.json | 2 +- packages/cron/CHANGELOG.md | 10 ++ packages/cron/package.json | 2 +- packages/fuselage-ui-kit/CHANGELOG.md | 20 ++++ packages/fuselage-ui-kit/package.json | 12 +-- packages/gazzodown/CHANGELOG.md | 11 +++ packages/gazzodown/package.json | 6 +- packages/i18n/CHANGELOG.md | 12 +++ packages/i18n/package.json | 2 +- packages/instance-status/CHANGELOG.md | 9 ++ packages/instance-status/package.json | 2 +- packages/livechat/CHANGELOG.md | 14 +++ packages/livechat/package.json | 2 +- packages/mock-providers/CHANGELOG.md | 9 ++ packages/mock-providers/package.json | 2 +- packages/model-typings/CHANGELOG.md | 9 ++ packages/model-typings/package.json | 2 +- packages/models/CHANGELOG.md | 9 ++ packages/models/package.json | 2 +- packages/rest-typings/CHANGELOG.md | 14 +++ packages/rest-typings/package.json | 2 +- packages/ui-avatar/CHANGELOG.md | 9 ++ packages/ui-avatar/package.json | 4 +- packages/ui-client/CHANGELOG.md | 9 ++ packages/ui-client/package.json | 4 +- packages/ui-contexts/CHANGELOG.md | 12 +++ packages/ui-contexts/package.json | 2 +- packages/ui-kit/CHANGELOG.md | 6 ++ packages/ui-kit/package.json | 2 +- packages/ui-video-conf/CHANGELOG.md | 10 ++ packages/ui-video-conf/package.json | 6 +- packages/uikit-playground/CHANGELOG.md | 11 +++ packages/uikit-playground/package.json | 2 +- packages/web-ui-registration/CHANGELOG.md | 9 ++ packages/web-ui-registration/package.json | 4 +- 73 files changed, 637 insertions(+), 49 deletions(-) create mode 100644 .changeset/pre.json diff --git a/.changeset/pre.json b/.changeset/pre.json new file mode 100644 index 000000000000..7faf2d0be107 --- /dev/null +++ b/.changeset/pre.json @@ -0,0 +1,94 @@ +{ + "mode": "pre", + "tag": "rc", + "initialVersions": { + "@rocket.chat/meteor": "6.9.0-develop", + "rocketchat-services": "1.1.32", + "@rocket.chat/account-service": "0.3.13", + "@rocket.chat/authorization-service": "0.3.14", + "@rocket.chat/ddp-streamer": "0.2.13", + "@rocket.chat/omnichannel-transcript": "0.3.14", + "@rocket.chat/presence-service": "0.3.14", + "@rocket.chat/queue-worker": "0.3.14", + "@rocket.chat/stream-hub-service": "0.3.14", + "@rocket.chat/api-client": "0.1.32", + "@rocket.chat/ddp-client": "0.2.23", + "@rocket.chat/license": "0.1.14", + "@rocket.chat/omnichannel-services": "0.1.14", + "@rocket.chat/pdf-worker": "0.0.38", + "@rocket.chat/presence": "0.1.14", + "@rocket.chat/ui-theming": "0.1.2", + "@rocket.chat/account-utils": "0.0.2", + "@rocket.chat/agenda": "0.1.0", + "@rocket.chat/apps": "0.0.5", + "@rocket.chat/base64": "1.0.13", + "@rocket.chat/cas-validate": "0.0.2", + "@rocket.chat/core-services": "0.3.14", + "@rocket.chat/core-typings": "6.9.0-develop", + "@rocket.chat/cron": "0.0.34", + "@rocket.chat/eslint-config": "0.7.0", + "@rocket.chat/favicon": "0.0.2", + "@rocket.chat/fuselage-ui-kit": "6.0.0", + "@rocket.chat/gazzodown": "6.0.0", + "@rocket.chat/i18n": "0.3.0", + "@rocket.chat/instance-status": "0.0.38", + "@rocket.chat/jwt": "0.1.1", + "@rocket.chat/livechat": "1.16.0", + "@rocket.chat/log-format": "0.0.2", + "@rocket.chat/logger": "0.0.2", + "@rocket.chat/message-parser": "0.31.29", + "@rocket.chat/mock-providers": "0.0.6", + "@rocket.chat/model-typings": "0.4.0", + "@rocket.chat/models": "0.0.38", + "@rocket.chat/poplib": "0.0.2", + "@rocket.chat/password-policies": "0.0.2", + "@rocket.chat/patch-injection": "0.0.1", + "@rocket.chat/peggy-loader": "0.31.25", + "@rocket.chat/random": "1.2.2", + "@rocket.chat/release-action": "2.2.3", + "@rocket.chat/release-changelog": "0.1.0", + "@rocket.chat/rest-typings": "6.9.0-develop", + "@rocket.chat/server-cloud-communication": "0.0.2", + "@rocket.chat/server-fetch": "0.0.3", + "@rocket.chat/sha256": "1.0.10", + "@rocket.chat/tools": "0.2.1", + "@rocket.chat/ui-avatar": "2.0.0", + "@rocket.chat/ui-client": "6.0.0", + "@rocket.chat/ui-composer": "0.1.0", + "@rocket.chat/ui-contexts": "6.0.0", + "@rocket.chat/ui-kit": "0.33.0", + "@rocket.chat/ui-video-conf": "6.0.0", + "@rocket.chat/uikit-playground": "0.2.22", + "@rocket.chat/web-ui-registration": "6.0.0" + }, + "changesets": [ + "angry-rocks-try", + "breezy-geckos-sparkle", + "chilly-poems-explode", + "cold-beds-hope", + "cuddly-owls-join", + "fair-grapes-thank", + "flat-starfishes-crash", + "fresh-students-remember", + "gorgeous-lizards-shave", + "lazy-gorilas-shop", + "nasty-swans-compete", + "ninety-rivers-mix", + "rich-bananas-complain", + "shiny-crabs-peel", + "shy-oranges-provide", + "silly-clocks-return", + "strange-bears-dance", + "strong-humans-bow", + "tall-wombats-love", + "unlucky-berries-guess", + "warm-squids-deliver", + "weak-starfishes-fail", + "weak-turkeys-sit", + "wicked-points-deliver", + "wild-teachers-design", + "wise-pianos-explode", + "yellow-lies-judge", + "young-yaks-suffer" + ] +} diff --git a/apps/meteor/CHANGELOG.md b/apps/meteor/CHANGELOG.md index 5039151d35bc..c1b1d541ccf4 100644 --- a/apps/meteor/CHANGELOG.md +++ b/apps/meteor/CHANGELOG.md @@ -1,5 +1,99 @@ # @rocket.chat/meteor +## 6.9.0-rc.0 + +### Minor Changes + +- ([#31917](https://github.com/RocketChat/Rocket.Chat/pull/31917)) Introduced a tab layout to the users page and implemented a tab called "All" that lists all users. + +- ([#32439](https://github.com/RocketChat/Rocket.Chat/pull/32439)) Allow visitors & integrations to access downloaded files after a room has closed. This was a known limitation in our codebase, where visitors were only able to access uploaded files in a livechat conversation while the conversation was open. + +- ([#32233](https://github.com/RocketChat/Rocket.Chat/pull/32233)) Makes the triggers fired by the condition `after-guest-registration` persist on the livechat client, it will persist through reloads and pagination, only reseting when a conversation is closed (no changes were done on the agent side of the conversation) + +- ([#32193](https://github.com/RocketChat/Rocket.Chat/pull/32193)) Adds CheckOption to departments multi selects improving options visibility state + +- ([#32317](https://github.com/RocketChat/Rocket.Chat/pull/32317)) Replace the read receipt receipt indicator in order to improve the accessibility complience + +- ([#32341](https://github.com/RocketChat/Rocket.Chat/pull/32341)) Changes the scrollbar color in order to improve the contrast and accessibility compliance + +- ([#32298](https://github.com/RocketChat/Rocket.Chat/pull/32298)) Added "Rocket.Chat Cloud Workspace ID" to workspace statistics page + +### Patch Changes + +- ([#32393](https://github.com/RocketChat/Rocket.Chat/pull/32393)) Fixed an issue causing monitors to dissapear from a saved unit every time a user saved the item. This was caused by the UI not sending the correct \_id of the monitors that were already saved, and this caused the Backend to ignore them and remove from the list. + +- ([#31695](https://github.com/RocketChat/Rocket.Chat/pull/31695)) Fix an issue where read receipts menu item wasn't considering the enabled setting to be displayed + +- ([#32454](https://github.com/RocketChat/Rocket.Chat/pull/32454)) Fixes an issue not allowing override retention policy in channels + +- ([#32444](https://github.com/RocketChat/Rocket.Chat/pull/32444)) Fixed an issue that prevented CAS users from being merged with existing user data on login + +- ([#32289](https://github.com/RocketChat/Rocket.Chat/pull/32289)) Fixed a problem in how server was processing errors that was sending 2 ephemeral error messages when @all or @here were used while they were disabled via permissions + +- ([#32348](https://github.com/RocketChat/Rocket.Chat/pull/32348)) Fixed an issue where translations would fallback to english some of the times. + +- ([#32182](https://github.com/RocketChat/Rocket.Chat/pull/32182)) Fixed an issue with object storage settings that was not allowing admins to decide if files generated via "Export conversation" feature were being proxied through server or not. + +- ([#32311](https://github.com/RocketChat/Rocket.Chat/pull/32311)) Fixed multiple issues with PDF generation logic when a quoted message was too big to fit in one single page. This was causing an internal infinite loop within the library (as it tried to make it fit, failing and then trying to fit on next page where the same happened thus causing a loop). + The library was not able to break down some nested views and thus was trying to fit the whole quote on one single page. Logic was updated to allow wrapping of the contents when messages are quoted (so they can span multiple lines) and removed a bunch of unnecesary views from the code. +- ([#32364](https://github.com/RocketChat/Rocket.Chat/pull/32364)) Fixed issue with "Export room as file" feature (`rooms.export` endpoint) generating an empty export when given an invalid date + +- ([#32314](https://github.com/RocketChat/Rocket.Chat/pull/32314)) Fixed an issue on Users converter that was not returning the `statusText` property from users even when the typing indicated property existed. + +- ([#32391](https://github.com/RocketChat/Rocket.Chat/pull/32391)) Fixes link image preview not opening in gallery mode + +- ([#32318](https://github.com/RocketChat/Rocket.Chat/pull/32318)) Fixed error handling for files bigger than NATS max allowed payload. This should prevent PDFs from erroring out when generating from rooms that contain heavy images. + +- ([#32345](https://github.com/RocketChat/Rocket.Chat/pull/32345)) Replaces the burger menu with an appropriate button fixing the semantics and mismatching color + +- ([#32414](https://github.com/RocketChat/Rocket.Chat/pull/32414)) Fixes the missing spacing on don`t ask again checkbox inside modals + +- ([#32269](https://github.com/RocketChat/Rocket.Chat/pull/32269)) Fixed a bad behavior with the interaction between OTR system messages & trash collection. We use trash collection as a temporary storage that holds recently deleted items from some collections. Messages is one of those. This was causing "User joined OTR" messages to be viewable when querying the trash collection. + Since OTR messages are by definition private, code was updated to bypass trash collection when removing these special messages. + + Note: this only applies to these system messages. OTR user's messages are not stored on the database. + +- ([#32415](https://github.com/RocketChat/Rocket.Chat/pull/32415)) This fuselage`s bump fixes: + + - The message toolbar visibility on hover (Firefox ESR) + - `Bubble` missing font-family + + [more details](https://github.com/RocketChat/fuselage/releases/tag/%40rocket.chat%2Ffuselage%400.53.7) + +- ([#32398](https://github.com/RocketChat/Rocket.Chat/pull/32398)) Fixed issue with external users being able to reset their passwords even when the "Allow Password Change for OAuth Users" setting is disabled + +- ([#32284](https://github.com/RocketChat/Rocket.Chat/pull/32284)) fixed Engagement Dashboard and Device Management admin pages loading indefinitely + +- ([#32342](https://github.com/RocketChat/Rocket.Chat/pull/32342)) bump fuselage adding `AttachmentAuthorName` missing color token + +-
Updated dependencies [ff4e396416, bc50dd54a2, ad86761209, f83bd56cc5, 6205ef14f0, 724ba3a729, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/i18n@0.4.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/omnichannel-services@0.1.15-rc.0 + - @rocket.chat/pdf-worker@0.0.39-rc.0 + - @rocket.chat/rest-typings@6.9.0-rc.0 + - @rocket.chat/fuselage-ui-kit@7.0.0-rc.0 + - @rocket.chat/ui-kit@0.34.0-rc.0 + - @rocket.chat/api-client@0.1.33-rc.0 + - @rocket.chat/license@0.1.15-rc.0 + - @rocket.chat/presence@0.1.15-rc.0 + - @rocket.chat/apps@0.0.6-rc.0 + - @rocket.chat/cron@0.0.35-rc.0 + - @rocket.chat/gazzodown@7.0.0-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/ui-contexts@7.0.0-rc.0 + - @rocket.chat/web-ui-registration@7.0.0-rc.0 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.0.39-rc.0 + - @rocket.chat/ui-theming@0.1.2 + - @rocket.chat/ui-avatar@3.0.0-rc.0 + - @rocket.chat/ui-client@7.0.0-rc.0 + - @rocket.chat/ui-video-conf@7.0.0-rc.0 + - @rocket.chat/instance-status@0.0.39-rc.0 +
+ ## 6.8.0 ### Minor Changes diff --git a/apps/meteor/app/utils/rocketchat.info b/apps/meteor/app/utils/rocketchat.info index 5878bf0b3190..18d1687ea9bd 100644 --- a/apps/meteor/app/utils/rocketchat.info +++ b/apps/meteor/app/utils/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "6.9.0-develop" + "version": "6.9.0-rc.0" } diff --git a/apps/meteor/ee/server/services/CHANGELOG.md b/apps/meteor/ee/server/services/CHANGELOG.md index de9a11ca7a32..c16384a9e56d 100644 --- a/apps/meteor/ee/server/services/CHANGELOG.md +++ b/apps/meteor/ee/server/services/CHANGELOG.md @@ -1,5 +1,19 @@ # rocketchat-services +## 1.1.33-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/rest-typings@6.9.0-rc.0 + - @rocket.chat/ui-kit@0.34.0-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 1.1.32 ### Patch Changes diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 3a22d3965385..3d1dc89ee1b6 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -1,7 +1,7 @@ { "name": "rocketchat-services", "private": true, - "version": "1.1.32", + "version": "1.1.33-rc.0", "description": "Rocket.Chat Authorization service", "main": "index.js", "scripts": { diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 127439f74c09..f67bbf4defbd 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/meteor", "description": "The Ultimate Open Source WebChat Platform", - "version": "6.9.0-develop", + "version": "6.9.0-rc.0", "private": true, "author": { "name": "Rocket.Chat", diff --git a/ee/apps/account-service/CHANGELOG.md b/ee/apps/account-service/CHANGELOG.md index 666eda95454d..875b61da3e5f 100644 --- a/ee/apps/account-service/CHANGELOG.md +++ b/ee/apps/account-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/account-service +## 0.3.14-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/rest-typings@6.9.0-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.3.13 ### Patch Changes diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json index 0ccbbce820f2..508814bc2b34 100644 --- a/ee/apps/account-service/package.json +++ b/ee/apps/account-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/account-service", "private": true, - "version": "0.3.13", + "version": "0.3.14-rc.0", "description": "Rocket.Chat Account service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/authorization-service/CHANGELOG.md b/ee/apps/authorization-service/CHANGELOG.md index 80940bcb4ff4..7a15bf205301 100644 --- a/ee/apps/authorization-service/CHANGELOG.md +++ b/ee/apps/authorization-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/authorization-service +## 0.3.15-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/rest-typings@6.9.0-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.3.14 ### Patch Changes diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json index 13546b16d3b3..d9cc9e7e8ce1 100644 --- a/ee/apps/authorization-service/package.json +++ b/ee/apps/authorization-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/authorization-service", "private": true, - "version": "0.3.14", + "version": "0.3.15-rc.0", "description": "Rocket.Chat Authorization service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/ddp-streamer/CHANGELOG.md b/ee/apps/ddp-streamer/CHANGELOG.md index 5376a1baad58..e7ba31816b5b 100644 --- a/ee/apps/ddp-streamer/CHANGELOG.md +++ b/ee/apps/ddp-streamer/CHANGELOG.md @@ -1,5 +1,20 @@ # @rocket.chat/ddp-streamer +## 0.2.14-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/rest-typings@6.9.0-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/ui-contexts@7.0.0-rc.0 + - @rocket.chat/models@0.0.39-rc.0 + - @rocket.chat/instance-status@0.0.39-rc.0 +
+ ## 0.2.13 ### Patch Changes diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index 8cc41e5b8e3c..ce7064e834fb 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/ddp-streamer", "private": true, - "version": "0.2.13", + "version": "0.2.14-rc.0", "description": "Rocket.Chat DDP-Streamer service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/omnichannel-transcript/CHANGELOG.md b/ee/apps/omnichannel-transcript/CHANGELOG.md index a2530269d793..ac726a7e5ffb 100644 --- a/ee/apps/omnichannel-transcript/CHANGELOG.md +++ b/ee/apps/omnichannel-transcript/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/omnichannel-transcript +## 0.3.15-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/omnichannel-services@0.1.15-rc.0 + - @rocket.chat/pdf-worker@0.0.39-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.3.14 ### Patch Changes diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json index 5a8da65d51a4..fc27979f1b30 100644 --- a/ee/apps/omnichannel-transcript/package.json +++ b/ee/apps/omnichannel-transcript/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/omnichannel-transcript", "private": true, - "version": "0.3.14", + "version": "0.3.15-rc.0", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/presence-service/CHANGELOG.md b/ee/apps/presence-service/CHANGELOG.md index 3bd7b9952832..68e8cfcff8d7 100644 --- a/ee/apps/presence-service/CHANGELOG.md +++ b/ee/apps/presence-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/presence-service +## 0.3.15-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/presence@0.1.15-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.3.14 ### Patch Changes diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json index 10b47541cb82..e353668a1f36 100644 --- a/ee/apps/presence-service/package.json +++ b/ee/apps/presence-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/presence-service", "private": true, - "version": "0.3.14", + "version": "0.3.15-rc.0", "description": "Rocket.Chat Presence service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/queue-worker/CHANGELOG.md b/ee/apps/queue-worker/CHANGELOG.md index 2834b6301181..911923e492ba 100644 --- a/ee/apps/queue-worker/CHANGELOG.md +++ b/ee/apps/queue-worker/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/queue-worker +## 0.3.15-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/omnichannel-services@0.1.15-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.3.14 ### Patch Changes diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json index 4864e4a34c9b..dcbb47e7b0e4 100644 --- a/ee/apps/queue-worker/package.json +++ b/ee/apps/queue-worker/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/queue-worker", "private": true, - "version": "0.3.14", + "version": "0.3.15-rc.0", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/stream-hub-service/CHANGELOG.md b/ee/apps/stream-hub-service/CHANGELOG.md index e6a8f79aedd8..997188f03260 100644 --- a/ee/apps/stream-hub-service/CHANGELOG.md +++ b/ee/apps/stream-hub-service/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/stream-hub-service +## 0.3.15-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.3.14 ### Patch Changes diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json index 76076b4d3030..827753a270b1 100644 --- a/ee/apps/stream-hub-service/package.json +++ b/ee/apps/stream-hub-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/stream-hub-service", "private": true, - "version": "0.3.14", + "version": "0.3.15-rc.0", "description": "Rocket.Chat Stream Hub service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/packages/api-client/CHANGELOG.md b/ee/packages/api-client/CHANGELOG.md index 28df5106b12f..0a89cb4a8e59 100644 --- a/ee/packages/api-client/CHANGELOG.md +++ b/ee/packages/api-client/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/api-client +## 0.1.33-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, f83bd56cc5, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/rest-typings@6.9.0-rc.0 +
+ ## 0.1.32 ### Patch Changes diff --git a/ee/packages/api-client/package.json b/ee/packages/api-client/package.json index 096eec4ee113..609cd9888dd6 100644 --- a/ee/packages/api-client/package.json +++ b/ee/packages/api-client/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/api-client", "private": true, - "version": "0.1.32", + "version": "0.1.33-rc.0", "devDependencies": { "@swc/core": "^1.3.95", "@swc/jest": "^0.2.29", diff --git a/ee/packages/ddp-client/CHANGELOG.md b/ee/packages/ddp-client/CHANGELOG.md index 80aada44fcab..66344812c276 100644 --- a/ee/packages/ddp-client/CHANGELOG.md +++ b/ee/packages/ddp-client/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/ddp-client +## 0.2.24-rc.0 + +### Patch Changes + +-
Updated dependencies [f83bd56cc5]: + + - @rocket.chat/rest-typings@6.9.0-rc.0 + - @rocket.chat/api-client@0.1.33-rc.0 +
+ ## 0.2.23 ### Patch Changes diff --git a/ee/packages/ddp-client/package.json b/ee/packages/ddp-client/package.json index daf3a22c5da6..26c85939670f 100644 --- a/ee/packages/ddp-client/package.json +++ b/ee/packages/ddp-client/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/ddp-client", "private": true, - "version": "0.2.23", + "version": "0.2.24-rc.0", "devDependencies": { "@swc/core": "^1.3.95", "@swc/jest": "^0.2.29", diff --git a/ee/packages/license/CHANGELOG.md b/ee/packages/license/CHANGELOG.md index 603f131dc407..b2bbb88bdb2e 100644 --- a/ee/packages/license/CHANGELOG.md +++ b/ee/packages/license/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/license +## 0.1.15-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 +
+ ## 0.1.14 ### Patch Changes diff --git a/ee/packages/license/package.json b/ee/packages/license/package.json index a07a8db51af0..6418eb224553 100644 --- a/ee/packages/license/package.json +++ b/ee/packages/license/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/license", - "version": "0.1.14", + "version": "0.1.15-rc.0", "private": true, "devDependencies": { "@swc/core": "^1.3.95", diff --git a/ee/packages/omnichannel-services/CHANGELOG.md b/ee/packages/omnichannel-services/CHANGELOG.md index e9364326e949..fbed2ecb619e 100644 --- a/ee/packages/omnichannel-services/CHANGELOG.md +++ b/ee/packages/omnichannel-services/CHANGELOG.md @@ -1,5 +1,23 @@ # @rocket.chat/omnichannel-services +## 0.1.15-rc.0 + +### Patch Changes + +- ([#32311](https://github.com/RocketChat/Rocket.Chat/pull/32311)) Fixed multiple issues with PDF generation logic when a quoted message was too big to fit in one single page. This was causing an internal infinite loop within the library (as it tried to make it fit, failing and then trying to fit on next page where the same happened thus causing a loop). + The library was not able to break down some nested views and thus was trying to fit the whole quote on one single page. Logic was updated to allow wrapping of the contents when messages are quoted (so they can span multiple lines) and removed a bunch of unnecesary views from the code. +- ([#32318](https://github.com/RocketChat/Rocket.Chat/pull/32318)) Fixed error handling for files bigger than NATS max allowed payload. This should prevent PDFs from erroring out when generating from rooms that contain heavy images. + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/pdf-worker@0.0.39-rc.0 + - @rocket.chat/rest-typings@6.9.0-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.1.14 ### Patch Changes diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json index a9a99ff25fd7..bc07fdc99639 100644 --- a/ee/packages/omnichannel-services/package.json +++ b/ee/packages/omnichannel-services/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/omnichannel-services", - "version": "0.1.14", + "version": "0.1.15-rc.0", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/ee/packages/pdf-worker/CHANGELOG.md b/ee/packages/pdf-worker/CHANGELOG.md index 5cd81d9558ac..05dab4b4b414 100644 --- a/ee/packages/pdf-worker/CHANGELOG.md +++ b/ee/packages/pdf-worker/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/pdf-worker +## 0.0.39-rc.0 + +### Patch Changes + +- ([#32311](https://github.com/RocketChat/Rocket.Chat/pull/32311)) Fixed multiple issues with PDF generation logic when a quoted message was too big to fit in one single page. This was causing an internal infinite loop within the library (as it tried to make it fit, failing and then trying to fit on next page where the same happened thus causing a loop). + The library was not able to break down some nested views and thus was trying to fit the whole quote on one single page. Logic was updated to allow wrapping of the contents when messages are quoted (so they can span multiple lines) and removed a bunch of unnecesary views from the code. +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 +
+ ## 0.0.38 ### Patch Changes diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json index c2e3513b6aec..2e68fd2f3ca4 100644 --- a/ee/packages/pdf-worker/package.json +++ b/ee/packages/pdf-worker/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/pdf-worker", - "version": "0.0.38", + "version": "0.0.39-rc.0", "private": true, "devDependencies": { "@storybook/addon-essentials": "~6.5.16", diff --git a/ee/packages/presence/CHANGELOG.md b/ee/packages/presence/CHANGELOG.md index faae6ee61368..8e11707e6c1e 100644 --- a/ee/packages/presence/CHANGELOG.md +++ b/ee/packages/presence/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/presence +## 0.1.15-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/core-services@0.3.15-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.1.14 ### Patch Changes diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index d4b102247d9a..9b2472dd91f6 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/presence", - "version": "0.1.14", + "version": "0.1.15-rc.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/package.json b/package.json index fa35a133961e..0edd977b7508 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket.chat", - "version": "6.9.0-develop", + "version": "6.9.0-rc.0", "description": "Rocket.Chat Monorepo", "main": "index.js", "private": true, diff --git a/packages/apps/CHANGELOG.md b/packages/apps/CHANGELOG.md index 2eda0bcd9fb0..dd7986b1ed88 100644 --- a/packages/apps/CHANGELOG.md +++ b/packages/apps/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/apps +## 0.0.6-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/model-typings@0.4.1-rc.0 +
+ ## 0.0.5 ### Patch Changes diff --git a/packages/apps/package.json b/packages/apps/package.json index fd657d4382f8..b27fec0a2d74 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/apps", - "version": "0.0.5", + "version": "0.0.6-rc.0", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/core-services/CHANGELOG.md b/packages/core-services/CHANGELOG.md index 38f0c44cb8ac..212f0af2114f 100644 --- a/packages/core-services/CHANGELOG.md +++ b/packages/core-services/CHANGELOG.md @@ -1,5 +1,21 @@ # @rocket.chat/core-services +## 0.3.15-rc.0 + +### Patch Changes + +- ([#32311](https://github.com/RocketChat/Rocket.Chat/pull/32311)) Fixed multiple issues with PDF generation logic when a quoted message was too big to fit in one single page. This was causing an internal infinite loop within the library (as it tried to make it fit, failing and then trying to fit on next page where the same happened thus causing a loop). + The library was not able to break down some nested views and thus was trying to fit the whole quote on one single page. Logic was updated to allow wrapping of the contents when messages are quoted (so they can span multiple lines) and removed a bunch of unnecesary views from the code. +- ([#32318](https://github.com/RocketChat/Rocket.Chat/pull/32318)) Fixed error handling for files bigger than NATS max allowed payload. This should prevent PDFs from erroring out when generating from rooms that contain heavy images. + +-
Updated dependencies [ff4e396416, f83bd56cc5, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/rest-typings@6.9.0-rc.0 + - @rocket.chat/ui-kit@0.34.0-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.3.14 ### Patch Changes diff --git a/packages/core-services/package.json b/packages/core-services/package.json index d7a8fe6b78f1..4f3aa194cf91 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/core-services", - "version": "0.3.14", + "version": "0.3.15-rc.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/packages/core-typings/CHANGELOG.md b/packages/core-typings/CHANGELOG.md index 311b3bbefa88..179038594e83 100644 --- a/packages/core-typings/CHANGELOG.md +++ b/packages/core-typings/CHANGELOG.md @@ -1,5 +1,20 @@ # @rocket.chat/core-typings +## 6.9.0-rc.0 + +### Minor Changes + +- ([#31917](https://github.com/RocketChat/Rocket.Chat/pull/31917)) Introduced a tab layout to the users page and implemented a tab called "All" that lists all users. + +- ([#32298](https://github.com/RocketChat/Rocket.Chat/pull/32298)) Added "Rocket.Chat Cloud Workspace ID" to workspace statistics page + +### Patch Changes + +-
Updated dependencies [ee5cdfc367]: + + - @rocket.chat/ui-kit@0.34.0-rc.0 +
+ ## 6.8.0 ### Minor Changes diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 8da547209212..0778f37d98ca 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -2,7 +2,7 @@ "$schema": "https://json.schemastore.org/package", "name": "@rocket.chat/core-typings", "private": true, - "version": "6.9.0-develop", + "version": "6.9.0-rc.0", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "eslint": "~8.45.0", diff --git a/packages/cron/CHANGELOG.md b/packages/cron/CHANGELOG.md index 797d15348f5d..a7cca89842a7 100644 --- a/packages/cron/CHANGELOG.md +++ b/packages/cron/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/cron +## 0.0.35-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.0.34 ### Patch Changes diff --git a/packages/cron/package.json b/packages/cron/package.json index a9a4424dafe9..490d75ceb041 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/cron", - "version": "0.0.34", + "version": "0.0.35-rc.0", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/fuselage-ui-kit/CHANGELOG.md b/packages/fuselage-ui-kit/CHANGELOG.md index 7733e8063e61..8c6909e30be2 100644 --- a/packages/fuselage-ui-kit/CHANGELOG.md +++ b/packages/fuselage-ui-kit/CHANGELOG.md @@ -1,5 +1,25 @@ # Change Log +## 7.0.0-rc.0 + +### Minor Changes + +- ([#31918](https://github.com/RocketChat/Rocket.Chat/pull/31918)) Introduced new elements for apps to select channels + +### Patch Changes + +- ([#32327](https://github.com/RocketChat/Rocket.Chat/pull/32327)) Fix translation param on video conf joined message + +-
Updated dependencies [ff4e396416, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/ui-kit@0.34.0-rc.0 + - @rocket.chat/gazzodown@7.0.0-rc.0 + - @rocket.chat/ui-contexts@7.0.0-rc.0 + - @rocket.chat/ui-avatar@3.0.0-rc.0 + - @rocket.chat/ui-video-conf@7.0.0-rc.0 +
+ ## 6.0.0 ### Patch Changes diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 5fe8960b2589..1ab7de040149 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/fuselage-ui-kit", "private": true, - "version": "6.0.0", + "version": "7.0.0-rc.0", "description": "UiKit elements for Rocket.Chat Apps built under Fuselage design system", "homepage": "https://rocketchat.github.io/Rocket.Chat.Fuselage/", "author": { @@ -50,10 +50,10 @@ "@rocket.chat/icons": "*", "@rocket.chat/prettier-config": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "2.0.0", - "@rocket.chat/ui-contexts": "6.0.0", - "@rocket.chat/ui-kit": "0.33.0", - "@rocket.chat/ui-video-conf": "6.0.0", + "@rocket.chat/ui-avatar": "3.0.0-rc.0", + "@rocket.chat/ui-contexts": "7.0.0-rc.0", + "@rocket.chat/ui-kit": "0.34.0-rc.0", + "@rocket.chat/ui-video-conf": "7.0.0-rc.0", "@tanstack/react-query": "*", "react": "*", "react-dom": "*" @@ -110,7 +110,7 @@ "typescript": "~5.3.3" }, "dependencies": { - "@rocket.chat/core-typings": "*", + "@rocket.chat/core-typings": "6.9.0-rc.0", "@rocket.chat/gazzodown": "workspace:^", "@rocket.chat/ui-kit": "workspace:~", "tslib": "^2.5.3" diff --git a/packages/gazzodown/CHANGELOG.md b/packages/gazzodown/CHANGELOG.md index 828981eb3809..69e83db1e9aa 100644 --- a/packages/gazzodown/CHANGELOG.md +++ b/packages/gazzodown/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/gazzodown +## 7.0.0-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/ui-contexts@7.0.0-rc.0 + - @rocket.chat/ui-client@7.0.0-rc.0 +
+ ## 6.0.0 ### Patch Changes diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index 435c984008a5..8168d202f0d1 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/gazzodown", - "version": "6.0.0", + "version": "7.0.0-rc.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -71,8 +71,8 @@ "@rocket.chat/fuselage-tokens": "*", "@rocket.chat/message-parser": "0.31.29", "@rocket.chat/styled": "*", - "@rocket.chat/ui-client": "6.0.0", - "@rocket.chat/ui-contexts": "6.0.0", + "@rocket.chat/ui-client": "7.0.0-rc.0", + "@rocket.chat/ui-contexts": "7.0.0-rc.0", "katex": "*", "react": "*" }, diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index c1488a9ce8ca..17f2e90aaeed 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/i18n +## 0.4.0-rc.0 + +### Minor Changes + +- ([#32298](https://github.com/RocketChat/Rocket.Chat/pull/32298)) Added "Rocket.Chat Cloud Workspace ID" to workspace statistics page + +### Patch Changes + +- ([#31917](https://github.com/RocketChat/Rocket.Chat/pull/31917)) Introduced a tab layout to the users page and implemented a tab called "All" that lists all users. + +- ([#32182](https://github.com/RocketChat/Rocket.Chat/pull/32182)) Fixed an issue with object storage settings that was not allowing admins to decide if files generated via "Export conversation" feature were being proxied through server or not. + ## 0.3.0 ### Minor Changes diff --git a/packages/i18n/package.json b/packages/i18n/package.json index 38a4c434b12c..a63db12d18e9 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/i18n", - "version": "0.3.0", + "version": "0.4.0-rc.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/packages/instance-status/CHANGELOG.md b/packages/instance-status/CHANGELOG.md index 968ac7af7959..e6d3269dbda9 100644 --- a/packages/instance-status/CHANGELOG.md +++ b/packages/instance-status/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/instance-status +## 0.0.39-rc.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/models@0.0.39-rc.0 +
+ ## 0.0.38 ### Patch Changes diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json index a6998bbd4c32..43a333587fba 100644 --- a/packages/instance-status/package.json +++ b/packages/instance-status/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/instance-status", - "version": "0.0.38", + "version": "0.0.39-rc.0", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/packages/livechat/CHANGELOG.md b/packages/livechat/CHANGELOG.md index 8541e820f1bb..7ffe2b0da4e3 100644 --- a/packages/livechat/CHANGELOG.md +++ b/packages/livechat/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/livechat Change Log +## 1.17.0-rc.0 + +### Minor Changes + +- ([#32233](https://github.com/RocketChat/Rocket.Chat/pull/32233)) Makes the triggers fired by the condition `after-guest-registration` persist on the livechat client, it will persist through reloads and pagination, only reseting when a conversation is closed (no changes were done on the agent side of the conversation) + +### Patch Changes + +-
Updated dependencies [ee5cdfc367]: + + - @rocket.chat/ui-kit@0.34.0-rc.0 + - @rocket.chat/gazzodown@7.0.0-rc.0 +
+ ## 1.16.0 ### Patch Changes diff --git a/packages/livechat/package.json b/packages/livechat/package.json index 6d1b805b59ab..f7d3e8b9e80c 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/livechat", - "version": "1.16.0", + "version": "1.17.0-rc.0", "files": [ "/build" ], diff --git a/packages/mock-providers/CHANGELOG.md b/packages/mock-providers/CHANGELOG.md index 13e9fd464c72..fe564b88c0ce 100644 --- a/packages/mock-providers/CHANGELOG.md +++ b/packages/mock-providers/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/mock-providers +## 0.0.7-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, bc50dd54a2, 70ab2a7b7b]: + + - @rocket.chat/i18n@0.4.0-rc.0 +
+ ## 0.0.6 ### Patch Changes diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json index 89208cafaf41..551447f9f1fc 100644 --- a/packages/mock-providers/package.json +++ b/packages/mock-providers/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/mock-providers", - "version": "0.0.6", + "version": "0.0.7-rc.0", "private": true, "dependencies": { "@rocket.chat/i18n": "workspace:~", diff --git a/packages/model-typings/CHANGELOG.md b/packages/model-typings/CHANGELOG.md index a4ff3abbd66d..0c237e46f300 100644 --- a/packages/model-typings/CHANGELOG.md +++ b/packages/model-typings/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/model-typings +## 0.4.1-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 +
+ ## 0.4.0 ### Minor Changes diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json index 5c14dc6b7bb4..3a3d7268c00c 100644 --- a/packages/model-typings/package.json +++ b/packages/model-typings/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/model-typings", - "version": "0.4.0", + "version": "0.4.1-rc.0", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/models/CHANGELOG.md b/packages/models/CHANGELOG.md index 5479e14a00bd..e23e0107e9f5 100644 --- a/packages/models/CHANGELOG.md +++ b/packages/models/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/models +## 0.0.39-rc.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/model-typings@0.4.1-rc.0 +
+ ## 0.0.38 ### Patch Changes diff --git a/packages/models/package.json b/packages/models/package.json index e8d4c77158fc..97ff2dcca4aa 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/models", - "version": "0.0.38", + "version": "0.0.39-rc.0", "private": true, "devDependencies": { "@swc/core": "^1.3.95", diff --git a/packages/rest-typings/CHANGELOG.md b/packages/rest-typings/CHANGELOG.md index 4f2819a3d71c..d54f717f3863 100644 --- a/packages/rest-typings/CHANGELOG.md +++ b/packages/rest-typings/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/rest-typings +## 6.9.0-rc.0 + +### Minor Changes + +- ([#32364](https://github.com/RocketChat/Rocket.Chat/pull/32364)) Fixed issue with "Export room as file" feature (`rooms.export` endpoint) generating an empty export when given an invalid date + +### Patch Changes + +-
Updated dependencies [ff4e396416, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/ui-kit@0.34.0-rc.0 +
+ ## 6.8.0 ### Minor Changes diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index cd3c10d6ebb4..8cb1a260d201 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/rest-typings", "private": true, - "version": "6.9.0-develop", + "version": "6.9.0-rc.0", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@types/jest": "~29.5.7", diff --git a/packages/ui-avatar/CHANGELOG.md b/packages/ui-avatar/CHANGELOG.md index 5a6023b53c47..acce08f9687b 100644 --- a/packages/ui-avatar/CHANGELOG.md +++ b/packages/ui-avatar/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/ui-avatar +## 3.0.0-rc.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.0 +
+ ## 2.0.0 ### Patch Changes diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index 949dbda74fb5..45e9e4577858 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-avatar", - "version": "2.0.0", + "version": "3.0.0-rc.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -31,7 +31,7 @@ ], "peerDependencies": { "@rocket.chat/fuselage": "*", - "@rocket.chat/ui-contexts": "6.0.0", + "@rocket.chat/ui-contexts": "7.0.0-rc.0", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-client/CHANGELOG.md b/packages/ui-client/CHANGELOG.md index 4ef42e89b343..01c70590c800 100644 --- a/packages/ui-client/CHANGELOG.md +++ b/packages/ui-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/ui-client +## 7.0.0-rc.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.0 +
+ ## 6.0.0 ### Patch Changes diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index 1695860ee949..d82021bb8344 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-client", - "version": "6.0.0", + "version": "7.0.0-rc.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -63,7 +63,7 @@ "@rocket.chat/fuselage": "*", "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", - "@rocket.chat/ui-contexts": "6.0.0", + "@rocket.chat/ui-contexts": "7.0.0-rc.0", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-contexts/CHANGELOG.md b/packages/ui-contexts/CHANGELOG.md index b8c3a1ca3fbc..d955d823c92e 100644 --- a/packages/ui-contexts/CHANGELOG.md +++ b/packages/ui-contexts/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/ui-contexts +## 7.0.0-rc.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, bc50dd54a2, f83bd56cc5, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0-rc.0 + - @rocket.chat/i18n@0.4.0-rc.0 + - @rocket.chat/rest-typings@6.9.0-rc.0 + - @rocket.chat/ddp-client@0.2.24-rc.0 +
+ ## 6.0.0 ### Minor Changes diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index 9152d21782c2..94a7f4ea4168 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-contexts", - "version": "6.0.0", + "version": "7.0.0-rc.0", "private": true, "devDependencies": { "@rocket.chat/core-typings": "workspace:^", diff --git a/packages/ui-kit/CHANGELOG.md b/packages/ui-kit/CHANGELOG.md index 59de835f34ad..283d203f0271 100644 --- a/packages/ui-kit/CHANGELOG.md +++ b/packages/ui-kit/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 0.34.0-rc.0 + +### Minor Changes + +- ([#31918](https://github.com/RocketChat/Rocket.Chat/pull/31918)) Introduced new elements for apps to select channels + ## 0.33.0 ### Minor Changes diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index 23cd40877dfe..cfd3d8f95407 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-kit", - "version": "0.33.0", + "version": "0.34.0-rc.0", "description": "Interactive UI elements for Rocket.Chat Apps", "homepage": "https://rocket.chat", "author": { diff --git a/packages/ui-video-conf/CHANGELOG.md b/packages/ui-video-conf/CHANGELOG.md index 5244989bae58..a103f9410c09 100644 --- a/packages/ui-video-conf/CHANGELOG.md +++ b/packages/ui-video-conf/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/ui-video-conf +## 7.0.0-rc.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.0 + - @rocket.chat/ui-avatar@3.0.0-rc.0 +
+ ## 6.0.0 ### Patch Changes diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index be30d82d7d9d..e5cfb3e580c2 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-video-conf", - "version": "6.0.0", + "version": "7.0.0-rc.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -36,8 +36,8 @@ "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "2.0.0", - "@rocket.chat/ui-contexts": "6.0.0", + "@rocket.chat/ui-avatar": "3.0.0-rc.0", + "@rocket.chat/ui-contexts": "7.0.0-rc.0", "react": "^17.0.2", "react-dom": "^17.0.2" }, diff --git a/packages/uikit-playground/CHANGELOG.md b/packages/uikit-playground/CHANGELOG.md index bc81f0f24d9f..26177ed97720 100644 --- a/packages/uikit-playground/CHANGELOG.md +++ b/packages/uikit-playground/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/uikit-playground +## 0.2.23-rc.0 + +### Patch Changes + +-
Updated dependencies [6205ef14f0, ee5cdfc367]: + + - @rocket.chat/fuselage-ui-kit@7.0.0-rc.0 + - @rocket.chat/ui-contexts@7.0.0-rc.0 + - @rocket.chat/ui-avatar@3.0.0-rc.0 +
+ ## 0.2.22 ### Patch Changes diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index 381dd9786545..e8db2846b429 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/uikit-playground", "private": true, - "version": "0.2.22", + "version": "0.2.23-rc.0", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/web-ui-registration/CHANGELOG.md b/packages/web-ui-registration/CHANGELOG.md index 310ba1e4abca..f5aa9b7f8385 100644 --- a/packages/web-ui-registration/CHANGELOG.md +++ b/packages/web-ui-registration/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/web-ui-registration +## 7.0.0-rc.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.0 +
+ ## 6.0.0 ### Patch Changes diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index ab7bd0beb3f2..0427c51f28c4 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/web-ui-registration", - "version": "6.0.0", + "version": "7.0.0-rc.0", "private": true, "homepage": "https://rocket.chat", "main": "./dist/index.js", @@ -51,7 +51,7 @@ "peerDependencies": { "@rocket.chat/layout": "*", "@rocket.chat/tools": "0.2.1", - "@rocket.chat/ui-contexts": "6.0.0", + "@rocket.chat/ui-contexts": "7.0.0-rc.0", "@tanstack/react-query": "*", "react": "*", "react-hook-form": "*", From 13aa4f54b74a265312318a1f14a30931768f59eb Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Tue, 21 May 2024 17:40:09 -0300 Subject: [PATCH 02/29] ci: publish missing Omnichannel services to DockerHub (#32462) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8393b0d9ec8f..b16ab459d6bd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -629,7 +629,7 @@ jobs: strategy: matrix: - service: ['account', 'authorization', 'ddp-streamer', 'presence', 'stream-hub'] + service: ['account', 'authorization', 'ddp-streamer', 'omnichannel-transcript', 'presence', 'queue-worker', 'stream-hub'] steps: - name: Login to DockerHub From e3c2fb6db3babe3845687c9cf3b6c02b267eb292 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Tue, 21 May 2024 18:27:12 -0300 Subject: [PATCH 03/29] chore: Publish npm packages again (#32463) --- ee/packages/api-client/package.json | 1 - ee/packages/ddp-client/package.json | 1 - packages/core-typings/package.json | 1 - packages/rest-typings/package.json | 1 - 4 files changed, 4 deletions(-) diff --git a/ee/packages/api-client/package.json b/ee/packages/api-client/package.json index 609cd9888dd6..4f80d73ca732 100644 --- a/ee/packages/api-client/package.json +++ b/ee/packages/api-client/package.json @@ -1,6 +1,5 @@ { "name": "@rocket.chat/api-client", - "private": true, "version": "0.1.33-rc.0", "devDependencies": { "@swc/core": "^1.3.95", diff --git a/ee/packages/ddp-client/package.json b/ee/packages/ddp-client/package.json index 26c85939670f..e26357fea0e0 100644 --- a/ee/packages/ddp-client/package.json +++ b/ee/packages/ddp-client/package.json @@ -1,6 +1,5 @@ { "name": "@rocket.chat/ddp-client", - "private": true, "version": "0.2.24-rc.0", "devDependencies": { "@swc/core": "^1.3.95", diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 0778f37d98ca..01c5c30adfd1 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -1,7 +1,6 @@ { "$schema": "https://json.schemastore.org/package", "name": "@rocket.chat/core-typings", - "private": true, "version": "6.9.0-rc.0", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 8cb1a260d201..66c729f2e531 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -1,6 +1,5 @@ { "name": "@rocket.chat/rest-typings", - "private": true, "version": "6.9.0-rc.0", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", From 61bf555d84e3f320a57297054c4fa4a1ac03db15 Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Fri, 24 May 2024 15:01:20 -0300 Subject: [PATCH 04/29] regression: Incorrect retention policy banner's display rule for teams (#32483) --- .../teams/contextualBar/info/TeamsInfo.tsx | 21 +++++++---------- .../contextualBar/info/TeamsInfoWithData.js | 23 ------------------- .../meteor/tests/e2e/retention-policy.spec.ts | 23 ++++++++++++++++++- 3 files changed, 30 insertions(+), 37 deletions(-) diff --git a/apps/meteor/client/views/teams/contextualBar/info/TeamsInfo.tsx b/apps/meteor/client/views/teams/contextualBar/info/TeamsInfo.tsx index 12e092b48763..5a38722cfc42 100644 --- a/apps/meteor/client/views/teams/contextualBar/info/TeamsInfo.tsx +++ b/apps/meteor/client/views/teams/contextualBar/info/TeamsInfo.tsx @@ -17,18 +17,10 @@ import RetentionPolicyCallout from '../../../../components/InfoPanel/RetentionPo import MarkdownText from '../../../../components/MarkdownText'; import type { Action } from '../../../hooks/useActionSpread'; import { useActionSpread } from '../../../hooks/useActionSpread'; - -type RetentionPolicy = { - retentionPolicyEnabled: boolean; - maxAgeDefault: number; - retentionEnabledDefault: boolean; - excludePinnedDefault: boolean; - filesOnlyDefault: boolean; -}; +import { useRetentionPolicy } from '../../../room/hooks/useRetentionPolicy'; type TeamsInfoProps = { room: IRoom; - retentionPolicy: RetentionPolicy; onClickHide: () => void; onClickClose: () => void; onClickLeave: () => void; @@ -40,7 +32,6 @@ type TeamsInfoProps = { const TeamsInfo = ({ room, - retentionPolicy, onClickHide, onClickClose, onClickLeave, @@ -51,7 +42,7 @@ const TeamsInfo = ({ }: TeamsInfoProps): ReactElement => { const t = useTranslation(); - const { retentionPolicyEnabled, filesOnlyDefault, excludePinnedDefault, maxAgeDefault } = retentionPolicy; + const retentionPolicy = useRetentionPolicy(room); const memoizedActions = useMemo( () => ({ @@ -199,8 +190,12 @@ const TeamsInfo = ({ )} - {retentionPolicyEnabled && ( - + {retentionPolicy?.isActive && ( + )} diff --git a/apps/meteor/client/views/teams/contextualBar/info/TeamsInfoWithData.js b/apps/meteor/client/views/teams/contextualBar/info/TeamsInfoWithData.js index f5cb4a44c5d2..0b2f84a339ed 100644 --- a/apps/meteor/client/views/teams/contextualBar/info/TeamsInfoWithData.js +++ b/apps/meteor/client/views/teams/contextualBar/info/TeamsInfoWithData.js @@ -3,7 +3,6 @@ import { useSetModal, useToastMessageDispatch, useUserId, - useSetting, usePermission, useMethod, useTranslation, @@ -23,33 +22,12 @@ import ConvertToChannelModal from '../../ConvertToChannelModal'; import LeaveTeam from './LeaveTeam'; import TeamsInfo from './TeamsInfo'; -const retentionPolicyMaxAge = { - c: 'RetentionPolicy_MaxAge_Channels', - p: 'RetentionPolicy_MaxAge_Groups', - d: 'RetentionPolicy_MaxAge_DMs', -}; - -const retentionPolicyAppliesTo = { - c: 'RetentionPolicy_AppliesToChannels', - p: 'RetentionPolicy_AppliesToGroups', - d: 'RetentionPolicy_AppliesToDMs', -}; - const TeamsInfoWithLogic = ({ openEditing }) => { const room = useRoom(); const { openTab, closeTab } = useRoomToolbox(); const t = useTranslation(); const userId = useUserId(); - const retentionPolicyEnabled = useSetting('RetentionPolicy_Enabled'); - const retentionPolicy = { - retentionPolicyEnabled, - maxAgeDefault: useSetting(retentionPolicyMaxAge[room.t]) || 30, - retentionEnabledDefault: useSetting(retentionPolicyAppliesTo[room.t]), - excludePinnedDefault: useSetting('RetentionPolicy_DoNotPrunePinned'), - filesOnlyDefault: useSetting('RetentionPolicy_FilesOnly'), - }; - const dontAskHideRoom = useDontAskAgain('hideRoom'); const dispatchToastMessage = useToastMessageDispatch(); @@ -153,7 +131,6 @@ const TeamsInfoWithLogic = ({ openEditing }) => { return ( { let poHomeChannel: HomeChannel; let targetChannel: string; + let targetTeam: string; let targetGroup: string; test.beforeAll(async ({ api }) => { targetChannel = await createTargetChannel(api); targetGroup = await createTargetPrivateChannel(api); + targetTeam = await createTargetTeam(api); }) test.beforeEach(async ({ page }) => { @@ -28,6 +30,12 @@ test.describe.serial('retention-policy', () => { await expect(poHomeChannel.content.channelRetentionPolicyWarning).not.toBeVisible(); }); + test('should not show prune banner in team', async () => { + await poHomeChannel.sidenav.openChat(targetTeam); + + await expect(poHomeChannel.content.channelRetentionPolicyWarning).not.toBeVisible(); + }); + test('should not show prune section on edit channel', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnRoomInfo.click(); @@ -53,6 +61,9 @@ test.describe.serial('retention-policy', () => { await poHomeChannel.sidenav.openChat(targetChannel); await expect(poHomeChannel.content.channelRetentionPolicyWarning).not.toBeVisible(); + await poHomeChannel.sidenav.openChat(targetTeam); + await expect(poHomeChannel.content.channelRetentionPolicyWarning).not.toBeVisible(); + await poHomeChannel.sidenav.openChat(targetGroup); await expect(poHomeChannel.content.channelRetentionPolicyWarning).not.toBeVisible(); @@ -85,6 +96,16 @@ test.describe.serial('retention-policy', () => { await expect(poHomeChannel.tabs.room.checkboxPruneMessages).toBeChecked(); }); + test('should prune old messages checkbox enabled by default in team and show retention policy banner', async () => { + await poHomeChannel.sidenav.openChat(targetTeam); + await expect(poHomeChannel.content.channelRetentionPolicyWarning).toBeVisible(); + + await poHomeChannel.tabs.btnRoomInfo.click(); + await poHomeChannel.tabs.room.btnEdit.click(); + await poHomeChannel.tabs.room.pruneAccordion.click(); + await expect(poHomeChannel.tabs.room.checkboxPruneMessages).toBeChecked(); + }); + test('should prune old messages checkbox enabled by default in group and show retention policy banner', async () => { await poHomeChannel.sidenav.openChat(targetGroup); await expect(poHomeChannel.content.channelRetentionPolicyWarning).toBeVisible(); From 5f013d8d8053b7fa3a436081a92287679062a572 Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Fri, 24 May 2024 16:05:48 -0300 Subject: [PATCH 05/29] regression: Replace read receipt single icon (#32486) --- .../message/ReadReceiptIndicator.tsx | 2 +- apps/meteor/ee/client/startup/readReceipt.ts | 2 +- apps/meteor/ee/server/services/package.json | 2 +- apps/meteor/package.json | 4 +- ee/packages/ui-theming/package.json | 4 +- packages/core-services/package.json | 2 +- packages/core-typings/package.json | 2 +- packages/fuselage-ui-kit/package.json | 4 +- packages/gazzodown/package.json | 2 +- packages/ui-avatar/package.json | 2 +- packages/ui-client/package.json | 4 +- packages/ui-composer/package.json | 4 +- packages/ui-video-conf/package.json | 4 +- packages/uikit-playground/package.json | 4 +- yarn.lock | 76 +++++++++---------- 15 files changed, 59 insertions(+), 59 deletions(-) diff --git a/apps/meteor/client/components/message/ReadReceiptIndicator.tsx b/apps/meteor/client/components/message/ReadReceiptIndicator.tsx index 90b3bb52c995..ac8ae925fbe5 100644 --- a/apps/meteor/client/components/message/ReadReceiptIndicator.tsx +++ b/apps/meteor/client/components/message/ReadReceiptIndicator.tsx @@ -21,7 +21,7 @@ const ReadReceiptIndicator = ({ mid, unread }: ReadReceiptIndicatorProps): React insetBlockStart={2} insetInlineEnd={8} > - + ); }; diff --git a/apps/meteor/ee/client/startup/readReceipt.ts b/apps/meteor/ee/client/startup/readReceipt.ts index eb23aa5fd883..6cd7c4835d46 100644 --- a/apps/meteor/ee/client/startup/readReceipt.ts +++ b/apps/meteor/ee/client/startup/readReceipt.ts @@ -17,7 +17,7 @@ Meteor.startup(() => { MessageAction.addButton({ id: 'receipt-detail', - icon: 'double-check', + icon: 'check-double', label: 'Read_Receipts', context: ['starred', 'message', 'message-mobile', 'threads', 'videoconf', 'videoconf-threads'], type: 'duplication', diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 3d1dc89ee1b6..2b5658d12b22 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -50,7 +50,7 @@ "ws": "^8.8.1" }, "devDependencies": { - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/icons": "^0.36.0", "@types/cookie": "^0.5.3", "@types/cookie-parser": "^1.4.5", "@types/ejson": "^2.2.1", diff --git a/apps/meteor/package.json b/apps/meteor/package.json index f67bbf4defbd..6f92ec267800 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -242,7 +242,7 @@ "@rocket.chat/favicon": "workspace:^", "@rocket.chat/forked-matrix-appservice-bridge": "^4.0.2", "@rocket.chat/forked-matrix-bot-sdk": "^0.6.0-beta.3", - "@rocket.chat/fuselage": "^0.53.7", + "@rocket.chat/fuselage": "^0.54.1", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/fuselage-polyfills": "~0.31.25", "@rocket.chat/fuselage-toastbar": "^0.31.26", @@ -250,7 +250,7 @@ "@rocket.chat/fuselage-ui-kit": "workspace:^", "@rocket.chat/gazzodown": "workspace:^", "@rocket.chat/i18n": "workspace:^", - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/icons": "^0.36.0", "@rocket.chat/instance-status": "workspace:^", "@rocket.chat/jwt": "workspace:^", "@rocket.chat/layout": "~0.31.26", diff --git a/ee/packages/ui-theming/package.json b/ee/packages/ui-theming/package.json index 487e497d14c8..15db49731544 100644 --- a/ee/packages/ui-theming/package.json +++ b/ee/packages/ui-theming/package.json @@ -4,9 +4,9 @@ "private": true, "devDependencies": { "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.53.7", + "@rocket.chat/fuselage": "^0.54.1", "@rocket.chat/fuselage-hooks": "^0.33.1", - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/icons": "^0.36.0", "@rocket.chat/ui-contexts": "workspace:~", "@storybook/addon-actions": "~6.5.16", "@storybook/addon-docs": "~6.5.16", diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 4f3aa194cf91..7c03f49037bf 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -36,7 +36,7 @@ "dependencies": { "@rocket.chat/apps-engine": "1.42.2", "@rocket.chat/core-typings": "workspace:^", - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/icons": "^0.36.0", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/models": "workspace:^", "@rocket.chat/rest-typings": "workspace:^", diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 01c5c30adfd1..58334badc4ae 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -23,7 +23,7 @@ ], "dependencies": { "@rocket.chat/apps-engine": "1.42.2", - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/icons": "^0.36.0", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/ui-kit": "workspace:~" }, diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 1ab7de040149..e43429131b9c 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -66,10 +66,10 @@ "@rocket.chat/apps-engine": "^1.42.2", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.53.7", + "@rocket.chat/fuselage": "^0.54.1", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/fuselage-polyfills": "~0.31.25", - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/icons": "^0.36.0", "@rocket.chat/mock-providers": "workspace:^", "@rocket.chat/prettier-config": "~0.31.25", "@rocket.chat/styled": "~0.31.25", diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index 8168d202f0d1..c32a0205b53b 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.53.7", + "@rocket.chat/fuselage": "^0.54.1", "@rocket.chat/fuselage-tokens": "^0.33.1", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/styled": "~0.31.25", diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index 45e9e4577858..567761cb54e6 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -4,7 +4,7 @@ "private": true, "devDependencies": { "@babel/core": "~7.22.20", - "@rocket.chat/fuselage": "^0.53.7", + "@rocket.chat/fuselage": "^0.54.1", "@rocket.chat/ui-contexts": "workspace:^", "@types/babel__core": "~7.20.3", "@types/react": "~17.0.69", diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index d82021bb8344..0b8386f57ed0 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -6,9 +6,9 @@ "@babel/core": "~7.22.20", "@react-aria/toolbar": "^3.0.0-beta.1", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.53.7", + "@rocket.chat/fuselage": "^0.54.1", "@rocket.chat/fuselage-hooks": "^0.33.1", - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/icons": "^0.36.0", "@rocket.chat/mock-providers": "workspace:^", "@rocket.chat/ui-contexts": "workspace:~", "@storybook/addon-actions": "~6.5.16", diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index 53998ec80e07..f2f269979004 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -6,8 +6,8 @@ "@babel/core": "~7.22.20", "@react-aria/toolbar": "^3.0.0-beta.1", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.53.7", - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/icons": "^0.36.0", "@storybook/addon-actions": "~6.5.16", "@storybook/addon-docs": "~6.5.16", "@storybook/addon-essentials": "~6.5.16", diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index e5cfb3e580c2..ade737a5e665 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -6,9 +6,9 @@ "@babel/core": "~7.22.20", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.53.7", + "@rocket.chat/fuselage": "^0.54.1", "@rocket.chat/fuselage-hooks": "^0.33.1", - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/icons": "^0.36.0", "@rocket.chat/styled": "~0.31.25", "@rocket.chat/ui-avatar": "workspace:^", "@rocket.chat/ui-contexts": "workspace:^", diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index e8db2846b429..f02958289587 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -15,13 +15,13 @@ "@codemirror/tooltip": "^0.19.16", "@lezer/highlight": "^1.1.6", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.53.7", + "@rocket.chat/fuselage": "^0.54.1", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/fuselage-polyfills": "~0.31.25", "@rocket.chat/fuselage-toastbar": "^0.31.26", "@rocket.chat/fuselage-tokens": "^0.33.1", "@rocket.chat/fuselage-ui-kit": "workspace:~", - "@rocket.chat/icons": "^0.35.0", + "@rocket.chat/icons": "^0.36.0", "@rocket.chat/logo": "^0.31.30", "@rocket.chat/styled": "~0.31.25", "@rocket.chat/ui-avatar": "workspace:^", diff --git a/yarn.lock b/yarn.lock index 023a3b4f215b..a4e266175002 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8444,7 +8444,7 @@ __metadata: "@rocket.chat/apps-engine": 1.42.2 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/icons": ^0.36.0 "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/models": "workspace:^" "@rocket.chat/rest-typings": "workspace:^" @@ -8469,7 +8469,7 @@ __metadata: dependencies: "@rocket.chat/apps-engine": 1.42.2 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/icons": ^0.36.0 "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/ui-kit": "workspace:~" eslint: ~8.45.0 @@ -8743,11 +8743,11 @@ __metadata: "@rocket.chat/apps-engine": ^1.42.2 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.53.7 + "@rocket.chat/fuselage": ^0.54.1 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/gazzodown": "workspace:^" - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/icons": ^0.36.0 "@rocket.chat/mock-providers": "workspace:^" "@rocket.chat/prettier-config": ~0.31.25 "@rocket.chat/styled": ~0.31.25 @@ -8795,19 +8795,19 @@ __metadata: "@rocket.chat/icons": "*" "@rocket.chat/prettier-config": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 2.0.0 - "@rocket.chat/ui-contexts": 6.0.0 - "@rocket.chat/ui-kit": 0.33.0 - "@rocket.chat/ui-video-conf": 6.0.0 + "@rocket.chat/ui-avatar": 3.0.0-rc.0 + "@rocket.chat/ui-contexts": 7.0.0-rc.0 + "@rocket.chat/ui-kit": 0.34.0-rc.0 + "@rocket.chat/ui-video-conf": 7.0.0-rc.0 "@tanstack/react-query": "*" react: "*" react-dom: "*" languageName: unknown linkType: soft -"@rocket.chat/fuselage@npm:^0.53.7": - version: 0.53.7 - resolution: "@rocket.chat/fuselage@npm:0.53.7" +"@rocket.chat/fuselage@npm:^0.54.1": + version: 0.54.1 + resolution: "@rocket.chat/fuselage@npm:0.54.1" dependencies: "@rocket.chat/css-in-js": ^0.31.25 "@rocket.chat/css-supports": ^0.31.25 @@ -8825,7 +8825,7 @@ __metadata: react: ^17.0.2 react-dom: ^17.0.2 react-virtuoso: 1.2.4 - checksum: 3765c064f9f356b3da3ee147d3700104eebb642ba27807ec25866e8445d8d761c5ad127bafddf171d4913ae92df082ace93fc070f93159fb7d01aba10bd3c2b0 + checksum: 11de809f6fbee14b9941e3e97e8eb6adf0703bca7e104d7a53ece2c1dd042cb1ce31016b4e2480de9ea3ed0971cb585dfab79c513edd0ec64bbc3cd15fe2e677 languageName: node linkType: hard @@ -8836,7 +8836,7 @@ __metadata: "@babel/core": ~7.22.20 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.53.7 + "@rocket.chat/fuselage": ^0.54.1 "@rocket.chat/fuselage-tokens": ^0.33.1 "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/styled": ~0.31.25 @@ -8887,8 +8887,8 @@ __metadata: "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/message-parser": 0.31.29 "@rocket.chat/styled": "*" - "@rocket.chat/ui-client": 6.0.0 - "@rocket.chat/ui-contexts": 6.0.0 + "@rocket.chat/ui-client": 7.0.0-rc.0 + "@rocket.chat/ui-contexts": 7.0.0-rc.0 katex: "*" react: "*" languageName: unknown @@ -8909,10 +8909,10 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/icons@npm:^0.35.0": - version: 0.35.0 - resolution: "@rocket.chat/icons@npm:0.35.0" - checksum: c31e20255f7349fab3f74abb0a4ccdaa6fcd194fcb00036115458714008d88108caeb713c79ea8ffc6871147c360e96fe4ae2f24d31116c50c7854f64c522701 +"@rocket.chat/icons@npm:^0.36.0": + version: 0.36.0 + resolution: "@rocket.chat/icons@npm:0.36.0" + checksum: ebec57fdfc9bac3b0b29ba43d9ac316b55f6e4177fa4456de195352d6add1e15e25c4d72e6a4fdc3d33abaabf8af0ca7eb0d36badb360113a19c15a13d68aed5 languageName: node linkType: hard @@ -9196,7 +9196,7 @@ __metadata: "@rocket.chat/favicon": "workspace:^" "@rocket.chat/forked-matrix-appservice-bridge": ^4.0.2 "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.3 - "@rocket.chat/fuselage": ^0.53.7 + "@rocket.chat/fuselage": ^0.54.1 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/fuselage-toastbar": ^0.31.26 @@ -9204,7 +9204,7 @@ __metadata: "@rocket.chat/fuselage-ui-kit": "workspace:^" "@rocket.chat/gazzodown": "workspace:^" "@rocket.chat/i18n": "workspace:^" - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/icons": ^0.36.0 "@rocket.chat/instance-status": "workspace:^" "@rocket.chat/jwt": "workspace:^" "@rocket.chat/layout": ~0.31.26 @@ -10092,7 +10092,7 @@ __metadata: resolution: "@rocket.chat/ui-avatar@workspace:packages/ui-avatar" dependencies: "@babel/core": ~7.22.20 - "@rocket.chat/fuselage": ^0.53.7 + "@rocket.chat/fuselage": ^0.54.1 "@rocket.chat/ui-contexts": "workspace:^" "@types/babel__core": ~7.20.3 "@types/react": ~17.0.69 @@ -10106,7 +10106,7 @@ __metadata: typescript: ~5.3.3 peerDependencies: "@rocket.chat/fuselage": "*" - "@rocket.chat/ui-contexts": 6.0.0 + "@rocket.chat/ui-contexts": 7.0.0-rc.0 react: ~17.0.2 languageName: unknown linkType: soft @@ -10118,9 +10118,9 @@ __metadata: "@babel/core": ~7.22.20 "@react-aria/toolbar": ^3.0.0-beta.1 "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.53.7 + "@rocket.chat/fuselage": ^0.54.1 "@rocket.chat/fuselage-hooks": ^0.33.1 - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/icons": ^0.36.0 "@rocket.chat/mock-providers": "workspace:^" "@rocket.chat/ui-contexts": "workspace:~" "@storybook/addon-actions": ~6.5.16 @@ -10159,7 +10159,7 @@ __metadata: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" - "@rocket.chat/ui-contexts": 6.0.0 + "@rocket.chat/ui-contexts": 7.0.0-rc.0 react: ~17.0.2 languageName: unknown linkType: soft @@ -10171,8 +10171,8 @@ __metadata: "@babel/core": ~7.22.20 "@react-aria/toolbar": ^3.0.0-beta.1 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.53.7 - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/icons": ^0.36.0 "@storybook/addon-actions": ~6.5.16 "@storybook/addon-docs": ~6.5.16 "@storybook/addon-essentials": ~6.5.16 @@ -10263,9 +10263,9 @@ __metadata: resolution: "@rocket.chat/ui-theming@workspace:ee/packages/ui-theming" dependencies: "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.53.7 + "@rocket.chat/fuselage": ^0.54.1 "@rocket.chat/fuselage-hooks": ^0.33.1 - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/icons": ^0.36.0 "@rocket.chat/ui-contexts": "workspace:~" "@storybook/addon-actions": ~6.5.16 "@storybook/addon-docs": ~6.5.16 @@ -10306,9 +10306,9 @@ __metadata: "@rocket.chat/css-in-js": ~0.31.25 "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.53.7 + "@rocket.chat/fuselage": ^0.54.1 "@rocket.chat/fuselage-hooks": ^0.33.1 - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/icons": ^0.36.0 "@rocket.chat/styled": ~0.31.25 "@rocket.chat/ui-avatar": "workspace:^" "@rocket.chat/ui-contexts": "workspace:^" @@ -10335,8 +10335,8 @@ __metadata: "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 2.0.0 - "@rocket.chat/ui-contexts": 6.0.0 + "@rocket.chat/ui-avatar": 3.0.0-rc.0 + "@rocket.chat/ui-contexts": 7.0.0-rc.0 react: ^17.0.2 react-dom: ^17.0.2 languageName: unknown @@ -10351,13 +10351,13 @@ __metadata: "@codemirror/tooltip": ^0.19.16 "@lezer/highlight": ^1.1.6 "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.53.7 + "@rocket.chat/fuselage": ^0.54.1 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/fuselage-toastbar": ^0.31.26 "@rocket.chat/fuselage-tokens": ^0.33.1 "@rocket.chat/fuselage-ui-kit": "workspace:~" - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/icons": ^0.36.0 "@rocket.chat/logo": ^0.31.30 "@rocket.chat/styled": ~0.31.25 "@rocket.chat/ui-avatar": "workspace:^" @@ -10426,7 +10426,7 @@ __metadata: peerDependencies: "@rocket.chat/layout": "*" "@rocket.chat/tools": 0.2.1 - "@rocket.chat/ui-contexts": 6.0.0 + "@rocket.chat/ui-contexts": 7.0.0-rc.0 "@tanstack/react-query": "*" react: "*" react-hook-form: "*" @@ -36857,7 +36857,7 @@ __metadata: "@rocket.chat/core-services": "workspace:^" "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/emitter": ~0.31.25 - "@rocket.chat/icons": ^0.35.0 + "@rocket.chat/icons": ^0.36.0 "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/model-typings": "workspace:^" "@rocket.chat/models": "workspace:^" From 86b4cebf5410a8b1252d069505f911b89cc7a29c Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Fri, 24 May 2024 10:07:27 -0300 Subject: [PATCH 06/29] fix: Re-login same browser tab issues (#32479) --- .changeset/smooth-knives-turn.md | 7 ++ .../client/models/CachedCollection.ts | 8 +- apps/meteor/app/utils/client/lib/SDKClient.ts | 10 ++- .../providers/UserProvider/UserProvider.tsx | 7 ++ ...mnichannel-manual-selection-logout.spec.ts | 74 +++++++++++++++++++ 5 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 .changeset/smooth-knives-turn.md create mode 100644 apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection-logout.spec.ts diff --git a/.changeset/smooth-knives-turn.md b/.changeset/smooth-knives-turn.md new file mode 100644 index 000000000000..3964ecc8481b --- /dev/null +++ b/.changeset/smooth-knives-turn.md @@ -0,0 +1,7 @@ +--- +"@rocket.chat/meteor": patch +--- + +Executing a logout and login action in the same "tab/instance", some streams were not being recreated, causing countless types of bugs. + +PS: as a workaround reloading after logout or login in also solves the problem. diff --git a/apps/meteor/app/ui-cached-collection/client/models/CachedCollection.ts b/apps/meteor/app/ui-cached-collection/client/models/CachedCollection.ts index 77190992612a..545e1e73342d 100644 --- a/apps/meteor/app/ui-cached-collection/client/models/CachedCollection.ts +++ b/apps/meteor/app/ui-cached-collection/client/models/CachedCollection.ts @@ -356,12 +356,6 @@ export class CachedCollection extends Emitter< this.trySync(); }); - if (!this.userRelated) { - return this.setupListener(); - } - - CachedCollectionManager.onLogin(async () => { - await this.setupListener(); - }); + return this.setupListener(); } } diff --git a/apps/meteor/app/utils/client/lib/SDKClient.ts b/apps/meteor/app/utils/client/lib/SDKClient.ts index 18ff309970df..c174f9125f49 100644 --- a/apps/meteor/app/utils/client/lib/SDKClient.ts +++ b/apps/meteor/app/utils/client/lib/SDKClient.ts @@ -51,6 +51,7 @@ type EventMap = Str type StreamMapValue = { stop: () => void; + error: (cb: (...args: any[]) => void) => void; onChange: ReturnType['onChange']; ready: () => Promise; isReady: boolean; @@ -62,6 +63,7 @@ const createNewMeteorStream = (streamName: StreamNames, key: StreamKeys { - console.error(err); ee.emit('ready', [err]); + ee.emit('error', err); }, }, ); @@ -115,6 +117,11 @@ const createNewMeteorStream = (streamName: StreamNames, key: StreamKeys void) => + ee.once('error', (error) => { + cb(error); + }), + get isReady() { return meta.ready; }, @@ -179,6 +186,7 @@ const createStreamManager = () => { if (!streams.has(eventLiteral)) { streams.set(eventLiteral, stream); } + stream.error(() => stop()); return { id: '', diff --git a/apps/meteor/client/providers/UserProvider/UserProvider.tsx b/apps/meteor/client/providers/UserProvider/UserProvider.tsx index 62ed7070737d..27c540928e86 100644 --- a/apps/meteor/client/providers/UserProvider/UserProvider.tsx +++ b/apps/meteor/client/providers/UserProvider/UserProvider.tsx @@ -12,6 +12,7 @@ import { sdk } from '../../../app/utils/client/lib/SDKClient'; import { afterLogoutCleanUpCallback } from '../../../lib/callbacks/afterLogoutCleanUpCallback'; import { useReactiveValue } from '../../hooks/useReactiveValue'; import { createReactiveSubscriptionFactory } from '../../lib/createReactiveSubscriptionFactory'; +import { queryClient } from '../../lib/queryClient'; import { useCreateFontStyleElement } from '../../views/account/accessibility/hooks/useCreateFontStyleElement'; import { useClearRemovedRoomsHistory } from './hooks/useClearRemovedRoomsHistory'; import { useDeleteUser } from './hooks/useDeleteUser'; @@ -92,6 +93,12 @@ const UserProvider = ({ children }: UserProviderProps): ReactElement => { } }, [preferedLanguage, setPreferedLanguage, setUserLanguage, user?.language, userLanguage, userId, setUserPreferences]); + useEffect(() => { + if (!userId) { + queryClient.clear(); + } + }, [userId]); + return ; }; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection-logout.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection-logout.spec.ts new file mode 100644 index 000000000000..f995f6b87b1b --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection-logout.spec.ts @@ -0,0 +1,74 @@ +import { Page } from '@playwright/test'; + +import { DEFAULT_USER_CREDENTIALS } from '../config/constants'; +import injectInitialData from '../fixtures/inject-initial-data'; +import { Users } from '../fixtures/userStates'; +import { HomeOmnichannel } from '../page-objects'; +import { createAgent, makeAgentAvailable } from '../utils/omnichannel/agents'; +import { createConversation } from '../utils/omnichannel/rooms'; +import { test, expect } from '../utils/test'; + +test.use({ storageState: Users.user1.state }); + +test.describe('OC - Manual Selection', () => { + let poOmnichannel: HomeOmnichannel; + let agent: Awaited>; + + // Change routing method to manual selection + test.beforeAll(async ({ api }) => { + const res = await api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' }); + expect(res.status()).toBe(200); + }); + + // Create agent and make it available + test.beforeAll(async ({ api }) => { + agent = await createAgent(api, 'user1'); + await makeAgentAvailable(api, agent.data._id); + }); + + // Create page object and redirect to home + test.beforeEach(async ({ page }: { page: Page }) => { + poOmnichannel = new HomeOmnichannel(page); + await page.goto('/home'); + + await poOmnichannel.sidenav.logout(); + await poOmnichannel.page.locator('role=textbox[name=/username/i]').waitFor({ state: 'visible' }); + await poOmnichannel.page.locator('role=textbox[name=/username/i]').fill('user1'); + await poOmnichannel.page.locator('[name=password]').fill(DEFAULT_USER_CREDENTIALS.password); + await poOmnichannel.page.locator('role=button[name="Login"]').click(); + + await poOmnichannel.page.locator('.main-content').waitFor(); + }); + + // Delete all data + test.afterAll(async ({ api }) => { + await agent.delete() + await api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }); + await injectInitialData(); + }); + + test('OC - Manual Selection - Logout & Login', async ({ api }) => { + expect(await poOmnichannel.page.locator('#omnichannel-status-toggle').getAttribute('title')).toEqual('Turn off answer chats'); + + const { data: { room } } = await createConversation(api); + + await test.step('expect login and see the chat in queue after login', async () => { + await poOmnichannel.sidenav.getSidebarItemByName(room.fname).click(); + await expect(poOmnichannel.content.inputMessage).not.toBeVisible(); + }); + + await test.step('expect take chat to be visible and return to queue not visible', async () => { + await expect(poOmnichannel.content.btnTakeChat).toBeVisible(); + await expect(poOmnichannel.content.btnReturnToQueue).not.toBeVisible(); + }); + + await test.step('expect to be able take chat', async () => { + await poOmnichannel.content.btnTakeChat.click(); + await expect(poOmnichannel.content.lastSystemMessageBody).toHaveText('joined the channel'); + await expect(poOmnichannel.content.inputMessage).toBeVisible(); + await expect(poOmnichannel.content.btnTakeChat).not.toBeVisible(); + await expect(poOmnichannel.content.btnReturnToQueue).toBeVisible(); + await expect(poOmnichannel.sidenav.getSidebarItemByName(room.fname)).toBeVisible(); + }); + }); +}); From b21d32b970756aea20ed57497a58dac72891c237 Mon Sep 17 00:00:00 2001 From: Ricardo Garim Date: Mon, 27 May 2024 18:56:30 -0300 Subject: [PATCH 07/29] refactor: IntegrationHistory out of DB Watcher (#32502) Co-authored-by: Diego Sampaio <8591547+sampaiodiego@users.noreply.github.com> --- .../integrations/server/lib/updateHistory.ts | 21 ++++++--- .../server/methods/clearIntegrationHistory.ts | 1 + .../outgoing/deleteOutgoingIntegration.ts | 1 + .../app/lib/server/lib/notifyListener.ts | 43 ++++++++++++++++++- .../server/database/watchCollections.ts | 2 +- .../server/models/raw/IntegrationHistory.ts | 15 ++++++- .../src/models/IIntegrationHistoryModel.ts | 8 +++- 7 files changed, 81 insertions(+), 10 deletions(-) diff --git a/apps/meteor/app/integrations/server/lib/updateHistory.ts b/apps/meteor/app/integrations/server/lib/updateHistory.ts index ed304403e8c7..e8068ad82ac1 100644 --- a/apps/meteor/app/integrations/server/lib/updateHistory.ts +++ b/apps/meteor/app/integrations/server/lib/updateHistory.ts @@ -1,8 +1,8 @@ import type { IIntegrationHistory, OutgoingIntegrationEvent, IIntegration, IMessage, AtLeast } from '@rocket.chat/core-typings'; import { IntegrationHistory } from '@rocket.chat/models'; -import { Random } from '@rocket.chat/random'; import { omit } from '../../../../lib/utils/omit'; +import { notifyOnIntegrationHistoryChangedById, notifyOnIntegrationHistoryChanged } from '../../../lib/server/lib/notifyListener'; export const updateHistory = async ({ historyId, @@ -77,7 +77,12 @@ export const updateHistory = async ({ }; if (historyId) { - await IntegrationHistory.updateOne({ _id: historyId }, { $set: history }); + // Projecting just integration field to comply with existing listener behaviour + const integrationHistory = await IntegrationHistory.updateById(historyId, history, { projection: { 'integration._id': 1 } }); + if (!integrationHistory) { + throw new Error('error-updating-integration-history'); + } + void notifyOnIntegrationHistoryChanged(integrationHistory, 'updated', history); return historyId; } @@ -86,11 +91,15 @@ export const updateHistory = async ({ throw new Error('error-invalid-integration'); } - history._createdAt = new Date(); + // TODO: Had to force type cast here because of function's signature + // It would be easier if we separate into create and update functions + const { insertedId } = await IntegrationHistory.create(history as IIntegrationHistory); - const _id = Random.id(); + if (!insertedId) { + throw new Error('error-creating-integration-history'); + } - await IntegrationHistory.insertOne({ _id, ...history } as IIntegrationHistory); + void notifyOnIntegrationHistoryChangedById(insertedId, 'inserted'); - return _id; + return insertedId; }; diff --git a/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts b/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts index 2447683bd291..5b8f13ef1a3a 100644 --- a/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts +++ b/apps/meteor/app/integrations/server/methods/clearIntegrationHistory.ts @@ -41,6 +41,7 @@ Meteor.methods({ }); } + // Don't sending to IntegrationHistory listener since it don't waits for 'removed' events. await IntegrationHistory.removeByIntegrationId(integrationId); notifications.streamIntegrationHistory.emit(integrationId, { type: 'removed', id: integrationId }); diff --git a/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts b/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts index cc3d138c554a..c9f2211d835b 100644 --- a/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts +++ b/apps/meteor/app/integrations/server/methods/outgoing/deleteOutgoingIntegration.ts @@ -41,6 +41,7 @@ export const deleteOutgoingIntegration = async (integrationId: string, userId: s } await Integrations.removeById(integrationId); + // Don't sending to IntegrationHistory listener since it don't waits for 'removed' events. await IntegrationHistory.removeByIntegrationId(integrationId); void notifyOnIntegrationChangedById(integrationId, 'removed'); }; diff --git a/apps/meteor/app/lib/server/lib/notifyListener.ts b/apps/meteor/app/lib/server/lib/notifyListener.ts index c019eba0db7a..df0073423642 100644 --- a/apps/meteor/app/lib/server/lib/notifyListener.ts +++ b/apps/meteor/app/lib/server/lib/notifyListener.ts @@ -10,8 +10,19 @@ import type { IPbxEvent, LoginServiceConfiguration as LoginServiceConfigurationData, ILivechatPriority, + IIntegrationHistory, + AtLeast, } from '@rocket.chat/core-typings'; -import { Rooms, Permissions, Settings, PbxEvents, Roles, Integrations, LoginServiceConfiguration } from '@rocket.chat/models'; +import { + Rooms, + Permissions, + Settings, + PbxEvents, + Roles, + Integrations, + LoginServiceConfiguration, + IntegrationHistory, +} from '@rocket.chat/models'; type ClientAction = 'inserted' | 'updated' | 'removed'; @@ -254,3 +265,33 @@ export async function notifyOnIntegrationChangedByChannels( + data: AtLeast, + clientAction: ClientAction = 'updated', + diff: Partial = {}, +): Promise { + if (!dbWatchersDisabled) { + return; + } + + void api.broadcast('watch.integrationHistory', { clientAction, id: data._id, data, diff }); +} + +export async function notifyOnIntegrationHistoryChangedById( + id: T['_id'], + clientAction: ClientAction = 'updated', + diff: Partial = {}, +): Promise { + if (!dbWatchersDisabled) { + return; + } + + const item = await IntegrationHistory.findOneById(id); + + if (!item) { + return; + } + + void api.broadcast('watch.integrationHistory', { clientAction, id: item._id, data: item, diff }); +} diff --git a/apps/meteor/server/database/watchCollections.ts b/apps/meteor/server/database/watchCollections.ts index 244159cb3e20..1f3628615ebe 100644 --- a/apps/meteor/server/database/watchCollections.ts +++ b/apps/meteor/server/database/watchCollections.ts @@ -34,7 +34,6 @@ export function getWatchCollections(): string[] { LivechatInquiry.getCollectionName(), LivechatDepartmentAgents.getCollectionName(), InstanceStatus.getCollectionName(), - IntegrationHistory.getCollectionName(), EmailInbox.getCollectionName(), Settings.getCollectionName(), Subscriptions.getCollectionName(), @@ -50,6 +49,7 @@ export function getWatchCollections(): string[] { collections.push(Permissions.getCollectionName()); collections.push(LivechatPriority.getCollectionName()); collections.push(LoginServiceConfiguration.getCollectionName()); + collections.push(IntegrationHistory.getCollectionName()); } if (onlyCollections.length > 0) { diff --git a/apps/meteor/server/models/raw/IntegrationHistory.ts b/apps/meteor/server/models/raw/IntegrationHistory.ts index 611c7ca095f1..317bdf41caf0 100644 --- a/apps/meteor/server/models/raw/IntegrationHistory.ts +++ b/apps/meteor/server/models/raw/IntegrationHistory.ts @@ -1,6 +1,6 @@ import type { IIntegrationHistory } from '@rocket.chat/core-typings'; import type { IIntegrationHistoryModel } from '@rocket.chat/model-typings'; -import type { Db, IndexDescription } from 'mongodb'; +import type { Db, IndexDescription, InsertOneResult, FindOneAndUpdateOptions } from 'mongodb'; import { BaseRaw } from './BaseRaw'; @@ -23,4 +23,17 @@ export class IntegrationHistoryRaw extends BaseRaw implemen findOneByIntegrationIdAndHistoryId(integrationId: string, historyId: string): Promise { return this.findOne({ 'integration._id': integrationId, '_id': historyId }); } + + async create(integrationHistory: IIntegrationHistory): Promise> { + return this.insertOne({ ...integrationHistory, _createdAt: new Date() }); + } + + async updateById( + _id: IIntegrationHistory['_id'], + data: Partial, + options?: FindOneAndUpdateOptions, + ): Promise { + const response = await this.findOneAndUpdate({ _id }, { $set: data }, { returnDocument: 'after', ...options }); + return response.value; + } } diff --git a/packages/model-typings/src/models/IIntegrationHistoryModel.ts b/packages/model-typings/src/models/IIntegrationHistoryModel.ts index 86765893dd53..378142e7519a 100644 --- a/packages/model-typings/src/models/IIntegrationHistoryModel.ts +++ b/packages/model-typings/src/models/IIntegrationHistoryModel.ts @@ -1,9 +1,15 @@ import type { IIntegrationHistory } from '@rocket.chat/core-typings'; +import type { FindOneAndUpdateOptions, InsertOneResult } from 'mongodb'; import type { IBaseModel } from './IBaseModel'; export interface IIntegrationHistoryModel extends IBaseModel { removeByIntegrationId(integrationId: string): ReturnType['deleteMany']>; - findOneByIntegrationIdAndHistoryId(integrationId: string, historyId: string): Promise; + create(integrationHistory: IIntegrationHistory): Promise>; + updateById( + _id: IIntegrationHistory['_id'], + data: Partial, + options?: FindOneAndUpdateOptions, + ): Promise; } From 2ba7cb8a91333d15c96286ecda9c7e7451a686a5 Mon Sep 17 00:00:00 2001 From: rocketchat-github-ci Date: Tue, 28 May 2024 14:08:13 +0000 Subject: [PATCH 08/29] Release 6.9.0-rc.1 [no ci] --- .changeset/bump-patch-1716905283526.md | 5 +++ .changeset/pre.json | 2 ++ apps/meteor/CHANGELOG.md | 36 +++++++++++++++++++ apps/meteor/app/utils/rocketchat.info | 2 +- apps/meteor/ee/server/services/CHANGELOG.md | 13 +++++++ apps/meteor/ee/server/services/package.json | 2 +- apps/meteor/package.json | 2 +- ee/apps/account-service/CHANGELOG.md | 13 +++++++ ee/apps/account-service/package.json | 2 +- ee/apps/authorization-service/CHANGELOG.md | 13 +++++++ ee/apps/authorization-service/package.json | 2 +- ee/apps/ddp-streamer/CHANGELOG.md | 15 ++++++++ ee/apps/ddp-streamer/package.json | 2 +- ee/apps/omnichannel-transcript/CHANGELOG.md | 14 ++++++++ ee/apps/omnichannel-transcript/package.json | 2 +- ee/apps/presence-service/CHANGELOG.md | 13 +++++++ ee/apps/presence-service/package.json | 2 +- ee/apps/queue-worker/CHANGELOG.md | 13 +++++++ ee/apps/queue-worker/package.json | 2 +- ee/apps/stream-hub-service/CHANGELOG.md | 12 +++++++ ee/apps/stream-hub-service/package.json | 2 +- ee/packages/api-client/CHANGELOG.md | 10 ++++++ ee/packages/api-client/package.json | 2 +- ee/packages/ddp-client/CHANGELOG.md | 10 ++++++ ee/packages/ddp-client/package.json | 2 +- ee/packages/license/CHANGELOG.md | 9 +++++ ee/packages/license/package.json | 2 +- ee/packages/omnichannel-services/CHANGELOG.md | 14 ++++++++ ee/packages/omnichannel-services/package.json | 2 +- ee/packages/pdf-worker/CHANGELOG.md | 9 +++++ ee/packages/pdf-worker/package.json | 2 +- ee/packages/presence/CHANGELOG.md | 11 ++++++ ee/packages/presence/package.json | 2 +- package.json | 2 +- packages/apps/CHANGELOG.md | 10 ++++++ packages/apps/package.json | 2 +- packages/core-services/CHANGELOG.md | 11 ++++++ packages/core-services/package.json | 2 +- packages/core-typings/CHANGELOG.md | 2 ++ packages/core-typings/package.json | 2 +- packages/cron/CHANGELOG.md | 10 ++++++ packages/cron/package.json | 2 +- packages/fuselage-ui-kit/CHANGELOG.md | 13 +++++++ packages/fuselage-ui-kit/package.json | 10 +++--- packages/gazzodown/CHANGELOG.md | 11 ++++++ packages/gazzodown/package.json | 6 ++-- packages/instance-status/CHANGELOG.md | 9 +++++ packages/instance-status/package.json | 2 +- packages/livechat/CHANGELOG.md | 9 +++++ packages/livechat/package.json | 2 +- packages/model-typings/CHANGELOG.md | 9 +++++ packages/model-typings/package.json | 2 +- packages/models/CHANGELOG.md | 9 +++++ packages/models/package.json | 2 +- packages/rest-typings/CHANGELOG.md | 9 +++++ packages/rest-typings/package.json | 2 +- packages/ui-avatar/CHANGELOG.md | 9 +++++ packages/ui-avatar/package.json | 4 +-- packages/ui-client/CHANGELOG.md | 9 +++++ packages/ui-client/package.json | 4 +-- packages/ui-contexts/CHANGELOG.md | 11 ++++++ packages/ui-contexts/package.json | 2 +- packages/ui-video-conf/CHANGELOG.md | 10 ++++++ packages/ui-video-conf/package.json | 6 ++-- packages/uikit-playground/CHANGELOG.md | 11 ++++++ packages/uikit-playground/package.json | 2 +- packages/web-ui-registration/CHANGELOG.md | 9 +++++ packages/web-ui-registration/package.json | 4 +-- 68 files changed, 418 insertions(+), 45 deletions(-) create mode 100644 .changeset/bump-patch-1716905283526.md diff --git a/.changeset/bump-patch-1716905283526.md b/.changeset/bump-patch-1716905283526.md new file mode 100644 index 000000000000..e1eaa7980afb --- /dev/null +++ b/.changeset/bump-patch-1716905283526.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/pre.json b/.changeset/pre.json index 7faf2d0be107..646efbb637eb 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -64,6 +64,7 @@ "changesets": [ "angry-rocks-try", "breezy-geckos-sparkle", + "bump-patch-1716905283526", "chilly-poems-explode", "cold-beds-hope", "cuddly-owls-join", @@ -78,6 +79,7 @@ "shiny-crabs-peel", "shy-oranges-provide", "silly-clocks-return", + "smooth-knives-turn", "strange-bears-dance", "strong-humans-bow", "tall-wombats-love", diff --git a/apps/meteor/CHANGELOG.md b/apps/meteor/CHANGELOG.md index c1b1d541ccf4..53f49f9e3b53 100644 --- a/apps/meteor/CHANGELOG.md +++ b/apps/meteor/CHANGELOG.md @@ -1,5 +1,41 @@ # @rocket.chat/meteor +## 6.9.0-rc.1 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +- ([#32479](https://github.com/RocketChat/Rocket.Chat/pull/32479)) Executing a logout and login action in the same "tab/instance", some streams were not being recreated, causing countless types of bugs. + + PS: as a workaround reloading after logout or login in also solves the problem. + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/rest-typings@6.9.0-rc.1 + - @rocket.chat/api-client@0.1.33-rc.1 + - @rocket.chat/license@0.1.15-rc.1 + - @rocket.chat/omnichannel-services@0.1.15-rc.1 + - @rocket.chat/pdf-worker@0.0.39-rc.1 + - @rocket.chat/presence@0.1.15-rc.1 + - @rocket.chat/apps@0.0.6-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/cron@0.0.35-rc.1 + - @rocket.chat/fuselage-ui-kit@7.0.0-rc.1 + - @rocket.chat/gazzodown@7.0.0-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/ui-contexts@7.0.0-rc.1 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.0.39-rc.1 + - @rocket.chat/ui-theming@0.1.2 + - @rocket.chat/ui-avatar@3.0.0-rc.1 + - @rocket.chat/ui-client@7.0.0-rc.1 + - @rocket.chat/ui-video-conf@7.0.0-rc.1 + - @rocket.chat/web-ui-registration@7.0.0-rc.1 + - @rocket.chat/instance-status@0.0.39-rc.1 +
+ ## 6.9.0-rc.0 ### Minor Changes diff --git a/apps/meteor/app/utils/rocketchat.info b/apps/meteor/app/utils/rocketchat.info index 18d1687ea9bd..b4a43e6ceaa3 100644 --- a/apps/meteor/app/utils/rocketchat.info +++ b/apps/meteor/app/utils/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "6.9.0-rc.0" + "version": "6.9.0-rc.1" } diff --git a/apps/meteor/ee/server/services/CHANGELOG.md b/apps/meteor/ee/server/services/CHANGELOG.md index c16384a9e56d..9e75ef4c3980 100644 --- a/apps/meteor/ee/server/services/CHANGELOG.md +++ b/apps/meteor/ee/server/services/CHANGELOG.md @@ -1,5 +1,18 @@ # rocketchat-services +## 1.1.33-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/rest-typings@6.9.0-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 1.1.33-rc.0 ### Patch Changes diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 2b5658d12b22..968ace364032 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -1,7 +1,7 @@ { "name": "rocketchat-services", "private": true, - "version": "1.1.33-rc.0", + "version": "1.1.33-rc.1", "description": "Rocket.Chat Authorization service", "main": "index.js", "scripts": { diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 6f92ec267800..7842ee136325 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/meteor", "description": "The Ultimate Open Source WebChat Platform", - "version": "6.9.0-rc.0", + "version": "6.9.0-rc.1", "private": true, "author": { "name": "Rocket.Chat", diff --git a/ee/apps/account-service/CHANGELOG.md b/ee/apps/account-service/CHANGELOG.md index 875b61da3e5f..951735322c50 100644 --- a/ee/apps/account-service/CHANGELOG.md +++ b/ee/apps/account-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/account-service +## 0.3.14-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/rest-typings@6.9.0-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.3.14-rc.0 ### Patch Changes diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json index 508814bc2b34..ead2c2dff8cc 100644 --- a/ee/apps/account-service/package.json +++ b/ee/apps/account-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/account-service", "private": true, - "version": "0.3.14-rc.0", + "version": "0.3.14-rc.1", "description": "Rocket.Chat Account service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/authorization-service/CHANGELOG.md b/ee/apps/authorization-service/CHANGELOG.md index 7a15bf205301..c84743103c34 100644 --- a/ee/apps/authorization-service/CHANGELOG.md +++ b/ee/apps/authorization-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/authorization-service +## 0.3.15-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/rest-typings@6.9.0-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.3.15-rc.0 ### Patch Changes diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json index d9cc9e7e8ce1..3c50fe168eb5 100644 --- a/ee/apps/authorization-service/package.json +++ b/ee/apps/authorization-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/authorization-service", "private": true, - "version": "0.3.15-rc.0", + "version": "0.3.15-rc.1", "description": "Rocket.Chat Authorization service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/ddp-streamer/CHANGELOG.md b/ee/apps/ddp-streamer/CHANGELOG.md index e7ba31816b5b..51922c477a6b 100644 --- a/ee/apps/ddp-streamer/CHANGELOG.md +++ b/ee/apps/ddp-streamer/CHANGELOG.md @@ -1,5 +1,20 @@ # @rocket.chat/ddp-streamer +## 0.2.14-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/rest-typings@6.9.0-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/ui-contexts@7.0.0-rc.1 + - @rocket.chat/models@0.0.39-rc.1 + - @rocket.chat/instance-status@0.0.39-rc.1 +
+ ## 0.2.14-rc.0 ### Patch Changes diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index ce7064e834fb..4898b86732d3 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/ddp-streamer", "private": true, - "version": "0.2.14-rc.0", + "version": "0.2.14-rc.1", "description": "Rocket.Chat DDP-Streamer service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/omnichannel-transcript/CHANGELOG.md b/ee/apps/omnichannel-transcript/CHANGELOG.md index ac726a7e5ffb..52754c454204 100644 --- a/ee/apps/omnichannel-transcript/CHANGELOG.md +++ b/ee/apps/omnichannel-transcript/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/omnichannel-transcript +## 0.3.15-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/omnichannel-services@0.1.15-rc.1 + - @rocket.chat/pdf-worker@0.0.39-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.3.15-rc.0 ### Patch Changes diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json index fc27979f1b30..6632944ac629 100644 --- a/ee/apps/omnichannel-transcript/package.json +++ b/ee/apps/omnichannel-transcript/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/omnichannel-transcript", "private": true, - "version": "0.3.15-rc.0", + "version": "0.3.15-rc.1", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/presence-service/CHANGELOG.md b/ee/apps/presence-service/CHANGELOG.md index 68e8cfcff8d7..52683c485011 100644 --- a/ee/apps/presence-service/CHANGELOG.md +++ b/ee/apps/presence-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/presence-service +## 0.3.15-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/presence@0.1.15-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.3.15-rc.0 ### Patch Changes diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json index e353668a1f36..2bf61f9ea9c4 100644 --- a/ee/apps/presence-service/package.json +++ b/ee/apps/presence-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/presence-service", "private": true, - "version": "0.3.15-rc.0", + "version": "0.3.15-rc.1", "description": "Rocket.Chat Presence service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/queue-worker/CHANGELOG.md b/ee/apps/queue-worker/CHANGELOG.md index 911923e492ba..54d7a0769371 100644 --- a/ee/apps/queue-worker/CHANGELOG.md +++ b/ee/apps/queue-worker/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/queue-worker +## 0.3.15-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/omnichannel-services@0.1.15-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.3.15-rc.0 ### Patch Changes diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json index dcbb47e7b0e4..a8d3c2f4863d 100644 --- a/ee/apps/queue-worker/package.json +++ b/ee/apps/queue-worker/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/queue-worker", "private": true, - "version": "0.3.15-rc.0", + "version": "0.3.15-rc.1", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/stream-hub-service/CHANGELOG.md b/ee/apps/stream-hub-service/CHANGELOG.md index 997188f03260..a36c91776fc3 100644 --- a/ee/apps/stream-hub-service/CHANGELOG.md +++ b/ee/apps/stream-hub-service/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/stream-hub-service +## 0.3.15-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.3.15-rc.0 ### Patch Changes diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json index 827753a270b1..72bd0521fe1d 100644 --- a/ee/apps/stream-hub-service/package.json +++ b/ee/apps/stream-hub-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/stream-hub-service", "private": true, - "version": "0.3.15-rc.0", + "version": "0.3.15-rc.1", "description": "Rocket.Chat Stream Hub service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/packages/api-client/CHANGELOG.md b/ee/packages/api-client/CHANGELOG.md index 0a89cb4a8e59..1c69f9a5ee5d 100644 --- a/ee/packages/api-client/CHANGELOG.md +++ b/ee/packages/api-client/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/api-client +## 0.1.33-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/rest-typings@6.9.0-rc.1 +
+ ## 0.1.33-rc.0 ### Patch Changes diff --git a/ee/packages/api-client/package.json b/ee/packages/api-client/package.json index 4f80d73ca732..60cf992dc4e7 100644 --- a/ee/packages/api-client/package.json +++ b/ee/packages/api-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/api-client", - "version": "0.1.33-rc.0", + "version": "0.1.33-rc.1", "devDependencies": { "@swc/core": "^1.3.95", "@swc/jest": "^0.2.29", diff --git a/ee/packages/ddp-client/CHANGELOG.md b/ee/packages/ddp-client/CHANGELOG.md index 66344812c276..d24ff021e939 100644 --- a/ee/packages/ddp-client/CHANGELOG.md +++ b/ee/packages/ddp-client/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/ddp-client +## 0.2.24-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/rest-typings@6.9.0-rc.1 + - @rocket.chat/api-client@0.1.33-rc.1 +
+ ## 0.2.24-rc.0 ### Patch Changes diff --git a/ee/packages/ddp-client/package.json b/ee/packages/ddp-client/package.json index e26357fea0e0..ef3a67401ae2 100644 --- a/ee/packages/ddp-client/package.json +++ b/ee/packages/ddp-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ddp-client", - "version": "0.2.24-rc.0", + "version": "0.2.24-rc.1", "devDependencies": { "@swc/core": "^1.3.95", "@swc/jest": "^0.2.29", diff --git a/ee/packages/license/CHANGELOG.md b/ee/packages/license/CHANGELOG.md index b2bbb88bdb2e..e4507990d195 100644 --- a/ee/packages/license/CHANGELOG.md +++ b/ee/packages/license/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/license +## 0.1.15-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 +
+ ## 0.1.15-rc.0 ### Patch Changes diff --git a/ee/packages/license/package.json b/ee/packages/license/package.json index 6418eb224553..542b384bb352 100644 --- a/ee/packages/license/package.json +++ b/ee/packages/license/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/license", - "version": "0.1.15-rc.0", + "version": "0.1.15-rc.1", "private": true, "devDependencies": { "@swc/core": "^1.3.95", diff --git a/ee/packages/omnichannel-services/CHANGELOG.md b/ee/packages/omnichannel-services/CHANGELOG.md index fbed2ecb619e..40cb02c93ce8 100644 --- a/ee/packages/omnichannel-services/CHANGELOG.md +++ b/ee/packages/omnichannel-services/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/omnichannel-services +## 0.1.15-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/rest-typings@6.9.0-rc.1 + - @rocket.chat/pdf-worker@0.0.39-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.1.15-rc.0 ### Patch Changes diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json index bc07fdc99639..bde1aad8c06d 100644 --- a/ee/packages/omnichannel-services/package.json +++ b/ee/packages/omnichannel-services/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/omnichannel-services", - "version": "0.1.15-rc.0", + "version": "0.1.15-rc.1", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/ee/packages/pdf-worker/CHANGELOG.md b/ee/packages/pdf-worker/CHANGELOG.md index 05dab4b4b414..1865a9d5d790 100644 --- a/ee/packages/pdf-worker/CHANGELOG.md +++ b/ee/packages/pdf-worker/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/pdf-worker +## 0.0.39-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 +
+ ## 0.0.39-rc.0 ### Patch Changes diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json index 2e68fd2f3ca4..03fd2580c87c 100644 --- a/ee/packages/pdf-worker/package.json +++ b/ee/packages/pdf-worker/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/pdf-worker", - "version": "0.0.39-rc.0", + "version": "0.0.39-rc.1", "private": true, "devDependencies": { "@storybook/addon-essentials": "~6.5.16", diff --git a/ee/packages/presence/CHANGELOG.md b/ee/packages/presence/CHANGELOG.md index 8e11707e6c1e..1d4e4377acb2 100644 --- a/ee/packages/presence/CHANGELOG.md +++ b/ee/packages/presence/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/presence +## 0.1.15-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/core-services@0.3.15-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.1.15-rc.0 ### Patch Changes diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index 9b2472dd91f6..651258cbc05e 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/presence", - "version": "0.1.15-rc.0", + "version": "0.1.15-rc.1", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/package.json b/package.json index 0edd977b7508..f73af572ded5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket.chat", - "version": "6.9.0-rc.0", + "version": "6.9.0-rc.1", "description": "Rocket.Chat Monorepo", "main": "index.js", "private": true, diff --git a/packages/apps/CHANGELOG.md b/packages/apps/CHANGELOG.md index dd7986b1ed88..291d9ff3374a 100644 --- a/packages/apps/CHANGELOG.md +++ b/packages/apps/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/apps +## 0.0.6-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/model-typings@0.4.1-rc.1 +
+ ## 0.0.6-rc.0 ### Patch Changes diff --git a/packages/apps/package.json b/packages/apps/package.json index b27fec0a2d74..6acec05fef52 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/apps", - "version": "0.0.6-rc.0", + "version": "0.0.6-rc.1", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/core-services/CHANGELOG.md b/packages/core-services/CHANGELOG.md index 212f0af2114f..2498eb2a13bc 100644 --- a/packages/core-services/CHANGELOG.md +++ b/packages/core-services/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/core-services +## 0.3.15-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/rest-typings@6.9.0-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.3.15-rc.0 ### Patch Changes diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 7c03f49037bf..c8ef47139472 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/core-services", - "version": "0.3.15-rc.0", + "version": "0.3.15-rc.1", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/packages/core-typings/CHANGELOG.md b/packages/core-typings/CHANGELOG.md index 179038594e83..b75b2dd4f2d7 100644 --- a/packages/core-typings/CHANGELOG.md +++ b/packages/core-typings/CHANGELOG.md @@ -1,5 +1,7 @@ # @rocket.chat/core-typings +## 6.9.0-rc.1 + ## 6.9.0-rc.0 ### Minor Changes diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 58334badc4ae..15c4357864e8 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package", "name": "@rocket.chat/core-typings", - "version": "6.9.0-rc.0", + "version": "6.9.0-rc.1", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "eslint": "~8.45.0", diff --git a/packages/cron/CHANGELOG.md b/packages/cron/CHANGELOG.md index a7cca89842a7..52586bbc4e10 100644 --- a/packages/cron/CHANGELOG.md +++ b/packages/cron/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/cron +## 0.0.35-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.0.35-rc.0 ### Patch Changes diff --git a/packages/cron/package.json b/packages/cron/package.json index 490d75ceb041..38e603f98ab5 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/cron", - "version": "0.0.35-rc.0", + "version": "0.0.35-rc.1", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/fuselage-ui-kit/CHANGELOG.md b/packages/fuselage-ui-kit/CHANGELOG.md index 8c6909e30be2..c8f2d81b3018 100644 --- a/packages/fuselage-ui-kit/CHANGELOG.md +++ b/packages/fuselage-ui-kit/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## 7.0.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/gazzodown@7.0.0-rc.1 + - @rocket.chat/ui-contexts@7.0.0-rc.1 + - @rocket.chat/ui-avatar@3.0.0-rc.1 + - @rocket.chat/ui-video-conf@7.0.0-rc.1 +
+ ## 7.0.0-rc.0 ### Minor Changes diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index e43429131b9c..b134989b7695 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/fuselage-ui-kit", "private": true, - "version": "7.0.0-rc.0", + "version": "7.0.0-rc.1", "description": "UiKit elements for Rocket.Chat Apps built under Fuselage design system", "homepage": "https://rocketchat.github.io/Rocket.Chat.Fuselage/", "author": { @@ -50,10 +50,10 @@ "@rocket.chat/icons": "*", "@rocket.chat/prettier-config": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "3.0.0-rc.0", - "@rocket.chat/ui-contexts": "7.0.0-rc.0", + "@rocket.chat/ui-avatar": "3.0.0-rc.1", + "@rocket.chat/ui-contexts": "7.0.0-rc.1", "@rocket.chat/ui-kit": "0.34.0-rc.0", - "@rocket.chat/ui-video-conf": "7.0.0-rc.0", + "@rocket.chat/ui-video-conf": "7.0.0-rc.1", "@tanstack/react-query": "*", "react": "*", "react-dom": "*" @@ -110,7 +110,7 @@ "typescript": "~5.3.3" }, "dependencies": { - "@rocket.chat/core-typings": "6.9.0-rc.0", + "@rocket.chat/core-typings": "6.9.0-rc.1", "@rocket.chat/gazzodown": "workspace:^", "@rocket.chat/ui-kit": "workspace:~", "tslib": "^2.5.3" diff --git a/packages/gazzodown/CHANGELOG.md b/packages/gazzodown/CHANGELOG.md index 69e83db1e9aa..712ff52a1a26 100644 --- a/packages/gazzodown/CHANGELOG.md +++ b/packages/gazzodown/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/gazzodown +## 7.0.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/ui-contexts@7.0.0-rc.1 + - @rocket.chat/ui-client@7.0.0-rc.1 +
+ ## 7.0.0-rc.0 ### Patch Changes diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index c32a0205b53b..dfc54a2f1745 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/gazzodown", - "version": "7.0.0-rc.0", + "version": "7.0.0-rc.1", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -71,8 +71,8 @@ "@rocket.chat/fuselage-tokens": "*", "@rocket.chat/message-parser": "0.31.29", "@rocket.chat/styled": "*", - "@rocket.chat/ui-client": "7.0.0-rc.0", - "@rocket.chat/ui-contexts": "7.0.0-rc.0", + "@rocket.chat/ui-client": "7.0.0-rc.1", + "@rocket.chat/ui-contexts": "7.0.0-rc.1", "katex": "*", "react": "*" }, diff --git a/packages/instance-status/CHANGELOG.md b/packages/instance-status/CHANGELOG.md index e6d3269dbda9..c9c5a8c5a7fe 100644 --- a/packages/instance-status/CHANGELOG.md +++ b/packages/instance-status/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/instance-status +## 0.0.39-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/models@0.0.39-rc.1 +
+ ## 0.0.39-rc.0 ### Patch Changes diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json index 43a333587fba..3e96e96e6e1a 100644 --- a/packages/instance-status/package.json +++ b/packages/instance-status/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/instance-status", - "version": "0.0.39-rc.0", + "version": "0.0.39-rc.1", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/packages/livechat/CHANGELOG.md b/packages/livechat/CHANGELOG.md index 7ffe2b0da4e3..5bf12f85f8b0 100644 --- a/packages/livechat/CHANGELOG.md +++ b/packages/livechat/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/livechat Change Log +## 1.17.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/gazzodown@7.0.0-rc.1 +
+ ## 1.17.0-rc.0 ### Minor Changes diff --git a/packages/livechat/package.json b/packages/livechat/package.json index f7d3e8b9e80c..571aaff1fb22 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/livechat", - "version": "1.17.0-rc.0", + "version": "1.17.0-rc.1", "files": [ "/build" ], diff --git a/packages/model-typings/CHANGELOG.md b/packages/model-typings/CHANGELOG.md index 0c237e46f300..0e2930a9ebb5 100644 --- a/packages/model-typings/CHANGELOG.md +++ b/packages/model-typings/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/model-typings +## 0.4.1-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 +
+ ## 0.4.1-rc.0 ### Patch Changes diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json index 3a3d7268c00c..309bf18b4a45 100644 --- a/packages/model-typings/package.json +++ b/packages/model-typings/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/model-typings", - "version": "0.4.1-rc.0", + "version": "0.4.1-rc.1", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/models/CHANGELOG.md b/packages/models/CHANGELOG.md index e23e0107e9f5..00eb1a3921d8 100644 --- a/packages/models/CHANGELOG.md +++ b/packages/models/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/models +## 0.0.39-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/model-typings@0.4.1-rc.1 +
+ ## 0.0.39-rc.0 ### Patch Changes diff --git a/packages/models/package.json b/packages/models/package.json index 97ff2dcca4aa..2b99c1eae881 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/models", - "version": "0.0.39-rc.0", + "version": "0.0.39-rc.1", "private": true, "devDependencies": { "@swc/core": "^1.3.95", diff --git a/packages/rest-typings/CHANGELOG.md b/packages/rest-typings/CHANGELOG.md index d54f717f3863..6045cf7f26d6 100644 --- a/packages/rest-typings/CHANGELOG.md +++ b/packages/rest-typings/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/rest-typings +## 6.9.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 +
+ ## 6.9.0-rc.0 ### Minor Changes diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 66c729f2e531..9dad92516c43 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/rest-typings", - "version": "6.9.0-rc.0", + "version": "6.9.0-rc.1", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@types/jest": "~29.5.7", diff --git a/packages/ui-avatar/CHANGELOG.md b/packages/ui-avatar/CHANGELOG.md index acce08f9687b..4c9e8d2b0879 100644 --- a/packages/ui-avatar/CHANGELOG.md +++ b/packages/ui-avatar/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/ui-avatar +## 3.0.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.1 +
+ ## 3.0.0-rc.0 ### Patch Changes diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index 567761cb54e6..c74652b2f655 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-avatar", - "version": "3.0.0-rc.0", + "version": "3.0.0-rc.1", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -31,7 +31,7 @@ ], "peerDependencies": { "@rocket.chat/fuselage": "*", - "@rocket.chat/ui-contexts": "7.0.0-rc.0", + "@rocket.chat/ui-contexts": "7.0.0-rc.1", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-client/CHANGELOG.md b/packages/ui-client/CHANGELOG.md index 01c70590c800..db3cc3f213a3 100644 --- a/packages/ui-client/CHANGELOG.md +++ b/packages/ui-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/ui-client +## 7.0.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.1 +
+ ## 7.0.0-rc.0 ### Patch Changes diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index 0b8386f57ed0..8d26a2506848 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-client", - "version": "7.0.0-rc.0", + "version": "7.0.0-rc.1", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -63,7 +63,7 @@ "@rocket.chat/fuselage": "*", "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", - "@rocket.chat/ui-contexts": "7.0.0-rc.0", + "@rocket.chat/ui-contexts": "7.0.0-rc.1", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-contexts/CHANGELOG.md b/packages/ui-contexts/CHANGELOG.md index d955d823c92e..b9b20100cb3f 100644 --- a/packages/ui-contexts/CHANGELOG.md +++ b/packages/ui-contexts/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/ui-contexts +## 7.0.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.1 + - @rocket.chat/rest-typings@6.9.0-rc.1 + - @rocket.chat/ddp-client@0.2.24-rc.1 +
+ ## 7.0.0-rc.0 ### Patch Changes diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index 94a7f4ea4168..838c6608d7a1 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-contexts", - "version": "7.0.0-rc.0", + "version": "7.0.0-rc.1", "private": true, "devDependencies": { "@rocket.chat/core-typings": "workspace:^", diff --git a/packages/ui-video-conf/CHANGELOG.md b/packages/ui-video-conf/CHANGELOG.md index a103f9410c09..95645481a1dd 100644 --- a/packages/ui-video-conf/CHANGELOG.md +++ b/packages/ui-video-conf/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/ui-video-conf +## 7.0.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.1 + - @rocket.chat/ui-avatar@3.0.0-rc.1 +
+ ## 7.0.0-rc.0 ### Patch Changes diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index ade737a5e665..647f2ae66ad4 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-video-conf", - "version": "7.0.0-rc.0", + "version": "7.0.0-rc.1", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -36,8 +36,8 @@ "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "3.0.0-rc.0", - "@rocket.chat/ui-contexts": "7.0.0-rc.0", + "@rocket.chat/ui-avatar": "3.0.0-rc.1", + "@rocket.chat/ui-contexts": "7.0.0-rc.1", "react": "^17.0.2", "react-dom": "^17.0.2" }, diff --git a/packages/uikit-playground/CHANGELOG.md b/packages/uikit-playground/CHANGELOG.md index 26177ed97720..15312b673f24 100644 --- a/packages/uikit-playground/CHANGELOG.md +++ b/packages/uikit-playground/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/uikit-playground +## 0.2.23-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/fuselage-ui-kit@7.0.0-rc.1 + - @rocket.chat/ui-contexts@7.0.0-rc.1 + - @rocket.chat/ui-avatar@3.0.0-rc.1 +
+ ## 0.2.23-rc.0 ### Patch Changes diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index f02958289587..d1cf7c33a9ed 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/uikit-playground", "private": true, - "version": "0.2.23-rc.0", + "version": "0.2.23-rc.1", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/web-ui-registration/CHANGELOG.md b/packages/web-ui-registration/CHANGELOG.md index f5aa9b7f8385..70a6fbc7407b 100644 --- a/packages/web-ui-registration/CHANGELOG.md +++ b/packages/web-ui-registration/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/web-ui-registration +## 7.0.0-rc.1 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.1 +
+ ## 7.0.0-rc.0 ### Patch Changes diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index 0427c51f28c4..a51f819af385 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/web-ui-registration", - "version": "7.0.0-rc.0", + "version": "7.0.0-rc.1", "private": true, "homepage": "https://rocket.chat", "main": "./dist/index.js", @@ -51,7 +51,7 @@ "peerDependencies": { "@rocket.chat/layout": "*", "@rocket.chat/tools": "0.2.1", - "@rocket.chat/ui-contexts": "7.0.0-rc.0", + "@rocket.chat/ui-contexts": "7.0.0-rc.1", "@tanstack/react-query": "*", "react": "*", "react-hook-form": "*", From 1ac48aed3d8bbb8386c385d8132c648d649fbec1 Mon Sep 17 00:00:00 2001 From: "lingohub[bot]" <69908207+lingohub[bot]@users.noreply.github.com> Date: Tue, 28 May 2024 15:33:05 +0000 Subject: [PATCH 09/29] =?UTF-8?q?i18n:=20Rocket.Chat=20language=20update?= =?UTF-8?q?=20from=20LingoHub=20=F0=9F=A4=96=20on=202024-05-28Z=20(#32508)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Douglas Fabris <27704687+dougfabris@users.noreply.github.com> --- packages/i18n/src/locales/ar.i18n.json | 20 ++++++++++---------- packages/i18n/src/locales/cs.i18n.json | 8 ++++---- packages/i18n/src/locales/es.i18n.json | 16 ++++++++-------- packages/i18n/src/locales/fr.i18n.json | 6 +++--- packages/i18n/src/locales/it.i18n.json | 8 ++++---- packages/i18n/src/locales/pa-IN.i18n.json | 1 + packages/i18n/src/locales/pl.i18n.json | 12 ++++++------ packages/i18n/src/locales/pt-BR.i18n.json | 10 +++++----- packages/i18n/src/locales/ru.i18n.json | 20 ++++++++++---------- packages/i18n/src/locales/sv.i18n.json | 5 ++++- packages/i18n/src/locales/uk.i18n.json | 4 ++-- 11 files changed, 57 insertions(+), 53 deletions(-) diff --git a/packages/i18n/src/locales/ar.i18n.json b/packages/i18n/src/locales/ar.i18n.json index e8c5b3c62ab1..85dfe30a4839 100644 --- a/packages/i18n/src/locales/ar.i18n.json +++ b/packages/i18n/src/locales/ar.i18n.json @@ -277,6 +277,7 @@ "add-livechat-department-agents_description": "إذن لإضافة وكلاء للقنوات متعددة الاتجاهات إلى الأقسام", "add-oauth-service": "إضافة خدمة Oauth", "add-oauth-service_description": "إذن لإضافة خدمة Oauth جديدة", + "Calls_in_queue_many": "{{count}} من المكالمات الانتظار", "add-user": "إضافة مستخدم", "add-user_description": "إذن لإضافة مستخدمين جدد إلى الخادم عبر شاشة المستخدمين", "add-user-to-any-c-room": "إضافة مستخدم إلى أي Channel عامة", @@ -296,6 +297,7 @@ "additional_integrations_Bots": "إذا كنت تبحث عن كيفية دمج الروبوت الخاص بك، فلن تجد أفضل من محول Hubot الخاص بنا. https://github.com/RocketChat/hubot-rocketchat", "Admin_disabled_encryption": "لم يقوم المسؤول لديك بتمكين التشفير بين الوحدات الطرفية.", "Admin_Info": "معلومات المسؤول", + "Calls_in_queue_few": "{{count}} من المكالمات الانتظار", "Administration": "الإدارة", "Adult_images_are_not_allowed": "غير مسموح بالصور الخاصة بالكبار", "Aerospace_and_Defense": "الفضاء والدفاع", @@ -335,7 +337,6 @@ "All_messages": "كل الرسائل", "All_users": "جميع المستخدمين", "All_users_in_the_channel_can_write_new_messages": "يمكن لجميع المستخدمين في القناة كتابة رسائل جديدة", - "Calls_in_queue_many": "{{count}} من المكالمات الانتظار", "Allow_collect_and_store_HTTP_header_informations": "السماح بجمع وتخزين معلومات عنوان HTTP", "Allow_collect_and_store_HTTP_header_informations_description": "يحدد هذا الإعداد ما إذا كان مسموحًا لـ Livechat بتخزين المعلومات التي يتم جمعها من بيانات عنوان HTTP أم لا، مثل عنوان IP، ووكيل المستخدم، وما إلى ذلك.", "Allow_Invalid_SelfSigned_Certs": "السماح بالشهادات الموقعة ذاتيًا غير الصالحة", @@ -362,7 +363,6 @@ "Animals_and_Nature": "الحيوانات والطبيعة", "Announcement": "إعلان", "Anonymous": "غير شخصي", - "Calls_in_queue_few": "{{count}} من المكالمات الانتظار", "Answer_call": "الرد على المكالمة", "API": "واجهة برمجة التطبيقات", "API_Add_Personal_Access_Token": "إضافة رمز مميز جديد للوصول الشخصي", @@ -942,6 +942,7 @@ "Contact_not_found": "لم يتم العثور على جهة الاتصال", "Contact_Profile": "الملف الشخصي لجهة الاتصال", "Contact_Info": "معلومات جهة الاتصال", + "message_counter_many": "{{count}} رسائل", "Content": "المحتوى", "Continue": "متابعة", "Continuous_sound_notifications_for_new_livechat_room": "إشعارات صوتية مستمرة لغرفة القناة متعددة الاتجاهاهت الجديدة", @@ -956,6 +957,7 @@ "Conversations": "المحادثات", "Conversations_per_day": "المحادثات لكل يوم", "Convert": "تحويل", + "meteor_status_reconnect_in_many": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "Convert_Ascii_Emojis": "تحويل ASCII إلى رمز تعبيري", "Convert_to_channel": "التحويل إلى Channel", "Converting_channel_to_a_team": "أنت تقوم بتحويل Channel هذه إلى فريق. سيتم الاحتفاظ بجميع الأعضاء.", @@ -1031,6 +1033,7 @@ "Country_Denmark": "الدنمارك", "Country_Djibouti": "جيبوتي", "Country_Dominica": "دومينيكا", + "message_counter_few": "{{count}} رسائل", "Country_Dominican_Republic": "جمهورية الدومنيكان", "Country_Ecuador": "الإكوادور", "Country_Egypt": "مصر", @@ -1066,6 +1069,7 @@ "Country_Heard_Island_and_Mcdonald_Islands": "جزيرة هيرد وجزر ماكدونالد", "Country_Holy_See_Vatican_City_State": "الكرسي الرسولي (دولة الفاتيكان)", "Country_Honduras": "هندوراس", + "meteor_status_reconnect_in_few": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "Country_Hong_Kong": "هونغ كونغ", "Country_Hungary": "هنغاريا", "Country_Iceland": "أيسلندا", @@ -1373,7 +1377,6 @@ "Desktop_Notifications_Duration_Description": "عدد الثواني اللازمة لعرض إشعار سطح المكتب. قد يؤثر ذلك في مركز إشعارات OS X. أدخل 0 لاستخدام إعدادات المتصفح الافتراضية دون التأثير في مركز إشعارات OS X.", "Desktop_Notifications_Enabled": "إشعارات سطح المكتب ممكّنة", "Desktop_Notifications_Not_Enabled": "إشعارات سطح المكتب غير ممكّنة", - "message_counter_many": "{{count}} رسائل", "Details": "التفاصيل", "line": "السطر", "Device_Management_IP": " عنوان IP", @@ -1393,7 +1396,6 @@ "Direct_Reply_Debug_Description": "[تحذير] سيترتب على تمكين وضع التصحيح عرض \"كلمة المرور بنص عادي\" في وحدة تحكم المسؤول.", "Direct_Reply_Delete": "حذف رسائل البريد الإلكتروني", "Direct_Reply_Delete_Description": "[تنبيه!] إذا تم تفعيل هذا الخيار، فسيتم حذف جميع الرسائل غير المقروءة نهائيًا، ومن بينها الرسائل التي ليست ردودًا مباشرة. عندئذٍ يكون صندوق البريد الإلكتروني الذي تم تكوينه فارغًا دائمًا ولا يستطيع إنسان معالجته \"بشكل متوازٍ\".", - "meteor_status_reconnect_in_many": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "Direct_Reply_Enable": "تمكين الرد المباشر", "Direct_Reply_Enable_Description": "[تنبيه!] إذا تم تمكين \"الرد المباشر\"، فإن Rocket.Chat سيتحكم في صندوق البريد الإلكتروني الذي تم تكوينه. يتم استرداد جميع رسائل البريد الإلكتروني غير المقروءة، ووضع علامة \"مقروءة\" عليها ومعالجتها. يجب تنشيط \"الرد المباشر\" فقط إذا كان صندوق البريد المستخدم مخصصًا حصريًا للوصول بواسطة Rocket.Chat ولم يقم إنسان بقراءته/معالجته \"بالتوازي\".", "Direct_Reply_Frequency": "معدل التكرار التحقق من البريد الإلكتروني", @@ -1479,7 +1481,6 @@ "Markdown_Marked_Tables": "تمكين الجداول المحددة", "duplicated-account": "حساب مكرر", "E2E Encryption": "التشفير بين الطرفيات", - "message_counter_few": "{{count}} رسائل", "Markdown_Parser": "محلل Markdown", "Markdown_SupportSchemesForLink": "مخططات دعم Markdown للرابط", "Markdown_SupportSchemesForLink_Description": "قائمة المخططات المسموح بها مفصولة بفواصل", @@ -1525,7 +1526,6 @@ "edit-other-user-active-status_description": "إذن لتمكين أو تعطيل الحسابات الأخرى", "edit-other-user-avatar": "تحرير الصورة الرمزية للمستخدم الآخر", "edit-other-user-avatar_description": "إذن لتغيير الصورة الرمزية للمستخدم الآخر.", - "meteor_status_reconnect_in_few": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "edit-other-user-e2ee": "تحرير التشفير بين الطرفيات للمستخدم الآخر", "edit-other-user-e2ee_description": "إذن لتعديل التشفير بين الطرفيات للمستخدمين الآخرين", "edit-other-user-info": "تحرير معلومات المستخدمين الآخرين", @@ -1608,8 +1608,10 @@ "EncryptionKey_Change_Disabled": "لا يمكنك تعيين كلمة مرور لمفتاح التشفير الخاص بك لأن مفتاحك الخاص غير موجود على هذا العميل. لتعيين كلمة مرور جديدة، يلزمك تحميل مفتاحك الخاص باستخدام كلمة مرورك الحالية أو استخدام وكيل سبق رفع المفتاح لديه.", "End": "إنهاء", "End_call": "إنهاء مكالمة", + "message_counter_two": "{{count}} رسائل", "Expand_view": "توسيع العرض", "Explore_marketplace": "استكشاف السوق", + "message_counter_zero": "{{count}} رسائل", "Explore_the_marketplace_to_find_awesome_apps": "استكشف السوق للعثور على تطبيقات رائعة لـ Rocket.Chat", "Export": "تصدير", "End_Call": "إنهاء مكالمة", @@ -1658,7 +1660,9 @@ "error-canned-response-not-found": "لم يتم العثور على ردود مسجلة", "error-cannot-delete-app-user": "غير مسموح بحذف مستخدم التطبيق، قم بإلغاء تثبيت التطبيق المقابل لإزالته.", "error-cant-invite-for-direct-room": "لا يمكن دعوة المستخدم في الغرفة المباشرة", + "meteor_status_reconnect_in_two": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "error-channels-setdefault-is-same": "الإعداد الافتراضي للقناة هو نفسه الذي سيتم تغييره إليه.", + "meteor_status_reconnect_in_zero": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "error-channels-setdefault-missing-default-param": "يلزم توفير bodyParam \"الافتراضية\"", "error-could-not-change-email": "تعذر تغيير البريد الإلكتروني", "error-could-not-change-name": "تعذر تغيير الاسم", @@ -1949,11 +1953,9 @@ "FileUpload_S3_Proxy_Uploads": "عمليات الرفع الخاصة بالوكيل", "FileUpload_S3_Proxy_Uploads_Description": "إرسال ملف الرفع الخاص بالوكيل من خلال الخادم الخاص بك بدلاً من الوصول المباشر إلى عنوان URL الخاص بالأصل", "FileUpload_S3_Region": "المنطقة", - "message_counter_two": "{{count}} رسائل", "FileUpload_S3_SignatureVersion": "إصدار التوقيع", "FileUpload_S3_URLExpiryTimeSpan": "فترة انتهاء صلاحية عناوين URL", "FileUpload_S3_URLExpiryTimeSpan_Description": "الوقت الذي لن تصبح بعده عناوين URL التي تنشئها Amazon S3 صالحة (بالثواني). إذا تم التعيين على أقل من 5 ثوانٍ، فسيتم تجاهل هذا الحقل.", - "message_counter_zero": "{{count}} رسائل", "FileUpload_Storage_Type": "نوع التخزين", "FileUpload_Webdav_Password": "كلمة مرور WebDAV", "FileUpload_Webdav_Proxy_Avatars": "الصور الرمزية للوكيل", @@ -2020,8 +2022,6 @@ "Full_Screen": "ملء الشاشة", "Gaming": "الألعاب", "General": "عام", - "meteor_status_reconnect_in_two": "المحاولة مرة أخرى خلال {{count}} من الثواني...", - "meteor_status_reconnect_in_zero": "المحاولة مرة أخرى خلال {{count}} من الثواني...", "Generate_new_key": "إنشاء مفتاح جديد", "Generate_New_Link": "إنشاء رابط جديد", "Generating_key": "يتم إنشاء مفتاح", diff --git a/packages/i18n/src/locales/cs.i18n.json b/packages/i18n/src/locales/cs.i18n.json index 4fd748f64f42..a02152a66277 100644 --- a/packages/i18n/src/locales/cs.i18n.json +++ b/packages/i18n/src/locales/cs.i18n.json @@ -759,6 +759,7 @@ "Contact": "Kontakt", "Contact_Chat_History": "Historie kontaktu", "Contains_Security_Fixes": "Obsahuje opravy zabezpečení", + "message_counter_many": "{{count}} zpráv(y)", "Content": "Obsah", "Continue": "Pokračovat", "Continuous_sound_notifications_for_new_livechat_room": "Trvalé zvukové oznámení pro novou Omnichannel místnost", @@ -772,6 +773,7 @@ "conversation_with_s": "konverzace s %s", "Conversations": "Konverzace", "Conversations_per_day": "Konverzace za den", + "meteor_status_reconnect_in_many": "zkusím znovu za {{count}} sekund...", "Convert_Ascii_Emojis": "Převod ASCII na Emoji", "Copied": "Zkopírováno", "Copy": "Kopírovat", @@ -842,6 +844,7 @@ "Country_Denmark": "Dánsko", "Country_Djibouti": "Džibutsko", "Country_Dominica": "Dominika", + "message_counter_few": "{{count}} zpráv(y)", "Country_Dominican_Republic": "Dominikánská republika", "Country_Ecuador": "Ekvádor", "Country_Egypt": "Egypt", @@ -877,6 +880,7 @@ "Country_Heard_Island_and_Mcdonald_Islands": "Heardův ostrov a McDonaldovy ostrovy", "Country_Holy_See_Vatican_City_State": "Svatý stolec (Vatikánský městský stát)", "Country_Honduras": "Honduras", + "meteor_status_reconnect_in_few": "zkusím znovu za {{count}} sekund...", "Country_Hong_Kong": "Hongkong", "Country_Hungary": "Maďarsko", "Country_Iceland": "Island", @@ -1165,7 +1169,6 @@ "Desktop_Notifications_Duration_Description": "Délka zobrazení oznámení (v sekundách). Toto může ovlivnit nastevení OS X Oznamovacího centra. Zadejte 0 pro použítí výchozí nastavení prohlížeče/notifikačního centra OS X", "Desktop_Notifications_Enabled": "Oznámení na ploše jsou povolena", "Desktop_Notifications_Not_Enabled": "Oznámení na ploše jsou povoleny", - "message_counter_many": "{{count}} zpráv(y)", "Details": "Detaily", "line": "řádek", "Different_Style_For_User_Mentions": "Odlišný styl pro zmínky", @@ -1183,7 +1186,6 @@ "Direct_Reply_Debug_Description": "[Pozor] Povolení Debug módu znamená zobrazení hesla v čitelné podobě v admin konzoli", "Direct_Reply_Delete": "Smazat e-maily", "Direct_Reply_Delete_Description": "[Pozor!] Je-li tato možnost aktivována, všechny nepřečtené zprávy budou neodvolatelně odstraněny, a to i ty, které nejsou přímými odpověďmi. Konfigurovaná e-mailová schránka je pak vždy prázdná a lidé ji NEmohou zpracovávat „paralelně“.", - "meteor_status_reconnect_in_many": "zkusím znovu za {{count}} sekund...", "Direct_Reply_Enable": "Povolit přímou odpověď", "Direct_Reply_Enable_Description": "[Pozor!] Pokud je povolená „Přímá odpověď“, bude Rocket.Chat ovládat nakonfigurovanou e-mailovou schránku. Všechny nepřečtené e-maily jsou načteny, označeny jako přečtené a zpracované. „Přímá odpověď“ by měla být aktivována pouze v případě, že použitá poštovní schránka je určena výhradně pro přístup na server Rocket.Chat a není člověkem „paralelně“ čtena/zpracována.", "Direct_Reply_Frequency": "Frekvenkce kontroly emailu", @@ -1260,7 +1262,6 @@ "Markdown_Marked_Tables": "Povolit značky tabulek", "duplicated-account": "Duplicitní účet", "E2E Encryption": "Šifrování E2E", - "message_counter_few": "{{count}} zpráv(y)", "Markdown_Parser": "Parser markdownu", "Markdown_SupportSchemesForLink": "Schémata používaná pro automatické odkazy markdown", "Markdown_SupportSchemesForLink_Description": "Čárkami oddělený seznam povolených schémat", @@ -1296,7 +1297,6 @@ "edit-other-user-active-status_description": "Právo povolit nebo zakázat jiné uživatelské účty", "edit-other-user-avatar": "Upravit avatar jiného uživatele", "edit-other-user-avatar_description": "Povolení změnit avatar jiného uživatele.", - "meteor_status_reconnect_in_few": "zkusím znovu za {{count}} sekund...", "edit-other-user-e2ee": "Upravit E2E šifrování jiného uživatele", "edit-other-user-e2ee_description": "Povolení spravovat E2E šifrování ostatních uživatelů", "edit-other-user-info": "Upravit informace uživatelů", diff --git a/packages/i18n/src/locales/es.i18n.json b/packages/i18n/src/locales/es.i18n.json index 8f6a9cd845f3..d79d3fa71cb1 100644 --- a/packages/i18n/src/locales/es.i18n.json +++ b/packages/i18n/src/locales/es.i18n.json @@ -15,9 +15,9 @@ "__username__is_no_longer__role__defined_by__user_by_": "{{username}} ya no es {{role}} (por {{user_by}})", "__username__was_set__role__by__user_by_": "{{username}} se ha establecido como {{role}} por {{user_by}}", "__count__without__department__": "{{count}} sin departamentos", - "__usersCount__member_joined_many": "{{count}} miembros se han unido", "__count__without__tags__": "{{count}} sin etiquetas", "__count__without__assignee__": "{{count}} sin un agente asignado", + "__usersCount__member_joined_many": "{{count}} miembros se han unido", "removed__username__as__role_": "se removió {{username}} como {{role}}", "set__username__as__role_": " se estableció a {{username}} como {{role}}", "This_room_encryption_has_been_enabled_by__username_": "El cifrado de esta sala ha sido habilitado por {{username}}", @@ -947,6 +947,7 @@ "Contact_not_found": "Contacto no encontrado", "Contact_Profile": "Perfil de contacto", "Contact_Info": "Información de contacto", + "message_counter_many": "{{count}} mensajes", "Content": "Contenido", "Continue": "Continuar", "Continuous_sound_notifications_for_new_livechat_room": "Notificaciones de sonido continuas para nueva sala de Omnichannel", @@ -961,6 +962,7 @@ "Conversations": "Conversaciones", "Conversations_per_day": "Conversaciones por día", "Convert": "Convertir", + "meteor_status_reconnect_in_many": "intentando de nuevo dentro de {{count}} segundos...", "Convert_Ascii_Emojis": "Convierte ASCII a emoji", "Convert_to_channel": "Convertir en Channel", "Converting_channel_to_a_team": "Vas a convertir este Channel en un equipo. Se conservarán todos los miembros.", @@ -1381,7 +1383,6 @@ "Desktop_Notifications_Duration_Description": "Segundos durante los que mostrar la notificación de escritorio. Esto puede afectar al Centro de notificaciones de OS X. Introduce 0 para usar la configuración por defecto del navegador y que no afecte al Centro de notificaciones de OS X.", "Desktop_Notifications_Enabled": "Las notificaciones de escritorio están habilitadas", "Desktop_Notifications_Not_Enabled": "Las notificaciones de escritorio no están habilitadas", - "message_counter_many": "{{count}} mensajes", "Details": "Detalles", "line": "línea", "Device_Management_IP": "IP", @@ -1400,7 +1401,6 @@ "Direct_Reply_Debug_Description": "[Beware] Habilitar el modo de depuración mostraría tu \"Contraseña de texto sin formato\" en la consola de administración.", "Direct_Reply_Delete": "Eliminar correos electrónicos", "Direct_Reply_Delete_Description": "[Attention!] Si esta opción está activada, todos los mensajes no leídos se eliminan irrevocablemente, incluso aquellos que no son respuestas directas. Así, el buzón de correo electrónico configurado está siempre vacío y ninguna persona puede procesarlo \"en paralelo\".", - "meteor_status_reconnect_in_many": "intentando de nuevo dentro de {{count}} segundos...", "Direct_Reply_Enable": "Habilitar respuesta directa", "Direct_Reply_Enable_Description": "[Attention!] Si la opción \"Respuesta directa\" está habilitada, Rocket.Chat controlará el buzón de correo electrónico configurado. Todos los correos electrónicos no leídos se recuperan, se marcan como leídos y se procesan. La opción \"Respuesta directa\" solo debe activarse si el buzón de correo usado está destinado exclusivamente al acceso por parte de Rocket.Chat y ninguna persona puede leerlo o procesarlo \"en paralelo\".", "Direct_Reply_Frequency": "Frecuencia de verificación de correo electrónico", @@ -1799,11 +1799,14 @@ "every_5_minutes": "Una vez cada 5 minutos", "every_10_seconds": "Una vez cada 10 segundos", "every_30_minutes": "Una vez cada 30 minutos", + "mentions_counter_many": "{{count}} menciones", "every_day": "Una vez cada día", "every_hour": "Una vez cada hora", "every_minute": "Una vez cada minuto", "every_second": "Una vez cada segundo", "every_six_hours": "Una vez cada seis horas", + "threads_counter_many": "{{count}} mensajes en hilo sin leer", + "unread_messages_counter_many": "{{count}} mensajes sin leer", "Everyone_can_access_this_channel": "Todos pueden acceder a este canal", "Exact": "Exacto", "Example_payload": "Carga útil de ejemplo", @@ -2122,7 +2125,9 @@ "Impersonate_user_description": "Cuando esta opción esté habilitada, la integración publicará como el usuario que activó la integración", "Import": "Importar", "Import_New_File": "Importar archivo nuevo", + "subscription.callout.description.limitsExceeded_many": "Su espacio de trabajo ha superado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", "Import_requested_successfully": "Importación solicitada correctamente", + "subscription.callout.description.limitsReached_many": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", "Import_Type": "Tipo de importación", "Importer_Archived": "Archivado", "Importer_CSV_Information": "El importador de CSV requiere un formato específico; lee la documentación sobre cómo estructurar tu archivo zip:", @@ -2195,15 +2200,12 @@ "Installation": "Instalación ", "Installed": "Instalada", "Installed_at": "Instalada en", - "mentions_counter_many": "{{count}} menciones", "Instance": "Instancia", "Instances": "Instancias", "Instances_health": "Estado de las instancias", "Instance_Record": "Registro de instancia", - "threads_counter_many": "{{count}} mensajes en hilo sin leer", "Instructions": "Instrucciones", "Instructions_to_your_visitor_fill_the_form_to_send_a_message": "Instrucciones para que el visitante rellene el formulario para enviar un mensaje", - "unread_messages_counter_many": "{{count}} mensajes sin leer", "Insert_Contact_Name": "Insertar nombre del contacto", "Insert_Placeholder": "Insertar marcador de posición", "Install_rocket_chat_on_your_preferred_desktop_platform": "Instale Rocket.Chat en su sistema operativo de preferencia.", @@ -2627,10 +2629,8 @@ "Livechat_offline": "Omnichannel fuera de línea", "Livechat_offline_message_sent": "Mensaje de Livechat fuera de línea enviado", "Livechat_OfflineMessageToChannel_enabled": "Enviar mensajes fuera de línea de Livechat a un canal", - "subscription.callout.description.limitsExceeded_many": "Su espacio de trabajo ha superado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", "Omnichannel_on_hold_chat_resumed": "Reanudación del chat en espera: {{comment}}", "Omnichannel_on_hold_chat_automatically": "El chat se ha reanudado automáticamente desde En espera al recibir un nuevo mensaje de {{guest}}", - "subscription.callout.description.limitsReached_many": "Su espacio de trabajo ha alcanzado los límites <1> {{val, list}} . <3> Administre su suscripción para incrementar los límites.", "Omnichannel_on_hold_chat_resumed_manually": "{{user}} ha reanudado el chat manualmente desde En espera ", "Omnichannel_On_Hold_due_to_inactivity": "El chat se ha puesto automáticamente en espera porque no hemos recibido ninguna respuesta de {{guest}} en {{timeout}} segundos", "Omnichannel_On_Hold_manually": "{{user}} ha puesto el chat en espera manualmente ", diff --git a/packages/i18n/src/locales/fr.i18n.json b/packages/i18n/src/locales/fr.i18n.json index bd809aba9176..ff96989499f8 100644 --- a/packages/i18n/src/locales/fr.i18n.json +++ b/packages/i18n/src/locales/fr.i18n.json @@ -277,6 +277,7 @@ "add-livechat-department-agents_description": "Autorisation d'ajouter des agents omnicanaux aux départements", "add-oauth-service": "Ajouter un service Oauth", "add-oauth-service_description": "Autorisation d'ajouter un nouveau service Oauth", + "Calls_in_queue_many": "{{count}} appels en file d'attente", "add-user": "Ajouter un utilisateur", "add-user_description": "Autorisation d'ajouter de nouveaux utilisateurs au serveur via l'écran des utilisateurs", "add-user-to-any-c-room": "Ajouter un utilisateur à un canal public", @@ -335,7 +336,6 @@ "All_messages": "Tous les messages", "All_users": "Tous les utilisateurs", "All_users_in_the_channel_can_write_new_messages": "Tous les utilisateurs du canal peuvent écrire de nouveaux messages", - "Calls_in_queue_many": "{{count}} appels en file d'attente", "Allow_collect_and_store_HTTP_header_informations": "Autoriser la collecte et le stockage des informations d'en-tête HTTP", "Allow_collect_and_store_HTTP_header_informations_description": "Ce paramètre détermine si Livechat est autorisé à stocker les informations collectées à partir des données d'en-tête HTTP, telles que l'adresse IP, l'agent utilisateur, etc.", "Allow_Invalid_SelfSigned_Certs": "Autoriser les certificats auto-signés invalides", @@ -944,6 +944,7 @@ "Contact_not_found": "Contact introuvable", "Contact_Profile": "Profil de contact", "Contact_Info": "Informations de contact", + "message_counter_many": "{{count}} messages", "Content": "Contenu", "Continue": "Continuer", "Continuous_sound_notifications_for_new_livechat_room": "Notifications sonores continues pour le nouveau salon omnicanal", @@ -958,6 +959,7 @@ "Conversations": "Conversations", "Conversations_per_day": "Conversations par jour", "Convert": "Convertir", + "meteor_status_reconnect_in_many": "nouvelle tentative dans {{count}} secondes...", "Convert_Ascii_Emojis": "Convertir le code ASCII en emoji", "Convert_to_channel": "Convertir en canal", "Converting_channel_to_a_team": "Vous convertissez ce canal en équipe. Tous les membres seront conservés.", @@ -1378,7 +1380,6 @@ "Desktop_Notifications_Duration_Description": "Affichage des notifications de bureau en secondes. Cela peut affecter le centre de notification d'OS X. Entrez 0 pour utiliser les paramètres du navigateur par défaut et ne pas affecter le centre de notifications d'OS X.", "Desktop_Notifications_Enabled": "Les notifications de bureau sont activées", "Desktop_Notifications_Not_Enabled": "Les notifications de bureau ne sont pas activées", - "message_counter_many": "{{count}} messages", "Details": "Détails", "line": "ligne", "Device_Management_IP": "IP", @@ -1397,7 +1398,6 @@ "Direct_Reply_Debug_Description": "[Attention] L'activation du mode de débogage affichera votre mot de passe en texte brut dans la console d'administration.", "Direct_Reply_Delete": "Supprimer les e-mails", "Direct_Reply_Delete_Description": "[Attention] Si cette option est activée, tous les messages non lus sont supprimés définitivement, même ceux qui ne sont pas des réponses directes. La boîte aux lettres configurée est alors toujours vide et ne peut pas être traitée en parallèle par des humains.", - "meteor_status_reconnect_in_many": "nouvelle tentative dans {{count}} secondes...", "Direct_Reply_Enable": "Activer la réponse directe", "Direct_Reply_Enable_Description": "[Attention] Si les réponses directes sont activées, Rocket.Chat contrôle la boîte aux lettres configurée. Tous les e-mails non lus sont récupérés, marqués comme lus et traités. Les réponses directes ne doivent être activées que si la boîte aux lettres utilisée est accessible exclusivement à Rocket.Chat et qu'elle n'est pas lue/traitée en parallèle par des humains.", "Direct_Reply_Frequency": "Fréquence de vérification des e-mails", diff --git a/packages/i18n/src/locales/it.i18n.json b/packages/i18n/src/locales/it.i18n.json index ab446b86dde3..39cce6358b2a 100644 --- a/packages/i18n/src/locales/it.i18n.json +++ b/packages/i18n/src/locales/it.i18n.json @@ -15,9 +15,9 @@ "__username__is_no_longer__role__defined_by__user_by_": "{{username}} non è più {{role}}, da {{user_by}}", "__username__was_set__role__by__user_by_": "A {{username}} è stato assegnato il ruolo di {{role}} da {{user_by}}", "__count__without__department__": "{{count}} senza reparto", - "__usersCount__member_joined_many": "+ {{count}} membri si sono uniti", "__count__without__tags__": "{{count}} senza tag", "__count__without__assignee__": "{{count}} non assegnate", + "__usersCount__member_joined_many": "+ {{count}} membri si sono uniti", "removed__username__as__role_": "ha rimosso {{username}} come {{role}}", "set__username__as__role_": "ha impostato {{username}} come {{role}}", "This_room_encryption_has_been_enabled_by__username_": "La crittografia di questa stanza è stata attivata da {{username}}", @@ -230,8 +230,10 @@ "Accounts_RegistrationForm_Secret_URL": "URL segreto", "Accounts_RegistrationForm_SecretURL": "URL segreto del modulo di registrazione ", "Accounts_RegistrationForm_SecretURL_Description": "È necessario fornire una stringa casuale che verrà aggiunta all'URL di registrazione. Esempio: `https://open.rocket.chat/register/[secret_hash]`", + "Apps_Count_Enabled_many": "{{count}} app abilitate", "Accounts_RequireNameForSignUp": "Richiedi il nome per la registrazione", "Accounts_RequirePasswordConfirmation": "Richiede conferma della password", + "Private_Apps_Count_Enabled_many": "{{count}} applicazioni private abilitate", "Accounts_SearchFields": "Campi da considerare nella ricerca", "Accounts_Send_Email_When_Activating": "Invia mail all'utente quando quando è attivato", "Accounts_Send_Email_When_Deactivating": "Invia mail all'utente quando quando è inattivato", @@ -262,10 +264,8 @@ "Add_Reaction": "Aggiungi reazione", "Add_Role": "Aggiungi ruolo", "Add_Server": "Aggiungi server", - "Apps_Count_Enabled_many": "{{count}} app abilitate", "Add_user": "Aggiungi utente", "Add_User": "Aggiungi utente", - "Private_Apps_Count_Enabled_many": "{{count}} applicazioni private abilitate", "Add_users": "Aggiungi utenti", "add-oauth-service": "Aggiungi servizio Oauth", "add-oauth-service_description": "Autorizzazione ad aggiungere un nuovo servizio Oauth", @@ -714,6 +714,7 @@ "Conversation_finished_message": "Messaggio di conversazione terminato", "conversation_with_s": "la conversazione con %s", "Conversations": "Conversazioni", + "meteor_status_reconnect_in_many": "riprovo tra {{count}} secondi...", "Convert_Ascii_Emojis": "Converti gli ASCII in Emoji", "Converted__roomName__to_team": "ha convertito #{{roomName}} in una squadra", "Converted__roomName__to_channel": "ha convertito #{{roomName}} in un Channel", @@ -1113,7 +1114,6 @@ "Direct_Reply_Debug": "Debug Direct Reply", "Direct_Reply_Debug_Description": "[Attenzione] L'attivazione della modalità di debug mostrerebbe la tua 'password di testo normale' nella Console di amministrazione.", "Direct_Reply_Delete": "Elimina email intercettate", - "meteor_status_reconnect_in_many": "riprovo tra {{count}} secondi...", "Direct_Reply_Enable": "Abilita risposta diretta", "Direct_Reply_Frequency": "Email Controlla frequenza", "Direct_Reply_Frequency_Description": "(in minuti, default / minimo 2)", diff --git a/packages/i18n/src/locales/pa-IN.i18n.json b/packages/i18n/src/locales/pa-IN.i18n.json index 08ba34c215ae..18aa4d8eee0b 100644 --- a/packages/i18n/src/locales/pa-IN.i18n.json +++ b/packages/i18n/src/locales/pa-IN.i18n.json @@ -1,5 +1,6 @@ { "500": "ਅੰਦਰੂਨੀ ਸਰਵਰ ਗੜਬੜ", + "set__username__as__role_": "set {{username}} ਨੂੰ {{role}}", "away": "ਦੂਰ", "Away": "ਦੂਰ", "busy": "ਰੁਝੇਵਾਂ", diff --git a/packages/i18n/src/locales/pl.i18n.json b/packages/i18n/src/locales/pl.i18n.json index f71dad33e584..0936ec845df1 100644 --- a/packages/i18n/src/locales/pl.i18n.json +++ b/packages/i18n/src/locales/pl.i18n.json @@ -297,6 +297,7 @@ "add-oauth-service": "Dodaj usługę Oauth", "add-oauth-service_description": "Uprawnienie do dodawania nowej usługi Oauth", "add-team-channel": "Dodaj zespół Channel", + "Calls_in_queue_many": "{{count}} połączeń w kolejce", "add-team-channel_description": "Zezwolenie na dodanie kanału do zespołu", "add-team-member": "Dodaj członka zespołu", "add-team-member_description": "Uprawnienie do dodawania członków do zespołu", @@ -320,6 +321,7 @@ "Admin_disabled_encryption": "Administrator nie włączył szyfrowania E2E", "Admin_Info": "Informacje administracyjne", "admin-no-active-video-conf-provider": "**Połączenie konferencyjne nie jest włączone**: Skonfiguruj połączenia konferencyjne, aby były dostępne w tej przestrzeni roboczej.", + "Calls_in_queue_few": "{{count}} połączeń w kolejce", "admin-video-conf-provider-not-configured": "**Połączenie konferencyjne nie jest włączone**: Skonfiguruj połączenia konferencyjne, aby były dostępne w tej przestrzeni roboczej.", "admin-no-videoconf-provider-app": "**Połączenie konferencyjne nie jest włączone**: Aplikacje do połączeń konferencyjnych są dostępne w marketplace Rocket.Chat.", "Administration": "Administracja", @@ -365,7 +367,6 @@ "All_status": "Cały status", "All_users": "Wszyscy użytkownicy", "All_users_in_the_channel_can_write_new_messages": "Wszyscy użytkownicy na kanale mogą pisać nowe wiadomości", - "Calls_in_queue_many": "{{count}} połączeń w kolejce", "Allow_collect_and_store_HTTP_header_informations": "Zezwalaj na zbieranie i przechowywanie danych nagłówków HTTP", "Allow_collect_and_store_HTTP_header_informations_description": "To ustawienie określa, czy Livechat może przechowywać informacje zebrane z danych nagłówka HTTP, takie jak adres IP, agent użytkownika itp.", "Allow_Invalid_SelfSigned_Certs": "Zezwalaj na nieprawidłowo samodzielnie podpisane certyfikaty", @@ -394,7 +395,6 @@ "Animals_and_Nature": "Fauna i flora", "Announcement": "Ogłoszenie", "Anonymous": "Anonimowy", - "Calls_in_queue_few": "{{count}} połączeń w kolejce", "Answer_call": "Odbierz połączenie", "API": "API", "API_Add_Personal_Access_Token": "Dodaj nowy osobisty token dostępowy", @@ -1028,6 +1028,7 @@ "Contact_not_found": "Nie znaleziono kontaktu", "Contact_Profile": "Profil kontaktu", "Contact_Info": "Informacje o kontakcie", + "message_counter_many": "{{count}} wiadomości", "Content": "Zawartość", "Continue": "Kontynuuj", "Continuous_sound_notifications_for_new_livechat_room": "Ciągłe powiadomienia dźwiękowe dla nowego pokoju omnichannel", @@ -1044,6 +1045,7 @@ "Conversations": "Rozmowy", "Conversations_per_day": "Rozmowy na dzień", "Convert": "Konwertuj", + "meteor_status_reconnect_in_many": "spróbuj jeszcze raz za {{count}} sekund...", "Convert_Ascii_Emojis": "Konwertuj ASCII na emotikon", "Convert_to_channel": "Konwertuj na kanał", "Converting_channel_to_a_team": "Konwertujesz ten kanał na zespół. Wszyscy członkowie zostaną utrzymani.", @@ -1121,6 +1123,7 @@ "Country_Denmark": "Dania", "Country_Djibouti": "Dżibuti", "Country_Dominica": "Dominika", + "message_counter_few": "{{count}} wiadomości", "Country_Dominican_Republic": "Dominikana", "Country_Ecuador": "Ekwador", "Country_Egypt": "Egipt", @@ -1156,6 +1159,7 @@ "Country_Heard_Island_and_Mcdonald_Islands": "Wyspy Heard i McDonalda", "Country_Holy_See_Vatican_City_State": "Watykan", "Country_Honduras": "Honduras", + "meteor_status_reconnect_in_few": "spróbuj jeszcze raz za {{count}} sekund...", "Country_Hong_Kong": "Hongkong", "Country_Hungary": "Węgry", "Country_Iceland": "Islandia", @@ -1476,7 +1480,6 @@ "Desktop_Notifications_Duration_Description": "Liczba sekund wyświetlania powiadomienia na pulpicie. Może to mieć wpływ na centrum powiadomień systemu OS X. Wprowadź 0, aby użyć domyślnych ustawień przeglądarki i nie wpływać na centrum powiadomień systemu OS X.", "Desktop_Notifications_Enabled": "Powiadomienia na pulpicie są włączone", "Desktop_Notifications_Not_Enabled": "Powiadomienia na pulpicie nie są włączone", - "message_counter_many": "{{count}} wiadomości", "Details": "Szczegóły", "Device_Changes_Not_Available": "Zmiany w urządzeniach niedostępne w tej przeglądarce. Aby uzyskać gwarancję dostępności, skorzystaj z oficjalnej aplikacji desktopowej Rocket.Chat.", "Device_Changes_Not_Available_Insecure_Context": "Zmiany w urządzeniach są dostępne tylko w bezpiecznych kontekstach (np. https://)", @@ -1515,7 +1518,6 @@ "Direct_Reply_Debug_Description": "[Uwaga] Włączenie trybu debugowania wyświetli hasło w formacie tekstowym w konsoli administracyjnej.", "Direct_Reply_Delete": "Usuń wiadomości e-mail", "Direct_Reply_Delete_Description": "[Uwaga!] Jeśli ta opcja jest włączona, wszystkie nieprzeczytane wiadomości są nieodwracalnie usuwane, nawet te, które nie są odpowiedziami bezpośrednimi. Skonfigurowana skrzynka pocztowa jest wtedy zawsze pusta i nie może być przetwarzana „równolegle” przez ludzi.", - "meteor_status_reconnect_in_many": "spróbuj jeszcze raz za {{count}} sekund...", "Direct_Reply_Enable": "Włącz odpowiedź bezpośrednią", "Direct_Reply_Enable_Description": "[Uwaga!] Jeśli włączona jest opcja „Odpowiedź bezpośrednia”, Rocket.Chat będzie kontrolował skonfigurowaną skrzynkę pocztową. Wszystkie nieprzeczytane wiadomości e-mail są pobierane, oznaczane jako przeczytane i przetwarzane. Opcja „Odpowiedź bezpośrednia” powinna być włączona tylko wtedy, gdy do używanej skrzynki pocztowej dostęp ma tylko Rocket.Chat i gdy nie jest ona czytana/przetwarzana „równolegle” przez ludzi.", "Direct_Reply_Frequency": "Częstotliwość sprawdzania poczty e-mail", @@ -1607,7 +1609,6 @@ "Markdown_Marked_Tables": "Włącz oznaczone tablice", "duplicated-account": "Zduplikowane konto", "E2E Encryption": "Szyfrowanie E2E", - "message_counter_few": "{{count}} wiadomości", "Markdown_Parser": "Markdown Parser", "Markdown_SupportSchemesForLink": "Przecena systemy wsparcia dla Łącze", "E2E Encryption_Description": "Zachowaj prywatność rozmów, zapewniając, że tylko nadawca i zamierzeni odbiorcy mogą je przeczytać.", @@ -1655,7 +1656,6 @@ "edit-other-user-active-status_description": "Zezwolenie na włączanie i wyłączanie innych kont", "edit-other-user-avatar": "Edytuj awatar innego użytkownika", "edit-other-user-avatar_description": "Zezwolenie na zmianę awatara innego użytkownika.", - "meteor_status_reconnect_in_few": "spróbuj jeszcze raz za {{count}} sekund...", "edit-other-user-e2ee": "Edytuj szyfrowanie E2E innych użytkowników", "edit-other-user-e2ee_description": "Zezwolenie na modyfikację szyfrowania E2E innego użytkownika.", "edit-other-user-info": "Edytuj inne informacje o użytkowniku", diff --git a/packages/i18n/src/locales/pt-BR.i18n.json b/packages/i18n/src/locales/pt-BR.i18n.json index 146292954d0d..0fecc1fa944a 100644 --- a/packages/i18n/src/locales/pt-BR.i18n.json +++ b/packages/i18n/src/locales/pt-BR.i18n.json @@ -15,9 +15,9 @@ "__username__is_no_longer__role__defined_by__user_by_": "{{username}} não pertence mais a {{role}}, por {{user_by}}", "__username__was_set__role__by__user_by_": "{{username}} foi definido como {{role}} por {{user_by}}", "__count__without__department__": "{{count}} sem departamento", - "__usersCount__member_joined_many": "+ {{count}} membros entraram", "__count__without__tags__": "{{count}} sem tags", "__count__without__assignee__": "{{count}} sem responsável", + "__usersCount__member_joined_many": "+ {{count}} membros entraram", "This_room_encryption_has_been_enabled_by__username_": "A criptografia desta sala foi ativada por {{username}}", "This_room_encryption_has_been_disabled_by__username_": "A criptografia desta sala foi desativada por {{username}}", "Enabled_E2E_Encryption_for_this_room": "Encriptação E2E habilitada para essa sala", @@ -301,6 +301,7 @@ "add-oauth-service": "Adicionar Serviço OAuth", "add-oauth-service_description": "Permissão para adicionar um novo serviço OAuth", "add-team-channel": "Adicionar Time ao Canal", + "Calls_in_queue_many": "{{count}} chamadas na fila", "add-team-channel_description": "Permissão para adicionar um canal a um time", "add-team-member": "Adicionar membro ao Team", "add-team-member_description": "Permissão para adicionar membros ao time", @@ -367,7 +368,6 @@ "All_status": "Todos os estados", "All_users": "Todos os usuários", "All_users_in_the_channel_can_write_new_messages": "Todos usuários no canal podem enviar mensagens novas", - "Calls_in_queue_many": "{{count}} chamadas na fila", "Allow_collect_and_store_HTTP_header_informations": "Permitir coleta e armazenamento de informações do cabeçalho HTTP", "Allow_collect_and_store_HTTP_header_informations_description": "Esta configuração determina se o Livechat tem permissão para armazenar informações coletadas dos dados do cabeçaho HTTP, como endereço IP, agente usuário, etc.", "Allow_Invalid_SelfSigned_Certs": "Permitir certificados autoassinados inválidos", @@ -984,6 +984,7 @@ "Contact_not_found": "Contato não encontrado", "Contact_Profile": "Perfil do contato", "Contact_Info": "Informações do contato", + "message_counter_many": "{{count}} mensagens", "Content": "Conteúdo", "Continue": "Continuar", "Continuous_sound_notifications_for_new_livechat_room": "Notificações sonoras contínuas para nova sala de omnichannel", @@ -999,6 +1000,7 @@ "Conversations": "Conversas", "Conversations_per_day": "Conversas por dia", "Convert": "Converter", + "meteor_status_reconnect_in_many": "tentando novamente em {{count}} segundos...", "Convert_Ascii_Emojis": "Converter ASCII em emoji", "Convert_to_channel": "Converter em canal", "Converting_channel_to_a_team": "Você está convertendo este canal em uma equipe. Todos os membros serão mantidos.", @@ -1416,7 +1418,6 @@ "Desktop_Notifications_Duration_Description": "Segundos para exibir a notificação da área de trabalho. Isso poderá afetar o Centro de notificação do OS X. Insira 0 para usar as configurações padrão do navegador e não afetar o Centro de notificação do OS X.", "Desktop_Notifications_Enabled": "Notificações da área de trabalho estão habilitadas", "Desktop_Notifications_Not_Enabled": "Notificações da área de trabalho estão desabilitadas", - "message_counter_many": "{{count}} mensagens", "Details": "Detalhes", "Device_Changes_Not_Available": "Mudanças de dispositivo não estão disponíveis neste navegador, para disponíbilidade garantida, use o aplicativo desktop oficial do Rocket.Chat.", "Device_Changes_Not_Available_Insecure_Context": "Mudanças de dispositivo somente estão disponíveis em contextos seguros. (https://)", @@ -1437,7 +1438,6 @@ "Direct_Reply_Debug_Description": "[Cuidado] A ativação do modo de depuração exibirá sua \"Senha de texto simples\" no console do administrador.", "Direct_Reply_Delete": "Excluir e-mails", "Direct_Reply_Delete_Description": "[Atenção!] Se esta opção estiver ativada, todas as mensagens não lidas serão irrevogavelmente excluídas, mesmo aquelas que não sejam respostas diretas. A caixa de entrada de e-mail configurada fica sempre vazia e não pode ser processada \"paralelamente\" por pessoas.", - "meteor_status_reconnect_in_many": "tentando novamente em {{count}} segundos...", "Direct_Reply_Enable": "Ativar resposta direta", "Direct_Reply_Enable_Description": "[Atenção!] Se \"Resposta direta\" estiver habilitado, o Rocket.Chat vai controlar a caixa de entrada de e-mail. Todos os e-mails não lidos serão recuperados, marcados como lidos e processados. \"Resposta direta\" deve ser ativado apenas se a caixa de entrada for destinada exclusivamente para acesso do Rocket.Chat e não lida/processada \"em paralelo\" por humanos.", "Direct_Reply_Frequency": "Frequência de verificação de e-mail", @@ -5014,4 +5014,4 @@ "Enterprise": "Enterprise", "UpgradeToGetMore_engagement-dashboard_Title": "Analytics", "UpgradeToGetMore_auditing_Title": "Auditoria de mensagem" -} +} \ No newline at end of file diff --git a/packages/i18n/src/locales/ru.i18n.json b/packages/i18n/src/locales/ru.i18n.json index 774f895dc33a..9b4b31910ba4 100644 --- a/packages/i18n/src/locales/ru.i18n.json +++ b/packages/i18n/src/locales/ru.i18n.json @@ -239,8 +239,10 @@ "Accounts_RegistrationForm_Secret_URL": "Секретный URL-адрес", "Accounts_RegistrationForm_SecretURL": "Секретный URL-адрес регистрационной формы", "Accounts_RegistrationForm_SecretURL_Description": "Вы должны предоставить случайную строку, которая будет добавлена к вашему регистрационному URL-адресу. Например: `https://open.rocket.chat/register/[secret_hash]`", + "Apps_Count_Enabled_many": "{{count}} приложений(-я) включено", "Accounts_RequireNameForSignUp": "Требуется имя для регистрации", "Accounts_RequirePasswordConfirmation": "Запрашивать подтверждение пароля", + "Private_Apps_Count_Enabled_many": "{{count}} приватных приложений включено", "Accounts_RoomAvatarExternalProviderUrl": "URL внешнего поставщика аватаров", "Accounts_RoomAvatarExternalProviderUrl_Description": "Пример: `https://acme.com/api/v1/{roomId}`", "Accounts_SearchFields": "Поля, которые следует учитывать при поиске", @@ -296,10 +298,8 @@ "Add_Sender_To_ReplyTo": "Добавить отправителя в ответ", "Add_Server": "Добавить Сервер", "Add_URL": "Добавить URL", - "Apps_Count_Enabled_many": "{{count}} приложений(-я) включено", "Add_user": "Добавить пользователя", "Add_User": "Добавить Пользователя", - "Private_Apps_Count_Enabled_many": "{{count}} приватных приложений включено", "Add_users": "Добавить пользователей", "Add_members": "Добавить участников", "add-all-to-room": "Добавить всех пользователей в чат", @@ -311,6 +311,7 @@ "bypass-time-limit-edit-and-delete": "Обход ограничения по времени", "bypass-time-limit-edit-and-delete_description": "Разрешение на обход ограничения по времени для редактирования и удаления сообщений", "add-team-channel": "Добавить Channel Команды", + "Calls_in_queue_many": "{{count}} Звонков в очереди", "add-team-channel_description": "Разрешение на добавление канала в Команду", "add-team-member": "Добавить участника Команды", "add-team-member_description": "Разрешение на добавление участников в Команду", @@ -336,6 +337,7 @@ "Admin_disabled_encryption": "Ваш администратор не включил шифрование E2E.", "Admin_Info": "Информация Администратора", "admin-no-active-video-conf-provider": "**Функция звонков не включена**: Настройте звонки, чтобы сделать их доступными для вашего сервера.", + "Calls_in_queue_few": "{{count}} Звонков в очереди", "admin-video-conf-provider-not-configured": "**Функция звонков не включена**: Настройте звонки, чтобы сделать их доступными для вашего сервера.", "admin-no-videoconf-provider-app": "**Функция звонков не включена**: Приложения для звонков могут быть установлены из магазина приложений Rocket.Chat администратором сервера.", "Administration": "Администрирование", @@ -361,12 +363,14 @@ "Alias_Set": "Настройки псевдонима", "AutoLinker_Email": "AutoLinker Email", "Aliases": "Псевдонимы", + "Apps_Count_Enabled_few": "{{count}} приложений(-я) включено", "AutoLinker_Phone": "Подсвечивать телефоны", "AutoLinker_Phone_Description": "Автоматически выделять телефонные номера, например `(123)456-7890`", "All": "Все", "AutoLinker_StripPrefix": "Удаление префиксов", "All_Apps": "Все приложения", "AutoLinker_StripPrefix_Description": "Сокращать формат, например: https://rocket.chat => rocket.chat", + "Private_Apps_Count_Enabled_few": "{{count}} приватных приложений включено", "All_added_tokens_will_be_required_by_the_user": "Все добавленные токены потребуются пользователем", "All_categories": "Все категории", "AutoLinker_Urls_Scheme": "AutoLinker Scheme:// URLs", @@ -381,7 +385,6 @@ "All_status": "Все статусы", "All_users": "Все пользователи", "All_users_in_the_channel_can_write_new_messages": "Все пользователи на канале могут писать новые сообщения", - "Calls_in_queue_many": "{{count}} Звонков в очереди", "Allow_collect_and_store_HTTP_header_informations": "Разрешить собирать и хранить информацию заголовка HTTP", "Allow_collect_and_store_HTTP_header_informations_description": "Этот параметр определяет, разрешено ли Livechat хранить информацию, собранную из данных заголовка HTTP, таких как IP-адрес, User-Agent и т. Д.", "Allow_Invalid_SelfSigned_Certs": "Разрешить недействительные самоподписанные сертификаты", @@ -390,14 +393,12 @@ "Allow_Online_Agents_Outside_Business_Hours": "Разрешить агентов в сети вне рабочих часов", "Allow_Online_Agents_Outside_Office_Hours": "Разрешить агентов в сети вне рабочего времени", "Allow_Save_Media_to_Gallery": "Разрешить сохранять медиа данные в галерее", - "Apps_Count_Enabled_few": "{{count}} приложений(-я) включено", "Allow_switching_departments": "Разрешить посетителю сменить отдел", "Almost_done": "Почти сделано", "Alphabetical": "По алфавиту", "bold": "жирный", "Also_send_thread_message_to_channel_behavior": "Поведение Также отправить сообщение треда в чат", "Also_send_to_channel": "Также отправить в чат", - "Private_Apps_Count_Enabled_few": "{{count}} приватных приложений включено", "Always_open_in_new_window": "Всегда открывать в новом окне", "Analytics": "Аналитика", "Analytics_Description": "Посмотрите, как пользователи взаимодействуют с вашим рабочим пространством.", @@ -412,7 +413,6 @@ "Animals_and_Nature": "Животные и природа", "Announcement": "Объявление", "Anonymous": "Аноним", - "Calls_in_queue_few": "{{count}} Звонков в очереди", "Answer_call": "Ответить на вызов", "API": "API", "API_Add_Personal_Access_Token": "Добавить токен личного доступа", @@ -1053,6 +1053,7 @@ "Contact_not_found": "Контакт не найден", "Contact_Profile": "Профиль контакта", "Contact_Info": "Контактная информация", + "message_counter_many": "{{count}} сообщения", "Content": "Содержимое", "Continue": "Продолжить", "Continuous_sound_notifications_for_new_livechat_room": "Непрерывные звуковые уведомления для новой комнаты livechat", @@ -1067,6 +1068,7 @@ "Conversations": "Сеансы чата", "Conversations_per_day": "Сеансы чата за день", "Convert": "Конвертировать", + "meteor_status_reconnect_in_many": "пытается снова через {{count}} секунд ...", "Convert_Ascii_Emojis": "Конвертировать ASCII в эмодзи", "Convert_to_channel": "Конвертировать в чат", "Converting_channel_to_a_team": "Вы преобразуете этот чат в Команду. Все его участники будут сохранены.", @@ -1142,6 +1144,7 @@ "Country_Denmark": "Дания", "Country_Djibouti": "Джибути", "Country_Dominica": "Доминика", + "message_counter_few": "{{count}} сообщения", "Country_Dominican_Republic": "Доминиканская Республика", "Country_Ecuador": "Эквадор", "Country_Egypt": "Египет", @@ -1177,6 +1180,7 @@ "Country_Heard_Island_and_Mcdonald_Islands": "Острова Херд и Макдональд", "Country_Holy_See_Vatican_City_State": "Святейший Престол (Государство Ватикан)", "Country_Honduras": "Гондурас", + "meteor_status_reconnect_in_few": "пытается снова через {{count}} секунд ...", "Country_Hong_Kong": "Гонконг", "Country_Hungary": "Венгрия", "Country_Iceland": "Исландия", @@ -1489,7 +1493,6 @@ "Desktop_Notifications_Enabled": "Уведомления на компьютере включены", "Desktop_Notifications_Not_Enabled": "Уведомления на рабочем столе не включены", "Unselected_by_default": "Выбрано не по умолчанию", - "message_counter_many": "{{count}} сообщения", "Details": "Подробности", "Device_Management": "Управление устройствами", "Device_Management_Client": "Клиент", @@ -1526,7 +1529,6 @@ "Direct_Reply_Debug_Description": "[ВНИМАНИЕ] Режим отладки будет отображать ваш пароль в открытом виде в консоли администратора", "Direct_Reply_Delete": "Удалить перехваченную электронную почту", "Direct_Reply_Delete_Description": "[Внимание!] Если эта опция включена; все непрочитанные сообщения, даже те - что не являются прямыми ответами - безвозвратно удаляться. Настроенный e-mail ящик будет постоянно пустым и не сможет быть обработан \"параллельно\" людьми.", - "meteor_status_reconnect_in_many": "пытается снова через {{count}} секунд ...", "Direct_Reply_Enable": "Разрешить прямой ответ", "Direct_Reply_Enable_Description": "[Внимание!] Если \"Прямой ответ\" включен; Rocket.Chat будет управлять настроенным e-mail ящиком. Все непрочитанные сообщения будут получены, помечены как прочитаны и обработаны. \"Прямой ответ\" должен быть активирован только при условии что все письма отправленные в ящик предполагают обработку Rocket.Chat-ом без \"параллельного\" участия людей в обработке писем.", "Direct_Reply_Frequency": "Частота проверки почты", @@ -1616,7 +1618,6 @@ "Markdown_Marked_Tables": "Enable Marked Tables", "duplicated-account": "Дублированный аккаунт", "E2E Encryption": "Шифрование E2E", - "message_counter_few": "{{count}} сообщения", "Markdown_Parser": "Парсер Markdown", "Markdown_SupportSchemesForLink": "Поддерживать Markdown систему ссылок", "Markdown_SupportSchemesForLink_Description": "Разрешённые Markdown системы через запятую", @@ -1661,7 +1662,6 @@ "edit-other-user-active-status_description": "Разрешение на блокировку и разблокировку аккаунтов", "edit-other-user-avatar": "Редактировать Аватар другого пользователя", "edit-other-user-avatar_description": "Разрешение на изменение аватара другого пользователя.", - "meteor_status_reconnect_in_few": "пытается снова через {{count}} секунд ...", "edit-other-user-e2ee": "Редактировать E2E шифрование других пользователей", "edit-other-user-e2ee_description": "Разрешение на изменение E2E шифрования другого пользователя.", "edit-other-user-info": "Редактировать информацию другого пользователя", diff --git a/packages/i18n/src/locales/sv.i18n.json b/packages/i18n/src/locales/sv.i18n.json index b6192f7084fd..bea0ea1cb238 100644 --- a/packages/i18n/src/locales/sv.i18n.json +++ b/packages/i18n/src/locales/sv.i18n.json @@ -1575,7 +1575,7 @@ "Direct": "Direkt", "Direction": "Riktning", "Livechat_Facebook_API_Secret": "OmniChannel API-hemlighet", - "Direct_Message": "Direktmeddelande", + "Direct_Message": "Direkt meddelande", "Livechat_Facebook_Enabled": "Facebook integration aktiverad", "Direct_message_creation_description": "Du håller på att skapa en chatt för flera användare. Lägg till de användare du vill prata med via direktmeddelanden på samma plats.", "Direct_message_someone": "Skicka direktmeddelande till någon", @@ -2275,6 +2275,7 @@ "Format": "Format", "Forward": "Vidarebefodra", "Forward_chat": "Vidarebefodra chatt", + "Forward_message": "Direkt meddelande", "Forward_to_department": "Vidarebefodra till avdelning", "Forward_to_user": "Vidarebefodra till användare", "Forwarding": "Vidarebefordran", @@ -3405,6 +3406,7 @@ "Monitors": "Övervakare", "Monthly_Active_Users": "Aktiva användare per månad", "More": "Mer", + "More_actions": "Fler alternativ", "More_channels": "Fler kanaler", "More_direct_messages": "Fler direktmeddelanden", "More_groups": "Fler privata grupper", @@ -5020,6 +5022,7 @@ "Uploads": "Uppladdningar", "Upload_private_app": "Ladda upp en privat app", "Upload_file_description": "Filbeskrivning", + "Upload_file": "Ladda upp fil", "Upload_file_name": "Filnamn", "Upload_file_question": "Ladda upp fil?", "Upload_Folder_Path": "Ladda upp mappväg", diff --git a/packages/i18n/src/locales/uk.i18n.json b/packages/i18n/src/locales/uk.i18n.json index 025504e65891..7cf127f8c8bf 100644 --- a/packages/i18n/src/locales/uk.i18n.json +++ b/packages/i18n/src/locales/uk.i18n.json @@ -700,6 +700,7 @@ "Consulting": "Консалтинг", "Contact": "Контакти", "Contains_Security_Fixes": "Містять виправлення безпеки", + "message_counter_many": "{{count}} повідомлень", "Content": "Вміст", "Continue": "Продовжити", "Continuous_sound_notifications_for_new_livechat_room": "Постійні звукові сповіщення для нової livechat кімнати", @@ -781,6 +782,7 @@ "Country_Denmark": "Данія", "Country_Djibouti": "Джибуті", "Country_Dominica": "Домініка", + "message_counter_few": "{{count}} повідомлень", "Country_Dominican_Republic": "Домініканська республіка", "Country_Ecuador": "Еквадор", "Country_Egypt": "Єгипет", @@ -1095,7 +1097,6 @@ "Desktop_Notifications_Duration_Description": "Час у секундах для відображення сповіщень на робочому столі. Може вплинути на Центр сповіщень операційної стистеми. Введіть 0, щоб використовувати настройки браузера за замовчуванням і не впливати на на Центр сповіщень операційної стистеми", "Desktop_Notifications_Enabled": "Сповіщення на робочому столі ввімкнені", "Desktop_Notifications_Not_Enabled": "Сповіщення на робочому столі вимкені", - "message_counter_many": "{{count}} повідомлень", "Details": "Деталі", "line": "лінія", "Different_Style_For_User_Mentions": "Різний стиль для згадування користувачів", @@ -1185,7 +1186,6 @@ "Markdown_Marked_Tables": "Увімкнути позначені таблиці", "duplicated-account": "Дублювання облікового запису", "E2E Encryption": "Шифрування E2E", - "message_counter_few": "{{count}} повідомлень", "Markdown_Parser": "Аналізатор зі зниженням курсу", "Markdown_SupportSchemesForLink": "Markdown Схеми підтримки для Link", "Markdown_SupportSchemesForLink_Description": "Розділених комами список дозволених схем", From 9cd49d56e0d5e43d14169d3e23c94421de549b3a Mon Sep 17 00:00:00 2001 From: Jean Brito Date: Wed, 29 May 2024 16:03:21 -0300 Subject: [PATCH 10/29] feat: Add contentDisposition option to file storages (#31974) Co-authored-by: Marcos Spessatto Defendi <15324204+MarcosSpessatto@users.noreply.github.com> --- .changeset/sweet-kiwis-scream.md | 5 +++++ .../app/file-upload/server/config/AmazonS3.ts | 9 ++++---- .../file-upload/server/config/FileSystem.ts | 4 +++- .../server/config/GoogleStorage.ts | 9 ++++---- .../app/file-upload/server/config/GridFS.ts | 3 ++- .../app/file-upload/server/config/helper.ts | 21 +++++++++++++++++++ .../file/GenericFileAttachment.tsx | 9 ++++++-- 7 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 .changeset/sweet-kiwis-scream.md create mode 100644 apps/meteor/app/file-upload/server/config/helper.ts diff --git a/.changeset/sweet-kiwis-scream.md b/.changeset/sweet-kiwis-scream.md new file mode 100644 index 000000000000..95a094f2ac40 --- /dev/null +++ b/.changeset/sweet-kiwis-scream.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": minor +--- + +Clicking on a message attachment link in the Desktop App will now initiate a direct download of the attachment only when the attachment is not a PDF file diff --git a/apps/meteor/app/file-upload/server/config/AmazonS3.ts b/apps/meteor/app/file-upload/server/config/AmazonS3.ts index 567e5e5d71eb..0f551d3b90d1 100644 --- a/apps/meteor/app/file-upload/server/config/AmazonS3.ts +++ b/apps/meteor/app/file-upload/server/config/AmazonS3.ts @@ -1,6 +1,5 @@ import http from 'http'; import https from 'https'; -import URL from 'url'; import _ from 'underscore'; @@ -8,12 +7,12 @@ import { settings } from '../../../settings/server'; import type { S3Options } from '../../ufs/AmazonS3/server'; import { FileUploadClass, FileUpload } from '../lib/FileUpload'; import '../../ufs/AmazonS3/server'; +import { forceDownload } from './helper'; const get: FileUploadClass['get'] = async function (this: FileUploadClass, file, req, res) { - const { query } = URL.parse(req.url || '', true); - const forceDownload = typeof query.download !== 'undefined'; + const forcedDownload = forceDownload(req); - const fileUrl = await this.store.getRedirectURL(file, forceDownload); + const fileUrl = await this.store.getRedirectURL(file, forcedDownload); if (!fileUrl || !file.store) { res.end(); return; @@ -23,7 +22,7 @@ const get: FileUploadClass['get'] = async function (this: FileUploadClass, file, if (settings.get(`FileUpload_S3_Proxy_${storeType}`)) { const request = /^https:/.test(fileUrl) ? https : http; - FileUpload.proxyFile(file.name || '', fileUrl, forceDownload, request, req, res); + FileUpload.proxyFile(file.name || '', fileUrl, forcedDownload, request, req, res); return; } diff --git a/apps/meteor/app/file-upload/server/config/FileSystem.ts b/apps/meteor/app/file-upload/server/config/FileSystem.ts index 98342daf2e46..75fdb5afc8ae 100644 --- a/apps/meteor/app/file-upload/server/config/FileSystem.ts +++ b/apps/meteor/app/file-upload/server/config/FileSystem.ts @@ -4,6 +4,7 @@ import { UploadFS } from '../../../../server/ufs'; import { settings } from '../../../settings/server'; import { FileUploadClass, FileUpload } from '../lib/FileUpload'; import { getFileRange, setRangeHeaders } from '../lib/ranges'; +import { getContentDisposition } from './helper'; const FileSystemUploads = new FileUploadClass({ name: 'FileSystem:Uploads', @@ -26,7 +27,8 @@ const FileSystemUploads = new FileUploadClass({ } file = FileUpload.addExtensionTo(file); - res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodeURIComponent(file.name || '')}`); + + res.setHeader('Content-Disposition', `${getContentDisposition(req)}; filename*=UTF-8''${encodeURIComponent(file.name || '')}`); file.uploadedAt && res.setHeader('Last-Modified', file.uploadedAt.toUTCString()); res.setHeader('Content-Type', file.type || 'application/octet-stream'); diff --git a/apps/meteor/app/file-upload/server/config/GoogleStorage.ts b/apps/meteor/app/file-upload/server/config/GoogleStorage.ts index 41eb4350b876..8fb901b5a123 100644 --- a/apps/meteor/app/file-upload/server/config/GoogleStorage.ts +++ b/apps/meteor/app/file-upload/server/config/GoogleStorage.ts @@ -1,18 +1,17 @@ import http from 'http'; import https from 'https'; -import URL from 'url'; import _ from 'underscore'; import { settings } from '../../../settings/server'; import { FileUploadClass, FileUpload } from '../lib/FileUpload'; import '../../ufs/GoogleStorage/server'; +import { forceDownload } from './helper'; const get: FileUploadClass['get'] = async function (this: FileUploadClass, file, req, res) { - const { query } = URL.parse(req.url || '', true); - const forceDownload = typeof query.download !== 'undefined'; + const forcedDownload = forceDownload(req); - const fileUrl = await this.store.getRedirectURL(file, forceDownload); + const fileUrl = await this.store.getRedirectURL(file, forcedDownload); if (!fileUrl || !file.store) { res.end(); return; @@ -22,7 +21,7 @@ const get: FileUploadClass['get'] = async function (this: FileUploadClass, file, if (settings.get(`FileUpload_GoogleStorage_Proxy_${storeType}`)) { const request = /^https:/.test(fileUrl) ? https : http; - FileUpload.proxyFile(file.name || '', fileUrl, forceDownload, request, req, res); + FileUpload.proxyFile(file.name || '', fileUrl, forcedDownload, request, req, res); return; } diff --git a/apps/meteor/app/file-upload/server/config/GridFS.ts b/apps/meteor/app/file-upload/server/config/GridFS.ts index 629d177581bf..3bb5f806f3a7 100644 --- a/apps/meteor/app/file-upload/server/config/GridFS.ts +++ b/apps/meteor/app/file-upload/server/config/GridFS.ts @@ -9,6 +9,7 @@ import { Logger } from '@rocket.chat/logger'; import { UploadFS } from '../../../../server/ufs'; import { FileUploadClass, FileUpload } from '../lib/FileUpload'; import { getFileRange, setRangeHeaders } from '../lib/ranges'; +import { getContentDisposition } from './helper'; const logger = new Logger('FileUpload'); @@ -161,7 +162,7 @@ new FileUploadClass({ async get(file, req, res) { file = FileUpload.addExtensionTo(file); - res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodeURIComponent(file.name || '')}`); + res.setHeader('Content-Disposition', `${getContentDisposition(req)}; filename*=UTF-8''${encodeURIComponent(file.name || '')}`); file.uploadedAt && res.setHeader('Last-Modified', file.uploadedAt.toUTCString()); res.setHeader('Content-Type', file.type || 'application/octet-stream'); res.setHeader('Content-Length', file.size || 0); diff --git a/apps/meteor/app/file-upload/server/config/helper.ts b/apps/meteor/app/file-upload/server/config/helper.ts new file mode 100644 index 000000000000..f1c465537255 --- /dev/null +++ b/apps/meteor/app/file-upload/server/config/helper.ts @@ -0,0 +1,21 @@ +import type http from 'http'; +import URL from 'url'; + +export const forceDownload = (req: http.IncomingMessage): boolean => { + const { query } = URL.parse(req.url || '', true); + + const forceDownload = typeof query.download !== 'undefined'; + if (forceDownload) { + return true; + } + + return query.contentDisposition === 'attachment'; +}; + +export const getContentDisposition = (req: http.IncomingMessage): string => { + const { query } = URL.parse(req.url || '', true); + if (query.contentDisposition === 'inline') { + return 'inline'; + } + return 'attachment'; +}; diff --git a/apps/meteor/client/components/message/content/attachments/file/GenericFileAttachment.tsx b/apps/meteor/client/components/message/content/attachments/file/GenericFileAttachment.tsx index 4301520c6173..3bbf1ccdc115 100644 --- a/apps/meteor/client/components/message/content/attachments/file/GenericFileAttachment.tsx +++ b/apps/meteor/client/components/message/content/attachments/file/GenericFileAttachment.tsx @@ -35,7 +35,7 @@ const GenericFileAttachment = ({ const handleTitleClick = (event: UIEvent): void => { if (openDocumentViewer && link && format === 'PDF') { event.preventDefault(); - openDocumentViewer(getURL(link), format, ''); + openDocumentViewer(`${getURL(link)}?contentDisposition=inline`, format, ''); } }; @@ -55,7 +55,12 @@ const GenericFileAttachment = ({ } > - + {title} {size && ( From c54ede3e1e9c4fd1d0324b24ee13231d46165d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrique=20Guimar=C3=A3es=20Ribeiro?= Date: Wed, 29 May 2024 16:22:26 -0300 Subject: [PATCH 11/29] regression: Remove impossible sorting from users table "registration status" column (#32506) --- .../views/admin/users/UsersTable/UsersTable.tsx | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/apps/meteor/client/views/admin/users/UsersTable/UsersTable.tsx b/apps/meteor/client/views/admin/users/UsersTable/UsersTable.tsx index 10ba211f27e0..93762f973c62 100644 --- a/apps/meteor/client/views/admin/users/UsersTable/UsersTable.tsx +++ b/apps/meteor/client/views/admin/users/UsersTable/UsersTable.tsx @@ -18,7 +18,7 @@ import { } from '../../../../components/GenericTable'; import type { usePagination } from '../../../../components/GenericTable/hooks/usePagination'; import type { useSort } from '../../../../components/GenericTable/hooks/useSort'; -import type { UsersFilters } from '../AdminUsersPage'; +import type { UsersFilters, UsersTableSortingOptions } from '../AdminUsersPage'; import UsersTableRow from './UsersTableRow'; type UsersTableProps = { @@ -27,7 +27,7 @@ type UsersTableProps = { setUserFilters: Dispatch>; filteredUsersQueryResult: UseQueryResult[] }>>; paginationData: ReturnType; - sortData: ReturnType>; + sortData: ReturnType>; }; // TODO: Missing error state @@ -104,19 +104,12 @@ const UsersTable = ({ ), mediaQuery && ( - + {t('Roles')} ), tab === 'all' && ( - + {t('Registration_status')} ), From d06df8ae77d390fcaba12cdd8932d57d8ca086d6 Mon Sep 17 00:00:00 2001 From: Aaron Ogle Date: Fri, 31 May 2024 07:21:29 -0500 Subject: [PATCH 12/29] ci: increase issue allowed stale time (#32523) --- .github/workflows/stale.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index b074212964eb..0ee119fe43aa 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -11,8 +11,8 @@ jobs: steps: - uses: actions/stale@v5 with: - days-before-issue-stale: 10 - days-before-issue-close: 4 + days-before-issue-stale: 14 + days-before-issue-close: 14 any-of-labels: 'stat: need more info,stat: waiting response' stale-issue-label: "stat: no response" stale-issue-message: "This issue has been marked as stale because there has been no further activity in the last 10 days. If the issue remains stale for the next 4 days (a total of 14 days with no activity), then it will be assumed that the question has been resolved and the issue will be automatically closed." From 3fc12f60dba8ed099625f89e8092efafd5c72d5e Mon Sep 17 00:00:00 2001 From: Ricardo Garim Date: Fri, 31 May 2024 11:13:10 -0300 Subject: [PATCH 13/29] refactor: EmailInbox out of DB Watcher (#32501) Co-authored-by: Diego Sampaio --- apps/meteor/app/api/server/lib/emailInbox.ts | 52 ++++++++++++++----- apps/meteor/app/api/server/v1/email-inbox.ts | 34 ++++++++---- .../app/lib/server/lib/notifyListener.ts | 12 +++++ .../server/database/watchCollections.ts | 2 +- apps/meteor/server/email/IMAPInterceptor.ts | 9 +++- .../server/features/EmailInbox/EmailInbox.ts | 4 +- apps/meteor/server/models/raw/EmailInbox.ts | 25 ++++++++- .../src/models/IEmailInboxModel.ts | 8 ++- 8 files changed, 113 insertions(+), 33 deletions(-) diff --git a/apps/meteor/app/api/server/lib/emailInbox.ts b/apps/meteor/app/api/server/lib/emailInbox.ts index 663459c7bc05..304d297261af 100644 --- a/apps/meteor/app/api/server/lib/emailInbox.ts +++ b/apps/meteor/app/api/server/lib/emailInbox.ts @@ -1,6 +1,8 @@ import type { IEmailInbox } from '@rocket.chat/core-typings'; import { EmailInbox, Users } from '@rocket.chat/models'; -import type { Filter, InsertOneResult, Sort, UpdateResult, WithId } from 'mongodb'; +import type { DeleteResult, Filter, InsertOneResult, Sort } from 'mongodb'; + +import { notifyOnEmailInboxChanged } from '../../../lib/server/lib/notifyListener'; export const findEmailInboxes = async ({ query = {}, @@ -34,33 +36,31 @@ export const findEmailInboxes = async ({ }; }; -export const findOneEmailInbox = async ({ _id }: { _id: string }): Promise => { - return EmailInbox.findOneById(_id); -}; export const insertOneEmailInbox = async ( userId: string, emailInboxParams: Pick, -): Promise>> => { +): Promise> => { const obj = { ...emailInboxParams, _createdAt: new Date(), _updatedAt: new Date(), _createdBy: await Users.findOneById(userId, { projection: { username: 1 } }), }; - return EmailInbox.insertOne(obj); + + const response = await EmailInbox.create(obj); + + if (response.insertedId) { + void notifyOnEmailInboxChanged({ _id: response.insertedId, ...obj }, 'inserted'); + } + + return response; }; export const updateEmailInbox = async ( emailInboxParams: Pick, -): Promise> | UpdateResult> => { +): Promise | null> => { const { _id, active, name, email, description, senderInfo, department, smtp, imap } = emailInboxParams; - const emailInbox = await findOneEmailInbox({ _id }); - - if (!emailInbox) { - throw new Error('error-invalid-email-inbox'); - } - const updateEmailInbox = { $set: { active, @@ -76,5 +76,29 @@ export const updateEmailInbox = async ( ...(department === 'All' && { $unset: { department: 1 as const } }), }; - return EmailInbox.updateOne({ _id }, updateEmailInbox); + const updatedResponse = await EmailInbox.updateById(_id, updateEmailInbox); + + if (!updatedResponse.value) { + throw new Error('error-invalid-email-inbox'); + } + + void notifyOnEmailInboxChanged( + { + ...updatedResponse.value, + ...(department === 'All' && { department: undefined }), + }, + 'updated', + ); + + return updatedResponse.value; +}; + +export const removeEmailInbox = async (emailInboxId: IEmailInbox['_id']): Promise => { + const removeResponse = await EmailInbox.removeById(emailInboxId); + + if (removeResponse.deletedCount) { + void notifyOnEmailInboxChanged({ _id: emailInboxId }, 'removed'); + } + + return removeResponse; }; diff --git a/apps/meteor/app/api/server/v1/email-inbox.ts b/apps/meteor/app/api/server/v1/email-inbox.ts index 5748565a0f77..89ede496b78a 100644 --- a/apps/meteor/app/api/server/v1/email-inbox.ts +++ b/apps/meteor/app/api/server/v1/email-inbox.ts @@ -4,7 +4,7 @@ import { check, Match } from 'meteor/check'; import { sendTestEmailToInbox } from '../../../../server/features/EmailInbox/EmailInbox_Outgoing'; import { API } from '../api'; import { getPaginationItems } from '../helpers/getPaginationItems'; -import { insertOneEmailInbox, findEmailInboxes, findOneEmailInbox, updateEmailInbox } from '../lib/emailInbox'; +import { insertOneEmailInbox, findEmailInboxes, updateEmailInbox, removeEmailInbox } from '../lib/emailInbox'; API.v1.addRoute( 'email-inbox.list', @@ -55,12 +55,23 @@ API.v1.addRoute( let _id: string; if (!emailInboxParams?._id) { - const emailInbox = await insertOneEmailInbox(this.userId, emailInboxParams); - _id = emailInbox.insertedId.toString(); + const { insertedId } = await insertOneEmailInbox(this.userId, emailInboxParams); + + if (!insertedId) { + return API.v1.failure('Failed to create email inbox'); + } + + _id = insertedId; } else { - _id = emailInboxParams._id; - await updateEmailInbox({ ...emailInboxParams, _id }); + const emailInbox = await updateEmailInbox({ ...emailInboxParams, _id: emailInboxParams._id }); + + if (!emailInbox?._id) { + return API.v1.failure('Failed to update email inbox'); + } + + _id = emailInbox._id; } + return API.v1.success({ _id }); }, }, @@ -79,7 +90,7 @@ API.v1.addRoute( if (!_id) { throw new Error('error-invalid-param'); } - const emailInbox = await findOneEmailInbox({ _id }); + const emailInbox = await EmailInbox.findOneById(_id); if (!emailInbox) { return API.v1.notFound(); @@ -97,11 +108,12 @@ API.v1.addRoute( throw new Error('error-invalid-param'); } - const emailInboxes = await EmailInbox.findOneById(_id); - if (!emailInboxes) { + const { deletedCount } = await removeEmailInbox(_id); + + if (!deletedCount) { return API.v1.notFound(); } - await EmailInbox.removeById(_id); + return API.v1.success({ _id }); }, }, @@ -120,7 +132,7 @@ API.v1.addRoute( // TODO: Chapter day backend - check if user has permission to view this email inbox instead of null values // TODO: Chapter day: Remove this endpoint and move search to GET /email-inbox - const emailInbox = await EmailInbox.findOne({ email }); + const emailInbox = await EmailInbox.findByEmail(email); return API.v1.success({ emailInbox }); }, @@ -140,7 +152,7 @@ API.v1.addRoute( if (!_id) { throw new Error('error-invalid-param'); } - const emailInbox = await findOneEmailInbox({ _id }); + const emailInbox = await EmailInbox.findOneById(_id); if (!emailInbox) { return API.v1.notFound(); diff --git a/apps/meteor/app/lib/server/lib/notifyListener.ts b/apps/meteor/app/lib/server/lib/notifyListener.ts index df0073423642..38b95404a13e 100644 --- a/apps/meteor/app/lib/server/lib/notifyListener.ts +++ b/apps/meteor/app/lib/server/lib/notifyListener.ts @@ -10,6 +10,7 @@ import type { IPbxEvent, LoginServiceConfiguration as LoginServiceConfigurationData, ILivechatPriority, + IEmailInbox, IIntegrationHistory, AtLeast, } from '@rocket.chat/core-typings'; @@ -266,6 +267,17 @@ export async function notifyOnIntegrationChangedByChannels( + data: Pick | T, // TODO: improve typing + clientAction: ClientAction = 'updated', +): Promise { + if (!dbWatchersDisabled) { + return; + } + + void api.broadcast('watch.emailInbox', { clientAction, id: data._id, data }); +} + export async function notifyOnIntegrationHistoryChanged( data: AtLeast, clientAction: ClientAction = 'updated', diff --git a/apps/meteor/server/database/watchCollections.ts b/apps/meteor/server/database/watchCollections.ts index 1f3628615ebe..31691aab3b88 100644 --- a/apps/meteor/server/database/watchCollections.ts +++ b/apps/meteor/server/database/watchCollections.ts @@ -34,7 +34,6 @@ export function getWatchCollections(): string[] { LivechatInquiry.getCollectionName(), LivechatDepartmentAgents.getCollectionName(), InstanceStatus.getCollectionName(), - EmailInbox.getCollectionName(), Settings.getCollectionName(), Subscriptions.getCollectionName(), ]; @@ -49,6 +48,7 @@ export function getWatchCollections(): string[] { collections.push(Permissions.getCollectionName()); collections.push(LivechatPriority.getCollectionName()); collections.push(LoginServiceConfiguration.getCollectionName()); + collections.push(EmailInbox.getCollectionName()); collections.push(IntegrationHistory.getCollectionName()); } diff --git a/apps/meteor/server/email/IMAPInterceptor.ts b/apps/meteor/server/email/IMAPInterceptor.ts index 3371087d551c..c599608cb182 100644 --- a/apps/meteor/server/email/IMAPInterceptor.ts +++ b/apps/meteor/server/email/IMAPInterceptor.ts @@ -6,6 +6,7 @@ import IMAP from 'imap'; import type { ParsedMail } from 'mailparser'; import { simpleParser } from 'mailparser'; +import { notifyOnEmailInboxChanged } from '../../app/lib/server/lib/notifyListener'; import { logger } from '../features/EmailInbox/logger'; type IMAPOptions = { @@ -221,9 +222,15 @@ export class IMAPInterceptor extends EventEmitter { async selfDisable(): Promise { logger.info(`Disabling inbox ${this.inboxId}`); + // Again, if there's 2 inboxes with the same email, this will prevent looping over the already disabled one // Active filter is just in case :) - await EmailInbox.findOneAndUpdate({ _id: this.inboxId, active: true }, { $set: { active: false } }); + const { value } = await EmailInbox.setDisabledById(this.inboxId); + + if (value) { + void notifyOnEmailInboxChanged(value, 'updated'); + } + logger.info(`IMAP inbox ${this.inboxId} automatically disabled`); } } diff --git a/apps/meteor/server/features/EmailInbox/EmailInbox.ts b/apps/meteor/server/features/EmailInbox/EmailInbox.ts index 18b273c43012..f9c4422f88e0 100644 --- a/apps/meteor/server/features/EmailInbox/EmailInbox.ts +++ b/apps/meteor/server/features/EmailInbox/EmailInbox.ts @@ -18,9 +18,7 @@ export type Inbox = { export const inboxes = new Map(); export async function configureEmailInboxes(): Promise { - const emailInboxesCursor = EmailInbox.find({ - active: true, - }); + const emailInboxesCursor = EmailInbox.findActive(); logger.info('Clearing old email inbox registrations'); for (const { imap } of inboxes.values()) { diff --git a/apps/meteor/server/models/raw/EmailInbox.ts b/apps/meteor/server/models/raw/EmailInbox.ts index 138b7bc0296d..edb17c8f8616 100644 --- a/apps/meteor/server/models/raw/EmailInbox.ts +++ b/apps/meteor/server/models/raw/EmailInbox.ts @@ -1,6 +1,6 @@ import type { IEmailInbox, RocketChatRecordDeleted } from '@rocket.chat/core-typings'; import type { IEmailInboxModel } from '@rocket.chat/model-typings'; -import type { Collection, Db, IndexDescription } from 'mongodb'; +import type { Collection, Db, FindCursor, IndexDescription, InsertOneResult, ModifyResult, UpdateFilter } from 'mongodb'; import { BaseRaw } from './BaseRaw'; @@ -12,4 +12,27 @@ export class EmailInboxRaw extends BaseRaw implements IEmailInboxMo protected modelIndexes(): IndexDescription[] { return [{ key: { email: 1 }, unique: true }]; } + + async setDisabledById(id: IEmailInbox['_id']): Promise> { + return this.findOneAndUpdate({ _id: id, active: true }, { $set: { active: false } }, { returnDocument: 'after' }); + } + + async create(emailInbox: IEmailInbox): Promise> { + return this.insertOne(emailInbox); + } + + async updateById(id: IEmailInbox['_id'], data: UpdateFilter): Promise>> { + // findOneAndUpdate doesn't accept generics, so we had to type cast + return this.findOneAndUpdate({ _id: id }, data, { returnDocument: 'after', projection: { _id: 1 } }) as unknown as Promise< + ModifyResult> + >; + } + + findActive(): FindCursor { + return this.find({ active: true }); + } + + async findByEmail(email: IEmailInbox['email']): Promise { + return this.findOne({ email }); + } } diff --git a/packages/model-typings/src/models/IEmailInboxModel.ts b/packages/model-typings/src/models/IEmailInboxModel.ts index 1bb235848535..93145041af74 100644 --- a/packages/model-typings/src/models/IEmailInboxModel.ts +++ b/packages/model-typings/src/models/IEmailInboxModel.ts @@ -1,8 +1,12 @@ import type { IEmailInbox } from '@rocket.chat/core-typings'; +import type { FindCursor, InsertOneResult, ModifyResult, UpdateFilter } from 'mongodb'; import type { IBaseModel } from './IBaseModel'; -// eslint-disable-next-line @typescript-eslint/no-empty-interface export interface IEmailInboxModel extends IBaseModel { - // + setDisabledById(id: IEmailInbox['_id']): Promise>; + create(emailInbox: Omit): Promise>; + updateById(id: IEmailInbox['_id'], data: UpdateFilter): Promise>>; + findActive(): FindCursor; + findByEmail(email: IEmailInbox['email']): Promise; } From 8e4485b0304602a2ea1268cf7342942c449137af Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Fri, 31 May 2024 15:29:11 -0300 Subject: [PATCH 14/29] fix: Users in role table not rendering the empty state properly (#32412) --- .changeset/rare-colts-repair.md | 5 + .../UsersInRole/UsersInRolePage.tsx | 88 ++++++++------ .../UsersInRoleTable/UsersInRoleTable.tsx | 108 +++++++++++------- .../UsersInRoleTable/UsersInRoleTableRow.tsx | 32 +++--- .../UsersInRoleTableWithData.tsx | 87 -------------- .../UsersInRole/UsersInRoleTable/index.ts | 2 +- apps/meteor/tests/e2e/administration.spec.ts | 45 +++++++- apps/meteor/tests/e2e/page-objects/admin.ts | 14 ++- 8 files changed, 198 insertions(+), 183 deletions(-) create mode 100644 .changeset/rare-colts-repair.md delete mode 100644 apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableWithData.tsx diff --git a/.changeset/rare-colts-repair.md b/.changeset/rare-colts-repair.md new file mode 100644 index 000000000000..9011de6ff483 --- /dev/null +++ b/.changeset/rare-colts-repair.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes an issue not rendering the proper error and empty state on users in role table diff --git a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRolePage.tsx b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRolePage.tsx index 9c418c74c3bc..4bfb2afc81d3 100644 --- a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRolePage.tsx +++ b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRolePage.tsx @@ -1,9 +1,10 @@ import type { IRole, IRoom } from '@rocket.chat/core-typings'; -import { Box, Field, FieldLabel, FieldRow, Margins, ButtonGroup, Button, Callout } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useToastMessageDispatch, useRoute, useEndpoint, useTranslation } from '@rocket.chat/ui-contexts'; +import { Box, Field, FieldLabel, FieldRow, Margins, ButtonGroup, Button, Callout, FieldError } from '@rocket.chat/fuselage'; +import { useEffectEvent, useUniqueId } from '@rocket.chat/fuselage-hooks'; +import { useToastMessageDispatch, useEndpoint, useTranslation, useRouter } from '@rocket.chat/ui-contexts'; +import { useQueryClient } from '@tanstack/react-query'; import type { ReactElement } from 'react'; -import React, { useRef } from 'react'; +import React from 'react'; import { useForm, Controller } from 'react-hook-form'; import { Page, PageHeader, PageContent } from '../../../../components/Page'; @@ -18,42 +19,35 @@ type UsersInRolePayload = { const UsersInRolePage = ({ role }: { role: IRole }): ReactElement => { const t = useTranslation(); - const reload = useRef<() => void>(() => undefined); const dispatchToastMessage = useToastMessageDispatch(); + const queryClient = useQueryClient(); const { control, handleSubmit, - formState: { isDirty }, - reset, - getValues, + formState: { errors, isDirty }, + watch, } = useForm({ defaultValues: { users: [] } }); const { _id, name, description } = role; - const router = useRoute('admin-permissions'); - const addUser = useEndpoint('POST', '/v1/roles.addUserToRole'); + const router = useRouter(); + const addUserToRoleEndpoint = useEndpoint('POST', '/v1/roles.addUserToRole'); - const rid = getValues('rid'); + const { rid } = watch(); + const roomFieldId = useUniqueId(); + const usersFieldId = useUniqueId(); - const handleReturn = useMutableCallback(() => { - router.push({ - context: 'edit', - _id, - }); - }); - - const handleAdd = useMutableCallback(async ({ users, rid }: UsersInRolePayload) => { + const handleAdd = useEffectEvent(async ({ users, rid }: UsersInRolePayload) => { try { await Promise.all( users.map(async (user) => { if (user) { - await addUser({ roleName: _id, username: user, roomId: rid }); + await addUserToRoleEndpoint({ roleName: _id, username: user, roomId: rid }); } }), ); dispatchToastMessage({ type: 'success', message: t('Users_added') }); - reload.current(); - reset(); + queryClient.invalidateQueries(['getUsersInRole']); } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } @@ -63,7 +57,7 @@ const UsersInRolePage = ({ role }: { role: IRole }): ReactElement => { - + @@ -71,40 +65,68 @@ const UsersInRolePage = ({ role }: { role: IRole }): ReactElement => { {role.scope !== 'Users' && ( - {t('Choose_a_room')} + {t('Choose_a_room')} ( - + rules={{ required: t('error-the-field-is-required', { field: t('Room') }) }} + render={({ field: { onChange, value } }) => ( + )} /> + {errors.rid && ( + + {errors.rid.message} + + )} )} - {t('Add_users')} + {t('Add_users')} ( - + rules={{ required: t('error-the-field-is-required', { field: t('Users') }) }} + render={({ field: { onChange, value } }) => ( + )} /> - + {errors.users && ( + + + {errors.users.message} + + + )} - {(role.scope === 'Users' || rid) && ( - - )} + {(role.scope === 'Users' || rid) && } {role.scope !== 'Users' && !rid && {t('Select_a_room')}} diff --git a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTable.tsx b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTable.tsx index ab8c5926f97f..ed7fdd93d79c 100644 --- a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTable.tsx +++ b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTable.tsx @@ -1,79 +1,107 @@ -import type { IRole, IRoom, IUserInRole } from '@rocket.chat/core-typings'; +import type { IRole, IRoom } from '@rocket.chat/core-typings'; import { Pagination } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { useSetModal, useToastMessageDispatch, useEndpoint, useTranslation } from '@rocket.chat/ui-contexts'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; import type { ReactElement } from 'react'; -import React from 'react'; +import React, { useMemo } from 'react'; +import GenericError from '../../../../../components/GenericError'; import GenericModal from '../../../../../components/GenericModal'; import GenericNoResults from '../../../../../components/GenericNoResults'; -import { GenericTable, GenericTableHeader, GenericTableHeaderCell, GenericTableBody } from '../../../../../components/GenericTable'; -import type { usePagination } from '../../../../../components/GenericTable/hooks/usePagination'; +import { + GenericTable, + GenericTableHeader, + GenericTableHeaderCell, + GenericTableBody, + GenericTableLoadingTable, +} from '../../../../../components/GenericTable'; +import { usePagination } from '../../../../../components/GenericTable/hooks/usePagination'; import UsersInRoleTableRow from './UsersInRoleTableRow'; type UsersInRoleTableProps = { - users: IUserInRole[]; - reload: () => void; roleName: IRole['name']; roleId: IRole['_id']; description: IRole['description']; - total: number; rid?: IRoom['_id']; - paginationData: ReturnType; }; -// TODO: Missing error state -const UsersInRoleTable = ({ - users, - reload, - roleName, - roleId, - description, - total, - rid, - paginationData, -}: UsersInRoleTableProps): ReactElement => { +const UsersInRoleTable = ({ rid, roleId, roleName, description }: UsersInRoleTableProps): ReactElement => { const t = useTranslation(); const setModal = useSetModal(); const dispatchToastMessage = useToastMessageDispatch(); - const removeUser = useEndpoint('POST', '/v1/roles.removeUserFromRole'); - const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = paginationData; + const queryClient = useQueryClient(); - const closeModal = (): void => setModal(); + const getUsersInRoleEndpoint = useEndpoint('GET', '/v1/roles.getUsersInRole'); + const removeUserFromRoleEndpoint = useEndpoint('POST', '/v1/roles.removeUserFromRole'); - const handleRemove = useMutableCallback((username) => { - const remove = async (): Promise => { + const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); + + const query = useMemo( + () => ({ + role: roleId, + ...(rid && { roomId: rid }), + ...(itemsPerPage && { count: itemsPerPage }), + ...(current && { offset: current }), + }), + [itemsPerPage, current, rid, roleId], + ); + + const { data, isLoading, isSuccess, refetch, isError } = useQuery(['getUsersInRole', roleId, query], async () => + getUsersInRoleEndpoint(query), + ); + + const users = + data?.users?.map((user) => ({ + ...user, + createdAt: new Date(user.createdAt), + _updatedAt: new Date(user._updatedAt), + })) || []; + + const handleRemove = useEffectEvent((username) => { + const remove = async () => { try { - await removeUser({ roleId, username, scope: rid }); + await removeUserFromRoleEndpoint({ roleId, username, scope: rid }); dispatchToastMessage({ type: 'success', message: t('User_removed') }); - } catch (error: unknown) { + queryClient.invalidateQueries(['getUsersInRole']); + } catch (error) { dispatchToastMessage({ type: 'error', message: error }); } finally { - closeModal(); - reload(); + setModal(null); } }; setModal( - + setModal(null)} confirmText={t('Delete')}> {t('The_user_s_will_be_removed_from_role_s', username, description || roleName)} , ); }); + const headers = ( + <> + {t('Name')} + {t('Email')} + + + ); + return ( <> - {users.length === 0 && } - {users.length > 0 && ( + {isLoading && ( + + {headers} + + + + + )} + {isSuccess && users?.length > 0 && ( <> - - {t('Name')} - {t('Email')} - - + {headers} - {users.map((user) => ( + {users?.map((user) => ( ))} @@ -82,13 +110,15 @@ const UsersInRoleTable = ({ divider current={current} itemsPerPage={itemsPerPage} - count={total} + count={users.length || 0} onSetItemsPerPage={onSetItemsPerPage} onSetCurrent={onSetCurrent} {...paginationProps} /> )} + {users?.length === 0 && } + {isError && } ); }; diff --git a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx index ea4b999d694e..4e860ca8f759 100644 --- a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx +++ b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx @@ -1,7 +1,8 @@ import type { IUserInRole } from '@rocket.chat/core-typings'; -import { Box, Button, Icon } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { Box, IconButton } from '@rocket.chat/fuselage'; +import { useEffectEvent } from '@rocket.chat/fuselage-hooks'; import { UserAvatar } from '@rocket.chat/ui-avatar'; +import { useTranslation } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import React, { memo } from 'react'; @@ -14,10 +15,11 @@ type UsersInRoleTableRowProps = { }; const UsersInRoleTableRow = ({ user, onRemove }: UsersInRoleTableRowProps): ReactElement => { + const t = useTranslation(); const { _id, name, username, avatarETag } = user; const email = getUserEmailAddress(user); - const handleRemove = useMutableCallback(() => { + const handleRemove = useEffectEvent(() => { onRemove(username); }); @@ -27,26 +29,20 @@ const UsersInRoleTableRow = ({ user, onRemove }: UsersInRoleTableRowProps): Reac - - - {name || username} - - {name && ( - - {' '} - {`@${username}`}{' '} - - )} + + {name || username} + {name && ( + + {`@${username}`} + + )} {email} - - {/* FIXME: Replace to IconButton */} - + + ); diff --git a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableWithData.tsx b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableWithData.tsx deleted file mode 100644 index a7fe837b6e72..000000000000 --- a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableWithData.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import type { IRole, IRoom, IUserInRole } from '@rocket.chat/core-typings'; -import { useEndpoint, useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; -import type { ReactElement, MutableRefObject } from 'react'; -import React, { useEffect, useMemo } from 'react'; - -import { usePagination } from '../../../../../components/GenericTable/hooks/usePagination'; -import UsersInRoleTable from './UsersInRoleTable'; - -type UsersInRoleTableWithDataProps = { - rid?: IRoom['_id']; - roleId: IRole['_id']; - roleName: IRole['name']; - description: IRole['description']; - reloadRef: MutableRefObject<() => void>; -}; - -const UsersInRoleTableWithData = ({ - rid, - roleId, - roleName, - description, - reloadRef, -}: UsersInRoleTableWithDataProps): ReactElement | null => { - const { itemsPerPage, current, ...paginationData } = usePagination(); - const t = useTranslation(); - - const query = useMemo( - () => ({ - role: roleId, - ...(rid && { roomId: rid }), - ...(itemsPerPage && { count: itemsPerPage }), - ...(current && { offset: current }), - }), - [itemsPerPage, current, rid, roleId], - ); - - const getUsersInRole = useEndpoint('GET', '/v1/roles.getUsersInRole'); - - const dispatchToastMessage = useToastMessageDispatch(); - - const { refetch, ...result } = useQuery( - ['roles', roleId, 'users', query], - async () => { - const { users } = await getUsersInRole(query); - - if (users.length === 0) { - throw new Error(t('No_results_found')); - } - return users; - }, - { - onError: (error) => { - dispatchToastMessage({ type: 'error', message: error }); - }, - }, - ); - - useEffect(() => { - reloadRef.current = refetch; - }, [refetch, reloadRef]); - - if (result.isLoading || result.error || !result.data) { - return null; - } - - const users: IUserInRole[] = result.data.map((user) => ({ - ...user, - createdAt: new Date(user.createdAt), - _updatedAt: new Date(user._updatedAt), - })); - - return ( - - ); -}; - -export default UsersInRoleTableWithData; diff --git a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/index.ts b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/index.ts index e7195afe4fd1..1557d53dff12 100644 --- a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/index.ts +++ b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/index.ts @@ -1 +1 @@ -export { default } from './UsersInRoleTableWithData'; +export { default } from './UsersInRoleTable'; diff --git a/apps/meteor/tests/e2e/administration.spec.ts b/apps/meteor/tests/e2e/administration.spec.ts index c778e165a769..d51c85bdc9ba 100644 --- a/apps/meteor/tests/e2e/administration.spec.ts +++ b/apps/meteor/tests/e2e/administration.spec.ts @@ -2,7 +2,7 @@ import { faker } from '@faker-js/faker'; import { IS_EE } from './config/constants'; import { Users } from './fixtures/userStates'; -import { Admin } from './page-objects'; +import { Admin, Utils } from './page-objects'; import { createTargetChannel } from './utils'; import { setSettingValueById } from './utils/setSettingValueById'; import { test, expect } from './utils/test'; @@ -11,10 +11,12 @@ test.use({ storageState: Users.admin.state }); test.describe.parallel('administration', () => { let poAdmin: Admin; + let poUtils: Utils; let targetChannel: string; test.beforeEach(async ({ page }) => { poAdmin = new Admin(page); + poUtils = new Utils(page); }); test.describe('Workspace', () => { @@ -202,7 +204,7 @@ test.describe.parallel('administration', () => { test('expect open upsell modal if not enterprise', async ({ page }) => { test.skip(IS_EE); await poAdmin.btnCreateRole.click(); - await page.waitForSelector('role=dialog[name="Custom roles"]'); + await expect(page.getByRole('dialog', { name: 'Custom roles' })).toBeVisible(); }); test.describe('Users in role', () => { @@ -214,7 +216,7 @@ test.describe.parallel('administration', () => { await api.post('/channels.addOwner', { roomId: channel._id, userId: Users.user1.data._id }); await api.post('/channels.removeOwner', { roomId: channel._id, userId: Users.admin.data._id }); - }) + }); test('admin should be able to get the owners of a room that wasnt created by him', async ({ page }) => { await poAdmin.openRoleByName('Owner').click(); @@ -223,7 +225,42 @@ test.describe.parallel('administration', () => { await page.getByRole('option', { name: channelName }).click(); await expect(poAdmin.getUserRowByUsername('user1')).toBeVisible(); - }) + }); + + test('should add user1 as moderator of target channel', async ({ page }) => { + await poAdmin.openRoleByName('Moderator').click(); + await poAdmin.btnUsersInRole.click(); + + await poAdmin.inputRoom.fill(channelName); + await page.getByRole('option', { name: channelName }).click(); + + await poAdmin.inputUsers.fill('user1'); + await page.getByRole('option', { name: 'user1' }).click(); + await poAdmin.btnAdd.click(); + + await expect(poAdmin.getUserRowByUsername('user1')).toBeVisible(); + }); + + test('should remove user1 as moderator of target channel', async ({ page }) => { + await poAdmin.openRoleByName('Moderator').click(); + await poAdmin.btnUsersInRole.click(); + + await poAdmin.inputRoom.fill(channelName); + await page.getByRole('option', { name: channelName }).click(); + + await poAdmin.getUserRowByUsername('user1').getByRole('button', { name: 'Remove' }).click(); + await poUtils.btnModalConfirmDelete.click(); + + await expect(page.locator('h3 >> text="No results found"')).toBeVisible(); + }); + + test('should back to the permissions page', async ({ page }) => { + await poAdmin.openRoleByName('Moderator').click(); + await poAdmin.btnUsersInRole.click(); + await poAdmin.btnBack.click(); + + await expect(page.locator('h1 >> text="Permissions"')).toBeVisible(); + }); }) }); diff --git a/apps/meteor/tests/e2e/page-objects/admin.ts b/apps/meteor/tests/e2e/page-objects/admin.ts index 791768778295..f3567652fe6e 100644 --- a/apps/meteor/tests/e2e/page-objects/admin.ts +++ b/apps/meteor/tests/e2e/page-objects/admin.ts @@ -205,7 +205,19 @@ export class Admin { return this.page.locator('input[placeholder="Room"]'); } + get inputUsers(): Locator { + return this.page.locator('input[placeholder="Users"]'); + } + + get btnAdd(): Locator { + return this.page.getByRole('button', { name: 'Add' }); + } + + get btnBack(): Locator { + return this.page.getByRole('button', { name: 'Back' }); + } + getUserRowByUsername(username: string): Locator { - return this.page.locator('tr', { hasText: username }) + return this.page.locator('tr', { hasText: username }); } } From 70dbbd1641795d2f0d8ca0a664b59061653defe4 Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Fri, 31 May 2024 16:35:52 -0300 Subject: [PATCH 15/29] regression: Hide prune section based on permission (#32531) --- .../Info/EditRoomInfo/EditRoomInfo.tsx | 9 ++----- .../meteor/tests/e2e/retention-policy.spec.ts | 25 ++++++++++++++++--- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx index 6b8d07779107..a32df8a44580 100644 --- a/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx +++ b/apps/meteor/client/views/room/contextualBar/Info/EditRoomInfo/EditRoomInfo.tsx @@ -465,7 +465,7 @@ const EditRoomInfo = ({ room, onClickClose, onClickBack }: EditRoomInfoProps) => )} - {retentionPolicy?.enabled && ( + {canEditRoomRetentionPolicy && retentionPolicy?.enabled && ( @@ -486,12 +486,7 @@ const EditRoomInfo = ({ room, onClickClose, onClickBack }: EditRoomInfoProps) => control={control} name='retentionOverrideGlobal' render={({ field: { value, ...field } }) => ( - + )} /> diff --git a/apps/meteor/tests/e2e/retention-policy.spec.ts b/apps/meteor/tests/e2e/retention-policy.spec.ts index 3b52ecce1405..ba9ec90eff3b 100644 --- a/apps/meteor/tests/e2e/retention-policy.spec.ts +++ b/apps/meteor/tests/e2e/retention-policy.spec.ts @@ -1,18 +1,24 @@ +import { faker } from '@faker-js/faker'; + +import { createAuxContext } from './fixtures/createAuxContext'; import { Users } from './fixtures/userStates'; import { HomeChannel } from './page-objects'; -import { createTargetChannel, createTargetPrivateChannel, createTargetTeam, setSettingValueById } from './utils'; +import { createTargetPrivateChannel, createTargetTeam, setSettingValueById } from './utils'; import { test, expect } from './utils/test'; test.use({ storageState: Users.admin.state }); test.describe.serial('retention-policy', () => { let poHomeChannel: HomeChannel; - let targetChannel: string; + const targetChannel = faker.string.uuid(); let targetTeam: string; let targetGroup: string; test.beforeAll(async ({ api }) => { - targetChannel = await createTargetChannel(api); + const response = await api.post('/channels.create', { name: targetChannel, members: ['user1'] }); + const { channel } = await response.json(); + await api.post('/channels.addOwner', { roomId: channel._id, userId: Users.user1.data._id }); + targetGroup = await createTargetPrivateChannel(api); targetTeam = await createTargetTeam(api); }) @@ -48,7 +54,7 @@ test.describe.serial('retention-policy', () => { test.describe('retention policy enabled', () => { test.beforeAll(async ({ api }) => { await setSettingValueById(api, 'RetentionPolicy_Enabled', true); - }) + }); test.afterAll(async ({ api }) => { await setSettingValueById(api, 'RetentionPolicy_Enabled', false); await setSettingValueById(api, 'RetentionPolicy_AppliesToChannels', false); @@ -79,6 +85,17 @@ test.describe.serial('retention-policy', () => { await expect(poHomeChannel.tabs.room.pruneAccordion).toBeVisible(); }); + test('should not show prune section in edit channel for users without permission', async ({ browser }) => { + const { page } = await createAuxContext(browser, Users.user1); + const auxContext = { page, poHomeChannel: new HomeChannel(page) }; + await auxContext.poHomeChannel.sidenav.openChat(targetChannel); + await auxContext.poHomeChannel.tabs.btnRoomInfo.click(); + await auxContext.poHomeChannel.tabs.room.btnEdit.click(); + + await expect(poHomeChannel.tabs.room.pruneAccordion).not.toBeVisible(); + await auxContext.page.close(); + }) + test.describe('retention policy applies enabled by default', () => { test.beforeAll(async ({ api }) => { await setSettingValueById(api, 'RetentionPolicy_AppliesToChannels', true); From 19c131bde5a937826d94f4b44279f3e18c3de3a5 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Fri, 31 May 2024 17:08:38 -0300 Subject: [PATCH 16/29] fix: User status when setting "Use REST instead of websocket for Meteor calls" is disabled (#32500) --- .changeset/serious-bottles-tie.md | 5 ++ .../meteor/client/sidebar/header/UserMenu.tsx | 2 + apps/meteor/ee/server/startup/presence.ts | 2 +- apps/meteor/tests/e2e/presence.spec.ts | 48 +++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 .changeset/serious-bottles-tie.md create mode 100644 apps/meteor/tests/e2e/presence.spec.ts diff --git a/.changeset/serious-bottles-tie.md b/.changeset/serious-bottles-tie.md new file mode 100644 index 000000000000..e12bb94a5310 --- /dev/null +++ b/.changeset/serious-bottles-tie.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fix user not being set as online when setting "Use REST instead of websocket for Meteor calls" is disabled diff --git a/apps/meteor/client/sidebar/header/UserMenu.tsx b/apps/meteor/client/sidebar/header/UserMenu.tsx index a53836eda311..592fc19656e9 100644 --- a/apps/meteor/client/sidebar/header/UserMenu.tsx +++ b/apps/meteor/client/sidebar/header/UserMenu.tsx @@ -28,6 +28,7 @@ const UserMenu = ({ user }: { user: IUser }) => { selectionMode='multiple' sections={sections} title={t('User_menu')} + aria-label={t('User_menu')} onAction={handleAction} isOpen={isOpen} onOpenChange={setIsOpen} @@ -41,6 +42,7 @@ const UserMenu = ({ user }: { user: IUser }) => { selectionMode='multiple' sections={sections} title={t('User_menu')} + aria-label={t('User_menu')} onAction={handleAction} isOpen={isOpen} onOpenChange={setIsOpen} diff --git a/apps/meteor/ee/server/startup/presence.ts b/apps/meteor/ee/server/startup/presence.ts index 3e8daad4b259..0e7ba8a2b951 100644 --- a/apps/meteor/ee/server/startup/presence.ts +++ b/apps/meteor/ee/server/startup/presence.ts @@ -30,7 +30,7 @@ Meteor.startup(() => { }); Accounts.onLogin((login: any): void => { - if (login.type !== 'resume' || !login.connection.id) { + if (!login.connection.id) { return; } diff --git a/apps/meteor/tests/e2e/presence.spec.ts b/apps/meteor/tests/e2e/presence.spec.ts new file mode 100644 index 000000000000..ad96c3cee4bf --- /dev/null +++ b/apps/meteor/tests/e2e/presence.spec.ts @@ -0,0 +1,48 @@ +import { DEFAULT_USER_CREDENTIALS, IS_EE } from './config/constants'; +import { Registration } from './page-objects'; +import { setSettingValueById } from './utils/setSettingValueById'; +import { test, expect } from './utils/test'; + +test.describe.serial('Presence', () => { + let poRegistration: Registration; + + test.beforeEach(async ({ page }) => { + poRegistration = new Registration(page); + + await page.goto('/home'); + }); + + test.beforeAll(async ({ api }) => { + await expect((await setSettingValueById(api, 'API_Use_REST_For_DDP_Calls', true)).status()).toBe(200); + }); + + test.afterAll(async ({ api }) => { + await expect((await setSettingValueById(api, 'API_Use_REST_For_DDP_Calls', true)).status()).toBe(200); + }); + + test.describe('Login using default settings', () => { + test('expect user to be online after log in', async ({ page }) => { + await poRegistration.username.type('user1'); + await poRegistration.inputPassword.type(DEFAULT_USER_CREDENTIALS.password); + await poRegistration.btnLogin.click(); + + await expect(page.getByRole('button', { name: 'User menu' }).locator('.rcx-status-bullet--online')).toBeVisible(); + }); + }); + + test.describe('Login using with "Methods by REST" disabled', () => { + test.skip(IS_EE, `Micro services don't support turning this setting off`); + + test.beforeAll(async ({ api }) => { + await expect((await setSettingValueById(api, 'API_Use_REST_For_DDP_Calls', false)).status()).toBe(200); + }); + + test('expect user to be online after log in', async ({ page }) => { + await poRegistration.username.type('user1'); + await poRegistration.inputPassword.type(DEFAULT_USER_CREDENTIALS.password); + await poRegistration.btnLogin.click(); + + await expect(page.getByRole('button', { name: 'User menu' }).locator('.rcx-status-bullet--online')).toBeVisible(); + }); + }); +}); From 20b9f1ab5a4b95890b21366f97fe32c90ffe3249 Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Fri, 31 May 2024 17:08:38 -0300 Subject: [PATCH 17/29] fix: User status when setting "Use REST instead of websocket for Meteor calls" is disabled (#32500) --- .changeset/serious-bottles-tie.md | 5 ++ .../meteor/client/sidebar/header/UserMenu.tsx | 2 + apps/meteor/ee/server/startup/presence.ts | 2 +- apps/meteor/tests/e2e/presence.spec.ts | 48 +++++++++++++++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 .changeset/serious-bottles-tie.md create mode 100644 apps/meteor/tests/e2e/presence.spec.ts diff --git a/.changeset/serious-bottles-tie.md b/.changeset/serious-bottles-tie.md new file mode 100644 index 000000000000..e12bb94a5310 --- /dev/null +++ b/.changeset/serious-bottles-tie.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fix user not being set as online when setting "Use REST instead of websocket for Meteor calls" is disabled diff --git a/apps/meteor/client/sidebar/header/UserMenu.tsx b/apps/meteor/client/sidebar/header/UserMenu.tsx index a53836eda311..592fc19656e9 100644 --- a/apps/meteor/client/sidebar/header/UserMenu.tsx +++ b/apps/meteor/client/sidebar/header/UserMenu.tsx @@ -28,6 +28,7 @@ const UserMenu = ({ user }: { user: IUser }) => { selectionMode='multiple' sections={sections} title={t('User_menu')} + aria-label={t('User_menu')} onAction={handleAction} isOpen={isOpen} onOpenChange={setIsOpen} @@ -41,6 +42,7 @@ const UserMenu = ({ user }: { user: IUser }) => { selectionMode='multiple' sections={sections} title={t('User_menu')} + aria-label={t('User_menu')} onAction={handleAction} isOpen={isOpen} onOpenChange={setIsOpen} diff --git a/apps/meteor/ee/server/startup/presence.ts b/apps/meteor/ee/server/startup/presence.ts index 3e8daad4b259..0e7ba8a2b951 100644 --- a/apps/meteor/ee/server/startup/presence.ts +++ b/apps/meteor/ee/server/startup/presence.ts @@ -30,7 +30,7 @@ Meteor.startup(() => { }); Accounts.onLogin((login: any): void => { - if (login.type !== 'resume' || !login.connection.id) { + if (!login.connection.id) { return; } diff --git a/apps/meteor/tests/e2e/presence.spec.ts b/apps/meteor/tests/e2e/presence.spec.ts new file mode 100644 index 000000000000..ad96c3cee4bf --- /dev/null +++ b/apps/meteor/tests/e2e/presence.spec.ts @@ -0,0 +1,48 @@ +import { DEFAULT_USER_CREDENTIALS, IS_EE } from './config/constants'; +import { Registration } from './page-objects'; +import { setSettingValueById } from './utils/setSettingValueById'; +import { test, expect } from './utils/test'; + +test.describe.serial('Presence', () => { + let poRegistration: Registration; + + test.beforeEach(async ({ page }) => { + poRegistration = new Registration(page); + + await page.goto('/home'); + }); + + test.beforeAll(async ({ api }) => { + await expect((await setSettingValueById(api, 'API_Use_REST_For_DDP_Calls', true)).status()).toBe(200); + }); + + test.afterAll(async ({ api }) => { + await expect((await setSettingValueById(api, 'API_Use_REST_For_DDP_Calls', true)).status()).toBe(200); + }); + + test.describe('Login using default settings', () => { + test('expect user to be online after log in', async ({ page }) => { + await poRegistration.username.type('user1'); + await poRegistration.inputPassword.type(DEFAULT_USER_CREDENTIALS.password); + await poRegistration.btnLogin.click(); + + await expect(page.getByRole('button', { name: 'User menu' }).locator('.rcx-status-bullet--online')).toBeVisible(); + }); + }); + + test.describe('Login using with "Methods by REST" disabled', () => { + test.skip(IS_EE, `Micro services don't support turning this setting off`); + + test.beforeAll(async ({ api }) => { + await expect((await setSettingValueById(api, 'API_Use_REST_For_DDP_Calls', false)).status()).toBe(200); + }); + + test('expect user to be online after log in', async ({ page }) => { + await poRegistration.username.type('user1'); + await poRegistration.inputPassword.type(DEFAULT_USER_CREDENTIALS.password); + await poRegistration.btnLogin.click(); + + await expect(page.getByRole('button', { name: 'User menu' }).locator('.rcx-status-bullet--online')).toBeVisible(); + }); + }); +}); From dbf8bdc70c44e104b8d80ad94224806289283335 Mon Sep 17 00:00:00 2001 From: rocketchat-github-ci Date: Fri, 31 May 2024 22:29:00 +0000 Subject: [PATCH 18/29] Release 6.9.0-rc.2 [no ci] --- .changeset/bump-patch-1717194531681.md | 5 +++ .changeset/pre.json | 2 ++ apps/meteor/CHANGELOG.md | 34 +++++++++++++++++++ apps/meteor/app/utils/rocketchat.info | 2 +- apps/meteor/ee/server/services/CHANGELOG.md | 13 +++++++ apps/meteor/ee/server/services/package.json | 2 +- apps/meteor/package.json | 2 +- ee/apps/account-service/CHANGELOG.md | 13 +++++++ ee/apps/account-service/package.json | 2 +- ee/apps/authorization-service/CHANGELOG.md | 13 +++++++ ee/apps/authorization-service/package.json | 2 +- ee/apps/ddp-streamer/CHANGELOG.md | 15 ++++++++ ee/apps/ddp-streamer/package.json | 2 +- ee/apps/omnichannel-transcript/CHANGELOG.md | 14 ++++++++ ee/apps/omnichannel-transcript/package.json | 2 +- ee/apps/presence-service/CHANGELOG.md | 13 +++++++ ee/apps/presence-service/package.json | 2 +- ee/apps/queue-worker/CHANGELOG.md | 13 +++++++ ee/apps/queue-worker/package.json | 2 +- ee/apps/stream-hub-service/CHANGELOG.md | 12 +++++++ ee/apps/stream-hub-service/package.json | 2 +- ee/packages/api-client/CHANGELOG.md | 10 ++++++ ee/packages/api-client/package.json | 2 +- ee/packages/ddp-client/CHANGELOG.md | 10 ++++++ ee/packages/ddp-client/package.json | 2 +- ee/packages/license/CHANGELOG.md | 9 +++++ ee/packages/license/package.json | 2 +- ee/packages/omnichannel-services/CHANGELOG.md | 14 ++++++++ ee/packages/omnichannel-services/package.json | 2 +- ee/packages/pdf-worker/CHANGELOG.md | 9 +++++ ee/packages/pdf-worker/package.json | 2 +- ee/packages/presence/CHANGELOG.md | 11 ++++++ ee/packages/presence/package.json | 2 +- package.json | 2 +- packages/apps/CHANGELOG.md | 10 ++++++ packages/apps/package.json | 2 +- packages/core-services/CHANGELOG.md | 11 ++++++ packages/core-services/package.json | 2 +- packages/core-typings/CHANGELOG.md | 2 ++ packages/core-typings/package.json | 2 +- packages/cron/CHANGELOG.md | 10 ++++++ packages/cron/package.json | 2 +- packages/fuselage-ui-kit/CHANGELOG.md | 13 +++++++ packages/fuselage-ui-kit/package.json | 10 +++--- packages/gazzodown/CHANGELOG.md | 11 ++++++ packages/gazzodown/package.json | 6 ++-- packages/instance-status/CHANGELOG.md | 9 +++++ packages/instance-status/package.json | 2 +- packages/livechat/CHANGELOG.md | 9 +++++ packages/livechat/package.json | 2 +- packages/model-typings/CHANGELOG.md | 9 +++++ packages/model-typings/package.json | 2 +- packages/models/CHANGELOG.md | 9 +++++ packages/models/package.json | 2 +- packages/rest-typings/CHANGELOG.md | 9 +++++ packages/rest-typings/package.json | 2 +- packages/ui-avatar/CHANGELOG.md | 9 +++++ packages/ui-avatar/package.json | 4 +-- packages/ui-client/CHANGELOG.md | 9 +++++ packages/ui-client/package.json | 4 +-- packages/ui-contexts/CHANGELOG.md | 11 ++++++ packages/ui-contexts/package.json | 2 +- packages/ui-video-conf/CHANGELOG.md | 10 ++++++ packages/ui-video-conf/package.json | 6 ++-- packages/uikit-playground/CHANGELOG.md | 11 ++++++ packages/uikit-playground/package.json | 2 +- packages/web-ui-registration/CHANGELOG.md | 9 +++++ packages/web-ui-registration/package.json | 4 +-- yarn.lock | 20 +++++------ 69 files changed, 426 insertions(+), 55 deletions(-) create mode 100644 .changeset/bump-patch-1717194531681.md diff --git a/.changeset/bump-patch-1717194531681.md b/.changeset/bump-patch-1717194531681.md new file mode 100644 index 000000000000..e1eaa7980afb --- /dev/null +++ b/.changeset/bump-patch-1717194531681.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Bump @rocket.chat/meteor version. diff --git a/.changeset/pre.json b/.changeset/pre.json index 646efbb637eb..fb96fe2739cd 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -65,6 +65,7 @@ "angry-rocks-try", "breezy-geckos-sparkle", "bump-patch-1716905283526", + "bump-patch-1717194531681", "chilly-poems-explode", "cold-beds-hope", "cuddly-owls-join", @@ -76,6 +77,7 @@ "nasty-swans-compete", "ninety-rivers-mix", "rich-bananas-complain", + "serious-bottles-tie", "shiny-crabs-peel", "shy-oranges-provide", "silly-clocks-return", diff --git a/apps/meteor/CHANGELOG.md b/apps/meteor/CHANGELOG.md index 53f49f9e3b53..4135ee33bb68 100644 --- a/apps/meteor/CHANGELOG.md +++ b/apps/meteor/CHANGELOG.md @@ -1,5 +1,39 @@ # @rocket.chat/meteor +## 6.9.0-rc.2 + +### Patch Changes + +- Bump @rocket.chat/meteor version. + +- ([#32500](https://github.com/RocketChat/Rocket.Chat/pull/32500)) Fix user not being set as online when setting "Use REST instead of websocket for Meteor calls" is disabled + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/rest-typings@6.9.0-rc.2 + - @rocket.chat/api-client@0.1.33-rc.2 + - @rocket.chat/license@0.1.15-rc.2 + - @rocket.chat/omnichannel-services@0.1.15-rc.2 + - @rocket.chat/pdf-worker@0.0.39-rc.2 + - @rocket.chat/presence@0.1.15-rc.2 + - @rocket.chat/apps@0.0.6-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/cron@0.0.35-rc.2 + - @rocket.chat/fuselage-ui-kit@7.0.0-rc.2 + - @rocket.chat/gazzodown@7.0.0-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/ui-contexts@7.0.0-rc.2 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.0.39-rc.2 + - @rocket.chat/ui-theming@0.1.2 + - @rocket.chat/ui-avatar@3.0.0-rc.2 + - @rocket.chat/ui-client@7.0.0-rc.2 + - @rocket.chat/ui-video-conf@7.0.0-rc.2 + - @rocket.chat/web-ui-registration@7.0.0-rc.2 + - @rocket.chat/instance-status@0.0.39-rc.2 +
+ ## 6.9.0-rc.1 ### Patch Changes diff --git a/apps/meteor/app/utils/rocketchat.info b/apps/meteor/app/utils/rocketchat.info index b4a43e6ceaa3..0c1a9c86fc83 100644 --- a/apps/meteor/app/utils/rocketchat.info +++ b/apps/meteor/app/utils/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "6.9.0-rc.1" + "version": "6.9.0-rc.2" } diff --git a/apps/meteor/ee/server/services/CHANGELOG.md b/apps/meteor/ee/server/services/CHANGELOG.md index 9e75ef4c3980..f2992b627ab2 100644 --- a/apps/meteor/ee/server/services/CHANGELOG.md +++ b/apps/meteor/ee/server/services/CHANGELOG.md @@ -1,5 +1,18 @@ # rocketchat-services +## 1.1.33-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/rest-typings@6.9.0-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 1.1.33-rc.1 ### Patch Changes diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 968ace364032..160b995470fa 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -1,7 +1,7 @@ { "name": "rocketchat-services", "private": true, - "version": "1.1.33-rc.1", + "version": "1.1.33-rc.2", "description": "Rocket.Chat Authorization service", "main": "index.js", "scripts": { diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 7842ee136325..d8c501425e94 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/meteor", "description": "The Ultimate Open Source WebChat Platform", - "version": "6.9.0-rc.1", + "version": "6.9.0-rc.2", "private": true, "author": { "name": "Rocket.Chat", diff --git a/ee/apps/account-service/CHANGELOG.md b/ee/apps/account-service/CHANGELOG.md index 951735322c50..e706d2edf128 100644 --- a/ee/apps/account-service/CHANGELOG.md +++ b/ee/apps/account-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/account-service +## 0.3.14-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/rest-typings@6.9.0-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.3.14-rc.1 ### Patch Changes diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json index ead2c2dff8cc..8795dfbe633c 100644 --- a/ee/apps/account-service/package.json +++ b/ee/apps/account-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/account-service", "private": true, - "version": "0.3.14-rc.1", + "version": "0.3.14-rc.2", "description": "Rocket.Chat Account service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/authorization-service/CHANGELOG.md b/ee/apps/authorization-service/CHANGELOG.md index c84743103c34..ba68a68aa7aa 100644 --- a/ee/apps/authorization-service/CHANGELOG.md +++ b/ee/apps/authorization-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/authorization-service +## 0.3.15-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/rest-typings@6.9.0-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.3.15-rc.1 ### Patch Changes diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json index 3c50fe168eb5..2996e5648f81 100644 --- a/ee/apps/authorization-service/package.json +++ b/ee/apps/authorization-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/authorization-service", "private": true, - "version": "0.3.15-rc.1", + "version": "0.3.15-rc.2", "description": "Rocket.Chat Authorization service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/ddp-streamer/CHANGELOG.md b/ee/apps/ddp-streamer/CHANGELOG.md index 51922c477a6b..3c3765c09f0e 100644 --- a/ee/apps/ddp-streamer/CHANGELOG.md +++ b/ee/apps/ddp-streamer/CHANGELOG.md @@ -1,5 +1,20 @@ # @rocket.chat/ddp-streamer +## 0.2.14-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/rest-typings@6.9.0-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/ui-contexts@7.0.0-rc.2 + - @rocket.chat/models@0.0.39-rc.2 + - @rocket.chat/instance-status@0.0.39-rc.2 +
+ ## 0.2.14-rc.1 ### Patch Changes diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index 4898b86732d3..1f8989527a07 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/ddp-streamer", "private": true, - "version": "0.2.14-rc.1", + "version": "0.2.14-rc.2", "description": "Rocket.Chat DDP-Streamer service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/omnichannel-transcript/CHANGELOG.md b/ee/apps/omnichannel-transcript/CHANGELOG.md index 52754c454204..308fca8cfde5 100644 --- a/ee/apps/omnichannel-transcript/CHANGELOG.md +++ b/ee/apps/omnichannel-transcript/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/omnichannel-transcript +## 0.3.15-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/omnichannel-services@0.1.15-rc.2 + - @rocket.chat/pdf-worker@0.0.39-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.3.15-rc.1 ### Patch Changes diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json index 6632944ac629..baaaf1e76a7d 100644 --- a/ee/apps/omnichannel-transcript/package.json +++ b/ee/apps/omnichannel-transcript/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/omnichannel-transcript", "private": true, - "version": "0.3.15-rc.1", + "version": "0.3.15-rc.2", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/presence-service/CHANGELOG.md b/ee/apps/presence-service/CHANGELOG.md index 52683c485011..213135556ecb 100644 --- a/ee/apps/presence-service/CHANGELOG.md +++ b/ee/apps/presence-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/presence-service +## 0.3.15-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/presence@0.1.15-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.3.15-rc.1 ### Patch Changes diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json index 2bf61f9ea9c4..9f9c6fb8b568 100644 --- a/ee/apps/presence-service/package.json +++ b/ee/apps/presence-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/presence-service", "private": true, - "version": "0.3.15-rc.1", + "version": "0.3.15-rc.2", "description": "Rocket.Chat Presence service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/queue-worker/CHANGELOG.md b/ee/apps/queue-worker/CHANGELOG.md index 54d7a0769371..b7455cad1611 100644 --- a/ee/apps/queue-worker/CHANGELOG.md +++ b/ee/apps/queue-worker/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/queue-worker +## 0.3.15-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/omnichannel-services@0.1.15-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.3.15-rc.1 ### Patch Changes diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json index a8d3c2f4863d..ad428914de89 100644 --- a/ee/apps/queue-worker/package.json +++ b/ee/apps/queue-worker/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/queue-worker", "private": true, - "version": "0.3.15-rc.1", + "version": "0.3.15-rc.2", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/stream-hub-service/CHANGELOG.md b/ee/apps/stream-hub-service/CHANGELOG.md index a36c91776fc3..0171de33960b 100644 --- a/ee/apps/stream-hub-service/CHANGELOG.md +++ b/ee/apps/stream-hub-service/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/stream-hub-service +## 0.3.15-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.3.15-rc.1 ### Patch Changes diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json index 72bd0521fe1d..2e8aa0be0fdf 100644 --- a/ee/apps/stream-hub-service/package.json +++ b/ee/apps/stream-hub-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/stream-hub-service", "private": true, - "version": "0.3.15-rc.1", + "version": "0.3.15-rc.2", "description": "Rocket.Chat Stream Hub service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/packages/api-client/CHANGELOG.md b/ee/packages/api-client/CHANGELOG.md index 1c69f9a5ee5d..6a95e7f618b8 100644 --- a/ee/packages/api-client/CHANGELOG.md +++ b/ee/packages/api-client/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/api-client +## 0.1.33-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/rest-typings@6.9.0-rc.2 +
+ ## 0.1.33-rc.1 ### Patch Changes diff --git a/ee/packages/api-client/package.json b/ee/packages/api-client/package.json index 60cf992dc4e7..a6806910f17d 100644 --- a/ee/packages/api-client/package.json +++ b/ee/packages/api-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/api-client", - "version": "0.1.33-rc.1", + "version": "0.1.33-rc.2", "devDependencies": { "@swc/core": "^1.3.95", "@swc/jest": "^0.2.29", diff --git a/ee/packages/ddp-client/CHANGELOG.md b/ee/packages/ddp-client/CHANGELOG.md index d24ff021e939..e3498cff1973 100644 --- a/ee/packages/ddp-client/CHANGELOG.md +++ b/ee/packages/ddp-client/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/ddp-client +## 0.2.24-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/rest-typings@6.9.0-rc.2 + - @rocket.chat/api-client@0.1.33-rc.2 +
+ ## 0.2.24-rc.1 ### Patch Changes diff --git a/ee/packages/ddp-client/package.json b/ee/packages/ddp-client/package.json index ef3a67401ae2..e2e6152c5da0 100644 --- a/ee/packages/ddp-client/package.json +++ b/ee/packages/ddp-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ddp-client", - "version": "0.2.24-rc.1", + "version": "0.2.24-rc.2", "devDependencies": { "@swc/core": "^1.3.95", "@swc/jest": "^0.2.29", diff --git a/ee/packages/license/CHANGELOG.md b/ee/packages/license/CHANGELOG.md index e4507990d195..7de7c5c7a76a 100644 --- a/ee/packages/license/CHANGELOG.md +++ b/ee/packages/license/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/license +## 0.1.15-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 +
+ ## 0.1.15-rc.1 ### Patch Changes diff --git a/ee/packages/license/package.json b/ee/packages/license/package.json index 542b384bb352..dcfd188c915f 100644 --- a/ee/packages/license/package.json +++ b/ee/packages/license/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/license", - "version": "0.1.15-rc.1", + "version": "0.1.15-rc.2", "private": true, "devDependencies": { "@swc/core": "^1.3.95", diff --git a/ee/packages/omnichannel-services/CHANGELOG.md b/ee/packages/omnichannel-services/CHANGELOG.md index 40cb02c93ce8..38da43b563ee 100644 --- a/ee/packages/omnichannel-services/CHANGELOG.md +++ b/ee/packages/omnichannel-services/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/omnichannel-services +## 0.1.15-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/rest-typings@6.9.0-rc.2 + - @rocket.chat/pdf-worker@0.0.39-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.1.15-rc.1 ### Patch Changes diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json index bde1aad8c06d..d81be4514245 100644 --- a/ee/packages/omnichannel-services/package.json +++ b/ee/packages/omnichannel-services/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/omnichannel-services", - "version": "0.1.15-rc.1", + "version": "0.1.15-rc.2", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/ee/packages/pdf-worker/CHANGELOG.md b/ee/packages/pdf-worker/CHANGELOG.md index 1865a9d5d790..e5ec06c74a72 100644 --- a/ee/packages/pdf-worker/CHANGELOG.md +++ b/ee/packages/pdf-worker/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/pdf-worker +## 0.0.39-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 +
+ ## 0.0.39-rc.1 ### Patch Changes diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json index 03fd2580c87c..18d0df2ca544 100644 --- a/ee/packages/pdf-worker/package.json +++ b/ee/packages/pdf-worker/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/pdf-worker", - "version": "0.0.39-rc.1", + "version": "0.0.39-rc.2", "private": true, "devDependencies": { "@storybook/addon-essentials": "~6.5.16", diff --git a/ee/packages/presence/CHANGELOG.md b/ee/packages/presence/CHANGELOG.md index 1d4e4377acb2..acc0a720bbfa 100644 --- a/ee/packages/presence/CHANGELOG.md +++ b/ee/packages/presence/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/presence +## 0.1.15-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/core-services@0.3.15-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.1.15-rc.1 ### Patch Changes diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index 651258cbc05e..3076d934a49b 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/presence", - "version": "0.1.15-rc.1", + "version": "0.1.15-rc.2", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/package.json b/package.json index f73af572ded5..d573c9750576 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket.chat", - "version": "6.9.0-rc.1", + "version": "6.9.0-rc.2", "description": "Rocket.Chat Monorepo", "main": "index.js", "private": true, diff --git a/packages/apps/CHANGELOG.md b/packages/apps/CHANGELOG.md index 291d9ff3374a..f94a58b5f2d2 100644 --- a/packages/apps/CHANGELOG.md +++ b/packages/apps/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/apps +## 0.0.6-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/model-typings@0.4.1-rc.2 +
+ ## 0.0.6-rc.1 ### Patch Changes diff --git a/packages/apps/package.json b/packages/apps/package.json index 6acec05fef52..9814bb2bf8a1 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/apps", - "version": "0.0.6-rc.1", + "version": "0.0.6-rc.2", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/core-services/CHANGELOG.md b/packages/core-services/CHANGELOG.md index 2498eb2a13bc..2d88ce51a025 100644 --- a/packages/core-services/CHANGELOG.md +++ b/packages/core-services/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/core-services +## 0.3.15-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/rest-typings@6.9.0-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.3.15-rc.1 ### Patch Changes diff --git a/packages/core-services/package.json b/packages/core-services/package.json index c8ef47139472..264d11c9405d 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/core-services", - "version": "0.3.15-rc.1", + "version": "0.3.15-rc.2", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/packages/core-typings/CHANGELOG.md b/packages/core-typings/CHANGELOG.md index b75b2dd4f2d7..46d39d336c9b 100644 --- a/packages/core-typings/CHANGELOG.md +++ b/packages/core-typings/CHANGELOG.md @@ -1,5 +1,7 @@ # @rocket.chat/core-typings +## 6.9.0-rc.2 + ## 6.9.0-rc.1 ## 6.9.0-rc.0 diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 15c4357864e8..15900820cd46 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package", "name": "@rocket.chat/core-typings", - "version": "6.9.0-rc.1", + "version": "6.9.0-rc.2", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "eslint": "~8.45.0", diff --git a/packages/cron/CHANGELOG.md b/packages/cron/CHANGELOG.md index 52586bbc4e10..087f08d89b7b 100644 --- a/packages/cron/CHANGELOG.md +++ b/packages/cron/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/cron +## 0.0.35-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.0.35-rc.1 ### Patch Changes diff --git a/packages/cron/package.json b/packages/cron/package.json index 38e603f98ab5..7f2b03a36766 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/cron", - "version": "0.0.35-rc.1", + "version": "0.0.35-rc.2", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/fuselage-ui-kit/CHANGELOG.md b/packages/fuselage-ui-kit/CHANGELOG.md index c8f2d81b3018..4bbb4f830e4e 100644 --- a/packages/fuselage-ui-kit/CHANGELOG.md +++ b/packages/fuselage-ui-kit/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## 7.0.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/gazzodown@7.0.0-rc.2 + - @rocket.chat/ui-contexts@7.0.0-rc.2 + - @rocket.chat/ui-avatar@3.0.0-rc.2 + - @rocket.chat/ui-video-conf@7.0.0-rc.2 +
+ ## 7.0.0-rc.1 ### Patch Changes diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index b134989b7695..9c23b8207fb8 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/fuselage-ui-kit", "private": true, - "version": "7.0.0-rc.1", + "version": "7.0.0-rc.2", "description": "UiKit elements for Rocket.Chat Apps built under Fuselage design system", "homepage": "https://rocketchat.github.io/Rocket.Chat.Fuselage/", "author": { @@ -50,10 +50,10 @@ "@rocket.chat/icons": "*", "@rocket.chat/prettier-config": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "3.0.0-rc.1", - "@rocket.chat/ui-contexts": "7.0.0-rc.1", + "@rocket.chat/ui-avatar": "3.0.0-rc.2", + "@rocket.chat/ui-contexts": "7.0.0-rc.2", "@rocket.chat/ui-kit": "0.34.0-rc.0", - "@rocket.chat/ui-video-conf": "7.0.0-rc.1", + "@rocket.chat/ui-video-conf": "7.0.0-rc.2", "@tanstack/react-query": "*", "react": "*", "react-dom": "*" @@ -110,7 +110,7 @@ "typescript": "~5.3.3" }, "dependencies": { - "@rocket.chat/core-typings": "6.9.0-rc.1", + "@rocket.chat/core-typings": "6.9.0-rc.2", "@rocket.chat/gazzodown": "workspace:^", "@rocket.chat/ui-kit": "workspace:~", "tslib": "^2.5.3" diff --git a/packages/gazzodown/CHANGELOG.md b/packages/gazzodown/CHANGELOG.md index 712ff52a1a26..2d7e9f817cb8 100644 --- a/packages/gazzodown/CHANGELOG.md +++ b/packages/gazzodown/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/gazzodown +## 7.0.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/ui-contexts@7.0.0-rc.2 + - @rocket.chat/ui-client@7.0.0-rc.2 +
+ ## 7.0.0-rc.1 ### Patch Changes diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index dfc54a2f1745..d0e16999e95d 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/gazzodown", - "version": "7.0.0-rc.1", + "version": "7.0.0-rc.2", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -71,8 +71,8 @@ "@rocket.chat/fuselage-tokens": "*", "@rocket.chat/message-parser": "0.31.29", "@rocket.chat/styled": "*", - "@rocket.chat/ui-client": "7.0.0-rc.1", - "@rocket.chat/ui-contexts": "7.0.0-rc.1", + "@rocket.chat/ui-client": "7.0.0-rc.2", + "@rocket.chat/ui-contexts": "7.0.0-rc.2", "katex": "*", "react": "*" }, diff --git a/packages/instance-status/CHANGELOG.md b/packages/instance-status/CHANGELOG.md index c9c5a8c5a7fe..e1a0a96e94cf 100644 --- a/packages/instance-status/CHANGELOG.md +++ b/packages/instance-status/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/instance-status +## 0.0.39-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/models@0.0.39-rc.2 +
+ ## 0.0.39-rc.1 ### Patch Changes diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json index 3e96e96e6e1a..bc522559de86 100644 --- a/packages/instance-status/package.json +++ b/packages/instance-status/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/instance-status", - "version": "0.0.39-rc.1", + "version": "0.0.39-rc.2", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/packages/livechat/CHANGELOG.md b/packages/livechat/CHANGELOG.md index 5bf12f85f8b0..709db6d02943 100644 --- a/packages/livechat/CHANGELOG.md +++ b/packages/livechat/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/livechat Change Log +## 1.17.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/gazzodown@7.0.0-rc.2 +
+ ## 1.17.0-rc.1 ### Patch Changes diff --git a/packages/livechat/package.json b/packages/livechat/package.json index 571aaff1fb22..b82ebb5c1e22 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/livechat", - "version": "1.17.0-rc.1", + "version": "1.17.0-rc.2", "files": [ "/build" ], diff --git a/packages/model-typings/CHANGELOG.md b/packages/model-typings/CHANGELOG.md index 0e2930a9ebb5..8bda5fcf284d 100644 --- a/packages/model-typings/CHANGELOG.md +++ b/packages/model-typings/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/model-typings +## 0.4.1-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 +
+ ## 0.4.1-rc.1 ### Patch Changes diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json index 309bf18b4a45..17fa7056da03 100644 --- a/packages/model-typings/package.json +++ b/packages/model-typings/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/model-typings", - "version": "0.4.1-rc.1", + "version": "0.4.1-rc.2", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/models/CHANGELOG.md b/packages/models/CHANGELOG.md index 00eb1a3921d8..65cb3723cd9b 100644 --- a/packages/models/CHANGELOG.md +++ b/packages/models/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/models +## 0.0.39-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/model-typings@0.4.1-rc.2 +
+ ## 0.0.39-rc.1 ### Patch Changes diff --git a/packages/models/package.json b/packages/models/package.json index 2b99c1eae881..2c710114dc6e 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/models", - "version": "0.0.39-rc.1", + "version": "0.0.39-rc.2", "private": true, "devDependencies": { "@swc/core": "^1.3.95", diff --git a/packages/rest-typings/CHANGELOG.md b/packages/rest-typings/CHANGELOG.md index 6045cf7f26d6..9751f74ce321 100644 --- a/packages/rest-typings/CHANGELOG.md +++ b/packages/rest-typings/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/rest-typings +## 6.9.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 +
+ ## 6.9.0-rc.1 ### Patch Changes diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 9dad92516c43..2b6966f16a02 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/rest-typings", - "version": "6.9.0-rc.1", + "version": "6.9.0-rc.2", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@types/jest": "~29.5.7", diff --git a/packages/ui-avatar/CHANGELOG.md b/packages/ui-avatar/CHANGELOG.md index 4c9e8d2b0879..b35f8784a4b2 100644 --- a/packages/ui-avatar/CHANGELOG.md +++ b/packages/ui-avatar/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/ui-avatar +## 3.0.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.2 +
+ ## 3.0.0-rc.1 ### Patch Changes diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index c74652b2f655..e037ed4de639 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-avatar", - "version": "3.0.0-rc.1", + "version": "3.0.0-rc.2", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -31,7 +31,7 @@ ], "peerDependencies": { "@rocket.chat/fuselage": "*", - "@rocket.chat/ui-contexts": "7.0.0-rc.1", + "@rocket.chat/ui-contexts": "7.0.0-rc.2", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-client/CHANGELOG.md b/packages/ui-client/CHANGELOG.md index db3cc3f213a3..0d49782d8347 100644 --- a/packages/ui-client/CHANGELOG.md +++ b/packages/ui-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/ui-client +## 7.0.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.2 +
+ ## 7.0.0-rc.1 ### Patch Changes diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index 8d26a2506848..b469357a37dd 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-client", - "version": "7.0.0-rc.1", + "version": "7.0.0-rc.2", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -63,7 +63,7 @@ "@rocket.chat/fuselage": "*", "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", - "@rocket.chat/ui-contexts": "7.0.0-rc.1", + "@rocket.chat/ui-contexts": "7.0.0-rc.2", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-contexts/CHANGELOG.md b/packages/ui-contexts/CHANGELOG.md index b9b20100cb3f..0e7571e8d9d5 100644 --- a/packages/ui-contexts/CHANGELOG.md +++ b/packages/ui-contexts/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/ui-contexts +## 7.0.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/core-typings@6.9.0-rc.2 + - @rocket.chat/rest-typings@6.9.0-rc.2 + - @rocket.chat/ddp-client@0.2.24-rc.2 +
+ ## 7.0.0-rc.1 ### Patch Changes diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index 838c6608d7a1..c4f363dd666c 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-contexts", - "version": "7.0.0-rc.1", + "version": "7.0.0-rc.2", "private": true, "devDependencies": { "@rocket.chat/core-typings": "workspace:^", diff --git a/packages/ui-video-conf/CHANGELOG.md b/packages/ui-video-conf/CHANGELOG.md index 95645481a1dd..55b72f9eb9cd 100644 --- a/packages/ui-video-conf/CHANGELOG.md +++ b/packages/ui-video-conf/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/ui-video-conf +## 7.0.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.2 + - @rocket.chat/ui-avatar@3.0.0-rc.2 +
+ ## 7.0.0-rc.1 ### Patch Changes diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index 647f2ae66ad4..d7f29253af33 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-video-conf", - "version": "7.0.0-rc.1", + "version": "7.0.0-rc.2", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -36,8 +36,8 @@ "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "3.0.0-rc.1", - "@rocket.chat/ui-contexts": "7.0.0-rc.1", + "@rocket.chat/ui-avatar": "3.0.0-rc.2", + "@rocket.chat/ui-contexts": "7.0.0-rc.2", "react": "^17.0.2", "react-dom": "^17.0.2" }, diff --git a/packages/uikit-playground/CHANGELOG.md b/packages/uikit-playground/CHANGELOG.md index 15312b673f24..712c0e16ef49 100644 --- a/packages/uikit-playground/CHANGELOG.md +++ b/packages/uikit-playground/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/uikit-playground +## 0.2.23-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/fuselage-ui-kit@7.0.0-rc.2 + - @rocket.chat/ui-contexts@7.0.0-rc.2 + - @rocket.chat/ui-avatar@3.0.0-rc.2 +
+ ## 0.2.23-rc.1 ### Patch Changes diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index d1cf7c33a9ed..b36ba6db006f 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/uikit-playground", "private": true, - "version": "0.2.23-rc.1", + "version": "0.2.23-rc.2", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/web-ui-registration/CHANGELOG.md b/packages/web-ui-registration/CHANGELOG.md index 70a6fbc7407b..59bb730f4c06 100644 --- a/packages/web-ui-registration/CHANGELOG.md +++ b/packages/web-ui-registration/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/web-ui-registration +## 7.0.0-rc.2 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0-rc.2 +
+ ## 7.0.0-rc.1 ### Patch Changes diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index a51f819af385..616bf23b9151 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/web-ui-registration", - "version": "7.0.0-rc.1", + "version": "7.0.0-rc.2", "private": true, "homepage": "https://rocket.chat", "main": "./dist/index.js", @@ -51,7 +51,7 @@ "peerDependencies": { "@rocket.chat/layout": "*", "@rocket.chat/tools": "0.2.1", - "@rocket.chat/ui-contexts": "7.0.0-rc.1", + "@rocket.chat/ui-contexts": "7.0.0-rc.2", "@tanstack/react-query": "*", "react": "*", "react-hook-form": "*", diff --git a/yarn.lock b/yarn.lock index a4e266175002..b9ac4faf2031 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8795,10 +8795,10 @@ __metadata: "@rocket.chat/icons": "*" "@rocket.chat/prettier-config": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 3.0.0-rc.0 - "@rocket.chat/ui-contexts": 7.0.0-rc.0 + "@rocket.chat/ui-avatar": 3.0.0-rc.1 + "@rocket.chat/ui-contexts": 7.0.0-rc.1 "@rocket.chat/ui-kit": 0.34.0-rc.0 - "@rocket.chat/ui-video-conf": 7.0.0-rc.0 + "@rocket.chat/ui-video-conf": 7.0.0-rc.1 "@tanstack/react-query": "*" react: "*" react-dom: "*" @@ -8887,8 +8887,8 @@ __metadata: "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/message-parser": 0.31.29 "@rocket.chat/styled": "*" - "@rocket.chat/ui-client": 7.0.0-rc.0 - "@rocket.chat/ui-contexts": 7.0.0-rc.0 + "@rocket.chat/ui-client": 7.0.0-rc.1 + "@rocket.chat/ui-contexts": 7.0.0-rc.1 katex: "*" react: "*" languageName: unknown @@ -10106,7 +10106,7 @@ __metadata: typescript: ~5.3.3 peerDependencies: "@rocket.chat/fuselage": "*" - "@rocket.chat/ui-contexts": 7.0.0-rc.0 + "@rocket.chat/ui-contexts": 7.0.0-rc.1 react: ~17.0.2 languageName: unknown linkType: soft @@ -10159,7 +10159,7 @@ __metadata: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" - "@rocket.chat/ui-contexts": 7.0.0-rc.0 + "@rocket.chat/ui-contexts": 7.0.0-rc.1 react: ~17.0.2 languageName: unknown linkType: soft @@ -10335,8 +10335,8 @@ __metadata: "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 3.0.0-rc.0 - "@rocket.chat/ui-contexts": 7.0.0-rc.0 + "@rocket.chat/ui-avatar": 3.0.0-rc.1 + "@rocket.chat/ui-contexts": 7.0.0-rc.1 react: ^17.0.2 react-dom: ^17.0.2 languageName: unknown @@ -10426,7 +10426,7 @@ __metadata: peerDependencies: "@rocket.chat/layout": "*" "@rocket.chat/tools": 0.2.1 - "@rocket.chat/ui-contexts": 7.0.0-rc.0 + "@rocket.chat/ui-contexts": 7.0.0-rc.1 "@tanstack/react-query": "*" react: "*" react-hook-form: "*" From 3b820dcd208302b880dfea14b26962e8c63a87ce Mon Sep 17 00:00:00 2001 From: rocketchat-github-ci Date: Sun, 2 Jun 2024 23:56:54 +0000 Subject: [PATCH 19/29] Release 6.9.0 [no ci] --- .changeset/angry-rocks-try.md | 5 - .changeset/breezy-geckos-sparkle.md | 5 - .changeset/bump-patch-1716905283526.md | 5 - .changeset/bump-patch-1717194531681.md | 5 - .changeset/chilly-poems-explode.md | 7 -- .changeset/cold-beds-hope.md | 5 - .changeset/cuddly-owls-join.md | 5 - .changeset/fair-grapes-thank.md | 5 - .changeset/flat-starfishes-crash.md | 5 - .changeset/fresh-students-remember.md | 5 - .changeset/gorgeous-lizards-shave.md | 6 - .changeset/lazy-gorilas-shop.md | 6 - .changeset/nasty-swans-compete.md | 9 -- .changeset/ninety-rivers-mix.md | 6 - .changeset/pre.json | 98 ---------------- .changeset/rich-bananas-complain.md | 5 - .changeset/serious-bottles-tie.md | 5 - .changeset/shiny-crabs-peel.md | 5 - .changeset/shy-oranges-provide.md | 5 - .changeset/silly-clocks-return.md | 7 -- .changeset/smooth-knives-turn.md | 7 -- .changeset/strange-bears-dance.md | 5 - .changeset/strong-humans-bow.md | 6 - .changeset/tall-wombats-love.md | 5 - .changeset/unlucky-berries-guess.md | 5 - .changeset/warm-squids-deliver.md | 5 - .changeset/weak-starfishes-fail.md | 5 - .changeset/weak-turkeys-sit.md | 8 -- .changeset/wicked-points-deliver.md | 9 -- .changeset/wild-teachers-design.md | 7 -- .changeset/wise-pianos-explode.md | 5 - .changeset/yellow-lies-judge.md | 5 - .changeset/young-yaks-suffer.md | 5 - apps/meteor/CHANGELOG.md | 106 ++++++++++++++++++ apps/meteor/app/utils/rocketchat.info | 2 +- apps/meteor/ee/server/services/CHANGELOG.md | 14 +++ apps/meteor/ee/server/services/package.json | 2 +- apps/meteor/package.json | 2 +- ee/apps/account-service/CHANGELOG.md | 13 +++ ee/apps/account-service/package.json | 2 +- ee/apps/authorization-service/CHANGELOG.md | 13 +++ ee/apps/authorization-service/package.json | 2 +- ee/apps/ddp-streamer/CHANGELOG.md | 15 +++ ee/apps/ddp-streamer/package.json | 2 +- ee/apps/omnichannel-transcript/CHANGELOG.md | 14 +++ ee/apps/omnichannel-transcript/package.json | 2 +- ee/apps/presence-service/CHANGELOG.md | 13 +++ ee/apps/presence-service/package.json | 2 +- ee/apps/queue-worker/CHANGELOG.md | 13 +++ ee/apps/queue-worker/package.json | 2 +- ee/apps/stream-hub-service/CHANGELOG.md | 12 ++ ee/apps/stream-hub-service/package.json | 2 +- ee/packages/api-client/CHANGELOG.md | 10 ++ ee/packages/api-client/package.json | 2 +- ee/packages/ddp-client/CHANGELOG.md | 10 ++ ee/packages/ddp-client/package.json | 2 +- ee/packages/license/CHANGELOG.md | 9 ++ ee/packages/license/package.json | 2 +- ee/packages/omnichannel-services/CHANGELOG.md | 18 +++ ee/packages/omnichannel-services/package.json | 2 +- ee/packages/pdf-worker/CHANGELOG.md | 11 ++ ee/packages/pdf-worker/package.json | 2 +- ee/packages/presence/CHANGELOG.md | 11 ++ ee/packages/presence/package.json | 2 +- package.json | 2 +- packages/apps/CHANGELOG.md | 10 ++ packages/apps/package.json | 2 +- packages/core-services/CHANGELOG.md | 16 +++ packages/core-services/package.json | 2 +- packages/core-typings/CHANGELOG.md | 15 +++ packages/core-typings/package.json | 2 +- packages/cron/CHANGELOG.md | 10 ++ packages/cron/package.json | 2 +- packages/fuselage-ui-kit/CHANGELOG.md | 20 ++++ packages/fuselage-ui-kit/package.json | 12 +- packages/gazzodown/CHANGELOG.md | 11 ++ packages/gazzodown/package.json | 6 +- packages/i18n/CHANGELOG.md | 12 ++ packages/i18n/package.json | 2 +- packages/instance-status/CHANGELOG.md | 9 ++ packages/instance-status/package.json | 2 +- packages/livechat/CHANGELOG.md | 14 +++ packages/livechat/package.json | 2 +- packages/mock-providers/CHANGELOG.md | 9 ++ packages/mock-providers/package.json | 2 +- packages/model-typings/CHANGELOG.md | 9 ++ packages/model-typings/package.json | 2 +- packages/models/CHANGELOG.md | 9 ++ packages/models/package.json | 2 +- packages/rest-typings/CHANGELOG.md | 14 +++ packages/rest-typings/package.json | 2 +- packages/ui-avatar/CHANGELOG.md | 9 ++ packages/ui-avatar/package.json | 4 +- packages/ui-client/CHANGELOG.md | 9 ++ packages/ui-client/package.json | 4 +- packages/ui-contexts/CHANGELOG.md | 12 ++ packages/ui-contexts/package.json | 2 +- packages/ui-kit/CHANGELOG.md | 6 + packages/ui-kit/package.json | 2 +- packages/ui-video-conf/CHANGELOG.md | 10 ++ packages/ui-video-conf/package.json | 6 +- packages/uikit-playground/CHANGELOG.md | 11 ++ packages/uikit-playground/package.json | 2 +- packages/web-ui-registration/CHANGELOG.md | 9 ++ packages/web-ui-registration/package.json | 4 +- yarn.lock | 20 ++-- 106 files changed, 565 insertions(+), 340 deletions(-) delete mode 100644 .changeset/angry-rocks-try.md delete mode 100644 .changeset/breezy-geckos-sparkle.md delete mode 100644 .changeset/bump-patch-1716905283526.md delete mode 100644 .changeset/bump-patch-1717194531681.md delete mode 100644 .changeset/chilly-poems-explode.md delete mode 100644 .changeset/cold-beds-hope.md delete mode 100644 .changeset/cuddly-owls-join.md delete mode 100644 .changeset/fair-grapes-thank.md delete mode 100644 .changeset/flat-starfishes-crash.md delete mode 100644 .changeset/fresh-students-remember.md delete mode 100644 .changeset/gorgeous-lizards-shave.md delete mode 100644 .changeset/lazy-gorilas-shop.md delete mode 100644 .changeset/nasty-swans-compete.md delete mode 100644 .changeset/ninety-rivers-mix.md delete mode 100644 .changeset/pre.json delete mode 100644 .changeset/rich-bananas-complain.md delete mode 100644 .changeset/serious-bottles-tie.md delete mode 100644 .changeset/shiny-crabs-peel.md delete mode 100644 .changeset/shy-oranges-provide.md delete mode 100644 .changeset/silly-clocks-return.md delete mode 100644 .changeset/smooth-knives-turn.md delete mode 100644 .changeset/strange-bears-dance.md delete mode 100644 .changeset/strong-humans-bow.md delete mode 100644 .changeset/tall-wombats-love.md delete mode 100644 .changeset/unlucky-berries-guess.md delete mode 100644 .changeset/warm-squids-deliver.md delete mode 100644 .changeset/weak-starfishes-fail.md delete mode 100644 .changeset/weak-turkeys-sit.md delete mode 100644 .changeset/wicked-points-deliver.md delete mode 100644 .changeset/wild-teachers-design.md delete mode 100644 .changeset/wise-pianos-explode.md delete mode 100644 .changeset/yellow-lies-judge.md delete mode 100644 .changeset/young-yaks-suffer.md diff --git a/.changeset/angry-rocks-try.md b/.changeset/angry-rocks-try.md deleted file mode 100644 index 8072b9db48fb..000000000000 --- a/.changeset/angry-rocks-try.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed an issue causing monitors to dissapear from a saved unit every time a user saved the item. This was caused by the UI not sending the correct _id of the monitors that were already saved, and this caused the Backend to ignore them and remove from the list. diff --git a/.changeset/breezy-geckos-sparkle.md b/.changeset/breezy-geckos-sparkle.md deleted file mode 100644 index c64ffe920282..000000000000 --- a/.changeset/breezy-geckos-sparkle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fix an issue where read receipts menu item wasn't considering the enabled setting to be displayed diff --git a/.changeset/bump-patch-1716905283526.md b/.changeset/bump-patch-1716905283526.md deleted file mode 100644 index e1eaa7980afb..000000000000 --- a/.changeset/bump-patch-1716905283526.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Bump @rocket.chat/meteor version. diff --git a/.changeset/bump-patch-1717194531681.md b/.changeset/bump-patch-1717194531681.md deleted file mode 100644 index e1eaa7980afb..000000000000 --- a/.changeset/bump-patch-1717194531681.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Bump @rocket.chat/meteor version. diff --git a/.changeset/chilly-poems-explode.md b/.changeset/chilly-poems-explode.md deleted file mode 100644 index 17acf3c5ba85..000000000000 --- a/.changeset/chilly-poems-explode.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@rocket.chat/meteor": minor -"@rocket.chat/core-typings": minor -"@rocket.chat/i18n": patch ---- - -Introduced a tab layout to the users page and implemented a tab called "All" that lists all users. diff --git a/.changeset/cold-beds-hope.md b/.changeset/cold-beds-hope.md deleted file mode 100644 index 33fc910e424f..000000000000 --- a/.changeset/cold-beds-hope.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fixes an issue not allowing override retention policy in channels diff --git a/.changeset/cuddly-owls-join.md b/.changeset/cuddly-owls-join.md deleted file mode 100644 index 0ace3d145d37..000000000000 --- a/.changeset/cuddly-owls-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fixed an issue that prevented CAS users from being merged with existing user data on login diff --git a/.changeset/fair-grapes-thank.md b/.changeset/fair-grapes-thank.md deleted file mode 100644 index 2d8962f40db9..000000000000 --- a/.changeset/fair-grapes-thank.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": minor ---- - -Allow visitors & integrations to access downloaded files after a room has closed. This was a known limitation in our codebase, where visitors were only able to access uploaded files in a livechat conversation while the conversation was open. diff --git a/.changeset/flat-starfishes-crash.md b/.changeset/flat-starfishes-crash.md deleted file mode 100644 index 9c5bb2425f19..000000000000 --- a/.changeset/flat-starfishes-crash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fixed a problem in how server was processing errors that was sending 2 ephemeral error messages when @all or @here were used while they were disabled via permissions diff --git a/.changeset/fresh-students-remember.md b/.changeset/fresh-students-remember.md deleted file mode 100644 index 50b422f6b7dd..000000000000 --- a/.changeset/fresh-students-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed an issue where translations would fallback to english some of the times. diff --git a/.changeset/gorgeous-lizards-shave.md b/.changeset/gorgeous-lizards-shave.md deleted file mode 100644 index d02d3cb80599..000000000000 --- a/.changeset/gorgeous-lizards-shave.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@rocket.chat/meteor": minor -"@rocket.chat/livechat": minor ---- - -Makes the triggers fired by the condition `after-guest-registration` persist on the livechat client, it will persist through reloads and pagination, only reseting when a conversation is closed (no changes were done on the agent side of the conversation) diff --git a/.changeset/lazy-gorilas-shop.md b/.changeset/lazy-gorilas-shop.md deleted file mode 100644 index c71610f703fc..000000000000 --- a/.changeset/lazy-gorilas-shop.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/i18n": patch ---- - -Fixed an issue with object storage settings that was not allowing admins to decide if files generated via "Export conversation" feature were being proxied through server or not. diff --git a/.changeset/nasty-swans-compete.md b/.changeset/nasty-swans-compete.md deleted file mode 100644 index 7cf912e3f075..000000000000 --- a/.changeset/nasty-swans-compete.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/core-services": patch -"@rocket.chat/omnichannel-services": patch -"@rocket.chat/pdf-worker": patch ---- - -Fixed multiple issues with PDF generation logic when a quoted message was too big to fit in one single page. This was causing an internal infinite loop within the library (as it tried to make it fit, failing and then trying to fit on next page where the same happened thus causing a loop). -The library was not able to break down some nested views and thus was trying to fit the whole quote on one single page. Logic was updated to allow wrapping of the contents when messages are quoted (so they can span multiple lines) and removed a bunch of unnecesary views from the code. diff --git a/.changeset/ninety-rivers-mix.md b/.changeset/ninety-rivers-mix.md deleted file mode 100644 index fbd10b2a04d1..000000000000 --- a/.changeset/ninety-rivers-mix.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@rocket.chat/meteor": patch -"@rocket.chat/rest-typings": minor ---- - -Fixed issue with "Export room as file" feature (`rooms.export` endpoint) generating an empty export when given an invalid date diff --git a/.changeset/pre.json b/.changeset/pre.json deleted file mode 100644 index fb96fe2739cd..000000000000 --- a/.changeset/pre.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "mode": "pre", - "tag": "rc", - "initialVersions": { - "@rocket.chat/meteor": "6.9.0-develop", - "rocketchat-services": "1.1.32", - "@rocket.chat/account-service": "0.3.13", - "@rocket.chat/authorization-service": "0.3.14", - "@rocket.chat/ddp-streamer": "0.2.13", - "@rocket.chat/omnichannel-transcript": "0.3.14", - "@rocket.chat/presence-service": "0.3.14", - "@rocket.chat/queue-worker": "0.3.14", - "@rocket.chat/stream-hub-service": "0.3.14", - "@rocket.chat/api-client": "0.1.32", - "@rocket.chat/ddp-client": "0.2.23", - "@rocket.chat/license": "0.1.14", - "@rocket.chat/omnichannel-services": "0.1.14", - "@rocket.chat/pdf-worker": "0.0.38", - "@rocket.chat/presence": "0.1.14", - "@rocket.chat/ui-theming": "0.1.2", - "@rocket.chat/account-utils": "0.0.2", - "@rocket.chat/agenda": "0.1.0", - "@rocket.chat/apps": "0.0.5", - "@rocket.chat/base64": "1.0.13", - "@rocket.chat/cas-validate": "0.0.2", - "@rocket.chat/core-services": "0.3.14", - "@rocket.chat/core-typings": "6.9.0-develop", - "@rocket.chat/cron": "0.0.34", - "@rocket.chat/eslint-config": "0.7.0", - "@rocket.chat/favicon": "0.0.2", - "@rocket.chat/fuselage-ui-kit": "6.0.0", - "@rocket.chat/gazzodown": "6.0.0", - "@rocket.chat/i18n": "0.3.0", - "@rocket.chat/instance-status": "0.0.38", - "@rocket.chat/jwt": "0.1.1", - "@rocket.chat/livechat": "1.16.0", - "@rocket.chat/log-format": "0.0.2", - "@rocket.chat/logger": "0.0.2", - "@rocket.chat/message-parser": "0.31.29", - "@rocket.chat/mock-providers": "0.0.6", - "@rocket.chat/model-typings": "0.4.0", - "@rocket.chat/models": "0.0.38", - "@rocket.chat/poplib": "0.0.2", - "@rocket.chat/password-policies": "0.0.2", - "@rocket.chat/patch-injection": "0.0.1", - "@rocket.chat/peggy-loader": "0.31.25", - "@rocket.chat/random": "1.2.2", - "@rocket.chat/release-action": "2.2.3", - "@rocket.chat/release-changelog": "0.1.0", - "@rocket.chat/rest-typings": "6.9.0-develop", - "@rocket.chat/server-cloud-communication": "0.0.2", - "@rocket.chat/server-fetch": "0.0.3", - "@rocket.chat/sha256": "1.0.10", - "@rocket.chat/tools": "0.2.1", - "@rocket.chat/ui-avatar": "2.0.0", - "@rocket.chat/ui-client": "6.0.0", - "@rocket.chat/ui-composer": "0.1.0", - "@rocket.chat/ui-contexts": "6.0.0", - "@rocket.chat/ui-kit": "0.33.0", - "@rocket.chat/ui-video-conf": "6.0.0", - "@rocket.chat/uikit-playground": "0.2.22", - "@rocket.chat/web-ui-registration": "6.0.0" - }, - "changesets": [ - "angry-rocks-try", - "breezy-geckos-sparkle", - "bump-patch-1716905283526", - "bump-patch-1717194531681", - "chilly-poems-explode", - "cold-beds-hope", - "cuddly-owls-join", - "fair-grapes-thank", - "flat-starfishes-crash", - "fresh-students-remember", - "gorgeous-lizards-shave", - "lazy-gorilas-shop", - "nasty-swans-compete", - "ninety-rivers-mix", - "rich-bananas-complain", - "serious-bottles-tie", - "shiny-crabs-peel", - "shy-oranges-provide", - "silly-clocks-return", - "smooth-knives-turn", - "strange-bears-dance", - "strong-humans-bow", - "tall-wombats-love", - "unlucky-berries-guess", - "warm-squids-deliver", - "weak-starfishes-fail", - "weak-turkeys-sit", - "wicked-points-deliver", - "wild-teachers-design", - "wise-pianos-explode", - "yellow-lies-judge", - "young-yaks-suffer" - ] -} diff --git a/.changeset/rich-bananas-complain.md b/.changeset/rich-bananas-complain.md deleted file mode 100644 index 9ddaf098c948..000000000000 --- a/.changeset/rich-bananas-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fixed an issue on Users converter that was not returning the `statusText` property from users even when the typing indicated property existed. diff --git a/.changeset/serious-bottles-tie.md b/.changeset/serious-bottles-tie.md deleted file mode 100644 index e12bb94a5310..000000000000 --- a/.changeset/serious-bottles-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fix user not being set as online when setting "Use REST instead of websocket for Meteor calls" is disabled diff --git a/.changeset/shiny-crabs-peel.md b/.changeset/shiny-crabs-peel.md deleted file mode 100644 index f4d066827bfc..000000000000 --- a/.changeset/shiny-crabs-peel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/fuselage-ui-kit': patch ---- - -Fix translation param on video conf joined message diff --git a/.changeset/shy-oranges-provide.md b/.changeset/shy-oranges-provide.md deleted file mode 100644 index 7141a58da575..000000000000 --- a/.changeset/shy-oranges-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixes link image preview not opening in gallery mode diff --git a/.changeset/silly-clocks-return.md b/.changeset/silly-clocks-return.md deleted file mode 100644 index 0505580a477a..000000000000 --- a/.changeset/silly-clocks-return.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@rocket.chat/omnichannel-services': patch -'@rocket.chat/core-services': patch -'@rocket.chat/meteor': patch ---- - -Fixed error handling for files bigger than NATS max allowed payload. This should prevent PDFs from erroring out when generating from rooms that contain heavy images. diff --git a/.changeset/smooth-knives-turn.md b/.changeset/smooth-knives-turn.md deleted file mode 100644 index 3964ecc8481b..000000000000 --- a/.changeset/smooth-knives-turn.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Executing a logout and login action in the same "tab/instance", some streams were not being recreated, causing countless types of bugs. - -PS: as a workaround reloading after logout or login in also solves the problem. diff --git a/.changeset/strange-bears-dance.md b/.changeset/strange-bears-dance.md deleted file mode 100644 index 49ea972c8fe4..000000000000 --- a/.changeset/strange-bears-dance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': minor ---- - -Adds CheckOption to departments multi selects improving options visibility state diff --git a/.changeset/strong-humans-bow.md b/.changeset/strong-humans-bow.md deleted file mode 100644 index b718cbe7fedd..000000000000 --- a/.changeset/strong-humans-bow.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@rocket.chat/fuselage-ui-kit": minor -"@rocket.chat/ui-kit": minor ---- - -Introduced new elements for apps to select channels diff --git a/.changeset/tall-wombats-love.md b/.changeset/tall-wombats-love.md deleted file mode 100644 index 80f4d2c494da..000000000000 --- a/.changeset/tall-wombats-love.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Replaces the burger menu with an appropriate button fixing the semantics and mismatching color diff --git a/.changeset/unlucky-berries-guess.md b/.changeset/unlucky-berries-guess.md deleted file mode 100644 index 5a4cc9aba3e9..000000000000 --- a/.changeset/unlucky-berries-guess.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': minor ---- - -Replace the read receipt receipt indicator in order to improve the accessibility complience diff --git a/.changeset/warm-squids-deliver.md b/.changeset/warm-squids-deliver.md deleted file mode 100644 index 0ec0a9407993..000000000000 --- a/.changeset/warm-squids-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': minor ---- - -Changes the scrollbar color in order to improve the contrast and accessibility compliance diff --git a/.changeset/weak-starfishes-fail.md b/.changeset/weak-starfishes-fail.md deleted file mode 100644 index 38e510229f6e..000000000000 --- a/.changeset/weak-starfishes-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -Fixes the missing spacing on don`t ask again checkbox inside modals diff --git a/.changeset/weak-turkeys-sit.md b/.changeset/weak-turkeys-sit.md deleted file mode 100644 index c4673b9d049d..000000000000 --- a/.changeset/weak-turkeys-sit.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed a bad behavior with the interaction between OTR system messages & trash collection. We use trash collection as a temporary storage that holds recently deleted items from some collections. Messages is one of those. This was causing "User joined OTR" messages to be viewable when querying the trash collection. -Since OTR messages are by definition private, code was updated to bypass trash collection when removing these special messages. - -Note: this only applies to these system messages. OTR user's messages are not stored on the database. diff --git a/.changeset/wicked-points-deliver.md b/.changeset/wicked-points-deliver.md deleted file mode 100644 index 91985578917f..000000000000 --- a/.changeset/wicked-points-deliver.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -This fuselage`s bump fixes: -- The message toolbar visibility on hover (Firefox ESR) -- `Bubble` missing font-family - -[more details](https://github.com/RocketChat/fuselage/releases/tag/%40rocket.chat%2Ffuselage%400.53.7) diff --git a/.changeset/wild-teachers-design.md b/.changeset/wild-teachers-design.md deleted file mode 100644 index f49f4549e762..000000000000 --- a/.changeset/wild-teachers-design.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"@rocket.chat/meteor": minor -"@rocket.chat/core-typings": minor -"@rocket.chat/i18n": minor ---- - -Added "Rocket.Chat Cloud Workspace ID" to workspace statistics page diff --git a/.changeset/wise-pianos-explode.md b/.changeset/wise-pianos-explode.md deleted file mode 100644 index 3473275e20ab..000000000000 --- a/.changeset/wise-pianos-explode.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -Fixed issue with external users being able to reset their passwords even when the "Allow Password Change for OAuth Users" setting is disabled diff --git a/.changeset/yellow-lies-judge.md b/.changeset/yellow-lies-judge.md deleted file mode 100644 index 15bc8e0819bd..000000000000 --- a/.changeset/yellow-lies-judge.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@rocket.chat/meteor": patch ---- - -fixed Engagement Dashboard and Device Management admin pages loading indefinitely diff --git a/.changeset/young-yaks-suffer.md b/.changeset/young-yaks-suffer.md deleted file mode 100644 index b3a1d7b09fef..000000000000 --- a/.changeset/young-yaks-suffer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@rocket.chat/meteor': patch ---- - -bump fuselage adding `AttachmentAuthorName` missing color token diff --git a/apps/meteor/CHANGELOG.md b/apps/meteor/CHANGELOG.md index 4135ee33bb68..1f1b39852c7b 100644 --- a/apps/meteor/CHANGELOG.md +++ b/apps/meteor/CHANGELOG.md @@ -1,5 +1,111 @@ # @rocket.chat/meteor +## 6.9.0 + +### Minor Changes + +- ([#31917](https://github.com/RocketChat/Rocket.Chat/pull/31917)) Introduced a tab layout to the users page and implemented a tab called "All" that lists all users. + +- ([#32439](https://github.com/RocketChat/Rocket.Chat/pull/32439)) Allow visitors & integrations to access downloaded files after a room has closed. This was a known limitation in our codebase, where visitors were only able to access uploaded files in a livechat conversation while the conversation was open. + +- ([#32233](https://github.com/RocketChat/Rocket.Chat/pull/32233)) Makes the triggers fired by the condition `after-guest-registration` persist on the livechat client, it will persist through reloads and pagination, only reseting when a conversation is closed (no changes were done on the agent side of the conversation) + +- ([#32193](https://github.com/RocketChat/Rocket.Chat/pull/32193)) Adds CheckOption to departments multi selects improving options visibility state + +- ([#32317](https://github.com/RocketChat/Rocket.Chat/pull/32317)) Replace the read receipt receipt indicator in order to improve the accessibility complience + +- ([#32341](https://github.com/RocketChat/Rocket.Chat/pull/32341)) Changes the scrollbar color in order to improve the contrast and accessibility compliance + +- ([#32298](https://github.com/RocketChat/Rocket.Chat/pull/32298)) Added "Rocket.Chat Cloud Workspace ID" to workspace statistics page + +### Patch Changes + +- ([#32393](https://github.com/RocketChat/Rocket.Chat/pull/32393)) Fixed an issue causing monitors to dissapear from a saved unit every time a user saved the item. This was caused by the UI not sending the correct \_id of the monitors that were already saved, and this caused the Backend to ignore them and remove from the list. + +- ([#31695](https://github.com/RocketChat/Rocket.Chat/pull/31695)) Fix an issue where read receipts menu item wasn't considering the enabled setting to be displayed + +- Bump @rocket.chat/meteor version. + +- Bump @rocket.chat/meteor version. + +- Bump @rocket.chat/meteor version. + +- ([#32454](https://github.com/RocketChat/Rocket.Chat/pull/32454)) Fixes an issue not allowing override retention policy in channels + +- ([#32444](https://github.com/RocketChat/Rocket.Chat/pull/32444)) Fixed an issue that prevented CAS users from being merged with existing user data on login + +- ([#32289](https://github.com/RocketChat/Rocket.Chat/pull/32289)) Fixed a problem in how server was processing errors that was sending 2 ephemeral error messages when @all or @here were used while they were disabled via permissions + +- ([#32348](https://github.com/RocketChat/Rocket.Chat/pull/32348)) Fixed an issue where translations would fallback to english some of the times. + +- ([#32182](https://github.com/RocketChat/Rocket.Chat/pull/32182)) Fixed an issue with object storage settings that was not allowing admins to decide if files generated via "Export conversation" feature were being proxied through server or not. + +- ([#32311](https://github.com/RocketChat/Rocket.Chat/pull/32311)) Fixed multiple issues with PDF generation logic when a quoted message was too big to fit in one single page. This was causing an internal infinite loop within the library (as it tried to make it fit, failing and then trying to fit on next page where the same happened thus causing a loop). + The library was not able to break down some nested views and thus was trying to fit the whole quote on one single page. Logic was updated to allow wrapping of the contents when messages are quoted (so they can span multiple lines) and removed a bunch of unnecesary views from the code. +- ([#32364](https://github.com/RocketChat/Rocket.Chat/pull/32364)) Fixed issue with "Export room as file" feature (`rooms.export` endpoint) generating an empty export when given an invalid date + +- ([#32314](https://github.com/RocketChat/Rocket.Chat/pull/32314)) Fixed an issue on Users converter that was not returning the `statusText` property from users even when the typing indicated property existed. + +- ([#32500](https://github.com/RocketChat/Rocket.Chat/pull/32500)) Fix user not being set as online when setting "Use REST instead of websocket for Meteor calls" is disabled + +- ([#32391](https://github.com/RocketChat/Rocket.Chat/pull/32391)) Fixes link image preview not opening in gallery mode + +- ([#32318](https://github.com/RocketChat/Rocket.Chat/pull/32318)) Fixed error handling for files bigger than NATS max allowed payload. This should prevent PDFs from erroring out when generating from rooms that contain heavy images. + +- ([#32479](https://github.com/RocketChat/Rocket.Chat/pull/32479)) Executing a logout and login action in the same "tab/instance", some streams were not being recreated, causing countless types of bugs. + + PS: as a workaround reloading after logout or login in also solves the problem. + +- ([#32345](https://github.com/RocketChat/Rocket.Chat/pull/32345)) Replaces the burger menu with an appropriate button fixing the semantics and mismatching color + +- ([#32414](https://github.com/RocketChat/Rocket.Chat/pull/32414)) Fixes the missing spacing on don`t ask again checkbox inside modals + +- ([#32269](https://github.com/RocketChat/Rocket.Chat/pull/32269)) Fixed a bad behavior with the interaction between OTR system messages & trash collection. We use trash collection as a temporary storage that holds recently deleted items from some collections. Messages is one of those. This was causing "User joined OTR" messages to be viewable when querying the trash collection. + Since OTR messages are by definition private, code was updated to bypass trash collection when removing these special messages. + + Note: this only applies to these system messages. OTR user's messages are not stored on the database. + +- ([#32415](https://github.com/RocketChat/Rocket.Chat/pull/32415)) This fuselage`s bump fixes: + + - The message toolbar visibility on hover (Firefox ESR) + - `Bubble` missing font-family + + [more details](https://github.com/RocketChat/fuselage/releases/tag/%40rocket.chat%2Ffuselage%400.53.7) + +- ([#32398](https://github.com/RocketChat/Rocket.Chat/pull/32398)) Fixed issue with external users being able to reset their passwords even when the "Allow Password Change for OAuth Users" setting is disabled + +- ([#32284](https://github.com/RocketChat/Rocket.Chat/pull/32284)) fixed Engagement Dashboard and Device Management admin pages loading indefinitely + +- ([#32342](https://github.com/RocketChat/Rocket.Chat/pull/32342)) bump fuselage adding `AttachmentAuthorName` missing color token + +-
Updated dependencies [ff4e396416, bc50dd54a2, ad86761209, f83bd56cc5, 6205ef14f0, 724ba3a729, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/i18n@0.4.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/omnichannel-services@0.1.15 + - @rocket.chat/pdf-worker@0.0.39 + - @rocket.chat/rest-typings@6.9.0 + - @rocket.chat/fuselage-ui-kit@7.0.0 + - @rocket.chat/ui-kit@0.34.0 + - @rocket.chat/api-client@0.1.33 + - @rocket.chat/license@0.1.15 + - @rocket.chat/presence@0.1.15 + - @rocket.chat/apps@0.0.6 + - @rocket.chat/cron@0.0.35 + - @rocket.chat/gazzodown@7.0.0 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/ui-contexts@7.0.0 + - @rocket.chat/web-ui-registration@7.0.0 + - @rocket.chat/server-cloud-communication@0.0.2 + - @rocket.chat/models@0.0.39 + - @rocket.chat/ui-theming@0.1.2 + - @rocket.chat/ui-avatar@3.0.0 + - @rocket.chat/ui-client@7.0.0 + - @rocket.chat/ui-video-conf@7.0.0 + - @rocket.chat/instance-status@0.0.39 +
+ ## 6.9.0-rc.2 ### Patch Changes diff --git a/apps/meteor/app/utils/rocketchat.info b/apps/meteor/app/utils/rocketchat.info index 0c1a9c86fc83..4665efe41ce2 100644 --- a/apps/meteor/app/utils/rocketchat.info +++ b/apps/meteor/app/utils/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "6.9.0-rc.2" + "version": "6.9.0" } diff --git a/apps/meteor/ee/server/services/CHANGELOG.md b/apps/meteor/ee/server/services/CHANGELOG.md index f2992b627ab2..9436cdfd7f00 100644 --- a/apps/meteor/ee/server/services/CHANGELOG.md +++ b/apps/meteor/ee/server/services/CHANGELOG.md @@ -1,5 +1,19 @@ # rocketchat-services +## 1.1.33 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/rest-typings@6.9.0 + - @rocket.chat/ui-kit@0.34.0 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/models@0.0.39 +
+ ## 1.1.33-rc.2 ### Patch Changes diff --git a/apps/meteor/ee/server/services/package.json b/apps/meteor/ee/server/services/package.json index 160b995470fa..c2119b1d3b24 100644 --- a/apps/meteor/ee/server/services/package.json +++ b/apps/meteor/ee/server/services/package.json @@ -1,7 +1,7 @@ { "name": "rocketchat-services", "private": true, - "version": "1.1.33-rc.2", + "version": "1.1.33", "description": "Rocket.Chat Authorization service", "main": "index.js", "scripts": { diff --git a/apps/meteor/package.json b/apps/meteor/package.json index d8c501425e94..77120b4c9a70 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/meteor", "description": "The Ultimate Open Source WebChat Platform", - "version": "6.9.0-rc.2", + "version": "6.9.0", "private": true, "author": { "name": "Rocket.Chat", diff --git a/ee/apps/account-service/CHANGELOG.md b/ee/apps/account-service/CHANGELOG.md index e706d2edf128..39eaf3f73387 100644 --- a/ee/apps/account-service/CHANGELOG.md +++ b/ee/apps/account-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/account-service +## 0.3.14 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/rest-typings@6.9.0 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/models@0.0.39 +
+ ## 0.3.14-rc.2 ### Patch Changes diff --git a/ee/apps/account-service/package.json b/ee/apps/account-service/package.json index 8795dfbe633c..6abc5aa783bc 100644 --- a/ee/apps/account-service/package.json +++ b/ee/apps/account-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/account-service", "private": true, - "version": "0.3.14-rc.2", + "version": "0.3.14", "description": "Rocket.Chat Account service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/authorization-service/CHANGELOG.md b/ee/apps/authorization-service/CHANGELOG.md index ba68a68aa7aa..fd73dae11270 100644 --- a/ee/apps/authorization-service/CHANGELOG.md +++ b/ee/apps/authorization-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/authorization-service +## 0.3.15 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/rest-typings@6.9.0 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/models@0.0.39 +
+ ## 0.3.15-rc.2 ### Patch Changes diff --git a/ee/apps/authorization-service/package.json b/ee/apps/authorization-service/package.json index 2996e5648f81..61de30257359 100644 --- a/ee/apps/authorization-service/package.json +++ b/ee/apps/authorization-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/authorization-service", "private": true, - "version": "0.3.15-rc.2", + "version": "0.3.15", "description": "Rocket.Chat Authorization service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/ddp-streamer/CHANGELOG.md b/ee/apps/ddp-streamer/CHANGELOG.md index 3c3765c09f0e..75409b275c32 100644 --- a/ee/apps/ddp-streamer/CHANGELOG.md +++ b/ee/apps/ddp-streamer/CHANGELOG.md @@ -1,5 +1,20 @@ # @rocket.chat/ddp-streamer +## 0.2.14 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/rest-typings@6.9.0 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/ui-contexts@7.0.0 + - @rocket.chat/models@0.0.39 + - @rocket.chat/instance-status@0.0.39 +
+ ## 0.2.14-rc.2 ### Patch Changes diff --git a/ee/apps/ddp-streamer/package.json b/ee/apps/ddp-streamer/package.json index 1f8989527a07..c1dd482d2e75 100644 --- a/ee/apps/ddp-streamer/package.json +++ b/ee/apps/ddp-streamer/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/ddp-streamer", "private": true, - "version": "0.2.14-rc.2", + "version": "0.2.14", "description": "Rocket.Chat DDP-Streamer service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/omnichannel-transcript/CHANGELOG.md b/ee/apps/omnichannel-transcript/CHANGELOG.md index 308fca8cfde5..1da1ca34fa23 100644 --- a/ee/apps/omnichannel-transcript/CHANGELOG.md +++ b/ee/apps/omnichannel-transcript/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/omnichannel-transcript +## 0.3.15 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/omnichannel-services@0.1.15 + - @rocket.chat/pdf-worker@0.0.39 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/models@0.0.39 +
+ ## 0.3.15-rc.2 ### Patch Changes diff --git a/ee/apps/omnichannel-transcript/package.json b/ee/apps/omnichannel-transcript/package.json index baaaf1e76a7d..9705a4ca2e2c 100644 --- a/ee/apps/omnichannel-transcript/package.json +++ b/ee/apps/omnichannel-transcript/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/omnichannel-transcript", "private": true, - "version": "0.3.15-rc.2", + "version": "0.3.15", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/presence-service/CHANGELOG.md b/ee/apps/presence-service/CHANGELOG.md index 213135556ecb..a90edcd821af 100644 --- a/ee/apps/presence-service/CHANGELOG.md +++ b/ee/apps/presence-service/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/presence-service +## 0.3.15 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/presence@0.1.15 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/models@0.0.39 +
+ ## 0.3.15-rc.2 ### Patch Changes diff --git a/ee/apps/presence-service/package.json b/ee/apps/presence-service/package.json index 9f9c6fb8b568..129eae6f6f14 100644 --- a/ee/apps/presence-service/package.json +++ b/ee/apps/presence-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/presence-service", "private": true, - "version": "0.3.15-rc.2", + "version": "0.3.15", "description": "Rocket.Chat Presence service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/queue-worker/CHANGELOG.md b/ee/apps/queue-worker/CHANGELOG.md index b7455cad1611..57508316acbf 100644 --- a/ee/apps/queue-worker/CHANGELOG.md +++ b/ee/apps/queue-worker/CHANGELOG.md @@ -1,5 +1,18 @@ # @rocket.chat/queue-worker +## 0.3.15 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/omnichannel-services@0.1.15 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/models@0.0.39 +
+ ## 0.3.15-rc.2 ### Patch Changes diff --git a/ee/apps/queue-worker/package.json b/ee/apps/queue-worker/package.json index ad428914de89..d2f07cc5e312 100644 --- a/ee/apps/queue-worker/package.json +++ b/ee/apps/queue-worker/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/queue-worker", "private": true, - "version": "0.3.15-rc.2", + "version": "0.3.15", "description": "Rocket.Chat service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/apps/stream-hub-service/CHANGELOG.md b/ee/apps/stream-hub-service/CHANGELOG.md index 0171de33960b..089b9c8fbd3c 100644 --- a/ee/apps/stream-hub-service/CHANGELOG.md +++ b/ee/apps/stream-hub-service/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/stream-hub-service +## 0.3.15 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/models@0.0.39 +
+ ## 0.3.15-rc.2 ### Patch Changes diff --git a/ee/apps/stream-hub-service/package.json b/ee/apps/stream-hub-service/package.json index 2e8aa0be0fdf..a2ac2464c0aa 100644 --- a/ee/apps/stream-hub-service/package.json +++ b/ee/apps/stream-hub-service/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/stream-hub-service", "private": true, - "version": "0.3.15-rc.2", + "version": "0.3.15", "description": "Rocket.Chat Stream Hub service", "scripts": { "build": "tsc -p tsconfig.json", diff --git a/ee/packages/api-client/CHANGELOG.md b/ee/packages/api-client/CHANGELOG.md index 6a95e7f618b8..62278200a94d 100644 --- a/ee/packages/api-client/CHANGELOG.md +++ b/ee/packages/api-client/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/api-client +## 0.1.33 + +### Patch Changes + +-
Updated dependencies [ff4e396416, f83bd56cc5, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/rest-typings@6.9.0 +
+ ## 0.1.33-rc.2 ### Patch Changes diff --git a/ee/packages/api-client/package.json b/ee/packages/api-client/package.json index a6806910f17d..f4b22774490b 100644 --- a/ee/packages/api-client/package.json +++ b/ee/packages/api-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/api-client", - "version": "0.1.33-rc.2", + "version": "0.1.33", "devDependencies": { "@swc/core": "^1.3.95", "@swc/jest": "^0.2.29", diff --git a/ee/packages/ddp-client/CHANGELOG.md b/ee/packages/ddp-client/CHANGELOG.md index e3498cff1973..8c64d0836416 100644 --- a/ee/packages/ddp-client/CHANGELOG.md +++ b/ee/packages/ddp-client/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/ddp-client +## 0.2.24 + +### Patch Changes + +-
Updated dependencies [f83bd56cc5]: + + - @rocket.chat/rest-typings@6.9.0 + - @rocket.chat/api-client@0.1.33 +
+ ## 0.2.24-rc.2 ### Patch Changes diff --git a/ee/packages/ddp-client/package.json b/ee/packages/ddp-client/package.json index e2e6152c5da0..cbf3bd20c52b 100644 --- a/ee/packages/ddp-client/package.json +++ b/ee/packages/ddp-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ddp-client", - "version": "0.2.24-rc.2", + "version": "0.2.24", "devDependencies": { "@swc/core": "^1.3.95", "@swc/jest": "^0.2.29", diff --git a/ee/packages/license/CHANGELOG.md b/ee/packages/license/CHANGELOG.md index 7de7c5c7a76a..80f539b4ed74 100644 --- a/ee/packages/license/CHANGELOG.md +++ b/ee/packages/license/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/license +## 0.1.15 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 +
+ ## 0.1.15-rc.2 ### Patch Changes diff --git a/ee/packages/license/package.json b/ee/packages/license/package.json index dcfd188c915f..6dc46eea1cf8 100644 --- a/ee/packages/license/package.json +++ b/ee/packages/license/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/license", - "version": "0.1.15-rc.2", + "version": "0.1.15", "private": true, "devDependencies": { "@swc/core": "^1.3.95", diff --git a/ee/packages/omnichannel-services/CHANGELOG.md b/ee/packages/omnichannel-services/CHANGELOG.md index 38da43b563ee..15f0fb538132 100644 --- a/ee/packages/omnichannel-services/CHANGELOG.md +++ b/ee/packages/omnichannel-services/CHANGELOG.md @@ -1,5 +1,23 @@ # @rocket.chat/omnichannel-services +## 0.1.15 + +### Patch Changes + +- ([#32311](https://github.com/RocketChat/Rocket.Chat/pull/32311)) Fixed multiple issues with PDF generation logic when a quoted message was too big to fit in one single page. This was causing an internal infinite loop within the library (as it tried to make it fit, failing and then trying to fit on next page where the same happened thus causing a loop). + The library was not able to break down some nested views and thus was trying to fit the whole quote on one single page. Logic was updated to allow wrapping of the contents when messages are quoted (so they can span multiple lines) and removed a bunch of unnecesary views from the code. +- ([#32318](https://github.com/RocketChat/Rocket.Chat/pull/32318)) Fixed error handling for files bigger than NATS max allowed payload. This should prevent PDFs from erroring out when generating from rooms that contain heavy images. + +-
Updated dependencies [ff4e396416, ad86761209, f83bd56cc5, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/pdf-worker@0.0.39 + - @rocket.chat/rest-typings@6.9.0 + - @rocket.chat/model-typings@0.4.1 + - @rocket.chat/models@0.0.39 +
+ ## 0.1.15-rc.2 ### Patch Changes diff --git a/ee/packages/omnichannel-services/package.json b/ee/packages/omnichannel-services/package.json index d81be4514245..bea077c18386 100644 --- a/ee/packages/omnichannel-services/package.json +++ b/ee/packages/omnichannel-services/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/omnichannel-services", - "version": "0.1.15-rc.2", + "version": "0.1.15", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/ee/packages/pdf-worker/CHANGELOG.md b/ee/packages/pdf-worker/CHANGELOG.md index e5ec06c74a72..ee34d97dc362 100644 --- a/ee/packages/pdf-worker/CHANGELOG.md +++ b/ee/packages/pdf-worker/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/pdf-worker +## 0.0.39 + +### Patch Changes + +- ([#32311](https://github.com/RocketChat/Rocket.Chat/pull/32311)) Fixed multiple issues with PDF generation logic when a quoted message was too big to fit in one single page. This was causing an internal infinite loop within the library (as it tried to make it fit, failing and then trying to fit on next page where the same happened thus causing a loop). + The library was not able to break down some nested views and thus was trying to fit the whole quote on one single page. Logic was updated to allow wrapping of the contents when messages are quoted (so they can span multiple lines) and removed a bunch of unnecesary views from the code. +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 +
+ ## 0.0.39-rc.2 ### Patch Changes diff --git a/ee/packages/pdf-worker/package.json b/ee/packages/pdf-worker/package.json index 18d0df2ca544..71a94eee43b5 100644 --- a/ee/packages/pdf-worker/package.json +++ b/ee/packages/pdf-worker/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/pdf-worker", - "version": "0.0.39-rc.2", + "version": "0.0.39", "private": true, "devDependencies": { "@storybook/addon-essentials": "~6.5.16", diff --git a/ee/packages/presence/CHANGELOG.md b/ee/packages/presence/CHANGELOG.md index acc0a720bbfa..e96a8365cd10 100644 --- a/ee/packages/presence/CHANGELOG.md +++ b/ee/packages/presence/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/presence +## 0.1.15 + +### Patch Changes + +-
Updated dependencies [ff4e396416, ad86761209, 724ba3a729, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/core-services@0.3.15 + - @rocket.chat/models@0.0.39 +
+ ## 0.1.15-rc.2 ### Patch Changes diff --git a/ee/packages/presence/package.json b/ee/packages/presence/package.json index 3076d934a49b..4e609c5d954b 100644 --- a/ee/packages/presence/package.json +++ b/ee/packages/presence/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/presence", - "version": "0.1.15-rc.2", + "version": "0.1.15", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/package.json b/package.json index d573c9750576..b9e63ffa85af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket.chat", - "version": "6.9.0-rc.2", + "version": "6.9.0", "description": "Rocket.Chat Monorepo", "main": "index.js", "private": true, diff --git a/packages/apps/CHANGELOG.md b/packages/apps/CHANGELOG.md index f94a58b5f2d2..f58d8fbfe387 100644 --- a/packages/apps/CHANGELOG.md +++ b/packages/apps/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/apps +## 0.0.6 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/model-typings@0.4.1 +
+ ## 0.0.6-rc.2 ### Patch Changes diff --git a/packages/apps/package.json b/packages/apps/package.json index 9814bb2bf8a1..ee99ba288fab 100644 --- a/packages/apps/package.json +++ b/packages/apps/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/apps", - "version": "0.0.6-rc.2", + "version": "0.0.6", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/core-services/CHANGELOG.md b/packages/core-services/CHANGELOG.md index 2d88ce51a025..779db0d7b4ca 100644 --- a/packages/core-services/CHANGELOG.md +++ b/packages/core-services/CHANGELOG.md @@ -1,5 +1,21 @@ # @rocket.chat/core-services +## 0.3.15 + +### Patch Changes + +- ([#32311](https://github.com/RocketChat/Rocket.Chat/pull/32311)) Fixed multiple issues with PDF generation logic when a quoted message was too big to fit in one single page. This was causing an internal infinite loop within the library (as it tried to make it fit, failing and then trying to fit on next page where the same happened thus causing a loop). + The library was not able to break down some nested views and thus was trying to fit the whole quote on one single page. Logic was updated to allow wrapping of the contents when messages are quoted (so they can span multiple lines) and removed a bunch of unnecesary views from the code. +- ([#32318](https://github.com/RocketChat/Rocket.Chat/pull/32318)) Fixed error handling for files bigger than NATS max allowed payload. This should prevent PDFs from erroring out when generating from rooms that contain heavy images. + +-
Updated dependencies [ff4e396416, f83bd56cc5, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/rest-typings@6.9.0 + - @rocket.chat/ui-kit@0.34.0 + - @rocket.chat/models@0.0.39 +
+ ## 0.3.15-rc.2 ### Patch Changes diff --git a/packages/core-services/package.json b/packages/core-services/package.json index 264d11c9405d..6033814bf2fa 100644 --- a/packages/core-services/package.json +++ b/packages/core-services/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/core-services", - "version": "0.3.15-rc.2", + "version": "0.3.15", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/packages/core-typings/CHANGELOG.md b/packages/core-typings/CHANGELOG.md index 46d39d336c9b..cb92dfed9f7f 100644 --- a/packages/core-typings/CHANGELOG.md +++ b/packages/core-typings/CHANGELOG.md @@ -1,5 +1,20 @@ # @rocket.chat/core-typings +## 6.9.0 + +### Minor Changes + +- ([#31917](https://github.com/RocketChat/Rocket.Chat/pull/31917)) Introduced a tab layout to the users page and implemented a tab called "All" that lists all users. + +- ([#32298](https://github.com/RocketChat/Rocket.Chat/pull/32298)) Added "Rocket.Chat Cloud Workspace ID" to workspace statistics page + +### Patch Changes + +-
Updated dependencies [ee5cdfc367]: + + - @rocket.chat/ui-kit@0.34.0 +
+ ## 6.9.0-rc.2 ## 6.9.0-rc.1 diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 15900820cd46..492fb7be848b 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package", "name": "@rocket.chat/core-typings", - "version": "6.9.0-rc.2", + "version": "6.9.0", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "eslint": "~8.45.0", diff --git a/packages/cron/CHANGELOG.md b/packages/cron/CHANGELOG.md index 087f08d89b7b..b79a1aa46e9d 100644 --- a/packages/cron/CHANGELOG.md +++ b/packages/cron/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/cron +## 0.0.35 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/models@0.0.39 +
+ ## 0.0.35-rc.2 ### Patch Changes diff --git a/packages/cron/package.json b/packages/cron/package.json index 7f2b03a36766..1755e8a33a2b 100644 --- a/packages/cron/package.json +++ b/packages/cron/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/cron", - "version": "0.0.35-rc.2", + "version": "0.0.35", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/fuselage-ui-kit/CHANGELOG.md b/packages/fuselage-ui-kit/CHANGELOG.md index 4bbb4f830e4e..21652a54903b 100644 --- a/packages/fuselage-ui-kit/CHANGELOG.md +++ b/packages/fuselage-ui-kit/CHANGELOG.md @@ -1,5 +1,25 @@ # Change Log +## 7.0.0 + +### Minor Changes + +- ([#31918](https://github.com/RocketChat/Rocket.Chat/pull/31918)) Introduced new elements for apps to select channels + +### Patch Changes + +- ([#32327](https://github.com/RocketChat/Rocket.Chat/pull/32327)) Fix translation param on video conf joined message + +-
Updated dependencies [ff4e396416, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/ui-kit@0.34.0 + - @rocket.chat/gazzodown@7.0.0 + - @rocket.chat/ui-contexts@7.0.0 + - @rocket.chat/ui-avatar@3.0.0 + - @rocket.chat/ui-video-conf@7.0.0 +
+ ## 7.0.0-rc.2 ### Patch Changes diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 9c23b8207fb8..7a2fa548b145 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/fuselage-ui-kit", "private": true, - "version": "7.0.0-rc.2", + "version": "7.0.0", "description": "UiKit elements for Rocket.Chat Apps built under Fuselage design system", "homepage": "https://rocketchat.github.io/Rocket.Chat.Fuselage/", "author": { @@ -50,10 +50,10 @@ "@rocket.chat/icons": "*", "@rocket.chat/prettier-config": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "3.0.0-rc.2", - "@rocket.chat/ui-contexts": "7.0.0-rc.2", - "@rocket.chat/ui-kit": "0.34.0-rc.0", - "@rocket.chat/ui-video-conf": "7.0.0-rc.2", + "@rocket.chat/ui-avatar": "3.0.0", + "@rocket.chat/ui-contexts": "7.0.0", + "@rocket.chat/ui-kit": "0.34.0", + "@rocket.chat/ui-video-conf": "7.0.0", "@tanstack/react-query": "*", "react": "*", "react-dom": "*" @@ -110,7 +110,7 @@ "typescript": "~5.3.3" }, "dependencies": { - "@rocket.chat/core-typings": "6.9.0-rc.2", + "@rocket.chat/core-typings": "6.9.0", "@rocket.chat/gazzodown": "workspace:^", "@rocket.chat/ui-kit": "workspace:~", "tslib": "^2.5.3" diff --git a/packages/gazzodown/CHANGELOG.md b/packages/gazzodown/CHANGELOG.md index 2d7e9f817cb8..61620a5e7eb8 100644 --- a/packages/gazzodown/CHANGELOG.md +++ b/packages/gazzodown/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/gazzodown +## 7.0.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/ui-contexts@7.0.0 + - @rocket.chat/ui-client@7.0.0 +
+ ## 7.0.0-rc.2 ### Patch Changes diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index d0e16999e95d..fe7b6a0df3e2 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/gazzodown", - "version": "7.0.0-rc.2", + "version": "7.0.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -71,8 +71,8 @@ "@rocket.chat/fuselage-tokens": "*", "@rocket.chat/message-parser": "0.31.29", "@rocket.chat/styled": "*", - "@rocket.chat/ui-client": "7.0.0-rc.2", - "@rocket.chat/ui-contexts": "7.0.0-rc.2", + "@rocket.chat/ui-client": "7.0.0", + "@rocket.chat/ui-contexts": "7.0.0", "katex": "*", "react": "*" }, diff --git a/packages/i18n/CHANGELOG.md b/packages/i18n/CHANGELOG.md index 17f2e90aaeed..53b9795af3f7 100644 --- a/packages/i18n/CHANGELOG.md +++ b/packages/i18n/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/i18n +## 0.4.0 + +### Minor Changes + +- ([#32298](https://github.com/RocketChat/Rocket.Chat/pull/32298)) Added "Rocket.Chat Cloud Workspace ID" to workspace statistics page + +### Patch Changes + +- ([#31917](https://github.com/RocketChat/Rocket.Chat/pull/31917)) Introduced a tab layout to the users page and implemented a tab called "All" that lists all users. + +- ([#32182](https://github.com/RocketChat/Rocket.Chat/pull/32182)) Fixed an issue with object storage settings that was not allowing admins to decide if files generated via "Export conversation" feature were being proxied through server or not. + ## 0.4.0-rc.0 ### Minor Changes diff --git a/packages/i18n/package.json b/packages/i18n/package.json index a63db12d18e9..629d48364e80 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/i18n", - "version": "0.4.0-rc.0", + "version": "0.4.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", diff --git a/packages/instance-status/CHANGELOG.md b/packages/instance-status/CHANGELOG.md index e1a0a96e94cf..ef804a060a70 100644 --- a/packages/instance-status/CHANGELOG.md +++ b/packages/instance-status/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/instance-status +## 0.0.39 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/models@0.0.39 +
+ ## 0.0.39-rc.2 ### Patch Changes diff --git a/packages/instance-status/package.json b/packages/instance-status/package.json index bc522559de86..1b9a81c6f432 100644 --- a/packages/instance-status/package.json +++ b/packages/instance-status/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/instance-status", - "version": "0.0.39-rc.2", + "version": "0.0.39", "private": true, "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", diff --git a/packages/livechat/CHANGELOG.md b/packages/livechat/CHANGELOG.md index 709db6d02943..05f50031910d 100644 --- a/packages/livechat/CHANGELOG.md +++ b/packages/livechat/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/livechat Change Log +## 1.17.0 + +### Minor Changes + +- ([#32233](https://github.com/RocketChat/Rocket.Chat/pull/32233)) Makes the triggers fired by the condition `after-guest-registration` persist on the livechat client, it will persist through reloads and pagination, only reseting when a conversation is closed (no changes were done on the agent side of the conversation) + +### Patch Changes + +-
Updated dependencies [ee5cdfc367]: + + - @rocket.chat/ui-kit@0.34.0 + - @rocket.chat/gazzodown@7.0.0 +
+ ## 1.17.0-rc.2 ### Patch Changes diff --git a/packages/livechat/package.json b/packages/livechat/package.json index b82ebb5c1e22..a47edd10bfce 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/livechat", - "version": "1.17.0-rc.2", + "version": "1.17.0", "files": [ "/build" ], diff --git a/packages/mock-providers/CHANGELOG.md b/packages/mock-providers/CHANGELOG.md index fe564b88c0ce..b399a60c8478 100644 --- a/packages/mock-providers/CHANGELOG.md +++ b/packages/mock-providers/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/mock-providers +## 0.0.7 + +### Patch Changes + +-
Updated dependencies [ff4e396416, bc50dd54a2, 70ab2a7b7b]: + + - @rocket.chat/i18n@0.4.0 +
+ ## 0.0.7-rc.0 ### Patch Changes diff --git a/packages/mock-providers/package.json b/packages/mock-providers/package.json index 551447f9f1fc..7b3fdbf5dc35 100644 --- a/packages/mock-providers/package.json +++ b/packages/mock-providers/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/mock-providers", - "version": "0.0.7-rc.0", + "version": "0.0.7", "private": true, "dependencies": { "@rocket.chat/i18n": "workspace:~", diff --git a/packages/model-typings/CHANGELOG.md b/packages/model-typings/CHANGELOG.md index 8bda5fcf284d..be6af1a7d7de 100644 --- a/packages/model-typings/CHANGELOG.md +++ b/packages/model-typings/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/model-typings +## 0.4.1 + +### Patch Changes + +-
Updated dependencies [ff4e396416, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 +
+ ## 0.4.1-rc.2 ### Patch Changes diff --git a/packages/model-typings/package.json b/packages/model-typings/package.json index 17fa7056da03..dac38893963a 100644 --- a/packages/model-typings/package.json +++ b/packages/model-typings/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/model-typings", - "version": "0.4.1-rc.2", + "version": "0.4.1", "private": true, "devDependencies": { "@types/jest": "~29.5.7", diff --git a/packages/models/CHANGELOG.md b/packages/models/CHANGELOG.md index 65cb3723cd9b..02e520ef1e9b 100644 --- a/packages/models/CHANGELOG.md +++ b/packages/models/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/models +## 0.0.39 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/model-typings@0.4.1 +
+ ## 0.0.39-rc.2 ### Patch Changes diff --git a/packages/models/package.json b/packages/models/package.json index 2c710114dc6e..7280cb2e36d8 100644 --- a/packages/models/package.json +++ b/packages/models/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/models", - "version": "0.0.39-rc.2", + "version": "0.0.39", "private": true, "devDependencies": { "@swc/core": "^1.3.95", diff --git a/packages/rest-typings/CHANGELOG.md b/packages/rest-typings/CHANGELOG.md index 9751f74ce321..b2f584d33557 100644 --- a/packages/rest-typings/CHANGELOG.md +++ b/packages/rest-typings/CHANGELOG.md @@ -1,5 +1,19 @@ # @rocket.chat/rest-typings +## 6.9.0 + +### Minor Changes + +- ([#32364](https://github.com/RocketChat/Rocket.Chat/pull/32364)) Fixed issue with "Export room as file" feature (`rooms.export` endpoint) generating an empty export when given an invalid date + +### Patch Changes + +-
Updated dependencies [ff4e396416, ee5cdfc367, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/ui-kit@0.34.0 +
+ ## 6.9.0-rc.2 ### Patch Changes diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 2b6966f16a02..9f425ec9521d 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/rest-typings", - "version": "6.9.0-rc.2", + "version": "6.9.0", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@types/jest": "~29.5.7", diff --git a/packages/ui-avatar/CHANGELOG.md b/packages/ui-avatar/CHANGELOG.md index b35f8784a4b2..0d61eb6eb359 100644 --- a/packages/ui-avatar/CHANGELOG.md +++ b/packages/ui-avatar/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/ui-avatar +## 3.0.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0 +
+ ## 3.0.0-rc.2 ### Patch Changes diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index e037ed4de639..199129381457 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-avatar", - "version": "3.0.0-rc.2", + "version": "3.0.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -31,7 +31,7 @@ ], "peerDependencies": { "@rocket.chat/fuselage": "*", - "@rocket.chat/ui-contexts": "7.0.0-rc.2", + "@rocket.chat/ui-contexts": "7.0.0", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-client/CHANGELOG.md b/packages/ui-client/CHANGELOG.md index 0d49782d8347..5f68202e7cb0 100644 --- a/packages/ui-client/CHANGELOG.md +++ b/packages/ui-client/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/ui-client +## 7.0.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0 +
+ ## 7.0.0-rc.2 ### Patch Changes diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index b469357a37dd..3e4dcac33f90 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-client", - "version": "7.0.0-rc.2", + "version": "7.0.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -63,7 +63,7 @@ "@rocket.chat/fuselage": "*", "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", - "@rocket.chat/ui-contexts": "7.0.0-rc.2", + "@rocket.chat/ui-contexts": "7.0.0", "react": "~17.0.2" }, "volta": { diff --git a/packages/ui-contexts/CHANGELOG.md b/packages/ui-contexts/CHANGELOG.md index 0e7571e8d9d5..622a99d4d898 100644 --- a/packages/ui-contexts/CHANGELOG.md +++ b/packages/ui-contexts/CHANGELOG.md @@ -1,5 +1,17 @@ # @rocket.chat/ui-contexts +## 7.0.0 + +### Patch Changes + +-
Updated dependencies [ff4e396416, bc50dd54a2, f83bd56cc5, 70ab2a7b7b]: + + - @rocket.chat/core-typings@6.9.0 + - @rocket.chat/i18n@0.4.0 + - @rocket.chat/rest-typings@6.9.0 + - @rocket.chat/ddp-client@0.2.24 +
+ ## 7.0.0-rc.2 ### Patch Changes diff --git a/packages/ui-contexts/package.json b/packages/ui-contexts/package.json index c4f363dd666c..472d10708bfd 100644 --- a/packages/ui-contexts/package.json +++ b/packages/ui-contexts/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-contexts", - "version": "7.0.0-rc.2", + "version": "7.0.0", "private": true, "devDependencies": { "@rocket.chat/core-typings": "workspace:^", diff --git a/packages/ui-kit/CHANGELOG.md b/packages/ui-kit/CHANGELOG.md index 283d203f0271..e2ac676651ec 100644 --- a/packages/ui-kit/CHANGELOG.md +++ b/packages/ui-kit/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 0.34.0 + +### Minor Changes + +- ([#31918](https://github.com/RocketChat/Rocket.Chat/pull/31918)) Introduced new elements for apps to select channels + ## 0.34.0-rc.0 ### Minor Changes diff --git a/packages/ui-kit/package.json b/packages/ui-kit/package.json index cfd3d8f95407..321095cf1527 100644 --- a/packages/ui-kit/package.json +++ b/packages/ui-kit/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-kit", - "version": "0.34.0-rc.0", + "version": "0.34.0", "description": "Interactive UI elements for Rocket.Chat Apps", "homepage": "https://rocket.chat", "author": { diff --git a/packages/ui-video-conf/CHANGELOG.md b/packages/ui-video-conf/CHANGELOG.md index 55b72f9eb9cd..50871b70ebd0 100644 --- a/packages/ui-video-conf/CHANGELOG.md +++ b/packages/ui-video-conf/CHANGELOG.md @@ -1,5 +1,15 @@ # @rocket.chat/ui-video-conf +## 7.0.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0 + - @rocket.chat/ui-avatar@3.0.0 +
+ ## 7.0.0-rc.2 ### Patch Changes diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index d7f29253af33..8f7b18f3ba2b 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/ui-video-conf", - "version": "7.0.0-rc.2", + "version": "7.0.0", "private": true, "devDependencies": { "@babel/core": "~7.22.20", @@ -36,8 +36,8 @@ "@rocket.chat/fuselage-hooks": "*", "@rocket.chat/icons": "*", "@rocket.chat/styled": "*", - "@rocket.chat/ui-avatar": "3.0.0-rc.2", - "@rocket.chat/ui-contexts": "7.0.0-rc.2", + "@rocket.chat/ui-avatar": "3.0.0", + "@rocket.chat/ui-contexts": "7.0.0", "react": "^17.0.2", "react-dom": "^17.0.2" }, diff --git a/packages/uikit-playground/CHANGELOG.md b/packages/uikit-playground/CHANGELOG.md index 712c0e16ef49..1de746cfaf6c 100644 --- a/packages/uikit-playground/CHANGELOG.md +++ b/packages/uikit-playground/CHANGELOG.md @@ -1,5 +1,16 @@ # @rocket.chat/uikit-playground +## 0.2.23 + +### Patch Changes + +-
Updated dependencies [6205ef14f0, ee5cdfc367]: + + - @rocket.chat/fuselage-ui-kit@7.0.0 + - @rocket.chat/ui-contexts@7.0.0 + - @rocket.chat/ui-avatar@3.0.0 +
+ ## 0.2.23-rc.2 ### Patch Changes diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index b36ba6db006f..d12ece478b7c 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/uikit-playground", "private": true, - "version": "0.2.23-rc.2", + "version": "0.2.23", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/web-ui-registration/CHANGELOG.md b/packages/web-ui-registration/CHANGELOG.md index 59bb730f4c06..16398fd01f1e 100644 --- a/packages/web-ui-registration/CHANGELOG.md +++ b/packages/web-ui-registration/CHANGELOG.md @@ -1,5 +1,14 @@ # @rocket.chat/web-ui-registration +## 7.0.0 + +### Patch Changes + +-
Updated dependencies []: + + - @rocket.chat/ui-contexts@7.0.0 +
+ ## 7.0.0-rc.2 ### Patch Changes diff --git a/packages/web-ui-registration/package.json b/packages/web-ui-registration/package.json index 616bf23b9151..35bcc20bee17 100644 --- a/packages/web-ui-registration/package.json +++ b/packages/web-ui-registration/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/web-ui-registration", - "version": "7.0.0-rc.2", + "version": "7.0.0", "private": true, "homepage": "https://rocket.chat", "main": "./dist/index.js", @@ -51,7 +51,7 @@ "peerDependencies": { "@rocket.chat/layout": "*", "@rocket.chat/tools": "0.2.1", - "@rocket.chat/ui-contexts": "7.0.0-rc.2", + "@rocket.chat/ui-contexts": "7.0.0", "@tanstack/react-query": "*", "react": "*", "react-hook-form": "*", diff --git a/yarn.lock b/yarn.lock index b9ac4faf2031..8a3e588765df 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8795,10 +8795,10 @@ __metadata: "@rocket.chat/icons": "*" "@rocket.chat/prettier-config": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 3.0.0-rc.1 - "@rocket.chat/ui-contexts": 7.0.0-rc.1 + "@rocket.chat/ui-avatar": 3.0.0-rc.2 + "@rocket.chat/ui-contexts": 7.0.0-rc.2 "@rocket.chat/ui-kit": 0.34.0-rc.0 - "@rocket.chat/ui-video-conf": 7.0.0-rc.1 + "@rocket.chat/ui-video-conf": 7.0.0-rc.2 "@tanstack/react-query": "*" react: "*" react-dom: "*" @@ -8887,8 +8887,8 @@ __metadata: "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/message-parser": 0.31.29 "@rocket.chat/styled": "*" - "@rocket.chat/ui-client": 7.0.0-rc.1 - "@rocket.chat/ui-contexts": 7.0.0-rc.1 + "@rocket.chat/ui-client": 7.0.0-rc.2 + "@rocket.chat/ui-contexts": 7.0.0-rc.2 katex: "*" react: "*" languageName: unknown @@ -10106,7 +10106,7 @@ __metadata: typescript: ~5.3.3 peerDependencies: "@rocket.chat/fuselage": "*" - "@rocket.chat/ui-contexts": 7.0.0-rc.1 + "@rocket.chat/ui-contexts": 7.0.0-rc.2 react: ~17.0.2 languageName: unknown linkType: soft @@ -10159,7 +10159,7 @@ __metadata: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" - "@rocket.chat/ui-contexts": 7.0.0-rc.1 + "@rocket.chat/ui-contexts": 7.0.0-rc.2 react: ~17.0.2 languageName: unknown linkType: soft @@ -10335,8 +10335,8 @@ __metadata: "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 3.0.0-rc.1 - "@rocket.chat/ui-contexts": 7.0.0-rc.1 + "@rocket.chat/ui-avatar": 3.0.0-rc.2 + "@rocket.chat/ui-contexts": 7.0.0-rc.2 react: ^17.0.2 react-dom: ^17.0.2 languageName: unknown @@ -10426,7 +10426,7 @@ __metadata: peerDependencies: "@rocket.chat/layout": "*" "@rocket.chat/tools": 0.2.1 - "@rocket.chat/ui-contexts": 7.0.0-rc.1 + "@rocket.chat/ui-contexts": 7.0.0-rc.2 "@tanstack/react-query": "*" react: "*" react-hook-form: "*" From f659c6ef797f70caf950805ef39520087d9cad84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BAlia=20Jaeger=20Foresti?= <60678893+juliajforesti@users.noreply.github.com> Date: Mon, 3 Jun 2024 17:09:51 -0300 Subject: [PATCH 20/29] fix: `codeBlock` styles in light mode (#32499) --- .changeset/five-shoes-fly.md | 5 ++ .../root/MainLayout/LayoutWithSidebar.tsx | 8 +- .../MainLayout/MainLayoutStyleTags.spec.tsx | 31 ++++++++ .../root/MainLayout/MainLayoutStyleTags.tsx | 17 +++++ .../client/views/root/lib/codeBlockStyles.ts | 74 +++++++++++++++++++ apps/meteor/package.json | 2 +- ee/packages/ui-theming/package.json | 2 +- packages/fuselage-ui-kit/package.json | 2 +- packages/gazzodown/package.json | 2 +- packages/ui-avatar/package.json | 2 +- packages/ui-client/package.json | 2 +- packages/ui-composer/package.json | 2 +- packages/ui-video-conf/package.json | 2 +- packages/uikit-playground/package.json | 2 +- yarn.lock | 48 ++++++------ 15 files changed, 163 insertions(+), 38 deletions(-) create mode 100644 .changeset/five-shoes-fly.md create mode 100644 apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.spec.tsx create mode 100644 apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.tsx create mode 100644 apps/meteor/client/views/root/lib/codeBlockStyles.ts diff --git a/.changeset/five-shoes-fly.md b/.changeset/five-shoes-fly.md new file mode 100644 index 000000000000..da462e1508c7 --- /dev/null +++ b/.changeset/five-shoes-fly.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed codeBlock styles in light mode diff --git a/apps/meteor/client/views/root/MainLayout/LayoutWithSidebar.tsx b/apps/meteor/client/views/root/MainLayout/LayoutWithSidebar.tsx index b12a035d32cd..0fb26c0cbc22 100644 --- a/apps/meteor/client/views/root/MainLayout/LayoutWithSidebar.tsx +++ b/apps/meteor/client/views/root/MainLayout/LayoutWithSidebar.tsx @@ -1,15 +1,14 @@ -import { Box, PaletteStyleTag } from '@rocket.chat/fuselage'; +import { Box } from '@rocket.chat/fuselage'; import { useLayout, useSetting, useCurrentModal, useRoute, useCurrentRoutePath } from '@rocket.chat/ui-contexts'; -import { useThemeMode } from '@rocket.chat/ui-theming/src/hooks/useThemeMode'; import type { ReactElement, ReactNode } from 'react'; import React, { useEffect, useRef } from 'react'; import Sidebar from '../../../sidebar'; import AccessibilityShortcut from './AccessibilityShortcut'; +import { MainLayoutStyleTags } from './MainLayoutStyleTags'; const LayoutWithSidebar = ({ children }: { children: ReactNode }): ReactElement => { const { isEmbedded: embeddedLayout } = useLayout(); - const [, , theme] = useThemeMode(); const modal = useCurrentModal(); const currentRoutePath = useCurrentRoutePath(); @@ -48,8 +47,7 @@ const LayoutWithSidebar = ({ children }: { children: ReactNode }): ReactElement aria-hidden={Boolean(modal)} > - - + {!removeSidenav && }
{ + it('should create the Light theme style tag', () => { + render(, { + wrapper: mockAppRoot().withUserPreference('themeAppearence', 'light').build(), + }); + const tagLight = queryByAttribute('id', document.head, 'main-palette-light'); + expect(tagLight).not.toBeNull(); + }); + + it('should create the Dark theme style tag', () => { + render(, { + wrapper: mockAppRoot().withUserPreference('themeAppearence', 'dark').build(), + }); + const tagDark = queryByAttribute('id', document.head, 'main-palette-dark'); + expect(tagDark).not.toBeNull(); + }); + + it('should create the codeBlock style tag when in dark mode', () => { + render(, { + wrapper: mockAppRoot().withUserPreference('themeAppearence', 'dark').build(), + }); + const style = queryByAttribute('id', document.head, 'codeBlock-palette'); + expect(style).not.toBeNull(); + }); +}); diff --git a/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.tsx b/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.tsx new file mode 100644 index 000000000000..c830047a3424 --- /dev/null +++ b/apps/meteor/client/views/root/MainLayout/MainLayoutStyleTags.tsx @@ -0,0 +1,17 @@ +import { PaletteStyleTag } from '@rocket.chat/fuselage'; +import { useThemeMode } from '@rocket.chat/ui-theming/src/hooks/useThemeMode'; +import React from 'react'; + +import { codeBlock } from '../lib/codeBlockStyles'; + +export const MainLayoutStyleTags = () => { + const [, , theme] = useThemeMode(); + + return ( + <> + + + {theme === 'dark' && } + + ); +}; diff --git a/apps/meteor/client/views/root/lib/codeBlockStyles.ts b/apps/meteor/client/views/root/lib/codeBlockStyles.ts new file mode 100644 index 000000000000..2c6b4bf33be0 --- /dev/null +++ b/apps/meteor/client/views/root/lib/codeBlockStyles.ts @@ -0,0 +1,74 @@ +export const codeBlock = `pre code.hljs { + display: block; + overflow-x: auto; + padding: 1em; +} +code.hljs { + padding: 3px 5px; +} +.hljs { + background: #1d1f21; + color: #c5c8c6; +} +.hljs span::selection, +.hljs::selection { + background: #373b41; +} +.hljs span::-moz-selection, +.hljs::-moz-selection { + background: #373b41; +} +.hljs-name, +.hljs-title { + color: #f0c674; +} +.hljs-comment, +.hljs-meta, +.hljs-meta .hljs-keyword { + color: #707880; +} +.hljs-deletion, +.hljs-link, +.hljs-literal, +.hljs-number, +.hljs-symbol { + color: #c66; +} +.hljs-addition, +.hljs-doctag, +.hljs-regexp, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-string { + color: #b5bd68; +} +.hljs-attribute, +.hljs-code, +.hljs-selector-id { + color: #b294bb; +} +.hljs-bullet, +.hljs-keyword, +.hljs-selector-tag, +.hljs-tag { + color: #81a2be; +} +.hljs-subst, +.hljs-template-tag, +.hljs-template-variable, +.hljs-variable { + color: #8abeb7; +} +.hljs-built_in, +.hljs-quote, +.hljs-section, +.hljs-selector-class, +.hljs-type { + color: #de935f; +} +.hljs-emphasis { + font-style: italic; +} +.hljs-strong { + font-weight: 700; +}`; diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 77120b4c9a70..3d02862c1e76 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -242,7 +242,7 @@ "@rocket.chat/favicon": "workspace:^", "@rocket.chat/forked-matrix-appservice-bridge": "^4.0.2", "@rocket.chat/forked-matrix-bot-sdk": "^0.6.0-beta.3", - "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/fuselage": "^0.54.2", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/fuselage-polyfills": "~0.31.25", "@rocket.chat/fuselage-toastbar": "^0.31.26", diff --git a/ee/packages/ui-theming/package.json b/ee/packages/ui-theming/package.json index 15db49731544..437f1fda92ab 100644 --- a/ee/packages/ui-theming/package.json +++ b/ee/packages/ui-theming/package.json @@ -4,7 +4,7 @@ "private": true, "devDependencies": { "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/fuselage": "^0.54.2", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/icons": "^0.36.0", "@rocket.chat/ui-contexts": "workspace:~", diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 7a2fa548b145..4c7405ddf830 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -66,7 +66,7 @@ "@rocket.chat/apps-engine": "^1.42.2", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/fuselage": "^0.54.2", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/fuselage-polyfills": "~0.31.25", "@rocket.chat/icons": "^0.36.0", diff --git a/packages/gazzodown/package.json b/packages/gazzodown/package.json index fe7b6a0df3e2..0ce09b0aa79b 100644 --- a/packages/gazzodown/package.json +++ b/packages/gazzodown/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/fuselage": "^0.54.2", "@rocket.chat/fuselage-tokens": "^0.33.1", "@rocket.chat/message-parser": "workspace:^", "@rocket.chat/styled": "~0.31.25", diff --git a/packages/ui-avatar/package.json b/packages/ui-avatar/package.json index 199129381457..a5300bc5648a 100644 --- a/packages/ui-avatar/package.json +++ b/packages/ui-avatar/package.json @@ -4,7 +4,7 @@ "private": true, "devDependencies": { "@babel/core": "~7.22.20", - "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/fuselage": "^0.54.2", "@rocket.chat/ui-contexts": "workspace:^", "@types/babel__core": "~7.20.3", "@types/react": "~17.0.69", diff --git a/packages/ui-client/package.json b/packages/ui-client/package.json index 3e4dcac33f90..6b6429df099c 100644 --- a/packages/ui-client/package.json +++ b/packages/ui-client/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@react-aria/toolbar": "^3.0.0-beta.1", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/fuselage": "^0.54.2", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/icons": "^0.36.0", "@rocket.chat/mock-providers": "workspace:^", diff --git a/packages/ui-composer/package.json b/packages/ui-composer/package.json index f2f269979004..e256334c3eb4 100644 --- a/packages/ui-composer/package.json +++ b/packages/ui-composer/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@react-aria/toolbar": "^3.0.0-beta.1", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/fuselage": "^0.54.2", "@rocket.chat/icons": "^0.36.0", "@storybook/addon-actions": "~6.5.16", "@storybook/addon-docs": "~6.5.16", diff --git a/packages/ui-video-conf/package.json b/packages/ui-video-conf/package.json index 8f7b18f3ba2b..2e92e8158113 100644 --- a/packages/ui-video-conf/package.json +++ b/packages/ui-video-conf/package.json @@ -6,7 +6,7 @@ "@babel/core": "~7.22.20", "@rocket.chat/css-in-js": "~0.31.25", "@rocket.chat/eslint-config": "workspace:^", - "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/fuselage": "^0.54.2", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/icons": "^0.36.0", "@rocket.chat/styled": "~0.31.25", diff --git a/packages/uikit-playground/package.json b/packages/uikit-playground/package.json index d12ece478b7c..133faa8c75ee 100644 --- a/packages/uikit-playground/package.json +++ b/packages/uikit-playground/package.json @@ -15,7 +15,7 @@ "@codemirror/tooltip": "^0.19.16", "@lezer/highlight": "^1.1.6", "@rocket.chat/css-in-js": "~0.31.25", - "@rocket.chat/fuselage": "^0.54.1", + "@rocket.chat/fuselage": "^0.54.2", "@rocket.chat/fuselage-hooks": "^0.33.1", "@rocket.chat/fuselage-polyfills": "~0.31.25", "@rocket.chat/fuselage-toastbar": "^0.31.26", diff --git a/yarn.lock b/yarn.lock index 8a3e588765df..1f73a73df3e1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8743,7 +8743,7 @@ __metadata: "@rocket.chat/apps-engine": ^1.42.2 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/fuselage": ^0.54.2 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/gazzodown": "workspace:^" @@ -8795,19 +8795,19 @@ __metadata: "@rocket.chat/icons": "*" "@rocket.chat/prettier-config": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 3.0.0-rc.2 - "@rocket.chat/ui-contexts": 7.0.0-rc.2 - "@rocket.chat/ui-kit": 0.34.0-rc.0 - "@rocket.chat/ui-video-conf": 7.0.0-rc.2 + "@rocket.chat/ui-avatar": 3.0.0 + "@rocket.chat/ui-contexts": 7.0.0 + "@rocket.chat/ui-kit": 0.34.0 + "@rocket.chat/ui-video-conf": 7.0.0 "@tanstack/react-query": "*" react: "*" react-dom: "*" languageName: unknown linkType: soft -"@rocket.chat/fuselage@npm:^0.54.1": - version: 0.54.1 - resolution: "@rocket.chat/fuselage@npm:0.54.1" +"@rocket.chat/fuselage@npm:^0.54.2": + version: 0.54.2 + resolution: "@rocket.chat/fuselage@npm:0.54.2" dependencies: "@rocket.chat/css-in-js": ^0.31.25 "@rocket.chat/css-supports": ^0.31.25 @@ -8825,7 +8825,7 @@ __metadata: react: ^17.0.2 react-dom: ^17.0.2 react-virtuoso: 1.2.4 - checksum: 11de809f6fbee14b9941e3e97e8eb6adf0703bca7e104d7a53ece2c1dd042cb1ce31016b4e2480de9ea3ed0971cb585dfab79c513edd0ec64bbc3cd15fe2e677 + checksum: 1e49b3324f50525a002dd450a28dc8c6fca559e51c8e93449e167b50ca88767cc3dd11ac3c89ea794597c6c06a4a681aea1043b8f8bb42c49df0362bb5791019 languageName: node linkType: hard @@ -8836,7 +8836,7 @@ __metadata: "@babel/core": ~7.22.20 "@rocket.chat/core-typings": "workspace:^" "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/fuselage": ^0.54.2 "@rocket.chat/fuselage-tokens": ^0.33.1 "@rocket.chat/message-parser": "workspace:^" "@rocket.chat/styled": ~0.31.25 @@ -8887,8 +8887,8 @@ __metadata: "@rocket.chat/fuselage-tokens": "*" "@rocket.chat/message-parser": 0.31.29 "@rocket.chat/styled": "*" - "@rocket.chat/ui-client": 7.0.0-rc.2 - "@rocket.chat/ui-contexts": 7.0.0-rc.2 + "@rocket.chat/ui-client": 7.0.0 + "@rocket.chat/ui-contexts": 7.0.0 katex: "*" react: "*" languageName: unknown @@ -9196,7 +9196,7 @@ __metadata: "@rocket.chat/favicon": "workspace:^" "@rocket.chat/forked-matrix-appservice-bridge": ^4.0.2 "@rocket.chat/forked-matrix-bot-sdk": ^0.6.0-beta.3 - "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/fuselage": ^0.54.2 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/fuselage-toastbar": ^0.31.26 @@ -10092,7 +10092,7 @@ __metadata: resolution: "@rocket.chat/ui-avatar@workspace:packages/ui-avatar" dependencies: "@babel/core": ~7.22.20 - "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/fuselage": ^0.54.2 "@rocket.chat/ui-contexts": "workspace:^" "@types/babel__core": ~7.20.3 "@types/react": ~17.0.69 @@ -10106,7 +10106,7 @@ __metadata: typescript: ~5.3.3 peerDependencies: "@rocket.chat/fuselage": "*" - "@rocket.chat/ui-contexts": 7.0.0-rc.2 + "@rocket.chat/ui-contexts": 7.0.0 react: ~17.0.2 languageName: unknown linkType: soft @@ -10118,7 +10118,7 @@ __metadata: "@babel/core": ~7.22.20 "@react-aria/toolbar": ^3.0.0-beta.1 "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/fuselage": ^0.54.2 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/icons": ^0.36.0 "@rocket.chat/mock-providers": "workspace:^" @@ -10159,7 +10159,7 @@ __metadata: "@rocket.chat/fuselage": "*" "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" - "@rocket.chat/ui-contexts": 7.0.0-rc.2 + "@rocket.chat/ui-contexts": 7.0.0 react: ~17.0.2 languageName: unknown linkType: soft @@ -10171,7 +10171,7 @@ __metadata: "@babel/core": ~7.22.20 "@react-aria/toolbar": ^3.0.0-beta.1 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/fuselage": ^0.54.2 "@rocket.chat/icons": ^0.36.0 "@storybook/addon-actions": ~6.5.16 "@storybook/addon-docs": ~6.5.16 @@ -10263,7 +10263,7 @@ __metadata: resolution: "@rocket.chat/ui-theming@workspace:ee/packages/ui-theming" dependencies: "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/fuselage": ^0.54.2 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/icons": ^0.36.0 "@rocket.chat/ui-contexts": "workspace:~" @@ -10306,7 +10306,7 @@ __metadata: "@rocket.chat/css-in-js": ~0.31.25 "@rocket.chat/emitter": ~0.31.25 "@rocket.chat/eslint-config": "workspace:^" - "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/fuselage": ^0.54.2 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/icons": ^0.36.0 "@rocket.chat/styled": ~0.31.25 @@ -10335,8 +10335,8 @@ __metadata: "@rocket.chat/fuselage-hooks": "*" "@rocket.chat/icons": "*" "@rocket.chat/styled": "*" - "@rocket.chat/ui-avatar": 3.0.0-rc.2 - "@rocket.chat/ui-contexts": 7.0.0-rc.2 + "@rocket.chat/ui-avatar": 3.0.0 + "@rocket.chat/ui-contexts": 7.0.0 react: ^17.0.2 react-dom: ^17.0.2 languageName: unknown @@ -10351,7 +10351,7 @@ __metadata: "@codemirror/tooltip": ^0.19.16 "@lezer/highlight": ^1.1.6 "@rocket.chat/css-in-js": ~0.31.25 - "@rocket.chat/fuselage": ^0.54.1 + "@rocket.chat/fuselage": ^0.54.2 "@rocket.chat/fuselage-hooks": ^0.33.1 "@rocket.chat/fuselage-polyfills": ~0.31.25 "@rocket.chat/fuselage-toastbar": ^0.31.26 @@ -10426,7 +10426,7 @@ __metadata: peerDependencies: "@rocket.chat/layout": "*" "@rocket.chat/tools": 0.2.1 - "@rocket.chat/ui-contexts": 7.0.0-rc.2 + "@rocket.chat/ui-contexts": 7.0.0 "@tanstack/react-query": "*" react: "*" react-hook-form: "*" From 3da6e14f97572c91073f12ed4ebdb1eb19d23016 Mon Sep 17 00:00:00 2001 From: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> Date: Mon, 3 Jun 2024 17:55:58 -0300 Subject: [PATCH 21/29] chore: Deprecate `banners.getNew` endpoint (#32525) --- apps/meteor/app/api/server/v1/banners.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/apps/meteor/app/api/server/v1/banners.ts b/apps/meteor/app/api/server/v1/banners.ts index 4dc74208153b..48c94d3711bd 100644 --- a/apps/meteor/app/api/server/v1/banners.ts +++ b/apps/meteor/app/api/server/v1/banners.ts @@ -52,9 +52,8 @@ import { API } from '../api'; */ API.v1.addRoute( 'banners.getNew', - { authRequired: true }, + { authRequired: true, deprecation: { version: '8.0.0', alternatives: ['banners/:id', 'banners'] } }, { - // deprecated async get() { check( this.queryParams, From a3e4c06b51ee10013b8b532e1b47195e671d5e9f Mon Sep 17 00:00:00 2001 From: Ricardo Garim Date: Wed, 5 Jun 2024 18:59:05 -0300 Subject: [PATCH 22/29] refactor: LivechatDepartmentAgents out of DB Watcher (#32504) Co-authored-by: Diego Sampaio <8591547+sampaiodiego@users.noreply.github.com> --- .../app/lib/server/functions/deleteUser.ts | 21 ++++- .../app/lib/server/lib/notifyListener.ts | 46 ++++++++++ .../server/hooks/afterAgentRemoved.ts | 21 ++++- .../app/livechat/server/lib/Departments.ts | 32 +++++-- apps/meteor/app/livechat/server/lib/Helper.ts | 51 +++++++++-- .../app/livechat/server/lib/LivechatTyped.ts | 7 +- .../server/database/watchCollections.ts | 2 +- apps/meteor/server/models/dummy/BaseDummy.ts | 7 ++ apps/meteor/server/models/raw/BaseRaw.ts | 4 + .../server/models/raw/LivechatDepartment.ts | 2 + .../models/raw/LivechatDepartmentAgents.ts | 87 +++++++++++-------- .../model-typings/src/models/IBaseModel.ts | 2 + .../models/ILivechatDepartmentAgentsModel.ts | 27 +++--- 13 files changed, 239 insertions(+), 70 deletions(-) diff --git a/apps/meteor/app/lib/server/functions/deleteUser.ts b/apps/meteor/app/lib/server/functions/deleteUser.ts index 3af123a72bf7..f2ca72a1d57d 100644 --- a/apps/meteor/app/lib/server/functions/deleteUser.ts +++ b/apps/meteor/app/lib/server/functions/deleteUser.ts @@ -19,7 +19,7 @@ import { callbacks } from '../../../../lib/callbacks'; import { i18n } from '../../../../server/lib/i18n'; import { FileUpload } from '../../../file-upload/server'; import { settings } from '../../../settings/server'; -import { notifyOnRoomChangedById, notifyOnIntegrationChangedByUserId } from '../lib/notifyListener'; +import { notifyOnRoomChangedById, notifyOnIntegrationChangedByUserId, notifyOnLivechatDepartmentAgentChanged } from '../lib/notifyListener'; import { getSubscribedRoomsForUserWithDetails, shouldRemoveOrChangeOwner } from './getRoomsWithSingleOwner'; import { getUserSingleOwnedRooms } from './getUserSingleOwnedRooms'; import { relinquishRoomOwnerships } from './relinquishRoomOwnerships'; @@ -95,9 +95,24 @@ export async function deleteUser(userId: string, confirmRelinquish = false, dele await Subscriptions.removeByUserId(userId); // Remove user subscriptions + // Remove user as livechat agent if (user.roles.includes('livechat-agent')) { - // Remove user as livechat agent - await LivechatDepartmentAgents.removeByAgentId(userId); + const departmentAgents = await LivechatDepartmentAgents.findByAgentId(userId).toArray(); + + const { deletedCount } = await LivechatDepartmentAgents.removeByAgentId(userId); + + if (deletedCount > 0) { + departmentAgents.forEach((depAgent) => { + void notifyOnLivechatDepartmentAgentChanged( + { + _id: depAgent._id, + agentId: userId, + departmentId: depAgent.departmentId, + }, + 'removed', + ); + }); + } } if (user.roles.includes('livechat-monitor')) { diff --git a/apps/meteor/app/lib/server/lib/notifyListener.ts b/apps/meteor/app/lib/server/lib/notifyListener.ts index 38b95404a13e..8ba5f45c4ae7 100644 --- a/apps/meteor/app/lib/server/lib/notifyListener.ts +++ b/apps/meteor/app/lib/server/lib/notifyListener.ts @@ -10,6 +10,7 @@ import type { IPbxEvent, LoginServiceConfiguration as LoginServiceConfigurationData, ILivechatPriority, + ILivechatDepartmentAgents, IEmailInbox, IIntegrationHistory, AtLeast, @@ -23,6 +24,7 @@ import { Integrations, LoginServiceConfiguration, IntegrationHistory, + LivechatDepartmentAgents, } from '@rocket.chat/models'; type ClientAction = 'inserted' | 'updated' | 'removed'; @@ -307,3 +309,47 @@ export async function notifyOnIntegrationHistoryChangedById( + data: Partial & Pick, + clientAction: ClientAction = 'updated', +): Promise { + if (!dbWatchersDisabled) { + return; + } + + void api.broadcast('watch.livechatDepartmentAgents', { clientAction, id: data._id, data }); +} + +export async function notifyOnLivechatDepartmentAgentChangedByDepartmentId( + departmentId: T['departmentId'], + clientAction: 'inserted' | 'updated' = 'updated', +): Promise { + if (!dbWatchersDisabled) { + return; + } + + const items = LivechatDepartmentAgents.findByDepartmentId(departmentId, { projection: { _id: 1, agentId: 1, departmentId: 1 } }); + + for await (const item of items) { + void api.broadcast('watch.livechatDepartmentAgents', { clientAction, id: item._id, data: item }); + } +} + +export async function notifyOnLivechatDepartmentAgentChangedByAgentsAndDepartmentId( + agentsIds: T['agentId'][], + departmentId: T['departmentId'], + clientAction: 'inserted' | 'updated' = 'updated', +): Promise { + if (!dbWatchersDisabled) { + return; + } + + const items = LivechatDepartmentAgents.findByAgentsAndDepartmentId(agentsIds, departmentId, { + projection: { _id: 1, agentId: 1, departmentId: 1 }, + }); + + for await (const item of items) { + void api.broadcast('watch.livechatDepartmentAgents', { clientAction, id: item._id, data: item }); + } +} diff --git a/apps/meteor/app/livechat/server/hooks/afterAgentRemoved.ts b/apps/meteor/app/livechat/server/hooks/afterAgentRemoved.ts index 475eff9002fc..01b7fd3c186b 100644 --- a/apps/meteor/app/livechat/server/hooks/afterAgentRemoved.ts +++ b/apps/meteor/app/livechat/server/hooks/afterAgentRemoved.ts @@ -1,13 +1,28 @@ import { LivechatDepartment, Users, LivechatDepartmentAgents, LivechatVisitors } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; +import { notifyOnLivechatDepartmentAgentChanged } from '../../../lib/server/lib/notifyListener'; callbacks.add('livechat.afterAgentRemoved', async ({ agent }) => { - const departmentIds = (await LivechatDepartmentAgents.findByAgentId(agent._id).toArray()).map((department) => department.departmentId); - await Promise.all([ + const departments = await LivechatDepartmentAgents.findByAgentId(agent._id).toArray(); + + const [, { deletedCount }] = await Promise.all([ Users.removeAgent(agent._id), LivechatDepartmentAgents.removeByAgentId(agent._id), agent.username && LivechatVisitors.removeContactManagerByUsername(agent.username), - departmentIds.length && LivechatDepartment.decreaseNumberOfAgentsByIds(departmentIds), + departments.length && LivechatDepartment.decreaseNumberOfAgentsByIds(departments.map(({ departmentId }) => departmentId)), ]); + + if (deletedCount > 0) { + departments.forEach((depAgent) => { + void notifyOnLivechatDepartmentAgentChanged( + { + _id: depAgent._id, + agentId: agent._id, + departmentId: depAgent.departmentId, + }, + 'removed', + ); + }); + } }); diff --git a/apps/meteor/app/livechat/server/lib/Departments.ts b/apps/meteor/app/livechat/server/lib/Departments.ts index ed55a856e0b8..3dfa01e4f6b6 100644 --- a/apps/meteor/app/livechat/server/lib/Departments.ts +++ b/apps/meteor/app/livechat/server/lib/Departments.ts @@ -1,8 +1,9 @@ -import type { ILivechatDepartment, ILivechatDepartmentAgents } from '@rocket.chat/core-typings'; +import type { ILivechatDepartment } from '@rocket.chat/core-typings'; import { Logger } from '@rocket.chat/logger'; import { LivechatDepartment, LivechatDepartmentAgents, LivechatRooms } from '@rocket.chat/models'; import { callbacks } from '../../../../lib/callbacks'; +import { notifyOnLivechatDepartmentAgentChanged } from '../../../lib/server/lib/notifyListener'; class DepartmentHelperClass { logger = new Logger('Omnichannel:DepartmentHelper'); @@ -24,29 +25,42 @@ class DepartmentHelperClass { throw new Error('error-failed-to-delete-department'); } - const agentsIds: string[] = await LivechatDepartmentAgents.findAgentsByDepartmentId>( - department._id, - { projection: { agentId: 1 } }, - ) - .cursor.map((agent) => agent.agentId) - .toArray(); + const removedAgents = await LivechatDepartmentAgents.findByDepartmentId(department._id, { projection: { agentId: 1 } }).toArray(); this.logger.debug( `Performing post-department-removal actions: ${_id}. Removing department agents, unsetting fallback department and removing department from rooms`, ); + const removeByDept = LivechatDepartmentAgents.removeByDepartmentId(_id); + const promiseResponses = await Promise.allSettled([ - LivechatDepartmentAgents.removeByDepartmentId(_id), + removeByDept, LivechatDepartment.unsetFallbackDepartmentByDepartmentId(_id), LivechatRooms.bulkRemoveDepartmentAndUnitsFromRooms(_id), ]); + promiseResponses.forEach((response, index) => { if (response.status === 'rejected') { this.logger.error(`Error while performing post-department-removal actions: ${_id}. Action No: ${index}. Error:`, response.reason); } }); - await callbacks.run('livechat.afterRemoveDepartment', { department, agentsIds }); + const { deletedCount } = await removeByDept; + + if (deletedCount > 0) { + removedAgents.forEach(({ _id: docId, agentId }) => { + void notifyOnLivechatDepartmentAgentChanged( + { + _id: docId, + agentId, + departmentId: _id, + }, + 'removed', + ); + }); + } + + await callbacks.run('livechat.afterRemoveDepartment', { department, agentsIds: removedAgents.map(({ agentId }) => agentId) }); return ret; } diff --git a/apps/meteor/app/livechat/server/lib/Helper.ts b/apps/meteor/app/livechat/server/lib/Helper.ts index 453869d4425a..dacd99be00f9 100644 --- a/apps/meteor/app/livechat/server/lib/Helper.ts +++ b/apps/meteor/app/livechat/server/lib/Helper.ts @@ -37,6 +37,10 @@ import { i18n } from '../../../../server/lib/i18n'; import { hasRoleAsync } from '../../../authorization/server/functions/hasRole'; import { sendNotification } from '../../../lib/server'; import { sendMessage } from '../../../lib/server/functions/sendMessage'; +import { + notifyOnLivechatDepartmentAgentChanged, + notifyOnLivechatDepartmentAgentChangedByAgentsAndDepartmentId, +} from '../../../lib/server/lib/notifyListener'; import { settings } from '../../../settings/server'; import { Livechat as LivechatTyped } from './LivechatTyped'; import { queueInquiry, saveQueueInquiry } from './QueueManager'; @@ -697,14 +701,31 @@ export const updateDepartmentAgents = async ( }); const { upsert = [], remove = [] } = agents; - const agentsRemoved = []; + + const agentsUpdated = []; + const agentsRemoved = remove.map(({ agentId }: { agentId: string }) => agentId); const agentsAdded = []; - for await (const { agentId } of remove) { - await LivechatDepartmentAgents.removeByDepartmentIdAndAgentId(departmentId, agentId); - agentsRemoved.push(agentId); - } if (agentsRemoved.length > 0) { + const removedIds = await LivechatDepartmentAgents.findByAgentsAndDepartmentId(agentsRemoved, departmentId, { + projection: { agentId: 1 }, + }).toArray(); + + const { deletedCount } = await LivechatDepartmentAgents.removeByIds(removedIds.map(({ _id }) => _id)); + + if (deletedCount > 0) { + removedIds.forEach(({ _id, agentId }) => { + void notifyOnLivechatDepartmentAgentChanged( + { + _id, + agentId, + departmentId, + }, + 'removed', + ); + }); + } + callbacks.runAsync('livechat.removeAgentDepartment', { departmentId, agentsId: agentsRemoved }); } @@ -714,7 +735,7 @@ export const updateDepartmentAgents = async ( continue; } - await LivechatDepartmentAgents.saveAgent({ + const livechatDepartmentAgent = await LivechatDepartmentAgents.saveAgent({ agentId: agent.agentId, departmentId, username: agentFromDb.username || '', @@ -722,6 +743,20 @@ export const updateDepartmentAgents = async ( order: agent.order ? parseFromIntOrStr(agent.order) : 0, departmentEnabled, }); + + if (livechatDepartmentAgent.upsertedId) { + void notifyOnLivechatDepartmentAgentChanged( + { + _id: livechatDepartmentAgent.upsertedId as any, + agentId: agent.agentId, + departmentId, + }, + 'inserted', + ); + } else { + agentsUpdated.push(agent.agentId); + } + agentsAdded.push(agent.agentId); } @@ -732,6 +767,10 @@ export const updateDepartmentAgents = async ( }); } + if (agentsUpdated.length > 0) { + void notifyOnLivechatDepartmentAgentChangedByAgentsAndDepartmentId(agentsUpdated, departmentId); + } + if (agentsRemoved.length > 0 || agentsAdded.length > 0) { const numAgents = await LivechatDepartmentAgents.countByDepartmentId(departmentId); await LivechatDepartment.updateNumAgentsById(departmentId, numAgents); diff --git a/apps/meteor/app/livechat/server/lib/LivechatTyped.ts b/apps/meteor/app/livechat/server/lib/LivechatTyped.ts index 8af9980eb5e6..27d9b4b9bdae 100644 --- a/apps/meteor/app/livechat/server/lib/LivechatTyped.ts +++ b/apps/meteor/app/livechat/server/lib/LivechatTyped.ts @@ -57,7 +57,7 @@ import { FileUpload } from '../../../file-upload/server'; import { deleteMessage } from '../../../lib/server/functions/deleteMessage'; import { sendMessage } from '../../../lib/server/functions/sendMessage'; import { updateMessage } from '../../../lib/server/functions/updateMessage'; -import { notifyOnRoomChangedById } from '../../../lib/server/lib/notifyListener'; +import { notifyOnLivechatDepartmentAgentChangedByDepartmentId, notifyOnRoomChangedById } from '../../../lib/server/lib/notifyListener'; import * as Mailer from '../../../mailer/server/api'; import { metrics } from '../../../metrics/server'; import { settings } from '../../../settings/server'; @@ -1002,6 +1002,8 @@ class LivechatClass { await Promise.all([LivechatDepartmentAgents.disableAgentsByDepartmentId(_id), LivechatDepartment.archiveDepartment(_id)]); + void notifyOnLivechatDepartmentAgentChangedByDepartmentId(_id); + await callbacks.run('livechat.afterDepartmentArchived', department); } @@ -1014,6 +1016,9 @@ class LivechatClass { // TODO: these kind of actions should be on events instead of here await Promise.all([LivechatDepartmentAgents.enableAgentsByDepartmentId(_id), LivechatDepartment.unarchiveDepartment(_id)]); + + void notifyOnLivechatDepartmentAgentChangedByDepartmentId(_id); + return true; } diff --git a/apps/meteor/server/database/watchCollections.ts b/apps/meteor/server/database/watchCollections.ts index 31691aab3b88..d8862ab47a53 100644 --- a/apps/meteor/server/database/watchCollections.ts +++ b/apps/meteor/server/database/watchCollections.ts @@ -32,7 +32,6 @@ export function getWatchCollections(): string[] { const collections = [ Users.getCollectionName(), LivechatInquiry.getCollectionName(), - LivechatDepartmentAgents.getCollectionName(), InstanceStatus.getCollectionName(), Settings.getCollectionName(), Subscriptions.getCollectionName(), @@ -50,6 +49,7 @@ export function getWatchCollections(): string[] { collections.push(LoginServiceConfiguration.getCollectionName()); collections.push(EmailInbox.getCollectionName()); collections.push(IntegrationHistory.getCollectionName()); + collections.push(LivechatDepartmentAgents.getCollectionName()); } if (onlyCollections.length > 0) { diff --git a/apps/meteor/server/models/dummy/BaseDummy.ts b/apps/meteor/server/models/dummy/BaseDummy.ts index c417213f5a36..9c91036d3969 100644 --- a/apps/meteor/server/models/dummy/BaseDummy.ts +++ b/apps/meteor/server/models/dummy/BaseDummy.ts @@ -131,6 +131,13 @@ export class BaseDummy< }; } + async removeByIds(_ids: T['_id'][]): Promise { + return { + acknowledged: true, + deletedCount: 0, + }; + } + async deleteOne(filter: Filter, options?: DeleteOptions & { bypassDocumentValidation?: boolean }): Promise { return this.deleteMany(filter, options); } diff --git a/apps/meteor/server/models/raw/BaseRaw.ts b/apps/meteor/server/models/raw/BaseRaw.ts index 5ab3b9802105..96f64b061ade 100644 --- a/apps/meteor/server/models/raw/BaseRaw.ts +++ b/apps/meteor/server/models/raw/BaseRaw.ts @@ -267,6 +267,10 @@ export abstract class BaseRaw< return this.deleteOne({ _id } as Filter); } + removeByIds(ids: T['_id'][]): Promise { + return this.deleteMany({ _id: { $in: ids } } as unknown as Filter); + } + async deleteOne(filter: Filter, options?: DeleteOptions & { bypassDocumentValidation?: boolean }): Promise { if (!this.trash) { if (options) { diff --git a/apps/meteor/server/models/raw/LivechatDepartment.ts b/apps/meteor/server/models/raw/LivechatDepartment.ts index a54b03876dd9..b8263af030a8 100644 --- a/apps/meteor/server/models/raw/LivechatDepartment.ts +++ b/apps/meteor/server/models/raw/LivechatDepartment.ts @@ -16,6 +16,7 @@ import type { AggregationCursor, } from 'mongodb'; +import { notifyOnLivechatDepartmentAgentChangedByDepartmentId } from '../../../app/lib/server/lib/notifyListener'; import { BaseRaw } from './BaseRaw'; export class LivechatDepartmentRaw extends BaseRaw implements ILivechatDepartmentModel { @@ -251,6 +252,7 @@ export class LivechatDepartmentRaw extends BaseRaw implemen if (current?.enabled !== data.enabled) { await LivechatDepartmentAgents.setDepartmentEnabledByDepartmentId(_id, data.enabled); + void notifyOnLivechatDepartmentAgentChangedByDepartmentId(_id, current ? 'updated' : 'inserted'); } const latestDept = await this.findOneById(_id); diff --git a/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts index 082a3e6aa2e6..76a0e7610445 100644 --- a/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts +++ b/apps/meteor/server/models/raw/LivechatDepartmentAgents.ts @@ -152,7 +152,7 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw { - return this.deleteOne({ departmentId }); + return this.deleteMany({ departmentId }); } findByDepartmentId(departmentId: string, options?: FindOptions): FindCursor { @@ -174,7 +174,7 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw { + }): Promise { return this.updateOne( { agentId: agent.agentId, @@ -192,8 +192,8 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw { - await this.deleteMany({ agentId }); + async removeByAgentId(agentId: string): Promise { + return this.deleteMany({ agentId }); } async removeByDepartmentIdAndAgentId(departmentId: string, agentId: string): Promise { @@ -201,11 +201,11 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw, - ): Promise<{ agentId: string; username: string } | null | undefined> { + ): Promise | null | undefined> { const agents = await this.findByDepartmentId(departmentId).toArray(); if (agents.length === 0) { @@ -231,25 +231,28 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw { @@ -311,15 +314,19 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw { + async getNextBotForDepartment( + departmentId: ILivechatDepartmentAgents['departmentId'], + ignoreAgentId?: ILivechatDepartmentAgents['agentId'], + ): Promise | null | undefined> { const agents = await this.findByDepartmentId(departmentId).toArray(); - if (agents.length === 0) { + if (!agents.length) { return; } - const botUsers = await Users.findBotAgents(agents.map((a) => a.username)).toArray(); - const botUsernames = botUsers.map((user) => user.username).filter(isStringValue); + const botUsernames = (await Users.findBotAgents(agents.map((a) => a.username)).toArray()) + .map((user) => user.username) + .filter(isStringValue); const query = { departmentId, @@ -329,24 +336,28 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw { @@ -376,6 +387,14 @@ export class LivechatDepartmentAgentsRaw extends BaseRaw { return this.col.distinct('agentId', { departmentId: { $in: departmentIds }, departmentEnabled: true }); } + + findByAgentsAndDepartmentId( + agentsIds: ILivechatDepartmentAgents['agentId'][], + departmentId: ILivechatDepartmentAgents['departmentId'], + options?: FindOptions, + ): FindCursor { + return this.find({ agentId: { $in: agentsIds }, departmentId }, options); + } } const isStringValue = (value: any): value is string => typeof value === 'string'; diff --git a/packages/model-typings/src/models/IBaseModel.ts b/packages/model-typings/src/models/IBaseModel.ts index 36f34a008508..fa053fef9ec8 100644 --- a/packages/model-typings/src/models/IBaseModel.ts +++ b/packages/model-typings/src/models/IBaseModel.ts @@ -85,6 +85,8 @@ export interface IBaseModel< removeById(_id: T['_id']): Promise; + removeByIds(ids: T['_id'][]): Promise; + deleteOne(filter: Filter, options?: DeleteOptions & { bypassDocumentValidation?: boolean }): Promise; deleteMany(filter: Filter, options?: DeleteOptions): Promise; diff --git a/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts b/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts index dfc2dfc5d1f2..45709dc7ff37 100644 --- a/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts +++ b/packages/model-typings/src/models/ILivechatDepartmentAgentsModel.ts @@ -67,33 +67,34 @@ export interface ILivechatDepartmentAgentsModel extends IBaseModel, ): Promise; findOneByAgentIdAndDepartmentId(agentId: string, departmentId: string): Promise; - saveAgent(agent: { - agentId: string; - departmentId: string; - username: string; - departmentEnabled: boolean; - count: number; - order: number; - }): Promise; - removeByAgentId(agentId: string): Promise; + saveAgent(agent: Omit): Promise; + removeByAgentId(agentId: string): Promise; removeByDepartmentIdAndAgentId(departmentId: string, agentId: string): Promise; getNextAgentForDepartment( - departmentId: string, + departmentId: ILivechatDepartmentAgents['departmentId'], isLivechatEnabledWhenAgentIdle?: boolean, - ignoreAgentId?: string, + ignoreAgentId?: ILivechatDepartmentAgents['agentId'], extraQuery?: Filter, - ): Promise<{ agentId: string; username: string } | null | undefined>; + ): Promise | null | undefined>; checkOnlineForDepartment(departmentId: string): Promise; getOnlineForDepartment( departmentId: string, isLivechatEnabledWhenAgentIdle?: boolean, ): Promise | undefined>; getBotsForDepartment(departmentId: string): Promise>; - getNextBotForDepartment(departmentId: string, ignoreAgentId?: string): Promise<{ agentId: string; username: string } | undefined>; + getNextBotForDepartment( + departmentId: ILivechatDepartmentAgents['departmentId'], + ignoreAgentId?: ILivechatDepartmentAgents['agentId'], + ): Promise | null | undefined>; replaceUsernameOfAgentByUserId(userId: string, username: string): Promise; countByDepartmentId(departmentId: string): Promise; disableAgentsByDepartmentId(departmentId: string): Promise; enableAgentsByDepartmentId(departmentId: string): Promise; findAllAgentsConnectedToListOfDepartments(departmentIds: string[]): Promise; findByAgentIds(agentIds: string[], options?: FindOptions): FindCursor; + findByAgentsAndDepartmentId( + agentsIds: ILivechatDepartmentAgents['agentId'][], + departmentId: ILivechatDepartmentAgents['departmentId'], + options?: FindOptions, + ): FindCursor; } From 62d4b27ea3d30ef485445214b16df6b8005fb6f3 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Thu, 6 Jun 2024 04:44:34 -0600 Subject: [PATCH 23/29] fix: Moderators with `Bypass Time limits` permission cannot edit messages (#32376) --- .changeset/eighty-wasps-kneel.md | 5 +++++ .../app/authorization/server/functions/canDeleteMessage.ts | 2 +- apps/meteor/app/lib/server/methods/updateMessage.ts | 2 +- apps/meteor/app/ui-utils/client/lib/messageActionDefault.ts | 2 +- apps/meteor/client/lib/chats/data.ts | 4 ++-- apps/meteor/client/methods/updateMessage.ts | 2 +- .../RoomFiles/hooks/useMessageDeletionIsAllowed.ts | 2 +- 7 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 .changeset/eighty-wasps-kneel.md diff --git a/.changeset/eighty-wasps-kneel.md b/.changeset/eighty-wasps-kneel.md new file mode 100644 index 000000000000..d8f297de64c3 --- /dev/null +++ b/.changeset/eighty-wasps-kneel.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed an issue with how the UI checked for permissions when deciding if editing or deleting a message by moderators users diff --git a/apps/meteor/app/authorization/server/functions/canDeleteMessage.ts b/apps/meteor/app/authorization/server/functions/canDeleteMessage.ts index 91769e71270a..7cd953a52bb2 100644 --- a/apps/meteor/app/authorization/server/functions/canDeleteMessage.ts +++ b/apps/meteor/app/authorization/server/functions/canDeleteMessage.ts @@ -34,7 +34,7 @@ export const canDeleteMessageAsync = async ( if (!allowed) { return false; } - const bypassBlockTimeLimit = await hasPermissionAsync(uid, 'bypass-time-limit-edit-and-delete'); + const bypassBlockTimeLimit = await hasPermissionAsync(uid, 'bypass-time-limit-edit-and-delete', rid); if (!bypassBlockTimeLimit) { const blockDeleteInMinutes = await getValue('Message_AllowDeleting_BlockDeleteInMinutes'); diff --git a/apps/meteor/app/lib/server/methods/updateMessage.ts b/apps/meteor/app/lib/server/methods/updateMessage.ts index 277841fd58e7..470fe0760b6d 100644 --- a/apps/meteor/app/lib/server/methods/updateMessage.ts +++ b/apps/meteor/app/lib/server/methods/updateMessage.ts @@ -53,7 +53,7 @@ export async function executeUpdateMessage(uid: IUser['_id'], message: AtLeast { return false; } const blockEditInMinutes = settings.Message_AllowEditing_BlockEditInMinutes as number; - const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete'); + const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete', message.rid); if (!bypassBlockTimeLimit && blockEditInMinutes) { let msgTs; diff --git a/apps/meteor/client/lib/chats/data.ts b/apps/meteor/client/lib/chats/data.ts index f2c049ad04b1..12fb4097dce5 100644 --- a/apps/meteor/client/lib/chats/data.ts +++ b/apps/meteor/client/lib/chats/data.ts @@ -95,7 +95,7 @@ export const createDataAPI = ({ rid, tmid }: { rid: IRoom['_id']; tmid: IMessage } const blockEditInMinutes = settings.get('Message_AllowEditing_BlockEditInMinutes') as number | undefined; - const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete'); + const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete', message.rid); const elapsedMinutes = moment().diff(message.ts, 'minutes'); if (!bypassBlockTimeLimit && elapsedMinutes && blockEditInMinutes && elapsedMinutes > blockEditInMinutes) { @@ -208,7 +208,7 @@ export const createDataAPI = ({ rid, tmid }: { rid: IRoom['_id']; tmid: IMessage } const blockDeleteInMinutes = settings.get('Message_AllowDeleting_BlockDeleteInMinutes') as number | undefined; - const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete'); + const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete', message.rid); const elapsedMinutes = moment().diff(message.ts, 'minutes'); const onTimeForDelete = bypassBlockTimeLimit || !blockDeleteInMinutes || !elapsedMinutes || elapsedMinutes <= blockDeleteInMinutes; diff --git a/apps/meteor/client/methods/updateMessage.ts b/apps/meteor/client/methods/updateMessage.ts index deb2878072c5..719a036f870c 100644 --- a/apps/meteor/client/methods/updateMessage.ts +++ b/apps/meteor/client/methods/updateMessage.ts @@ -50,7 +50,7 @@ Meteor.methods({ } const blockEditInMinutes = Number(settings.get('Message_AllowEditing_BlockEditInMinutes') as number | undefined); - const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete'); + const bypassBlockTimeLimit = hasPermission('bypass-time-limit-edit-and-delete', message.rid); if (!bypassBlockTimeLimit && blockEditInMinutes !== 0) { if (originalMessage.ts) { diff --git a/apps/meteor/client/views/room/contextualBar/RoomFiles/hooks/useMessageDeletionIsAllowed.ts b/apps/meteor/client/views/room/contextualBar/RoomFiles/hooks/useMessageDeletionIsAllowed.ts index 31bc0ce7e2ca..fee190e36423 100644 --- a/apps/meteor/client/views/room/contextualBar/RoomFiles/hooks/useMessageDeletionIsAllowed.ts +++ b/apps/meteor/client/views/room/contextualBar/RoomFiles/hooks/useMessageDeletionIsAllowed.ts @@ -9,7 +9,7 @@ export const useMessageDeletionIsAllowed = (rid: IRoom['_id'], file: IUpload, ui const deletionIsEnabled = useSetting('Message_AllowDeleting'); const userHasPermissionToDeleteAny = usePermission('delete-message', rid); const userHasPermissionToDeleteOwn = usePermission('delete-own-message'); - const bypassBlockTimeLimit = usePermission('bypass-time-limit-edit-and-delete'); + const bypassBlockTimeLimit = usePermission('bypass-time-limit-edit-and-delete', rid); const blockDeleteInMinutes = useSetting('Message_AllowDeleting_BlockDeleteInMinutes'); const isDeletionAllowed = useMemo(() => { From 2b14bf688c7185d0e201ef44236b28cf6bc3735b Mon Sep 17 00:00:00 2001 From: Diego Sampaio Date: Thu, 6 Jun 2024 10:46:04 -0300 Subject: [PATCH 24/29] Bump to 6.10.0-develop (#32565) --- apps/meteor/app/utils/rocketchat.info | 2 +- apps/meteor/package.json | 2 +- package.json | 2 +- packages/core-typings/package.json | 2 +- packages/fuselage-ui-kit/package.json | 2 +- packages/rest-typings/package.json | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/meteor/app/utils/rocketchat.info b/apps/meteor/app/utils/rocketchat.info index 4665efe41ce2..b10a632463e7 100644 --- a/apps/meteor/app/utils/rocketchat.info +++ b/apps/meteor/app/utils/rocketchat.info @@ -1,3 +1,3 @@ { - "version": "6.9.0" + "version": "6.10.0-develop" } diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 3d02862c1e76..d79155167845 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -1,7 +1,7 @@ { "name": "@rocket.chat/meteor", "description": "The Ultimate Open Source WebChat Platform", - "version": "6.9.0", + "version": "6.10.0-develop", "private": true, "author": { "name": "Rocket.Chat", diff --git a/package.json b/package.json index b9e63ffa85af..c77da78c94be 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rocket.chat", - "version": "6.9.0", + "version": "6.10.0-develop", "description": "Rocket.Chat Monorepo", "main": "index.js", "private": true, diff --git a/packages/core-typings/package.json b/packages/core-typings/package.json index 492fb7be848b..9256b3e8b6e7 100644 --- a/packages/core-typings/package.json +++ b/packages/core-typings/package.json @@ -1,7 +1,7 @@ { "$schema": "https://json.schemastore.org/package", "name": "@rocket.chat/core-typings", - "version": "6.9.0", + "version": "6.10.0-develop", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "eslint": "~8.45.0", diff --git a/packages/fuselage-ui-kit/package.json b/packages/fuselage-ui-kit/package.json index 4c7405ddf830..25d44e876dff 100644 --- a/packages/fuselage-ui-kit/package.json +++ b/packages/fuselage-ui-kit/package.json @@ -110,7 +110,7 @@ "typescript": "~5.3.3" }, "dependencies": { - "@rocket.chat/core-typings": "6.9.0", + "@rocket.chat/core-typings": "workspace:^", "@rocket.chat/gazzodown": "workspace:^", "@rocket.chat/ui-kit": "workspace:~", "tslib": "^2.5.3" diff --git a/packages/rest-typings/package.json b/packages/rest-typings/package.json index 9f425ec9521d..2d567eb10fab 100644 --- a/packages/rest-typings/package.json +++ b/packages/rest-typings/package.json @@ -1,6 +1,6 @@ { "name": "@rocket.chat/rest-typings", - "version": "6.9.0", + "version": "6.10.0-develop", "devDependencies": { "@rocket.chat/eslint-config": "workspace:^", "@types/jest": "~29.5.7", From abebb068cd1f17f6a64ae9ec282048739cb03b2c Mon Sep 17 00:00:00 2001 From: Douglas Gubert Date: Thu, 6 Jun 2024 16:58:00 -0300 Subject: [PATCH 25/29] fix: Installed apps not appearing in the list if they're not published in the Marketplace (#32534) --- .changeset/short-coins-enjoy.md | 5 + .../AppsProvider/AppsProvider.spec.ts | 39 ++++++ .../{ => AppsProvider}/AppsProvider.tsx | 77 ++---------- .../client/providers/AppsProvider/index.ts | 3 + .../AppsProvider/storeQueryFunction.ts | 64 ++++++++++ apps/meteor/tests/mocks/data/marketplace.ts | 116 ++++++++++++++++++ 6 files changed, 240 insertions(+), 64 deletions(-) create mode 100644 .changeset/short-coins-enjoy.md create mode 100644 apps/meteor/client/providers/AppsProvider/AppsProvider.spec.ts rename apps/meteor/client/providers/{ => AppsProvider}/AppsProvider.tsx (58%) create mode 100644 apps/meteor/client/providers/AppsProvider/index.ts create mode 100644 apps/meteor/client/providers/AppsProvider/storeQueryFunction.ts create mode 100644 apps/meteor/tests/mocks/data/marketplace.ts diff --git a/.changeset/short-coins-enjoy.md b/.changeset/short-coins-enjoy.md new file mode 100644 index 000000000000..d47017030fcb --- /dev/null +++ b/.changeset/short-coins-enjoy.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixed an issue where apps installed via the Marketplace would not be shown in the installed list if the app is unpublished diff --git a/apps/meteor/client/providers/AppsProvider/AppsProvider.spec.ts b/apps/meteor/client/providers/AppsProvider/AppsProvider.spec.ts new file mode 100644 index 000000000000..8210fe22eec5 --- /dev/null +++ b/apps/meteor/client/providers/AppsProvider/AppsProvider.spec.ts @@ -0,0 +1,39 @@ +import type { App } from '@rocket.chat/core-typings'; +import type { UseQueryResult } from '@tanstack/react-query'; + +import { createFakeApp } from '../../../tests/mocks/data'; +import { createFakeAppInstalledMarketplace, createFakeAppPrivate } from '../../../tests/mocks/data/marketplace'; +import { storeQueryFunction } from './storeQueryFunction'; + +describe(`when an app installed from the Marketplace, but has since been unpublished`, () => { + it(`should still be present in the installed app data provided`, () => { + const marketplaceMockQuery = { + data: [createFakeApp({ id: 'marketplace-1' }), createFakeAppInstalledMarketplace({ id: 'marketplace-2' })], + isFetched: true, + } as unknown as UseQueryResult; + + const instanceMockQuery = { + data: [ + marketplaceMockQuery.data?.[1], + createFakeAppInstalledMarketplace({ id: 'marketplace-3' }), // This app has been installed via Marketplace but has been unpublished since + createFakeAppPrivate({ id: 'private-1' }), + ], + isFetched: true, + } as unknown as UseQueryResult; + + const [marketplaceList, installedList, privateList] = storeQueryFunction(marketplaceMockQuery, instanceMockQuery); + + expect(marketplaceList.find((app) => app.id === 'marketplace-1')).toBeTruthy(); + expect(marketplaceList.find((app) => app.id === 'marketplace-2')).toBeTruthy(); + expect(marketplaceList.find((app) => app.id === 'marketplace-3')).toBeUndefined(); + expect(marketplaceList).toHaveLength(2); + + expect(installedList.find((app) => app.id === 'marketplace-1')).toBeUndefined(); + expect(installedList.find((app) => app.id === 'marketplace-2')).toBeTruthy(); + expect(installedList.find((app) => app.id === 'marketplace-3')).toBeTruthy(); + expect(installedList).toHaveLength(2); + + expect(privateList.find((app) => app.id === 'private-1')).toBeTruthy(); + expect(privateList).toHaveLength(1); + }); +}); diff --git a/apps/meteor/client/providers/AppsProvider.tsx b/apps/meteor/client/providers/AppsProvider/AppsProvider.tsx similarity index 58% rename from apps/meteor/client/providers/AppsProvider.tsx rename to apps/meteor/client/providers/AppsProvider/AppsProvider.tsx index 905302b7ce4d..cf1d4d671d94 100644 --- a/apps/meteor/client/providers/AppsProvider.tsx +++ b/apps/meteor/client/providers/AppsProvider/AppsProvider.tsx @@ -4,16 +4,15 @@ import { useQuery, useQueryClient } from '@tanstack/react-query'; import type { ReactNode } from 'react'; import React, { useEffect } from 'react'; -import { AppClientOrchestratorInstance } from '../apps/orchestrator'; -import { AppsContext } from '../contexts/AppsContext'; -import { useIsEnterprise } from '../hooks/useIsEnterprise'; -import { useInvalidateLicense } from '../hooks/useLicense'; -import type { AsyncState } from '../lib/asyncState'; -import { AsyncStatePhase } from '../lib/asyncState'; -import { useInvalidateAppsCountQueryCallback } from '../views/marketplace/hooks/useAppsCountQuery'; -import type { App } from '../views/marketplace/types'; - -const sortByName = (apps: App[]): App[] => apps.sort((a, b) => (a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1)); +import { AppClientOrchestratorInstance } from '../../apps/orchestrator'; +import { AppsContext } from '../../contexts/AppsContext'; +import { useIsEnterprise } from '../../hooks/useIsEnterprise'; +import { useInvalidateLicense } from '../../hooks/useLicense'; +import type { AsyncState } from '../../lib/asyncState'; +import { AsyncStatePhase } from '../../lib/asyncState'; +import { useInvalidateAppsCountQueryCallback } from '../../views/marketplace/hooks/useAppsCountQuery'; +import type { App } from '../../views/marketplace/types'; +import { storeQueryFunction } from './storeQueryFunction'; const getAppState = ( loading: boolean, @@ -96,60 +95,10 @@ const AppsProvider = ({ children }: AppsProviderProps) => { }, ); - const store = useQuery( - ['marketplace', 'apps-stored', instance.data, marketplace.data], - () => { - if (!marketplace.isFetched && !instance.isFetched) { - throw new Error('Apps not loaded'); - } - - const marketplaceApps: App[] = []; - const installedApps: App[] = []; - const privateApps: App[] = []; - const clonedData = [...(instance.data || [])]; - - sortByName(marketplace.data || []).forEach((app) => { - const appIndex = clonedData.findIndex(({ id }) => id === app.id); - const [installedApp] = appIndex > -1 ? clonedData.splice(appIndex, 1) : []; - - const record = { - ...app, - ...(installedApp && { - private: installedApp.private, - installed: true, - status: installedApp.status, - version: installedApp.version, - licenseValidation: installedApp.licenseValidation, - migrated: installedApp.migrated, - }), - bundledIn: app.bundledIn, - marketplaceVersion: app.version, - }; - - if (installedApp) { - if (installedApp.private) { - privateApps.push(record); - } else { - installedApps.push(record); - } - } - - marketplaceApps.push(record); - }); - - sortByName(clonedData).forEach((app) => { - if (app.private) { - privateApps.push(app); - } - }); - - return [marketplaceApps, installedApps, privateApps]; - }, - { - enabled: marketplace.isFetched && instance.isFetched, - keepPreviousData: true, - }, - ); + const store = useQuery(['marketplace', 'apps-stored', instance.data, marketplace.data], () => storeQueryFunction(marketplace, instance), { + enabled: marketplace.isFetched && instance.isFetched, + keepPreviousData: true, + }); const [marketplaceAppsData, installedAppsData, privateAppsData] = store.data || []; const { isLoading } = store; diff --git a/apps/meteor/client/providers/AppsProvider/index.ts b/apps/meteor/client/providers/AppsProvider/index.ts new file mode 100644 index 000000000000..94ae81e87e4c --- /dev/null +++ b/apps/meteor/client/providers/AppsProvider/index.ts @@ -0,0 +1,3 @@ +import AppsProvider from './AppsProvider'; + +export default AppsProvider; diff --git a/apps/meteor/client/providers/AppsProvider/storeQueryFunction.ts b/apps/meteor/client/providers/AppsProvider/storeQueryFunction.ts new file mode 100644 index 000000000000..a7c9d21f4df6 --- /dev/null +++ b/apps/meteor/client/providers/AppsProvider/storeQueryFunction.ts @@ -0,0 +1,64 @@ +import { type UseQueryResult } from '@tanstack/react-query'; + +import type { App } from '../../views/marketplace/types'; + +const sortByName = (apps: App[]): App[] => apps.sort((a, b) => (a.name.toLowerCase() > b.name.toLowerCase() ? 1 : -1)); + +/** + * Aggregates result data from marketplace request and instance installed into their appropriate lists + * + * Exporting for better testing + */ +export function storeQueryFunction( + marketplace: UseQueryResult, + instance: UseQueryResult, +): [App[], App[], App[]] { + if (!marketplace.isFetched && !instance.isFetched) { + throw new Error('Apps not loaded'); + } + + const marketplaceApps: App[] = []; + const installedApps: App[] = []; + const privateApps: App[] = []; + const clonedData = [...(instance.data || [])]; + + sortByName(marketplace.data || []).forEach((app) => { + const appIndex = clonedData.findIndex(({ id }) => id === app.id); + const [installedApp] = appIndex > -1 ? clonedData.splice(appIndex, 1) : []; + + const record = { + ...app, + ...(installedApp && { + private: installedApp.private, + installed: true, + status: installedApp.status, + version: installedApp.version, + licenseValidation: installedApp.licenseValidation, + migrated: installedApp.migrated, + }), + bundledIn: app.bundledIn, + marketplaceVersion: app.version, + }; + + if (installedApp) { + if (installedApp.private) { + privateApps.push(record); + } else { + installedApps.push(record); + } + } + + marketplaceApps.push(record); + }); + + sortByName(clonedData).forEach((app) => { + if (app.private) { + privateApps.push(app); + return; + } + + installedApps.push(app); + }); + + return [marketplaceApps, installedApps, privateApps]; +} diff --git a/apps/meteor/tests/mocks/data/marketplace.ts b/apps/meteor/tests/mocks/data/marketplace.ts new file mode 100644 index 000000000000..cb8c5d67ad10 --- /dev/null +++ b/apps/meteor/tests/mocks/data/marketplace.ts @@ -0,0 +1,116 @@ +import { faker } from '@faker-js/faker'; +import type { AppStatus } from '@rocket.chat/apps'; +import { type App, type AppSubscriptionInfo, AppSubscriptionStatus } from '@rocket.chat/core-typings'; + +import { createFakeApp } from '../data'; + +// Zero-value of the subscriptionInfo field on marketplace-api +// returned by the API when the app has no value assigned to the field +const subscriptionInfoZero = (): AppSubscriptionInfo => ({ + typeOf: '', + status: '' as AppSubscriptionStatus, // real value that is sent currently, enum should be updated + statusFromBilling: false, + isSeatBased: false, + seats: 0, + maxSeats: 0, + license: { + license: '', + version: 0, + expireDate: '0001-01-01T00:00:00Z', + }, + startDate: '0001-01-01T00:00:00Z', + periodEnd: '0001-01-01T00:00:00Z', + endDate: '0001-01-01T00:00:00Z', + // externallyManaged: false, // TODO add to typings + isSubscribedViaBundle: false, +}); + +/* + * Creates a fake record of an app that has been bought from the Marketplace + */ +export function createFakeAppBought(partial: Partial = {}): App { + const app = createFakeApp({ + isPurchased: true, + isSubscribed: false, + purchaseType: 'buy', + // isUsageBased: false, // TODO add to typings + subscriptionInfo: subscriptionInfoZero(), + ...partial, + }); + + return app; +} + +export function createFakeAppSubscribed(partial: Partial = {}): App { + const app = createFakeApp({ + isSubscribed: true, + isPurchased: false, + purchaseType: 'subscription', + subscriptionInfo: { + typeOf: 'app', + status: AppSubscriptionStatus.Active, + statusFromBilling: faker.datatype.boolean(), + isSeatBased: faker.datatype.boolean(), + seats: faker.number.int({ min: 0, max: 50 }), + maxSeats: faker.number.int({ min: 50, max: 100 }), + license: { + license: faker.lorem.word(), + version: faker.number.int({ min: 0, max: 3 }), + expireDate: faker.date.future().toISOString(), + }, + startDate: faker.date.past().toISOString(), + periodEnd: faker.date.future().toISOString(), + endDate: faker.date.future().toISOString(), + isSubscribedViaBundle: faker.datatype.boolean(), + }, + ...partial, + }); + + return app; +} + +export function createFakeAppInstalledMarketplace(partial: Partial = {}): App { + const app = createFakeAppBought({ + installed: true, + private: false, + status: 'manually_enabled' as AppStatus.MANUALLY_ENABLED, + licenseValidation: { + errors: {}, + warnings: {}, + }, + ...partial, + }); + + return app; +} + +export function createFakeAppPrivate(partial: Partial = {}): App { + const app = createFakeApp({ + installed: true, + private: true, + status: 'manually_enabled' as AppStatus.MANUALLY_ENABLED, + // Fields from marketplace + appRequestStats: undefined, + shortDescription: undefined, + price: undefined, + pricingPlans: undefined, + purchaseType: undefined, + isPurchased: undefined, + isSubscribed: undefined, + tosLink: undefined, + bundledIn: undefined, + privacyLink: undefined, + privacyPolicySummary: undefined, + documentationUrl: undefined, + detailedChangelog: undefined, + detailedDescription: undefined, + categories: undefined, + versionIncompatible: undefined, + marketplaceVersion: undefined, + latest: undefined, + subscriptionInfo: undefined, + ...partial, + }); + + return app; +} From 04b0a76d85f4803f932736cd34148a3fc713c0b8 Mon Sep 17 00:00:00 2001 From: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> Date: Thu, 6 Jun 2024 18:08:41 -0300 Subject: [PATCH 26/29] fix: Image gallery moves to older images when clicking on the right arrow button (#32106) Co-authored-by: gabriellsh <40830821+gabriellsh@users.noreply.github.com> --- .changeset/tidy-apes-fry.md | 5 +++ .../components/ImageGallery/ImageGallery.tsx | 10 ++++- .../tests/e2e/fixtures/files/number1.png | Bin 0 -> 13976 bytes .../tests/e2e/fixtures/files/number2.png | Bin 0 -> 20148 bytes .../tests/e2e/fixtures/files/number3.png | Bin 0 -> 91843 bytes .../tests/e2e/fixtures/files/number4.png | Bin 0 -> 8764 bytes .../tests/e2e/fixtures/files/number5.png | Bin 0 -> 86845 bytes .../tests/e2e/fixtures/files/number6.png | Bin 0 -> 94430 bytes apps/meteor/tests/e2e/image-gallery.spec.ts | 39 +++++++++++++++++- .../page-objects/fragments/home-content.ts | 12 ++++++ 10 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 .changeset/tidy-apes-fry.md create mode 100644 apps/meteor/tests/e2e/fixtures/files/number1.png create mode 100644 apps/meteor/tests/e2e/fixtures/files/number2.png create mode 100644 apps/meteor/tests/e2e/fixtures/files/number3.png create mode 100644 apps/meteor/tests/e2e/fixtures/files/number4.png create mode 100644 apps/meteor/tests/e2e/fixtures/files/number5.png create mode 100644 apps/meteor/tests/e2e/fixtures/files/number6.png diff --git a/.changeset/tidy-apes-fry.md b/.changeset/tidy-apes-fry.md new file mode 100644 index 000000000000..ee3922fa350c --- /dev/null +++ b/.changeset/tidy-apes-fry.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixed inverted navigation direction in the image gallery diff --git a/apps/meteor/client/components/ImageGallery/ImageGallery.tsx b/apps/meteor/client/components/ImageGallery/ImageGallery.tsx index 8f4f76a14afb..6b3b9f2c8488 100644 --- a/apps/meteor/client/components/ImageGallery/ImageGallery.tsx +++ b/apps/meteor/client/components/ImageGallery/ImageGallery.tsx @@ -112,6 +112,7 @@ export const ImageGallery = ({ images, onClose, loadMore }: { images: IUpload[]; const swiperRef = useRef(null); const [, setSwiperInst] = useState(); const [zoomScale, setZoomScale] = useState(1); + const [gridSize, setGridSize] = useState(images.length); const handleZoom = (ratio: number) => { if (swiperRef.current?.swiper.zoom) { @@ -174,9 +175,14 @@ export const ImageGallery = ({ images, onClose, loadMore }: { images: IUpload[]; onKeyPress={(_, keyCode) => String(keyCode) === '27' && onClose()} modules={[Navigation, Zoom, Keyboard, A11y]} onInit={(swiper) => setSwiperInst(swiper)} - onReachEnd={loadMore} + onSlidesGridLengthChange={(swiper) => { + swiper.slideTo(images.length - gridSize, 2000); + setGridSize(images.length); + }} + onReachBeginning={loadMore} + initialSlide={images.length - 1} > - {images?.map(({ _id, url }) => ( + {images.toReversed().map(({ _id, url }) => (
{/* eslint-disable-next-line diff --git a/apps/meteor/tests/e2e/fixtures/files/number1.png b/apps/meteor/tests/e2e/fixtures/files/number1.png new file mode 100644 index 0000000000000000000000000000000000000000..4359ce1882096f07a724131738a2e8672bec2f50 GIT binary patch literal 13976 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 GCH_BIARKrA literal 0 HcmV?d00001 diff --git a/apps/meteor/tests/e2e/fixtures/files/number2.png b/apps/meteor/tests/e2e/fixtures/files/number2.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ed8a15716690b6b91d438c5a34ad5be669be18 GIT binary patch literal 20148 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 Z<<7Q^-7Wfp1K>$&MGs|#v>xI~{s*#Zp=AI7 literal 0 HcmV?d00001 diff --git a/apps/meteor/tests/e2e/fixtures/files/number3.png b/apps/meteor/tests/e2e/fixtures/files/number3.png new file mode 100644 index 0000000000000000000000000000000000000000..7a29d4122125d591c0420d91721322e2bf3abc46 GIT binary patch literal 91843 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

KvE! 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 literal 0 HcmV?d00001 diff --git a/apps/meteor/tests/e2e/fixtures/files/number4.png b/apps/meteor/tests/e2e/fixtures/files/number4.png new file mode 100644 index 0000000000000000000000000000000000000000..7bd2b90faa94a210344bd2c30cb8183e11b4c60d GIT binary patch literal 8764 zcmZ{Kc{r3^{QitFV<&so7+V-iL?VQ-C9)g)Ai@x3-wjy{Swe|KBI}SX>w_#MM3}Kp zq-gB2<;8Ej@Avn|_mA&2*K^G^=Q*Eq-{<~3&spv>NybLH47A*|AP|T_Uk_;t0)Y|d z7d4Dr5)zRbK>mU`8|WfIXXl^7_R>sp35~CwwI2vn7IJ=p^ImZEoEHZAYTWz(@t|X+ zhaMo1Ag4Z3!#sF;eJ(7^Vmab$`{3n=EAm9y*-e_l%a?CO6-AFZBaolEZHp|H_DWw% zBy~yZuh+cOw`naGeW$?k&8{-X{oAuX&pPggzHCJkeSh{6_bc#8I)NbHi@BtulkGV_ zg5S%*=kG_-y3%tv2@L|6xWxN@YLMaL^juu5D=MO}Q z)SDyb5QUJ1iuS>#Fh}o@1zYS1z`uzJnm@<~!T{;Q-eXT_9ecG;u2RW}x=0(koRS-d zdrlutp9^|2a?H(0|N0&%?xZ!Nl|1u9J%gPmvB}K zbEoVBe`~K1YTq=goi|mTG)NxY)Zid_G@#pShX7Hc;pVX@ng_>3*G@3MO9ffMXz(XhCErGOUg62!y_Qq8br-Wr?IQ;nZGw zeICCJ)B-3(p&Ng6{`93U}g7o)xE z!HcX?1SP^CKnFZVF?n6$rg{vG&|zMVGgp{=tW2ZCPFG%BtFe6x@A~9}k(Y6l5QkkS zEb{SQ$Ml43k^U=#N5O&?ajKI;5Dv)W=(J)7bAnBD6IKCu57?|dsMAUjR{mqH^fPRh z2lDdE_opvXH9tS&SW9sU3O<1mQu%rEznugD*L>C3!ZL$6d_@)2CWtNJV?AK6mn3oG zJp#{woAJ^Ejf1u);c4NlSar%_m{FHo7U_LrBSH~!7DCh~<`CFuRpqkNHv$I2+uwzv zrF|JE^ORZgX2rL^#T!~i&<0Zk(}X=SkEMOS;iDI>G4UuxKY~MvFVCs^xPac;tM9}Q zC?@3M`M*-}a?Igbc86|UqC!BW``!xC2iPmpSja1?E?yyW68=yRRmxnM8)4aoPM8zF z0da)r&?-`$zIB5$WLF&)nOqfQ?)xlp!{ug2;ft8KaaZ69f!OlKifT(8=s^Xy$Hqv? z&UM0%Vmw)V)qJ6i*>^NVBKZh5eN@<2=;Ltl=HxfWih3Pge`pBB3(pAMOTUYxFMEup zN&%-~YbFoq%D{}-8&=qGjQ~o;C{JkPA54r<6aLzQbow!K#Hf)?}L1_X(iX98BZh;L?L>cV4ngveb- zNP%Fli|xCLrWz{+?!z03VE=m3!z4B|mE!k5YMZaj@X=-#jtgz&A;2rJ!PgA#q?|ya zBeuqc%Jq%syrt*w-*Fa@#=LF`FP@9(&C^d92Gr?!^$fI(!c})UBp2ePEGIRXGAOBV zz2iYoGkV99s$a=e8d09Igi+o;X5Pp^*b{^nUpYT6XPql!wY|1r3%svwl6-HMqc4oC zaq?+>CEVr1%xWzoQ^{R>E&3Wn$UaB^4SgVZ0hkxwFmPTnGS3fBi)O{vP~@QH3EE?e z7q*0mBej04tP=yQW}J?wp^x(g;j}4M`pN;|vzT^Du?umnl`gR;Z+0C@N2hXW%Zx0YU4`hnlA{hS))8)A(vc;0b)O z4Jj4TFPal9y~2_@q?|0#gI@8i(wTaX)_b#eD@FTkCqCBAI-n*Xl2~|YLyFfQebOl&vPkpRfNZ>L=R20(7C7Df_ zv2df}8DZuo1McyoVn&RMBv#Obu}Tk??E^ce^(uJwRyy%f1sH>oOx${MH~`J|@g^<< zXIhz>+Miu7PX3e@E5a}d?KuNMvBQ0-s|CcC+i>xEXfxwX`&Cmx=I3=kyqR~ki0*h- z7X8{3Ld>e3w;^kiZg<U5b|IyGVh=~ZgHeousjfexp5eKbI$ zJj4B1&p(_Nlb2$$;(DC{u?aJGsxg%bu;*t!N~E7uv;tXFYYkf8Jd}u( z_GNw1E6rljfZ|c*oK3xVo$H?wmGmR0HmoXhQav6!=o{Q!Kd6gKB5ZHdN~Qa+O$4HR?nZc|)yuyn^ROCFkfNtv2Ajx(o^l>^gpXY%4O}=>m0`x&;{BBN zm|$$f(KmsYx;?n=yY!Q)ygXxj+QKjToW0evXi7vFD%%=jUQr)(B}8NP5>A36 zSZ^tU96#%J3q_N}cYk{`CskfSiSnA1)4>=k+m@C`e0|N3!Y#u<-D~0YO4B`@D7vDN z#5c#rob)yn!6TZr=!~Tp%*lNP`>EU}4rj6Vt9?Q}J1C*egpu=w?#CM=g&h^LnKNS@ z%2qy@cD%W9DR=2_s@}&ZT#%*ygk$-Z7UEox)20Ky;Td+Qt8UTOI(ea`WJSuc4fw0H zr9_L^#(2hThEs9K#19YqM(Suod6g+8t-6=eTB~c>-1vO?w*qUs%*>ev@vVP_(2b;4 z0cKMZaE>G6uY4*6h3}`8S_$ZZ3wVX>?x8-prD5kVYmGkKTc^B0i#e|`lY%trr#n}3T zMTvyKmppZ^_*hq57GfPsTiGVmYUFG0m-O_ypBKo^<(3?d_41B8&N&oi2=qq7#6QyW z(KgLe$h$R5CwuQW7^Mlz3zDp^_HLh>uE^E~yxW;9M(GZd_(I2nyEYaOPI`4jrb*ME$`#RrXRt!5E zYO3dK!7n!I#=J-lE%0vdLH>nu7;hoG?kg)stOGmM#rOF4PB$s;vjptzVB5B>1--X^vye;(P=T5N#LNfhClnyJ!Z%a4n{WA zE@-_k+s*7Pkkdgaq{9}K!ly#4Zbg$U2eNi>5A<_aQ9u8@!!PjH7+A&yjMkScRF#(# zTS(}xn8ljW2`JMI(1>bjS16aBYW8)D2vv^#1N>Ytk;x8!lh>y0Vs(cys%E7mXN@v{ z*a(`xJJgdBw-8#)9hj zR8(5j-{oIk`3O^uT{t^I<3rZ298Qhc;dK^E_y-Fd#M1XCdOS5-li%V!O1mzd)k3Xm z6}_T6Pi$3GjPLsX{MNt!DFQl4Po4rwIH>wk8+5xKK#Y_(X1Zdxu0=s=+JCkvvfR=A z)_-@8AG=J78KR(54!0hb5Av%aDZ%oi(&zH~+i@D}dSA*y~~R_EBC>?wzE7|-gD zvD_;y@N}`Vu;_JMs%j$gEJQP@``hy*)zBhhfA5@W`Ct_ol|}=SO1|i%)aiEVXC`;* zgsD_IFvxVSkzu36#s(`7<|#0YCtqTpQhvTmEU!R+${_b~-#U0pV}Qet`hy{qk=M?qP|+i5rIw3IAs9q*laqbo;P1q!9f0P&LB5)#B@N%ZO%8Sp#wu(k6&kwrY; zp>QkbFJjZ@nGJM3|4UE$58+0n`!qxvPSFROS0tL zz3O{}-x^Aua!(;{>`>p>%Oa!6DJ=3Cjpm!2@>?=+ciu`fkjB0rrVUI9AQ5L48t0JO z-4AYbEJ07O6VzV;=NP3Lj`Iq9LkgYjQXl@9{4Y5>w8OuZ$DP7P)#Jq&CJ;2^~R()Q6K(fP+B+AOSfMocnm62 zTNJt6kQI(qy+j_kxy4_;MEjMH#LJe9#XvYH^q_u zIfx<&m?vdC2*xU~T-<26Y6`zsKx5^=wPvzK)M)<2&-X~eM2`33bFk>^YmYw3x+brW zsKJR@%H;AVu$`FAZN(JD$ot;pbaZK4)IReQ|WIhgMco(#XQ1O92mb$8}W~#~O=F zOKk1ogsVBEVwMMA*VP?jR>*u4?3fG|-PcfIY`mPl-1+2|gWXNhy%w$|dzD5iQiOoO z%|=~~bB_3|u9=Gl&Tii|oA+&adL%3lG|KL%ueXrb$x3j@c#Cu#{aBfaqK3aSU^Ye8 z>7#)+%+Mn-=QgamWBR8(^fj46WVyV1c39h&S3dI76_8Wab6Sy}<2}il%tBr>x#DIq z_PSKBZ{2v8z|O}GzIixL-P$o*Wbu)(rZrKId%R`RyN zk=k}s$=sDH7;*KEpNopR_uU*D5rhC`Wn$~Xghm+)hU;ekYvk0+>w$lVo<@fuev{km z41`){k>3^FFC)3k|B9FKS{35{!q42^pZR5w1MXZQ{Zz$0T#@I#SM#<`Sp{7nA6bh} zulX&76|Mq?*Sfwu|4&?Nawp#GjwH}YQ%C+=Wvl>fW1piL?l$}=&!^GB@&cK2MyUd1 zEy$jBdwgQ5d17tqztHFV_o7wFQ)YqRNW-;Qja4${TUFZ1vj67GyfF4hF@{fb^hEv7TiM%7eO)=7UJJ2b$qlJ} zCm7(dT3w%@zeiIJ4E~#8Ob3J_vACwQf%uj$y8)` z{GFo4)s^Bxa+dtVSO+i5b+|TtV9R9TQlyV(VhT*DmL^%B?BrBq%($m33}9jhf2_cV zXTKLHuR_3SnDh*rPJaG~@jwv<<*31uYH7Ny!ol=^BqY{|sqyi|c2s97qq~PmvyPU0 z$9IXd(l&=|beEvMPPY_PrLn(q2sOGv92gd$* zFehbLZF|eU0P}p=X^W8=LLzym6I@NDi+6NyE`SoCRU|9-1x z)BmKJ1Yb=RfsbxUg!pOsVV8OOZ4v_SUtn&s!6A0;v9=E_+9oLeVP$S=T!dyj`d}Lv zf~NvJw1p=e-sbc?2&Jox1?ULY`*8SjcCXwD`ZQ{V8P##Gmvb~e6291X9}zp?=sSVG zHGVBRrP@FW{;oc~?Z|5GFKwl2FpU`8)J?{j>ksoK8bl3UHZ(Hj?X^U`kOuTr=DPP; z%BiB*U#aO|_Q=l|`E1qp-#$z!RX`M|zolBkD@^$R~B7Tg* z+q-0rsp5n6s~nXx4fWldVGNbD0(5+2uaEs^JIUtb*v}!~_=3Ga1FJzGa(T#a-cqfY4S4W?|o!p5emF)Ri{Lt7P&AEdSY zZ@-{SxD^ZpTXA|3&|Vr6fl zk3`c?c?sWJbl@3!D!3<~7_Y*uS6Ycy(ZB5Rw~#EWA#FXPFjIFlAE*EbnoUjAqp5eA zGX46v9Sj-7Ylkrge+yVg3Y*M-tc%kWEu(h}-D(BCRb#~9Njq1wrJ&-Macw_H-7WW9 z?eNA(7AMYZar-!Dl`5so?o5!e-I!y;@>JI>OGjo(ND<})RoGB9g**5Y)YdBNZ}F5 z;K37ED_*CzwZI#E$~-fqfqY|}j|%h>|H;Ipj0;aXG$ShD8#vQZAq<158VA*dhx{CX zEg)2uBLa_G{V2Co<&f9C;ztBz>zD?09phrI~*Rd3e+vG z3vh~)o1{5nMdy=R1>xz9jDyKVVOAH~5}=K~+Zu&)dwk64dY=7qMMUl42pTq2h!4Hv z!*KFG`Go@<$kXUF;0qdrHXvamkw(VQY^K{r!hd#oHX7|l@9;j0fB4BGmw1$4$mIUe^ zSrt)J$OoJN)3TBA)F5`Jt90UHHkCs`kM`b~$Jt?na2wwtz}C~KY~&ny2k}K-HuUP< z_gyvkN!VuluNF(^eP{2JeAy_yvMAM%&Wr|N4*1n`8p85`o!!`q>N!im+Iwqv?>NTx zr-2B%S*lrz`uM2n-h!A_(T2Hs6%Rle#~+a32OM$Vk@Gy=1+Wf-cgdER1i99a*YI zh@%+rjtkC0LxgBTc=8eA%~dAjK}fOm#Xsx<9ZBNZj(T zZ%Cw{=BQ-Qk*E~V#6nf?e;L85Q|&jCZPL$cUDNX;f;LW2W;(>cT%okr?=wfxr55t7 zTj7Zf9}=Rg%i`FPvN!=w8*f6zcqawpd000eFg@*AD3wf(V?YeVO$rkEi9CSDxz|`0 zi{fdeQevCH#ZXgm{Lrj`Hq$k84#jhdH&|AB&q3>v*DD1UvCt1+Jz*Q5j>oDJ$$Gxt zWWN;Ro*IhMIQ+$ujf6gpivZT=J6m8XYPXTe-;(1d)`1SCN9@SWD%Z}oPbDdUH?Vgz zpCp&`@vFw#l`TeRHp>g|ffze?2Izh0eHiz-r>(*?fmj=vX}3)pNDm2&vVjlyPhNi|rPb3n~gsza7WMcIr&Z4L!qA+% zx)d|+r1HLCOsh1TBuxNFt&WD650oZ$eMF^S@F)A^-ps7ehYoHDUSXI%z_z7&ul@x! za+nAkGCFl0<1=u$TQ>F&!&z@zq5T?k&NIWc*8LMzCF;hiN%!odGMLN{HrzKaF#M3r z??QWgJ54x?`yJ07BhU8ew3o6cIRFdGpNoi?6sr@-tx_emAN9N$cGn7Z-3@_B0f(gQ zT|GHo&?&zyYcn)sp)k{-lUJshJ9-e;Bu2I=^o65`2s2v=Scr$mfX6$rr*u`cX#U2R z_h=M{MOZl32|`3Xw&A9tVTzJr05tRlJQb#v)~?UH-eL!b60q&ywvpps;|j$3iEI4_ z9NU?MnP-_};pgWefKP4H+{ja6Q#3>$(~jkDukrv=fD(5+RZ@04AOti;Hwnz8C=LaT zYA-7SY19J~cN_)a+UP&zQZ#PY=m znpScUJ=U75eqk*Y`mn3~>;nh6!IX`VkF;JU4Sh}L$6MN;D{AxE_hY%8U;Dp;iThmH zE3NGv?=Kcn8|w@tT6op&+|mE!ylndIL?Xi{9P{tlnlHk5xy6e`oDYBzHHczBnET6e z_ZA=UQ4EGw@p2Sb;KQ^S$vI^lD~7)hHnE_g!JfO}m~;-Eq#1u*o&evWj9 z+RJ|hbD8*of*~Zs6M7zFAD99^r~e4wZg&NXZE>(1?jq0bi`4A1<}nJd?!Gq#z56B8 zjQ-_a%_YZ|1Uq#5Y6%)#bKmzKusJwk!1F(S^{Sw1H`Bt?i$>r@;l~eCdiL|w+4J}x zTy0EwABbdl%Q_PoETqWy9Z%?3o%yO}o?bE{0t-(|Ng*iV!_nZz!_XVQBiPHKgk&kT zNHAUbwdjbI2QnOgxO$)X03D2^h@tI{)c#4i)Lz)G{J%%kib|*8#_UZCbpAmDgA%nT z=t1#_8KQUB5r9sCfQB0nk9L6s~`2GI= z!_tR`RCMtR_B;9TmbzqGl)8}kbkTyA2H}xRbp)Gs4zKtlw>9tiy!it|)TYNJ#Sij| z?3vvwySHf;lu(dHn(udsE`$z;rQMErm;QnYG~{gJ(OGLo@BS0d{_dX_6fbuuY+~rP zItdf%U%etFdretZRz2Uu>3;=y``q<#3;DkTjDXcSasbyk zf|-w-e~{BdS5Qz;khI5rjGv2>udB4r!+UufH@L}__|7Ytd-!{~f{X&Zon0Ra$O}Al hy({4CLH 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
  • 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 M { let poHomeChannel: HomeChannel; let targetChannel: string; + let targetChannelLargeImage: string; const viewport = { width: 1280, height: 720, }; + // Using more than 5 images so that new images need to be loaded by the gallery + const imageNames = ['number1.png', 'number2.png', 'number3.png', 'number4.png', 'number5.png', 'number6.png']; test.use({ viewport }); test.beforeAll(async ({ api, browser }) => { targetChannel = await createTargetChannel(api); + targetChannelLargeImage = await createTargetChannel(api); const { page } = await createAuxContext(browser, Users.user1); poHomeChannel = new HomeChannel(page); + await poHomeChannel.sidenav.openChat(targetChannelLargeImage); + await poHomeChannel.content.btnJoinRoom.click(); + await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.content.btnJoinRoom.click(); }); test.afterAll(async ({ api }) => { await deleteChannel(api, targetChannel); + await deleteChannel(api, targetChannelLargeImage); }); test.describe('When sending an image as a file', () => { test.beforeAll(async() => { + await poHomeChannel.sidenav.openChat(targetChannel); + for await (const imageName of imageNames) { + await poHomeChannel.content.sendFileMessage(imageName); + await poHomeChannel.content.btnModalConfirm.click(); + await expect(poHomeChannel.content.lastUserMessage).toContainText(imageName); + } + + await poHomeChannel.sidenav.openChat(targetChannelLargeImage); await poHomeChannel.content.sendFileMessage('test-large-image.jpeg'); await poHomeChannel.content.btnModalConfirm.click(); - await expect(poHomeChannel.content.lastUserMessage).toContainText('test-large-image.jpeg'); await poHomeChannel.content.lastUserMessage.locator('img.gallery-item').click(); @@ -76,6 +91,28 @@ test.describe.serial('Image Gallery', async () => { await expect(poHomeChannel.content.imageGalleryImage).not.toBeVisible(); }); + + test('expect successfully move to older images by using the left arrow button', async () => { + await poHomeChannel.sidenav.openChat(targetChannel); + await poHomeChannel.content.lastUserMessage.locator('img.gallery-item').click(); + /* eslint-disable no-await-in-loop */ + for (let i = 0; i < imageNames.length - 1; i++) { + await expect(poHomeChannel.content.previousSlideButton).toBeEnabled(); + await expect(poHomeChannel.content.currentGalleryImage).toHaveAttribute('src', new RegExp(`${imageNames[imageNames.length - (i + 1)]}$`)); + await poHomeChannel.content.previousSlideButton.click(); + } + await expect(poHomeChannel.content.previousSlideButton).toBeDisabled(); + }); + + test('expect successfully move to newer images by using the right arrow button', async () => { + for (let i = 0; i < imageNames.length - 1; i++) { + await expect(poHomeChannel.content.nextSlideButton).toBeEnabled(); + await expect(poHomeChannel.content.currentGalleryImage).toHaveAttribute('src', new RegExp(`${imageNames[i]}$`)); + await poHomeChannel.content.nextSlideButton.click(); + } + await expect(poHomeChannel.content.nextSlideButton).toBeDisabled(); + await (await poHomeChannel.content.getGalleryButtonByName('close')).click(); + }); }); test.describe('When sending an image as a link', () => { diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts index 4f55c4f088e7..02f7dde09a85 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-content.ts @@ -359,6 +359,18 @@ export class HomeContent { return this.page.locator('role=button[name="Or talk as anonymous"]'); } + get nextSlideButton(): Locator { + return this.page.getByLabel('Next slide'); + } + + get previousSlideButton(): Locator { + return this.page.getByLabel('Previous slide'); + } + + get currentGalleryImage(): Locator { + return this.page.locator('div[class="swiper-slide swiper-slide-active"] img'); + } + findSystemMessage(text: string): Locator { return this.page.locator(`[data-qa-type="system-message-body"] >> text="${text}"`); } From 1e8d97ff54740725369d57acf3215a693accb165 Mon Sep 17 00:00:00 2001 From: Kevin Aleman Date: Mon, 10 Jun 2024 07:25:26 -0600 Subject: [PATCH 27/29] chore: Use `prettier` on UI tests files (#32526) --- apps/meteor/tests/e2e/.eslintrc.json | 2 +- .../tests/e2e/access-security-page.spec.ts | 4 +- apps/meteor/tests/e2e/account-profile.spec.ts | 44 ++-- apps/meteor/tests/e2e/administration.spec.ts | 14 +- .../tests/e2e/channel-management.spec.ts | 8 +- apps/meteor/tests/e2e/e2e-encryption.spec.ts | 1 - .../page-objects/fragments/home-content.ts | 6 +- .../tests/messaging/threads.spec.ts | 210 ++++++++++-------- apps/meteor/tests/e2e/forgot-password.spec.ts | 4 +- apps/meteor/tests/e2e/homepage.spec.ts | 4 +- apps/meteor/tests/e2e/image-gallery.spec.ts | 43 ++-- apps/meteor/tests/e2e/imports.spec.ts | 42 ++-- apps/meteor/tests/e2e/login.spec.ts | 2 +- apps/meteor/tests/e2e/message-actions.spec.ts | 18 +- .../meteor/tests/e2e/message-composer.spec.ts | 6 +- .../meteor/tests/e2e/message-mentions.spec.ts | 45 ++-- apps/meteor/tests/e2e/messaging.spec.ts | 29 ++- .../omnichannel-chat-transfers.spec.ts | 2 +- .../omnichannel-current-chats.spec.ts | 2 +- .../omnichannel-livechat-api.spec.ts | 9 +- ...channel-livechat-avatar-visibility.spec.ts | 2 +- .../omnichannel-livechat-department.spec.ts | 7 +- .../omnichannel-livechat-fileupload.spec.ts | 31 +-- ...nnel-livechat-message-bubble-color.spec.ts | 2 +- ...channel-livechat-tab-communication.spec.ts | 8 +- .../omnichannel/omnichannel-livechat.spec.ts | 2 +- .../omnichannel-manager-role.spec.ts | 2 +- ...mnichannel-manual-selection-logout.spec.ts | 2 +- .../omnichannel-manual-selection.spec.ts | 8 +- .../omnichannel-monitor-role.spec.ts | 2 +- .../omnichannel/omnichannel-reports.spec.ts | 2 +- .../e2e/omnichannel/omnichannel-tags.spec.ts | 26 +-- ...hannel-triggers-after-registration.spec.ts | 14 +- .../e2e/omnichannel/omnichannel-units.spec.ts | 2 +- .../fragments/admin-flextab-users.ts | 2 +- .../fragments/home-flextab-members.ts | 1 - .../fragments/home-flextab-room.ts | 2 +- .../fragments/home-omnichannel-content.ts | 6 +- .../tests/e2e/page-objects/home-channel.ts | 2 +- .../tests/e2e/page-objects/home-team.ts | 4 +- .../e2e/page-objects/omnichannel-tags.ts | 44 ++-- .../e2e/page-objects/omnichannel-triggers.ts | 7 +- apps/meteor/tests/e2e/read-receipts.spec.ts | 12 +- apps/meteor/tests/e2e/register.spec.ts | 4 +- apps/meteor/tests/e2e/reset-password.spec.ts | 46 ++-- .../meteor/tests/e2e/retention-policy.spec.ts | 20 +- apps/meteor/tests/e2e/saml.spec.ts | 7 +- .../tests/e2e/search-discussion.spec.ts | 4 +- .../e2e/sidebar-administration-menu.spec.ts | 8 +- apps/meteor/tests/e2e/sidebar.spec.ts | 38 ++-- apps/meteor/tests/e2e/threads.spec.ts | 4 +- .../tests/e2e/utils/create-target-channel.ts | 2 +- apps/meteor/tests/e2e/utils/custom-role.ts | 2 +- apps/meteor/tests/e2e/utils/getUserInfo.ts | 4 +- .../tests/e2e/utils/omnichannel/agents.ts | 2 +- .../e2e/utils/omnichannel/departments.ts | 45 ++-- .../tests/e2e/utils/omnichannel/managers.ts | 2 +- .../tests/e2e/utils/omnichannel/monitors.ts | 2 +- .../tests/e2e/utils/omnichannel/rooms.ts | 2 +- .../tests/e2e/utils/omnichannel/tags.ts | 36 ++- .../tests/e2e/utils/omnichannel/units.ts | 4 +- .../tests/e2e/utils/parseMeteorResponse.ts | 4 +- .../tests/e2e/utils/setUserPreferences.ts | 2 +- 63 files changed, 491 insertions(+), 432 deletions(-) diff --git a/apps/meteor/tests/e2e/.eslintrc.json b/apps/meteor/tests/e2e/.eslintrc.json index 303264be56f0..aa970258b4c7 100644 --- a/apps/meteor/tests/e2e/.eslintrc.json +++ b/apps/meteor/tests/e2e/.eslintrc.json @@ -1,6 +1,6 @@ { "root": true, - "extends": ["@rocket.chat/eslint-config/original", "@rocket.chat/eslint-config/react", "prettier", "plugin:@typescript-eslint/recommended"], + "extends": ["@rocket.chat/eslint-config", "@rocket.chat/eslint-config/react", "prettier", "plugin:@typescript-eslint/recommended"], "parser": "@typescript-eslint/parser", "plugins": ["prettier", "testing-library", "anti-trojan-source", "no-floating-promise"], "rules": { diff --git a/apps/meteor/tests/e2e/access-security-page.spec.ts b/apps/meteor/tests/e2e/access-security-page.spec.ts index 40153892dd32..590f41297ef2 100644 --- a/apps/meteor/tests/e2e/access-security-page.spec.ts +++ b/apps/meteor/tests/e2e/access-security-page.spec.ts @@ -27,7 +27,7 @@ test.describe.serial('access-security-page', () => { setSettingValueById(api, 'Accounts_AllowPasswordChange', true), setSettingValueById(api, 'Accounts_TwoFactorAuthentication_Enabled', true), setSettingValueById(api, 'E2E_Enable', false), - ]) + ]), ); test('security tab is invisible when password change, 2FA and E2E are disabled', async ({ page }) => { @@ -77,5 +77,5 @@ test.describe.serial('access-security-page', () => { ]); await expect(poAccountProfile.securityE2EEncryptionSection).toBeVisible(); }); - }) + }); }); diff --git a/apps/meteor/tests/e2e/account-profile.spec.ts b/apps/meteor/tests/e2e/account-profile.spec.ts index e287a1c694c4..c549a8b420c7 100644 --- a/apps/meteor/tests/e2e/account-profile.spec.ts +++ b/apps/meteor/tests/e2e/account-profile.spec.ts @@ -21,51 +21,51 @@ test.describe.serial('settings-account-profile', () => { test.describe('Profile', () => { test.beforeEach(async ({ page }) => { await page.goto('/account/profile'); - }) + }); test.skip('expect update profile with new name/username', async () => { const newName = faker.person.fullName(); const newUsername = faker.internet.userName({ firstName: newName }); - + await poAccountProfile.inputName.fill(newName); await poAccountProfile.inputUsername.fill(newUsername); await poAccountProfile.btnSubmit.click(); await poAccountProfile.btnClose.click(); await poHomeChannel.sidenav.openChat('general'); await poHomeChannel.content.sendMessage('any_message'); - + await expect(poHomeChannel.content.lastUserMessageNotSequential).toContainText(newUsername); - + await poHomeChannel.content.lastUserMessageNotSequential.locator('figure').click(); await poHomeChannel.content.linkUserCard.click(); - + await expect(poHomeChannel.tabs.userInfoUsername).toHaveText(newUsername); - }) + }); test.describe('Avatar', () => { - test('should change avatar image by uploading file', async () => { + test('should change avatar image by uploading file', async () => { await poAccountProfile.inputImageFile.setInputFiles('./tests/e2e/fixtures/files/test-image.jpeg'); await poAccountProfile.btnSubmit.click(); - + await expect(poAccountProfile.userAvatarEditor).toHaveAttribute('src'); }); - test('should change avatar image from url', async () => { + test('should change avatar image from url', async () => { await poAccountProfile.inputAvatarLink.fill('https://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50'); await poAccountProfile.btnSetAvatarLink.click(); - + await poAccountProfile.btnSubmit.click(); await expect(poAccountProfile.userAvatarEditor).toHaveAttribute('src'); }); - test('should display a skeleton if the image url is not valid', async () => { + test('should display a skeleton if the image url is not valid', async () => { await poAccountProfile.inputAvatarLink.fill('https://invalidUrl'); await poAccountProfile.btnSetAvatarLink.click(); - + await poAccountProfile.btnSubmit.click(); await expect(poAccountProfile.userAvatarEditor).not.toHaveAttribute('src'); }); - }) + }); }); test.describe('Security', () => { @@ -74,8 +74,8 @@ test.describe.serial('settings-account-profile', () => { const results = await makeAxeBuilder().analyze(); expect(results.violations).toEqual([]); - }) - }) + }); + }); test('Personal Access Tokens', async ({ page }) => { const response = page.waitForResponse('**/api/v1/users.getPersonalAccessTokens'); @@ -120,8 +120,8 @@ test.describe.serial('settings-account-profile', () => { const results = await makeAxeBuilder().analyze(); expect(results.violations).toEqual([]); - }) - }) + }); + }); test.describe('Feature Preview', () => { test('should not have any accessibility violations', async ({ page, makeAxeBuilder }) => { @@ -129,8 +129,8 @@ test.describe.serial('settings-account-profile', () => { const results = await makeAxeBuilder().analyze(); expect(results.violations).toEqual([]); - }) - }) + }); + }); test.describe('Accessibility & Appearance', () => { test('should not have any accessibility violations', async ({ page, makeAxeBuilder }) => { @@ -138,8 +138,6 @@ test.describe.serial('settings-account-profile', () => { const results = await makeAxeBuilder().analyze(); expect(results.violations).toEqual([]); - }) - }) + }); + }); }); - - diff --git a/apps/meteor/tests/e2e/administration.spec.ts b/apps/meteor/tests/e2e/administration.spec.ts index d51c85bdc9ba..902d4f09b12c 100644 --- a/apps/meteor/tests/e2e/administration.spec.ts +++ b/apps/meteor/tests/e2e/administration.spec.ts @@ -210,7 +210,7 @@ test.describe.parallel('administration', () => { test.describe('Users in role', () => { const channelName = faker.string.uuid(); test.beforeAll(async ({ api }) => { - // TODO: refactor createChannel utility in order to get channel data when creating + // TODO: refactor createChannel utility in order to get channel data when creating const response = await api.post('/channels.create', { name: channelName, members: ['user1'] }); const { channel } = await response.json(); @@ -223,7 +223,7 @@ test.describe.parallel('administration', () => { await poAdmin.btnUsersInRole.click(); await poAdmin.inputRoom.fill(channelName); await page.getByRole('option', { name: channelName }).click(); - + await expect(poAdmin.getUserRowByUsername('user1')).toBeVisible(); }); @@ -237,7 +237,7 @@ test.describe.parallel('administration', () => { await poAdmin.inputUsers.fill('user1'); await page.getByRole('option', { name: 'user1' }).click(); await poAdmin.btnAdd.click(); - + await expect(poAdmin.getUserRowByUsername('user1')).toBeVisible(); }); @@ -257,11 +257,11 @@ test.describe.parallel('administration', () => { test('should back to the permissions page', async ({ page }) => { await poAdmin.openRoleByName('Moderator').click(); await poAdmin.btnUsersInRole.click(); - await poAdmin.btnBack.click(); - + await poAdmin.btnBack.click(); + await expect(page.locator('h1 >> text="Permissions"')).toBeVisible(); }); - }) + }); }); test.describe('Mailer', () => { @@ -282,7 +282,7 @@ test.describe.parallel('administration', () => { }); test.afterAll(async ({ api }) => { - await setSettingValueById(api, 'Language', 'en') + await setSettingValueById(api, 'Language', 'en'); }); test('expect be able to reset a setting after a change', async () => { diff --git a/apps/meteor/tests/e2e/channel-management.spec.ts b/apps/meteor/tests/e2e/channel-management.spec.ts index aeaa74773354..f9c779b728b9 100644 --- a/apps/meteor/tests/e2e/channel-management.spec.ts +++ b/apps/meteor/tests/e2e/channel-management.spec.ts @@ -146,7 +146,7 @@ test.describe.serial('channel-management', () => { await user1Page.close(); }); - + test('should set user1 as moderator', async ({ browser }) => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnTabMembers.click(); @@ -264,7 +264,7 @@ test.describe.serial('channel-management', () => { await page.getByRole('button', { name: targetChannel }).first().focus(); await page.keyboard.press('Space'); await page.getByRole('dialog').waitFor(); - + await expect(page.getByRole('dialog')).toBeVisible(); }); @@ -275,7 +275,7 @@ test.describe.serial('channel-management', () => { await page.getByRole('menuitem', { name: 'Discussion' }).click(); await page.getByRole('textbox', { name: 'Name' }).fill(discussionName); await page.getByRole('button', { name: 'Create' }).click(); - + await expect(page.getByRole('heading', { name: discussionName })).toBeVisible(); }); @@ -286,7 +286,7 @@ test.describe.serial('channel-management', () => { await page.keyboard.press('Tab'); await page.keyboard.press('Tab'); await page.keyboard.press('Space'); - + await expect(page).toHaveURL(`/channel/${targetChannel}`); }); diff --git a/apps/meteor/tests/e2e/e2e-encryption.spec.ts b/apps/meteor/tests/e2e/e2e-encryption.spec.ts index 55de92ef8bad..b33365c5dce0 100644 --- a/apps/meteor/tests/e2e/e2e-encryption.spec.ts +++ b/apps/meteor/tests/e2e/e2e-encryption.spec.ts @@ -447,5 +447,4 @@ test.describe.serial('e2ee room setup', () => { await expect(poHomeChannel.content.inputMessage).not.toBeVisible(); await expect(page.locator('.rcx-states__title')).toContainText('Check back later'); }); - }); diff --git a/apps/meteor/tests/e2e/federation/page-objects/fragments/home-content.ts b/apps/meteor/tests/e2e/federation/page-objects/fragments/home-content.ts index 2534bf817a30..532cca6795fc 100644 --- a/apps/meteor/tests/e2e/federation/page-objects/fragments/home-content.ts +++ b/apps/meteor/tests/e2e/federation/page-objects/fragments/home-content.ts @@ -264,12 +264,14 @@ export class FederationHomeContent { async openLastThreadMessageMenu(): Promise { await this.page.getByRole('dialog').locator('[data-qa-type="message"]').last().hover(); await this.page - .getByRole('dialog').locator('[data-qa-type="message"]') + .getByRole('dialog') + .locator('[data-qa-type="message"]') .last() .locator('[data-qa-type="message-action-menu"][data-qa-id="menu"]') .waitFor(); await this.page - .getByRole('dialog').locator('[data-qa-type="message"]') + .getByRole('dialog') + .locator('[data-qa-type="message"]') .last() .locator('[data-qa-type="message-action-menu"][data-qa-id="menu"]') .click(); diff --git a/apps/meteor/tests/e2e/federation/tests/messaging/threads.spec.ts b/apps/meteor/tests/e2e/federation/tests/messaging/threads.spec.ts index d52af145dae2..f03e33ebdc3d 100644 --- a/apps/meteor/tests/e2e/federation/tests/messaging/threads.spec.ts +++ b/apps/meteor/tests/e2e/federation/tests/messaging/threads.spec.ts @@ -90,22 +90,22 @@ test.describe.only('Federation - Threads', () => { await poFederationChannelServer1.content.sendMessage('hello world from server A'); await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); - await expect(pageForServer2).toHaveURL(/.*thread/); + await expect(pageForServer2).toHaveURL(/.*thread/); - await expect(poFederationChannelServer2.content.threadSendToChannelAlso()).not.toBeVisible(); + await expect(poFederationChannelServer2.content.threadSendToChannelAlso()).not.toBeVisible(); - await poFederationChannelServer2.content.sendThreadMessage('This is a thread message sent from server B'); + await poFederationChannelServer2.content.sendThreadMessage('This is a thread message sent from server B'); - await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText('This is a thread message sent from server B'); - await expect(poFederationChannelServer2.content.lastUserMessage).toContainText('This is a thread message sent from server B'); + await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText('This is a thread message sent from server B'); + await expect(poFederationChannelServer2.content.lastUserMessage).toContainText('This is a thread message sent from server B'); - await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + await poFederationChannelServer1.content.openLastMessageMenu(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); - await expect(page).toHaveURL(/.*thread/); - await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText('This is a thread message sent from server B'); + await expect(page).toHaveURL(/.*thread/); + await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText('This is a thread message sent from server B'); }); test('expect to send a thread message from Server A to Server B', async ({ page }) => { @@ -117,24 +117,24 @@ test.describe.only('Federation - Threads', () => { await poFederationChannelServer2.content.sendMessage('hello world from server B'); await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); - await expect(page).toHaveURL(/.*thread/); + await expect(page).toHaveURL(/.*thread/); - await expect(poFederationChannelServer1.content.threadSendToChannelAlso()).not.toBeVisible(); + await expect(poFederationChannelServer1.content.threadSendToChannelAlso()).not.toBeVisible(); - await poFederationChannelServer1.content.sendThreadMessage('This is a thread message sent from server A'); + await poFederationChannelServer1.content.sendThreadMessage('This is a thread message sent from server A'); - await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText('This is a thread message sent from server A'); - await expect(poFederationChannelServer1.content.lastUserMessage).toContainText('This is a thread message sent from server A'); + await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText('This is a thread message sent from server A'); + await expect(poFederationChannelServer1.content.lastUserMessage).toContainText('This is a thread message sent from server A'); - await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + await poFederationChannelServer2.content.openLastMessageMenu(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); - await expect(pageForServer2).toHaveURL(/.*thread/); - await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText('This is a thread message sent from server A'); + await expect(pageForServer2).toHaveURL(/.*thread/); + await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText('This is a thread message sent from server A'); }); - }); + }); test.describe('Send "Special" messages', () => { test('expect to send a thread message with emojis from Server A to Server B', async ({ page }) => { @@ -145,18 +145,24 @@ test.describe.only('Federation - Threads', () => { await poFederationChannelServer2.sidenav.openChat(createdGroupName); await poFederationChannelServer1.content.sendMessage('hello world from server A'); - await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + await poFederationChannelServer2.content.openLastMessageMenu(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); await poFederationChannelServer2.content.sendThreadMessage('😀 😀 hello world 🌎 from server B with emojis 😀 😀'); - await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText('😀 😀 hello world 🌎 from server B with emojis 😀 😀'); - await expect(poFederationChannelServer2.content.lastUserMessage).toContainText('😀 😀 hello world 🌎 from server B with emojis 😀 😀'); + await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText( + '😀 😀 hello world 🌎 from server B with emojis 😀 😀', + ); + await expect(poFederationChannelServer2.content.lastUserMessage).toContainText( + '😀 😀 hello world 🌎 from server B with emojis 😀 😀', + ); - await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + await poFederationChannelServer1.content.openLastMessageMenu(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); - await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText('😀 😀 hello world 🌎 from server B with emojis 😀 😀'); + await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText( + '😀 😀 hello world 🌎 from server B with emojis 😀 😀', + ); }); test('expect to send a thread message with emojis from Server B to Server A', async ({ page }) => { @@ -167,18 +173,24 @@ test.describe.only('Federation - Threads', () => { await poFederationChannelServer2.sidenav.openChat(createdGroupName); await poFederationChannelServer2.content.sendMessage('hello world from server B'); - await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + await poFederationChannelServer1.content.openLastMessageMenu(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); await poFederationChannelServer1.content.sendThreadMessage('😀 😀 hello world 🌎 from server A with emojis 😀 😀'); - await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText('😀 😀 hello world 🌎 from server A with emojis 😀 😀'); - await expect(poFederationChannelServer1.content.lastUserMessage).toContainText('😀 😀 hello world 🌎 from server A with emojis 😀 😀'); + await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText( + '😀 😀 hello world 🌎 from server A with emojis 😀 😀', + ); + await expect(poFederationChannelServer1.content.lastUserMessage).toContainText( + '😀 😀 hello world 🌎 from server A with emojis 😀 😀', + ); - await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + await poFederationChannelServer2.content.openLastMessageMenu(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); - await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText('😀 😀 hello world 🌎 from server A with emojis 😀 😀'); + await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText( + '😀 😀 hello world 🌎 from server A with emojis 😀 😀', + ); }); test('expect to send an audio message from Server A to Server B', async ({ page }) => { @@ -189,22 +201,21 @@ test.describe.only('Federation - Threads', () => { await poFederationChannelServer2.sidenav.openChat(createdGroupName); await poFederationChannelServer1.content.sendMessage('hello world from server A'); - await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + await poFederationChannelServer2.content.openLastMessageMenu(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); await poFederationChannelServer2.content.sendAudioRecordedInThreadMessage(); - await expect(await (await poFederationChannelServer2.content.getLastFileThreadMessageByFileName('Audio record.mp3')).innerText()).toEqual( - 'Audio record.mp3', - ); + await expect( + await (await poFederationChannelServer2.content.getLastFileThreadMessageByFileName('Audio record.mp3')).innerText(), + ).toEqual('Audio record.mp3'); - await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + await poFederationChannelServer1.content.openLastMessageMenu(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); - - await expect(await (await poFederationChannelServer1.content.getLastFileThreadMessageByFileName('Audio record.mp3')).innerText()).toEqual( - 'Audio record.mp3', - ); + await expect( + await (await poFederationChannelServer1.content.getLastFileThreadMessageByFileName('Audio record.mp3')).innerText(), + ).toEqual('Audio record.mp3'); }); test('expect to send an audio message from Server B to Server A', async ({ page }) => { @@ -213,24 +224,23 @@ test.describe.only('Federation - Threads', () => { await poFederationChannelServer1.sidenav.openChat(createdGroupName); await poFederationChannelServer2.sidenav.openChat(createdGroupName); - await poFederationChannelServer2.content.sendMessage('hello world from server B'); + await poFederationChannelServer2.content.sendMessage('hello world from server B'); - await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + await poFederationChannelServer1.content.openLastMessageMenu(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); await poFederationChannelServer1.content.sendAudioRecordedInThreadMessage(); - await expect(await (await poFederationChannelServer1.content.getLastFileThreadMessageByFileName('Audio record.mp3')).innerText()).toEqual( - 'Audio record.mp3', - ); + await expect( + await (await poFederationChannelServer1.content.getLastFileThreadMessageByFileName('Audio record.mp3')).innerText(), + ).toEqual('Audio record.mp3'); - await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + await poFederationChannelServer2.content.openLastMessageMenu(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); - - await expect(await (await poFederationChannelServer2.content.getLastFileThreadMessageByFileName('Audio record.mp3')).innerText()).toEqual( - 'Audio record.mp3', - ); + await expect( + await (await poFederationChannelServer2.content.getLastFileThreadMessageByFileName('Audio record.mp3')).innerText(), + ).toEqual('Audio record.mp3'); }); test('expect to send a thread message mentioning an user from Server A to Server B', async ({ page }) => { @@ -239,19 +249,25 @@ test.describe.only('Federation - Threads', () => { await poFederationChannelServer1.sidenav.openChat(createdGroupName); await poFederationChannelServer2.sidenav.openChat(createdGroupName); - await poFederationChannelServer1.content.sendMessage('hello world from server A'); + await poFederationChannelServer1.content.sendMessage('hello world from server A'); - await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + await poFederationChannelServer2.content.openLastMessageMenu(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); - await poFederationChannelServer2.content.sendThreadMessage(`hello @${adminUsernameWithDomainFromServer1}, here's @${userFromServer2UsernameOnly} from Server B`); + await poFederationChannelServer2.content.sendThreadMessage( + `hello @${adminUsernameWithDomainFromServer1}, here's @${userFromServer2UsernameOnly} from Server B`, + ); - await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText(`hello ${adminUsernameWithDomainFromServer1}, here's ${userFromServer2UsernameOnly} from Server B`); + await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText( + `hello ${adminUsernameWithDomainFromServer1}, here's ${userFromServer2UsernameOnly} from Server B`, + ); - await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + await poFederationChannelServer1.content.openLastMessageMenu(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); - await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText(`hello ${constants.RC_SERVER_1.username}, here's ${usernameWithDomainFromServer2} from Server B`); + await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText( + `hello ${constants.RC_SERVER_1.username}, here's ${usernameWithDomainFromServer2} from Server B`, + ); }); test('expect to send a thread message mentioning an user Server B to Server A', async ({ page }) => { @@ -260,19 +276,25 @@ test.describe.only('Federation - Threads', () => { await poFederationChannelServer1.sidenav.openChat(createdGroupName); await poFederationChannelServer2.sidenav.openChat(createdGroupName); - await poFederationChannelServer2.content.sendMessage('hello world from server B'); + await poFederationChannelServer2.content.sendMessage('hello world from server B'); - await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + await poFederationChannelServer1.content.openLastMessageMenu(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); - await poFederationChannelServer1.content.sendThreadMessage(`hello @${usernameWithDomainFromServer2}, here's @${constants.RC_SERVER_1.username} from Server A`); + await poFederationChannelServer1.content.sendThreadMessage( + `hello @${usernameWithDomainFromServer2}, here's @${constants.RC_SERVER_1.username} from Server A`, + ); - await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText(`hello ${usernameWithDomainFromServer2}, here's ${constants.RC_SERVER_1.username} from Server A`); + await expect(poFederationChannelServer1.content.lastThreadMessageText).toContainText( + `hello ${usernameWithDomainFromServer2}, here's ${constants.RC_SERVER_1.username} from Server A`, + ); - await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + await poFederationChannelServer2.content.openLastMessageMenu(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); - await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText(`hello ${userFromServer2UsernameOnly}, here's ${adminUsernameWithDomainFromServer1} from Server A`); + await expect(poFederationChannelServer2.content.lastThreadMessageText).toContainText( + `hello ${userFromServer2UsernameOnly}, here's ${adminUsernameWithDomainFromServer1} from Server A`, + ); }); }); @@ -281,47 +303,47 @@ test.describe.only('Federation - Threads', () => { await page.goto(`${constants.RC_SERVER_1.url}/home`); await pageForServer2.goto(`${constants.RC_SERVER_2.url}/home`); - await poFederationChannelServer1.sidenav.openChat(createdGroupName); + await poFederationChannelServer1.sidenav.openChat(createdGroupName); await poFederationChannelServer2.sidenav.openChat(createdGroupName); - + const message = `Message for quote - ${Date.now()}`; - await poFederationChannelServer1.content.sendMessage('hello world from server A'); + await poFederationChannelServer1.content.sendMessage('hello world from server A'); - await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + await poFederationChannelServer2.content.openLastMessageMenu(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); await poFederationChannelServer2.content.sendThreadMessage(message); - - await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + + await poFederationChannelServer1.content.openLastMessageMenu(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); await poFederationChannelServer1.content.quoteMessageInsideThread('this is a quote message'); - await expect(poFederationChannelServer1.content.waitForLastThreadMessageTextAttachmentEqualsText).toContainText(message); - await expect(poFederationChannelServer2.content.waitForLastThreadMessageTextAttachmentEqualsText).toContainText(message); + await expect(poFederationChannelServer1.content.waitForLastThreadMessageTextAttachmentEqualsText).toContainText(message); + await expect(poFederationChannelServer2.content.waitForLastThreadMessageTextAttachmentEqualsText).toContainText(message); }); test('expect to send a thread message quoting a thread message Server B to Server A', async ({ page }) => { await page.goto(`${constants.RC_SERVER_1.url}/home`); await pageForServer2.goto(`${constants.RC_SERVER_2.url}/home`); - await poFederationChannelServer1.sidenav.openChat(createdGroupName); + await poFederationChannelServer1.sidenav.openChat(createdGroupName); await poFederationChannelServer2.sidenav.openChat(createdGroupName); - + const message = `Message for quote - ${Date.now()}`; - await poFederationChannelServer2.content.sendMessage('hello world from server B'); + await poFederationChannelServer2.content.sendMessage('hello world from server B'); - await poFederationChannelServer1.content.openLastMessageMenu(); - await poFederationChannelServer1.content.btnOptionReplyInThread.click(); + await poFederationChannelServer1.content.openLastMessageMenu(); + await poFederationChannelServer1.content.btnOptionReplyInThread.click(); await poFederationChannelServer1.content.sendThreadMessage(message); - - await poFederationChannelServer2.content.openLastMessageMenu(); - await poFederationChannelServer2.content.btnOptionReplyInThread.click(); + + await poFederationChannelServer2.content.openLastMessageMenu(); + await poFederationChannelServer2.content.btnOptionReplyInThread.click(); await poFederationChannelServer2.content.quoteMessageInsideThread('this is a quote message'); - await expect(poFederationChannelServer1.content.waitForLastThreadMessageTextAttachmentEqualsText).toContainText(message); - await expect(poFederationChannelServer2.content.waitForLastThreadMessageTextAttachmentEqualsText).toContainText(message); + await expect(poFederationChannelServer1.content.waitForLastThreadMessageTextAttachmentEqualsText).toContainText(message); + await expect(poFederationChannelServer2.content.waitForLastThreadMessageTextAttachmentEqualsText).toContainText(message); }); }); diff --git a/apps/meteor/tests/e2e/forgot-password.spec.ts b/apps/meteor/tests/e2e/forgot-password.spec.ts index 441944f5b227..8330f8c767e2 100644 --- a/apps/meteor/tests/e2e/forgot-password.spec.ts +++ b/apps/meteor/tests/e2e/forgot-password.spec.ts @@ -2,7 +2,7 @@ import { Registration } from './page-objects'; import { test, expect } from './utils/test'; test.describe.parallel('Forgot Password', () => { - let poRegistration: Registration; + let poRegistration: Registration; test.beforeEach(async ({ page }) => { poRegistration = new Registration(page); @@ -42,5 +42,5 @@ test.describe.parallel('Forgot Password', () => { test('should not have any accessibility violations', async ({ makeAxeBuilder }) => { const results = await makeAxeBuilder().analyze(); expect(results.violations).toEqual([]); - }) + }); }); diff --git a/apps/meteor/tests/e2e/homepage.spec.ts b/apps/meteor/tests/e2e/homepage.spec.ts index 89aa905744df..72291785bd09 100644 --- a/apps/meteor/tests/e2e/homepage.spec.ts +++ b/apps/meteor/tests/e2e/homepage.spec.ts @@ -49,9 +49,7 @@ test.describe.serial('homepage', () => { test('visibility and button functionality in custom body with empty custom content', async () => { await test.step('expect default value in custom body', async () => { - await expect( - adminPage.locator('div >> text="Admins may insert content html to be rendered in this white space."'), - ).toBeVisible(); + await expect(adminPage.locator('div >> text="Admins may insert content html to be rendered in this white space."')).toBeVisible(); }); await test.step('expect both change visibility and show only custom content buttons to be disabled', async () => { diff --git a/apps/meteor/tests/e2e/image-gallery.spec.ts b/apps/meteor/tests/e2e/image-gallery.spec.ts index c8e11c5e1115..0291eefff9df 100644 --- a/apps/meteor/tests/e2e/image-gallery.spec.ts +++ b/apps/meteor/tests/e2e/image-gallery.spec.ts @@ -36,19 +36,19 @@ test.describe.serial('Image Gallery', async () => { }); test.describe('When sending an image as a file', () => { - test.beforeAll(async() => { + test.beforeAll(async () => { await poHomeChannel.sidenav.openChat(targetChannel); for await (const imageName of imageNames) { await poHomeChannel.content.sendFileMessage(imageName); await poHomeChannel.content.btnModalConfirm.click(); await expect(poHomeChannel.content.lastUserMessage).toContainText(imageName); } - + await poHomeChannel.sidenav.openChat(targetChannelLargeImage); await poHomeChannel.content.sendFileMessage('test-large-image.jpeg'); await poHomeChannel.content.btnModalConfirm.click(); await expect(poHomeChannel.content.lastUserMessage).toContainText('test-large-image.jpeg'); - + await poHomeChannel.content.lastUserMessage.locator('img.gallery-item').click(); }); @@ -56,39 +56,39 @@ test.describe.serial('Image Gallery', async () => { expect( await poHomeChannel.content.imageGalleryImage.evaluate((el) => parseInt(window.getComputedStyle(el).getPropertyValue('width'))), ).toBeLessThanOrEqual(viewport.width); - + expect( await poHomeChannel.content.imageGalleryImage.evaluate((el) => parseInt(window.getComputedStyle(el).getPropertyValue('height'))), ).toBeLessThanOrEqual(viewport.height); }); - + test('expect to zoom in image', async () => { await (await poHomeChannel.content.getGalleryButtonByName('zoom-in')).click(); - + expect(parseInt((await poHomeChannel.content.imageGalleryImage.getAttribute('data-qa-zoom-scale')) as string)).toBeGreaterThan(1); }); - + test('expect to zoom out image', async () => { await (await poHomeChannel.content.getGalleryButtonByName('zoom-out')).click(); - + expect(parseInt((await poHomeChannel.content.imageGalleryImage.getAttribute('data-qa-zoom-scale')) as string)).toEqual(1); }); - + test('expect to resize image to default ratio', async () => { await expect(await poHomeChannel.content.getGalleryButtonByName('zoom-out')).toBeDisabled(); - + await (await poHomeChannel.content.getGalleryButtonByName('zoom-in')).dblclick(); - + await expect(await poHomeChannel.content.getGalleryButtonByName('zoom-out')).toBeEnabled(); - + await (await poHomeChannel.content.getGalleryButtonByName('resize')).click(); - + expect(parseInt((await poHomeChannel.content.imageGalleryImage.getAttribute('data-qa-zoom-scale')) as string)).toEqual(1); }); - + test('expect to close gallery', async () => { await (await poHomeChannel.content.getGalleryButtonByName('close')).click(); - + await expect(poHomeChannel.content.imageGalleryImage).not.toBeVisible(); }); @@ -98,12 +98,15 @@ test.describe.serial('Image Gallery', async () => { /* eslint-disable no-await-in-loop */ for (let i = 0; i < imageNames.length - 1; i++) { await expect(poHomeChannel.content.previousSlideButton).toBeEnabled(); - await expect(poHomeChannel.content.currentGalleryImage).toHaveAttribute('src', new RegExp(`${imageNames[imageNames.length - (i + 1)]}$`)); + await expect(poHomeChannel.content.currentGalleryImage).toHaveAttribute( + 'src', + new RegExp(`${imageNames[imageNames.length - (i + 1)]}$`), + ); await poHomeChannel.content.previousSlideButton.click(); } await expect(poHomeChannel.content.previousSlideButton).toBeDisabled(); }); - + test('expect successfully move to newer images by using the right arrow button', async () => { for (let i = 0; i < imageNames.length - 1; i++) { await expect(poHomeChannel.content.nextSlideButton).toBeEnabled(); @@ -118,11 +121,11 @@ test.describe.serial('Image Gallery', async () => { test.describe('When sending an image as a link', () => { const imageLink = 'https://i0.wp.com/merithu.com.br/wp-content/uploads/2019/11/rocket-chat.png'; - test.beforeAll(async() => { + test.beforeAll(async () => { await poHomeChannel.content.sendMessage(imageLink); - + await expect(poHomeChannel.content.lastUserMessage).toContainText(imageLink); - + await poHomeChannel.content.lastUserMessage.locator('img.preview-image').click(); }); diff --git a/apps/meteor/tests/e2e/imports.spec.ts b/apps/meteor/tests/e2e/imports.spec.ts index 5b7c54316758..6da86cee86f9 100644 --- a/apps/meteor/tests/e2e/imports.spec.ts +++ b/apps/meteor/tests/e2e/imports.spec.ts @@ -31,39 +31,42 @@ const dmMessagesCsvDir = path.resolve(__dirname, 'fixtures', 'files', 'dm_messag const usersCsvsToJson = async (): Promise => { await new Promise((resolve) => - fs.createReadStream(slackCsvDir) + fs + .createReadStream(slackCsvDir) .pipe(parse({ delimiter: ',', from_line: 2 })) .on('data', (rows) => { rowUserName.push(rows[0]); }) - .on('end', resolve) + .on('end', resolve), ); await new Promise((resolve) => - fs.createReadStream(usersCsvDir) + fs + .createReadStream(usersCsvDir) .pipe(parse({ delimiter: ',' })) .on('data', (rows) => { rowUserName.push(rows[0]); csvImportedUsernames.push(rows[0]); }) - .on('end', resolve) + .on('end', resolve), ); }; -const countDmMessages = (): Promise => ( +const countDmMessages = (): Promise => new Promise((resolve) => - fs.createReadStream(dmMessagesCsvDir) + fs + .createReadStream(dmMessagesCsvDir) .pipe(parse({ delimiter: ',' })) .on('data', (rows) => { dmMessages.push(rows[3]); }) - .on('end', resolve) - ) -); + .on('end', resolve), + ); -const roomsCsvToJson = (): Promise => ( +const roomsCsvToJson = (): Promise => new Promise((resolve) => - fs.createReadStream(roomsCsvDir) + fs + .createReadStream(roomsCsvDir) .pipe(parse({ delimiter: ',' })) .on('data', (rows) => { importedRooms.push({ @@ -73,9 +76,8 @@ const roomsCsvToJson = (): Promise => ( members: rows[3], }); }) - .on('end', resolve) - ) -); + .on('end', resolve), + ); test.describe.serial('imports', () => { test.beforeAll(async () => { @@ -136,7 +138,7 @@ test.describe.serial('imports', () => { await poAdmin.inputSearchRooms.fill(room.name); const expectedMembersCount = room.members.split(';').filter((username) => username !== room.ownerUsername).length + 1; - expect(page.locator(`tbody tr td:nth-child(2) >> text="${ expectedMembersCount }"`)); + expect(page.locator(`tbody tr td:nth-child(2) >> text="${expectedMembersCount}"`)); } }); @@ -148,7 +150,9 @@ test.describe.serial('imports', () => { await poAdmin.inputSearchRooms.fill(room.name); await poAdmin.getRoomRow(room.name).click(); - room.visibility === 'private' ? await expect(poAdmin.privateInput).toBeChecked() : await expect(poAdmin.privateInput).not.toBeChecked(); + room.visibility === 'private' + ? await expect(poAdmin.privateInput).toBeChecked() + : await expect(poAdmin.privateInput).not.toBeChecked(); await expect(poAdmin.roomOwnerInput).toHaveValue(room.ownerUsername); } }); @@ -162,10 +166,10 @@ test.describe.serial('imports', () => { expect(page.locator(`tbody tr td:first-child >> text="${user}"`)); const expectedMembersCount = 2; - expect(page.locator(`tbody tr td:nth-child(2) >> text="${ expectedMembersCount }"`)); + expect(page.locator(`tbody tr td:nth-child(2) >> text="${expectedMembersCount}"`)); const expectedMessagesCount = dmMessages.length; - expect(page.locator(`tbody tr td:nth-child(3) >> text="${ expectedMessagesCount }"`)); - } + expect(page.locator(`tbody tr td:nth-child(3) >> text="${expectedMessagesCount}"`)); + } }); }); diff --git a/apps/meteor/tests/e2e/login.spec.ts b/apps/meteor/tests/e2e/login.spec.ts index 41710fffa203..63e4949c31d9 100644 --- a/apps/meteor/tests/e2e/login.spec.ts +++ b/apps/meteor/tests/e2e/login.spec.ts @@ -18,7 +18,7 @@ test.describe.parallel('Login', () => { test('should not have any accessibility violations', async ({ makeAxeBuilder }) => { const results = await makeAxeBuilder().analyze(); expect(results.violations).toEqual([]); - }) + }); test('Login with invalid credentials', async () => { await test.step('expect to have username and password marked as invalid', async () => { diff --git a/apps/meteor/tests/e2e/message-actions.spec.ts b/apps/meteor/tests/e2e/message-actions.spec.ts index 259ab4d71d33..5186d27e3656 100644 --- a/apps/meteor/tests/e2e/message-actions.spec.ts +++ b/apps/meteor/tests/e2e/message-actions.spec.ts @@ -86,7 +86,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.content.openLastMessageMenu(); await page.locator('role=menuitem[name="Copy text"]').click(); - const clipboardText = await page.evaluate("navigator.clipboard.readText()"); + const clipboardText = await page.evaluate('navigator.clipboard.readText()'); expect(clipboardText).toBe('Message to copy'); }); @@ -128,7 +128,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.sidenav.openChat(forwardChannel); await expect(poHomeChannel.content.lastUserMessage).toContainText(message); - }) + }); test('expect forward message to team', async () => { const message = 'this is a message to forward to team'; @@ -137,7 +137,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.sidenav.openChat(forwardTeam); await expect(poHomeChannel.content.lastUserMessage).toContainText(message); - }) + }); test('expect forward message to direct message', async () => { const message = 'this is a message to forward to direct message'; @@ -149,7 +149,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.sidenav.openChat(ADMIN_CREDENTIALS.username); await expect(poHomeChannel.content.lastUserMessage).toContainText(message); - }) + }); test('expect forward text file to channel', async () => { const filename = 'any_file.txt'; @@ -161,7 +161,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.sidenav.openChat(forwardChannel); await expect(poHomeChannel.content.lastUserMessage).toContainText(filename); - }) + }); test('expect forward image file to channel', async () => { const filename = 'test-image.jpeg'; @@ -173,7 +173,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.sidenav.openChat(forwardChannel); await expect(poHomeChannel.content.lastUserMessage).toContainText(filename); - }) + }); test('expect forward pdf file to channel', async () => { const filename = 'test_pdf_file.pdf'; @@ -185,7 +185,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.sidenav.openChat(forwardChannel); await expect(poHomeChannel.content.lastUserMessage).toContainText(filename); - }) + }); test('expect forward audio message to channel', async () => { const filename = 'sample-audio.mp3'; @@ -197,7 +197,7 @@ test.describe.serial('message-actions', () => { await poHomeChannel.sidenav.openChat(forwardChannel); await expect(poHomeChannel.content.lastUserMessage).toContainText(filename); - }) + }); test('expect forward video message to channel', async () => { const filename = 'test_video.mp4'; @@ -209,5 +209,5 @@ test.describe.serial('message-actions', () => { await poHomeChannel.sidenav.openChat(forwardChannel); await expect(poHomeChannel.content.lastUserMessage).toContainText(filename); - }) + }); }); diff --git a/apps/meteor/tests/e2e/message-composer.spec.ts b/apps/meteor/tests/e2e/message-composer.spec.ts index 8b8888c040a2..e68d82daf78f 100644 --- a/apps/meteor/tests/e2e/message-composer.spec.ts +++ b/apps/meteor/tests/e2e/message-composer.spec.ts @@ -52,7 +52,7 @@ test.describe.serial('message-composer', () => { await page.keyboard.press('Tab'); await page.keyboard.press('Tab'); - + await expect(poHomeChannel.composerToolbar.getByRole('button', { name: 'Emoji' })).not.toBeFocused(); }); @@ -63,10 +63,10 @@ test.describe.serial('message-composer', () => { await page.keyboard.type('hello composer'); await page.keyboard.press('Control+A'); // on Windows and Linux await page.keyboard.press('Meta+A'); // on macOS - await poHomeChannel.composerToolbar.getByRole('button', { name: 'Link' }).click() + await poHomeChannel.composerToolbar.getByRole('button', { name: 'Link' }).click(); await page.keyboard.type(url); await page.keyboard.press('Enter'); - + await expect(poHomeChannel.composer).toHaveValue(`[hello composer](${url})`); }); }); diff --git a/apps/meteor/tests/e2e/message-mentions.spec.ts b/apps/meteor/tests/e2e/message-mentions.spec.ts index 1d956dfcb735..1b5b7e1bb6fc 100644 --- a/apps/meteor/tests/e2e/message-mentions.spec.ts +++ b/apps/meteor/tests/e2e/message-mentions.spec.ts @@ -5,7 +5,6 @@ import { HomeChannel } from './page-objects'; import { createTargetPrivateChannel, createTargetTeam, deleteChannel, deleteTeam } from './utils'; import { test, expect } from './utils/test'; - test.use({ storageState: Users.admin.state }); const getMentionText = (username: string, kind?: number): string => { @@ -41,11 +40,15 @@ test.describe.serial('message-mentions', () => { test.describe('Should not allow to send @all mention if permission to do so is disabled', () => { let targetChannel2: string; test.beforeAll(async ({ api }) => { - expect((await api.post('/permissions.update', { permissions: [{ '_id': 'mention-all', 'roles': [] }] })).status()).toBe(200); + expect((await api.post('/permissions.update', { permissions: [{ _id: 'mention-all', roles: [] }] })).status()).toBe(200); }); test.afterAll(async ({ api }) => { - expect((await api.post('/permissions.update', { permissions: [{ '_id': 'mention-all', 'roles': ['admin', 'owner', 'moderator', 'user'] }] })).status()).toBe(200); + expect( + ( + await api.post('/permissions.update', { permissions: [{ _id: 'mention-all', roles: ['admin', 'owner', 'moderator', 'user'] }] }) + ).status(), + ).toBe(200); await deleteChannel(api, targetChannel2); }); @@ -72,11 +75,15 @@ test.describe.serial('message-mentions', () => { test.describe('Should not allow to send @here mention if permission to do so is disabled', () => { let targetChannel2: string; test.beforeAll(async ({ api }) => { - expect((await api.post('/permissions.update', { permissions: [{ '_id': 'mention-here', 'roles': [] }] })).status()).toBe(200); + expect((await api.post('/permissions.update', { permissions: [{ _id: 'mention-here', roles: [] }] })).status()).toBe(200); }); test.afterAll(async ({ api }) => { - expect((await api.post('/permissions.update', { permissions: [{ '_id': 'mention-here', 'roles': ['admin', 'owner', 'moderator', 'user'] }] })).status()).toBe(200); + expect( + ( + await api.post('/permissions.update', { permissions: [{ _id: 'mention-here', roles: ['admin', 'owner', 'moderator', 'user'] }] }) + ).status(), + ).toBe(200); await deleteChannel(api, targetChannel2); }); @@ -191,16 +198,18 @@ test.describe.serial('message-mentions', () => { await expect(userPage.content.lastUserMessageBody).toContainText(getMentionText(Users.user2.data.username, 3)); }); }); - }) + }); test.describe(() => { test.use({ storageState: Users.user1.state }); test.beforeAll(async ({ api }) => { - expect((await api.post('/permissions.update', { permissions: [{ '_id': 'create-d', 'roles': ['admin'] }] })).status()).toBe(200); + expect((await api.post('/permissions.update', { permissions: [{ _id: 'create-d', roles: ['admin'] }] })).status()).toBe(200); }); test.afterAll(async ({ api }) => { - expect((await api.post('/permissions.update', { permissions: [{ '_id': 'create-d', 'roles': ['admin', 'user', 'bot', 'app'] }] })).status()).toBe(200); + expect( + (await api.post('/permissions.update', { permissions: [{ _id: 'create-d', roles: ['admin', 'user', 'bot', 'app'] }] })).status(), + ).toBe(200); }); test('dismiss and add users actions', async ({ page }) => { @@ -215,7 +224,7 @@ test.describe.serial('message-mentions', () => { await poHomeChannel.sidenav.btnCreate.click(); await expect(page).toHaveURL(`/group/${targetChannel2}`); - }) + }); await test.step('receive bot message', async () => { await userPage.sidenav.openChat(targetChannel2); @@ -251,11 +260,13 @@ test.describe.serial('message-mentions', () => { test.describe(() => { test.use({ storageState: Users.user2.state }); test.beforeAll(async ({ api }) => { - expect((await api.post('/permissions.update', { permissions: [{ '_id': 'create-d', 'roles': ['admin'] }] })).status()).toBe(200); + expect((await api.post('/permissions.update', { permissions: [{ _id: 'create-d', roles: ['admin'] }] })).status()).toBe(200); }); test.afterAll(async ({ api }) => { - expect((await api.post('/permissions.update', { permissions: [{ '_id': 'create-d', 'roles': ['admin', 'user', 'bot', 'app'] }] })).status()).toBe(200); + expect( + (await api.post('/permissions.update', { permissions: [{ _id: 'create-d', roles: ['admin', 'user', 'bot', 'app'] }] })).status(), + ).toBe(200); }); test('no actions', async ({ page }) => { const userPage = new HomeChannel(page); @@ -263,7 +274,9 @@ test.describe.serial('message-mentions', () => { await test.step('receive bot message', async () => { await userPage.sidenav.openChat(targetChannel2); await userPage.content.sendMessage(getMentionText(Users.user3.data.username)); - await expect(userPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText(getMentionText(Users.user3.data.username, 2)); + await expect(userPage.content.lastUserMessage.locator('.rcx-message-block')).toContainText( + getMentionText(Users.user3.data.username, 2), + ); }); await test.step('not show "Do nothing" action', async () => { @@ -276,7 +289,7 @@ test.describe.serial('message-mentions', () => { await expect(userPage.content.lastUserMessage.locator('button >> text="Let them know"')).not.toBeVisible(); }); }); - }) + }); test.describe('team mention', () => { let team: string; @@ -297,9 +310,7 @@ test.describe.serial('message-mentions', () => { await userPage.content.sendMessage(getMentionText(team)); await expect(userPage.content.lastUserMessage.locator('.rcx-message-block')).not.toBeVisible(); }); - }); - }) - - }) + }); + }); }); diff --git a/apps/meteor/tests/e2e/messaging.spec.ts b/apps/meteor/tests/e2e/messaging.spec.ts index 226b75ecc9a8..c5b004faeb85 100644 --- a/apps/meteor/tests/e2e/messaging.spec.ts +++ b/apps/meteor/tests/e2e/messaging.spec.ts @@ -49,15 +49,28 @@ test.describe.serial('Messaging', () => { await expect(page.locator('[data-qa-type="message"]:has-text("msg1")')).toBeFocused(); // move focus to the message toolbar - await page.locator('[data-qa-type="message"]:has-text("msg1")').locator('[role=toolbar][aria-label="Message actions"]').getByRole('button', { name: 'Add reaction' }).waitFor(); - + await page + .locator('[data-qa-type="message"]:has-text("msg1")') + .locator('[role=toolbar][aria-label="Message actions"]') + .getByRole('button', { name: 'Add reaction' }) + .waitFor(); + await page.keyboard.press('Tab'); await page.keyboard.press('Tab'); - await expect(page.locator('[data-qa-type="message"]:has-text("msg1")').locator('[role=toolbar][aria-label="Message actions"]').getByRole('button', { name: 'Add reaction' })).toBeFocused(); - + await expect( + page + .locator('[data-qa-type="message"]:has-text("msg1")') + .locator('[role=toolbar][aria-label="Message actions"]') + .getByRole('button', { name: 'Add reaction' }), + ).toBeFocused(); + // move focus to the composer await page.keyboard.press('Tab'); - await page.locator('[data-qa-type="message"]:has-text("msg2")').locator('[role=toolbar][aria-label="Message actions"]').getByRole('button', { name: 'Add reaction' }).waitFor(); + await page + .locator('[data-qa-type="message"]:has-text("msg2")') + .locator('[role=toolbar][aria-label="Message actions"]') + .getByRole('button', { name: 'Add reaction' }) + .waitFor(); await page.keyboard.press('Tab'); await page.keyboard.press('Tab'); await expect(poHomeChannel.composer).toBeFocused(); @@ -87,11 +100,11 @@ test.describe.serial('Messaging', () => { await page.keyboard.press('Tab'); await page.keyboard.press('Space'); await expect(poHomeChannel.userCardToolbar).not.toBeVisible(); - }) + }); test('should not restore focus on the last focused if it was triggered by click', async ({ page }) => { await poHomeChannel.sidenav.openChat(targetChannel); - await page.locator('[data-qa-type="message"]:has-text("msg1")').click(); + await page.locator('[data-qa-type="message"]:has-text("msg1")').click(); await poHomeChannel.composer.click(); await page.keyboard.press('Shift+Tab'); @@ -100,7 +113,7 @@ test.describe.serial('Messaging', () => { test('should not focus on the last message when focusing by click', async ({ page }) => { await poHomeChannel.sidenav.openChat(targetChannel); - await page.locator('[data-qa-type="message"]:has-text("msg1")').click(); + await page.locator('[data-qa-type="message"]:has-text("msg1")').click(); await expect(page.locator('[data-qa-type="message"]').last()).not.toBeFocused(); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-transfers.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-transfers.spec.ts index fd5715c691fe..101308ef0b6a 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-transfers.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-chat-transfers.spec.ts @@ -1,4 +1,4 @@ -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { IS_EE } from '../config/constants'; import { createAuxContext } from '../fixtures/createAuxContext'; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-current-chats.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-current-chats.spec.ts index 163a0f40f2b3..be8ec38a49aa 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-current-chats.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-current-chats.spec.ts @@ -1,5 +1,5 @@ import { faker } from '@faker-js/faker'; -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { IS_EE } from '../config/constants'; import { Users } from '../fixtures/userStates'; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts index db2a0c63678c..bf77840446dc 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-api.spec.ts @@ -431,7 +431,7 @@ test.describe('OC - Livechat API', () => { await expect(poLiveChat.txtChatMessage('this_a_test_message_from_visitor_1')).toBeVisible(); // wait for load messages to happen - await page.waitForResponse(response => response.url().includes(`token=${registerGuestVisitor1.token}`)); + await page.waitForResponse((response) => response.url().includes(`token=${registerGuestVisitor1.token}`)); }); await test.step('Expect registerGuest to create guest 2', async () => { @@ -441,9 +441,12 @@ test.describe('OC - Livechat API', () => { ); // wait for load messages to happen - await page.waitForResponse(response => response.url().includes(`token=${registerGuestVisitor2.token}`)); + await page.waitForResponse((response) => response.url().includes(`token=${registerGuestVisitor2.token}`)); - await poLiveChat.page.frameLocator('#rocketchat-iframe').getByText('this_a_test_message_from_visitor_1').waitFor({ state: 'hidden' }); + await poLiveChat.page + .frameLocator('#rocketchat-iframe') + .getByText('this_a_test_message_from_visitor_1') + .waitFor({ state: 'hidden' }); await expect(poLiveChat.page.frameLocator('#rocketchat-iframe').getByText('Start Chat')).not.toBeVisible(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-avatar-visibility.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-avatar-visibility.spec.ts index ec54ee6421ae..d2b1db457ba1 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-avatar-visibility.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-avatar-visibility.spec.ts @@ -1,5 +1,5 @@ import { faker } from '@faker-js/faker'; -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-department.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-department.spec.ts index c0b2bf8ae852..d71467a9336c 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-department.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-department.spec.ts @@ -8,8 +8,6 @@ import { createAgent } from '../utils/omnichannel/agents'; import { addAgentToDepartment, createDepartment } from '../utils/omnichannel/departments'; import { test, expect } from '../utils/test'; - - test.use({ storageState: Users.user1.state }); test.describe('OC - Livechat - Department Flow', () => { @@ -64,7 +62,6 @@ test.describe('OC - Livechat - Department Flow', () => { }); test('OC - Livechat - Chat with Department', async () => { - const guest = { name: `${faker.person.firstName()} ${faker.string.nanoid(10)}}`, email: faker.internet.email(), @@ -92,11 +89,9 @@ test.describe('OC - Livechat - Department Flow', () => { }); test('OC - Livechat - Change Department', async () => { - const guest = { name: `${faker.person.firstName()} ${faker.string.nanoid(10)}}`, email: faker.internet.email(), - }; await test.step('expect start Chat with department', async () => { await poLiveChat.openAnyLiveChat(); @@ -133,7 +128,7 @@ test.describe('OC - Livechat - Department Flow', () => { await expect(poLiveChat.livechatModalText('Are you sure you want to switch the department?')).toBeVisible(); await poLiveChat.btnYes.click(); - + await expect(poLiveChat.livechatModal).toBeVisible(); await expect(poLiveChat.livechatModalText('Department switched')).toBeVisible(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-fileupload.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-fileupload.spec.ts index a79f2c04c044..b1244e7813b7 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-fileupload.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-fileupload.spec.ts @@ -9,14 +9,17 @@ import { test, expect } from '../utils/test'; const visitor = { name: `${faker.person.firstName()} ${faker.string.uuid()}}`, email: faker.internet.email(), -} +}; // Endpoint defaults are reset after each test, so if not in matrix assume is true const endpointMatrix = [ - [{ url: '/settings/FileUpload_Enabled', value: false}], - [{ url: '/settings/Livechat_fileupload_enabled', value: false}], - [{ url: '/settings/FileUpload_Enabled', value: false}, { url: '/settings/Livechat_fileupload_enabled', value: false}], -] + [{ url: '/settings/FileUpload_Enabled', value: false }], + [{ url: '/settings/Livechat_fileupload_enabled', value: false }], + [ + { url: '/settings/FileUpload_Enabled', value: false }, + { url: '/settings/Livechat_fileupload_enabled', value: false }, + ], +]; const beforeTest = async (poLiveChat: OmnichannelLiveChat) => { await poLiveChat.page.goto('/livechat'); @@ -26,8 +29,8 @@ const beforeTest = async (poLiveChat: OmnichannelLiveChat) => { await poLiveChat.onlineAgentMessage.fill('this_a_test_message_from_user'); await poLiveChat.btnSendMessageToOnlineAgent.click(); - await poLiveChat.txtChatMessage('this_a_test_message_from_user').waitFor({state: 'visible'}); -} + await poLiveChat.txtChatMessage('this_a_test_message_from_user').waitFor({ state: 'visible' }); +}; test.describe('OC - Livechat - OC - File Upload', () => { let poLiveChat: OmnichannelLiveChat; @@ -45,7 +48,7 @@ test.describe('OC - Livechat - OC - File Upload', () => { poLiveChat = new OmnichannelLiveChat(page, api); }); - test.afterAll(async ({api}) => { + test.afterAll(async ({ api }) => { await api.post('/settings/FileUpload_Enabled', { value: true }); await api.post('/settings/Livechat_fileupload_enabled', { value: true }); @@ -85,7 +88,7 @@ test.describe('OC - Livechat - OC - File Upload - Disabled', () => { poHomeOmnichannel = new HomeOmnichannel(page); }); - test.afterAll(async ({api}) => { + test.afterAll(async ({ api }) => { await api.post('/settings/FileUpload_Enabled', { value: true }); await api.post('/settings/Livechat_fileupload_enabled', { value: true }); @@ -99,9 +102,11 @@ test.describe('OC - Livechat - OC - File Upload - Disabled', () => { test(`OC - Livechat - txt Drag & Drop - ${testName}`, async ({ page, api }) => { poLiveChat = new OmnichannelLiveChat(page, api); - await Promise.all(endpoints.map(async (endpoint: { url: string, value: boolean }) => { - await api.post(endpoint.url, { value: endpoint.value }); - })); + await Promise.all( + endpoints.map(async (endpoint: { url: string; value: boolean }) => { + await api.post(endpoint.url, { value: endpoint.value }); + }), + ); await poLiveChat.page.goto('/livechat'); @@ -110,7 +115,7 @@ test.describe('OC - Livechat - OC - File Upload - Disabled', () => { await poLiveChat.onlineAgentMessage.fill('this_a_test_message_from_user'); await poLiveChat.btnSendMessageToOnlineAgent.click(); - await poLiveChat.txtChatMessage('this_a_test_message_from_user').waitFor({state: 'visible'}); + await poLiveChat.txtChatMessage('this_a_test_message_from_user').waitFor({ state: 'visible' }); await test.step('expect to upload a txt file', async () => { await poLiveChat.dragAndDropTxtFile(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-message-bubble-color.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-message-bubble-color.spec.ts index fa72d7406816..bc167a299494 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-message-bubble-color.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-message-bubble-color.spec.ts @@ -1,5 +1,5 @@ import { faker } from '@faker-js/faker'; -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-tab-communication.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-tab-communication.spec.ts index 27c800fd0a5f..60e2e193262b 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-tab-communication.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat-tab-communication.spec.ts @@ -9,7 +9,7 @@ import { test, expect } from '../utils/test'; test.describe('OC - Livechat - Cross Tab Communication', () => { let pageLivechat1: OmnichannelLiveChat; let pageLivechat2: OmnichannelLiveChat; - + let poHomeOmnichannel: HomeOmnichannel; let agent: Awaited>; @@ -53,7 +53,7 @@ test.describe('OC - Livechat - Cross Tab Communication', () => { await pageLivechat1.btnSendMessageToOnlineAgent.click(); await expect(pageLivechat1.page.locator('div >> text="this_a_test_message_from_user"')).toBeVisible(); - + await expect(pageLivechat2.page.locator('div >> text="this_a_test_message_from_user"')).toBeVisible(); }); @@ -72,11 +72,9 @@ test.describe('OC - Livechat - Cross Tab Communication', () => { await pageLivechat1.onlineAgentMessage.fill('this_a_test_message_from_user_after_close'); await pageLivechat1.btnSendMessageToOnlineAgent.click(); - await pageLivechat1.page.locator('div >> text="this_a_test_message_from_user"').waitFor({ state: 'hidden' }); await pageLivechat2.page.locator('div >> text="this_a_test_message_from_user"').waitFor({ state: 'hidden' }); - - + await expect(pageLivechat1.page.locator('div >> text="this_a_test_message_from_user"')).not.toBeVisible(); await expect(pageLivechat2.page.locator('div >> text="this_a_test_message_from_user"')).not.toBeVisible(); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts index 35629880e749..00823cd98a19 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-livechat.spec.ts @@ -278,7 +278,7 @@ test.describe('OC - Livechat - Livechat_Display_Offline_Form', () => { test('OC - Livechat - Livechat_Display_Offline_Form false', async () => { await test.step('expect offline form to not be visible', async () => { await poLiveChat.openAnyLiveChat(); - await expect (poLiveChat.page.locator(`div >> text=${message}`)).toBeVisible(); + await expect(poLiveChat.page.locator(`div >> text=${message}`)).toBeVisible(); await expect(poLiveChat.textAreaMessage).not.toBeVisible(); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-manager-role.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-manager-role.spec.ts index a07f0e7b808f..a9c0de65cdff 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-manager-role.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-manager-role.spec.ts @@ -1,5 +1,5 @@ import { faker } from '@faker-js/faker'; -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { IS_EE } from '../config/constants'; import { Users } from '../fixtures/userStates'; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection-logout.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection-logout.spec.ts index f4a9a5d1207f..9fbb567e3a87 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection-logout.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection-logout.spec.ts @@ -1,4 +1,4 @@ -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { DEFAULT_USER_CREDENTIALS } from '../config/constants'; import injectInitialData from '../fixtures/inject-initial-data'; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts index 12443722160a..8a4e74c1661a 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-manual-selection.spec.ts @@ -1,4 +1,4 @@ -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { createAuxContext } from '../fixtures/createAuxContext'; import { Users } from '../fixtures/userStates'; @@ -43,13 +43,15 @@ test.describe('OC - Manual Selection', () => { test.afterAll(async ({ api }) => { await Promise.all([ agentB.page.close(), - ...agents.map(agent => agent.delete()), + ...agents.map((agent) => agent.delete()), api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }), ]); }); test('OC - Manual Selection - Queue', async ({ page, api }) => { - const { data: { room } } = await createConversation(api); + const { + data: { room }, + } = await createConversation(api); await test.step('expect not be able to see queue when livechat is disabled', async () => { await poOmnichannel.sidenav.switchOmnichannelStatus('offline'); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-monitor-role.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-monitor-role.spec.ts index 3d4469a76b08..25a5336742a3 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-monitor-role.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-monitor-role.spec.ts @@ -1,5 +1,5 @@ import { faker } from '@faker-js/faker'; -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { IS_EE } from '../config/constants'; import { Users } from '../fixtures/userStates'; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-reports.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-reports.spec.ts index 10e4db2cfd0b..f336bf7eab62 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-reports.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-reports.spec.ts @@ -1,4 +1,4 @@ -import { Route } from '@playwright/test'; +import type { Route } from '@playwright/test'; import { IS_EE } from '../config/constants'; import { Users } from '../fixtures/userStates'; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-tags.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-tags.spec.ts index 4ad7bde6d760..f14cf6c37445 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-tags.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-tags.spec.ts @@ -12,7 +12,7 @@ import { test, expect } from '../utils/test'; test.use({ storageState: Users.admin.state }); test.describe('OC - Manage Tags', () => { - test.skip(!IS_EE, 'OC - Manage Tags > Enterprise Edition Only'); + test.skip(!IS_EE, 'OC - Manage Tags > Enterprise Edition Only'); let poOmnichannelTags: OmnichannelTags; @@ -34,17 +34,17 @@ test.describe('OC - Manage Tags', () => { await agent.delete(); }); - test.beforeEach(async ({ page }: { page: Page }) => { + test.beforeEach(async ({ page }: { page: Page }) => { poOmnichannelTags = new OmnichannelTags(page); }); - test('OC - Manage Tags - Create Tag', async ({ page }) => { - const tagName = faker.string.uuid(); + test('OC - Manage Tags - Create Tag', async ({ page }) => { + const tagName = faker.string.uuid(); - await page.goto('/omnichannel'); + await page.goto('/omnichannel'); await poOmnichannelTags.sidenav.linkTags.click(); - await test.step('expect correct form default state', async () => { + await test.step('expect correct form default state', async () => { await poOmnichannelTags.btnCreateTag.click(); await expect(poOmnichannelTags.contextualBar).toBeVisible(); await expect(poOmnichannelTags.btnSave).toBeDisabled(); @@ -53,7 +53,7 @@ test.describe('OC - Manage Tags', () => { await expect(poOmnichannelTags.contextualBar).not.toBeVisible(); }); - await test.step('expect to create new tag', async () => { + await test.step('expect to create new tag', async () => { await poOmnichannelTags.btnCreateTag.click(); await poOmnichannelTags.inputName.fill(tagName); await poOmnichannelTags.selectDepartment(department.data); @@ -66,7 +66,7 @@ test.describe('OC - Manage Tags', () => { }); }); - await test.step('expect to delete tag', async () => { + await test.step('expect to delete tag', async () => { await test.step('expect to be able to cancel delete', async () => { await poOmnichannelTags.btnDeleteByName(tagName).click(); await expect(poOmnichannelTags.confirmDeleteModal).toBeVisible(); @@ -82,9 +82,9 @@ test.describe('OC - Manage Tags', () => { await expect(page.locator('h3 >> text="No results found"')).toBeVisible(); }); }); - }); + }); - test('OC - Manage Tags - Edit tag departments', async ({ api, page }) => { + test('OC - Manage Tags - Edit tag departments', async ({ api, page }) => { const tag = await test.step('expect to create new tag', async () => { const { data: tag } = await createTag(api, { name: faker.string.uuid(), @@ -94,7 +94,7 @@ test.describe('OC - Manage Tags', () => { return tag; }); - await page.goto('/omnichannel'); + await page.goto('/omnichannel'); await poOmnichannelTags.sidenav.linkTags.click(); await test.step('expect to add tag departments', async () => { @@ -128,7 +128,7 @@ test.describe('OC - Manage Tags', () => { await expect(page.getByRole('option', { name: department2.data.name })).toBeHidden(); }); - await test.step('expect to delete tag', async () => { + await test.step('expect to delete tag', async () => { await poOmnichannelTags.btnDeleteByName(tag.name).click(); await expect(poOmnichannelTags.confirmDeleteModal).toBeVisible(); await poOmnichannelTags.btnConfirmDeleteModal.click(); @@ -136,4 +136,4 @@ test.describe('OC - Manage Tags', () => { await expect(page.locator('h3 >> text="No results found"')).toBeVisible(); }); }); -}); \ No newline at end of file +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-after-registration.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-after-registration.spec.ts index 539037219e62..70d224223744 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-after-registration.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-triggers-after-registration.spec.ts @@ -72,14 +72,14 @@ test.describe('OC - Livechat New Chat Triggers - After Registration', () => { await poLiveChat.page.goto('/livechat'); await poLiveChat.openAnyLiveChat(); await poLiveChat.sendMessage(newUser, false); - await expect(poLiveChat.txtChatMessage(triggerMessage)).toBeVisible(); - }) + await expect(poLiveChat.txtChatMessage(triggerMessage)).toBeVisible(); + }); await test.step('expect trigger message after registration to be visible after reload', async () => { await poLiveChat.page.reload(); await poLiveChat.openAnyLiveChat(); - await expect(poLiveChat.txtChatMessage(triggerMessage)).toBeVisible(); - }) + await expect(poLiveChat.txtChatMessage(triggerMessage)).toBeVisible(); + }); await test.step('expect to close room and reload', async () => { await poLiveChat.onlineAgentMessage.type('message_after_trigger'); @@ -89,13 +89,13 @@ test.describe('OC - Livechat New Chat Triggers - After Registration', () => { await expect(poLiveChat.btnNewChat).toBeVisible(); await poLiveChat.startNewChat(); - await poLiveChat.page.reload() - }) + await poLiveChat.page.reload(); + }); await test.step('expect trigger message after registration to be visible after reload on new chat', async () => { await poLiveChat.openAnyLiveChat(); await expect(poLiveChat.txtChatMessage(triggerMessage)).toBeVisible(); - }) + }); }); }); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts index 7b4b5d2611cc..9c1b5fdd5948 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-units.spec.ts @@ -222,5 +222,5 @@ test.describe('OC - Manage Units', () => { await expect(poOmnichannelUnits.contextualBar).not.toBeVisible(); }); - }) + }); }); diff --git a/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-users.ts b/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-users.ts index d57d6be612c6..5b912be1fd02 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-users.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/admin-flextab-users.ts @@ -53,6 +53,6 @@ export class AdminFlextabUsers { } get setupSmtpLink(): Locator { - return this.page.locator('role=link[name="Set up SMTP"]') + return this.page.locator('role=link[name="Set up SMTP"]'); } } diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-members.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-members.ts index 7986bad4e9e6..508362429b22 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-members.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-members.ts @@ -46,7 +46,6 @@ export class HomeFlextabMembers { await this.page.getByRole('dialog').getByRole('button').first().click(); } - async setUserAsModerator(username: string) { await this.openMemberOptionMoreActions(username); await this.getMenuItemAction('Set as moderator').click(); diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts index fac98e630caa..041b37da9919 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-flextab-room.ts @@ -48,7 +48,7 @@ export class HomeFlextabRoom { } getMaxAgeLabel(maxAge = '30') { - return this.page.getByRole('dialog').getByText(`Maximum message age in days (default: ${maxAge})`) + return this.page.getByRole('dialog').getByText(`Maximum message age in days (default: ${maxAge})`); } get inputRetentionMaxAge(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-omnichannel-content.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-omnichannel-content.ts index 4716f6812fd7..cb2172d6fa48 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-omnichannel-content.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-omnichannel-content.ts @@ -23,11 +23,11 @@ export class HomeOmnichannelContent extends HomeContent { return this.page.locator('[data-qa-id="return-to-queue-modal"]'); } - get btnReturnToQueueConfirm():Locator { + get btnReturnToQueueConfirm(): Locator { return this.modalReturnToQueue.locator('role=button[name="Confirm"]'); } - get btnReturnToQueueCancel():Locator { + get btnReturnToQueueCancel(): Locator { return this.modalReturnToQueue.locator('role=button[name="Cancel"]'); } @@ -58,7 +58,7 @@ export class HomeOmnichannelContent extends HomeContent { get infoContactName(): Locator { return this.page.locator('[data-qa-id="contactInfo-name"]'); } - + get btnReturn(): Locator { return this.page.locator('[data-qa-id="ToolBoxAction-back"]'); } diff --git a/apps/meteor/tests/e2e/page-objects/home-channel.ts b/apps/meteor/tests/e2e/page-objects/home-channel.ts index 905a192f1f11..a5c9fa478c6c 100644 --- a/apps/meteor/tests/e2e/page-objects/home-channel.ts +++ b/apps/meteor/tests/e2e/page-objects/home-channel.ts @@ -62,7 +62,7 @@ export class HomeChannel { } get readOnlyFooter(): Locator { - return this.page.locator('footer', { hasText: 'This room is read only' }) + return this.page.locator('footer', { hasText: 'This room is read only' }); } get roomHeaderToolbar(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/home-team.ts b/apps/meteor/tests/e2e/page-objects/home-team.ts index a3b9130eb341..9225ca7a1b4d 100644 --- a/apps/meteor/tests/e2e/page-objects/home-team.ts +++ b/apps/meteor/tests/e2e/page-objects/home-team.ts @@ -32,10 +32,10 @@ export class HomeTeam { } get textPrivate(): Locator { - return this.page.locator('label', {has: this.page.getByRole('checkbox', {name: 'Private'})}); + return this.page.locator('label', { has: this.page.getByRole('checkbox', { name: 'Private' }) }); } get textReadOnly(): Locator { - return this.page.locator('label', {has: this.page.getByRole('checkbox', {name: 'Read-only'})}); + return this.page.locator('label', { has: this.page.getByRole('checkbox', { name: 'Read-only' }) }); } } diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-tags.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-tags.ts index 064877aab1c6..afb5775ba1f5 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-tags.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-tags.ts @@ -3,67 +3,67 @@ import type { Locator } from '@playwright/test'; import { OmnichannelAdministration } from './omnichannel-administration'; export class OmnichannelTags extends OmnichannelAdministration { - get btnCreateTag(): Locator { + get btnCreateTag(): Locator { return this.page.locator('header').locator('role=button[name="Create tag"]'); } - get contextualBar(): Locator { + get contextualBar(): Locator { return this.page.locator('div[role="dialog"].rcx-vertical-bar'); } - get btnSave(): Locator { + get btnSave(): Locator { return this.contextualBar.locator('role=button[name="Save"]'); } - get btnCancel(): Locator { + get btnCancel(): Locator { return this.contextualBar.locator('role=button[name="Cancel"]'); } - get inputName(): Locator { + get inputName(): Locator { return this.page.locator('[name="name"]'); } - get inputSearch(): Locator { + get inputSearch(): Locator { return this.page.locator('[placeholder="Search"]'); } - get confirmDeleteModal(): Locator { + get confirmDeleteModal(): Locator { return this.page.locator('dialog:has(h2:has-text("Are you sure?"))'); } - get btnCancelDeleteModal(): Locator { + get btnCancelDeleteModal(): Locator { return this.confirmDeleteModal.locator('role=button[name="Cancel"]'); } - get btnConfirmDeleteModal(): Locator { + get btnConfirmDeleteModal(): Locator { return this.confirmDeleteModal.locator('role=button[name="Delete"]'); } - get btnContextualbarClose(): Locator { + get btnContextualbarClose(): Locator { return this.contextualBar.locator('button[aria-label="Close"]'); } - btnDeleteByName(name: string): Locator { + btnDeleteByName(name: string): Locator { return this.page.locator(`role=link[name="${name} Remove"] >> role=button`); } - findRowByName(name: string): Locator { + findRowByName(name: string): Locator { return this.page.locator(`tr:has-text("${name}")`); } - get inputDepartments(): Locator { - return this.page.locator('input[placeholder="Select an option"]'); + get inputDepartments(): Locator { + return this.page.locator('input[placeholder="Select an option"]'); } - - private selectOption(name: string): Locator { - return this.page.locator(`[role=option][value="${name}"]`); + + private selectOption(name: string): Locator { + return this.page.locator(`[role=option][value="${name}"]`); + } + + async search(text: string) { + await this.inputSearch.fill(text); } - - async search(text: string) { - await this.inputSearch.fill(text); - } - async selectDepartment({ name, _id }: { name: string; _id: string }) { + async selectDepartment({ name, _id }: { name: string; _id: string }) { await this.inputDepartments.click(); await this.inputDepartments.fill(name); await this.selectOption(_id).click(); diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts index 14c0ba41e989..a063952ed3ba 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts @@ -86,7 +86,12 @@ export class OmnichannelTriggers { await this.page.locator(`li.rcx-option[data-key="${sender}"]`).click(); } - public async createTrigger(triggersName: string, triggerMessage: string, condition: "time-on-site" | "chat-opened-by-visitor" | "after-guest-registration", conditionValue?: number | string) { + public async createTrigger( + triggersName: string, + triggerMessage: string, + condition: 'time-on-site' | 'chat-opened-by-visitor' | 'after-guest-registration', + conditionValue?: number | string, + ) { await this.headingButtonNew('Create trigger').click(); await this.fillTriggerForm({ name: triggersName, diff --git a/apps/meteor/tests/e2e/read-receipts.spec.ts b/apps/meteor/tests/e2e/read-receipts.spec.ts index 524b79d4e919..54eb52f06fa6 100644 --- a/apps/meteor/tests/e2e/read-receipts.spec.ts +++ b/apps/meteor/tests/e2e/read-receipts.spec.ts @@ -35,7 +35,7 @@ test.describe.serial('read-receipts', () => { test.describe('read receipts enabled', async () => { test.beforeAll(async ({ api }) => { await setSettingValueById(api, 'Message_Read_Receipt_Enabled', true); - await setSettingValueById(api, 'Message_Read_Receipt_Store_Users', true); + await setSettingValueById(api, 'Message_Read_Receipt_Store_Users', true); }); test.afterAll(async ({ api }) => { @@ -48,21 +48,21 @@ test.describe.serial('read-receipts', () => { const auxContext = { page, poHomeChannel: new HomeChannel(page) }; await auxContext.poHomeChannel.sidenav.openChat(targetChannel); await auxContext.poHomeChannel.content.sendMessage('hello admin'); - + await expect(auxContext.poHomeChannel.content.lastUserMessage.getByRole('status', { name: 'Message sent' })).toBeVisible(); await auxContext.page.close(); }); - + test('should show read receipts message viewed status in the sent message', async () => { await poHomeChannel.sidenav.openChat(targetChannel); - await expect(poHomeChannel.content.lastUserMessage.getByRole('status', { name: 'Message viewed' })).toBeVisible(); + await expect(poHomeChannel.content.lastUserMessage.getByRole('status', { name: 'Message viewed' })).toBeVisible(); }); - + test('should show the reads receipt modal with the users who read the message', async ({ page }) => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.content.openLastMessageMenu(); await page.locator('role=menuitem[name="Read receipts"]').click(); - + await expect(page.getByRole('dialog').getByRole('listitem')).toHaveCount(2); }); }); diff --git a/apps/meteor/tests/e2e/register.spec.ts b/apps/meteor/tests/e2e/register.spec.ts index 1709b8414e6b..0e371aa25d97 100644 --- a/apps/meteor/tests/e2e/register.spec.ts +++ b/apps/meteor/tests/e2e/register.spec.ts @@ -129,9 +129,9 @@ test.describe.parallel('register', () => { test('should not have any accessibility violations', async ({ page, makeAxeBuilder }) => { await page.goto('/home'); await poRegistration.goToRegister.click(); - + const results = await makeAxeBuilder().analyze(); - + expect(results.violations).toEqual([]); }); }); diff --git a/apps/meteor/tests/e2e/reset-password.spec.ts b/apps/meteor/tests/e2e/reset-password.spec.ts index fc5e0b703784..fcd26eb4f355 100644 --- a/apps/meteor/tests/e2e/reset-password.spec.ts +++ b/apps/meteor/tests/e2e/reset-password.spec.ts @@ -3,33 +3,33 @@ import { setSettingValueById } from './utils/setSettingValueById'; import { test, expect } from './utils/test'; test.describe.parallel('Reset Password', () => { - let poRegistration: Registration; + let poRegistration: Registration; - test.beforeEach(async ({ api, page }) => { - poRegistration = new Registration(page); - await setSettingValueById(api, 'Accounts_RequirePasswordConfirmation', true); + test.beforeEach(async ({ api, page }) => { + poRegistration = new Registration(page); + await setSettingValueById(api, 'Accounts_RequirePasswordConfirmation', true); - await page.goto('/reset-password/someToken'); - }); + await page.goto('/reset-password/someToken'); + }); - test.afterAll(async ({ api }) => { - await setSettingValueById(api, 'Accounts_RequirePasswordConfirmation', true); - }) + test.afterAll(async ({ api }) => { + await setSettingValueById(api, 'Accounts_RequirePasswordConfirmation', true); + }); - test('should confirm password be invalid', async () => { - await poRegistration.inputPassword.fill('123456'); - await poRegistration.inputPasswordConfirm.fill('123455'); - await poRegistration.btnReset.click(); - await expect(poRegistration.inputPasswordConfirm).toBeInvalid(); - }); + test('should confirm password be invalid', async () => { + await poRegistration.inputPassword.fill('123456'); + await poRegistration.inputPasswordConfirm.fill('123455'); + await poRegistration.btnReset.click(); + await expect(poRegistration.inputPasswordConfirm).toBeInvalid(); + }); - test('should confirm password not be visible', async ({ api }) => { - await setSettingValueById(api, 'Accounts_RequirePasswordConfirmation', false); - await expect(poRegistration.inputPasswordConfirm).not.toBeVisible(); - }) + test('should confirm password not be visible', async ({ api }) => { + await setSettingValueById(api, 'Accounts_RequirePasswordConfirmation', false); + await expect(poRegistration.inputPasswordConfirm).not.toBeVisible(); + }); - test('should not have any accessibility violations', async ({ makeAxeBuilder }) => { - const results = await makeAxeBuilder().analyze(); - expect(results.violations).toEqual([]); - }) + test('should not have any accessibility violations', async ({ makeAxeBuilder }) => { + const results = await makeAxeBuilder().analyze(); + expect(results.violations).toEqual([]); + }); }); diff --git a/apps/meteor/tests/e2e/retention-policy.spec.ts b/apps/meteor/tests/e2e/retention-policy.spec.ts index ba9ec90eff3b..9c18edcf4af3 100644 --- a/apps/meteor/tests/e2e/retention-policy.spec.ts +++ b/apps/meteor/tests/e2e/retention-policy.spec.ts @@ -21,7 +21,7 @@ test.describe.serial('retention-policy', () => { targetGroup = await createTargetPrivateChannel(api); targetTeam = await createTargetTeam(api); - }) + }); test.beforeEach(async ({ page }) => { poHomeChannel = new HomeChannel(page); @@ -51,7 +51,7 @@ test.describe.serial('retention-policy', () => { }); }); - test.describe('retention policy enabled', () => { + test.describe('retention policy enabled', () => { test.beforeAll(async ({ api }) => { await setSettingValueById(api, 'RetentionPolicy_Enabled', true); }); @@ -94,7 +94,7 @@ test.describe.serial('retention-policy', () => { await expect(poHomeChannel.tabs.room.pruneAccordion).not.toBeVisible(); await auxContext.page.close(); - }) + }); test.describe('retention policy applies enabled by default', () => { test.beforeAll(async ({ api }) => { @@ -106,7 +106,7 @@ test.describe.serial('retention-policy', () => { test('should prune old messages checkbox enabled by default in channel and show retention policy banner', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await expect(poHomeChannel.content.channelRetentionPolicyWarning).toBeVisible(); - + await poHomeChannel.tabs.btnRoomInfo.click(); await poHomeChannel.tabs.room.btnEdit.click(); await poHomeChannel.tabs.room.pruneAccordion.click(); @@ -116,7 +116,7 @@ test.describe.serial('retention-policy', () => { test('should prune old messages checkbox enabled by default in team and show retention policy banner', async () => { await poHomeChannel.sidenav.openChat(targetTeam); await expect(poHomeChannel.content.channelRetentionPolicyWarning).toBeVisible(); - + await poHomeChannel.tabs.btnRoomInfo.click(); await poHomeChannel.tabs.room.btnEdit.click(); await poHomeChannel.tabs.room.pruneAccordion.click(); @@ -126,7 +126,7 @@ test.describe.serial('retention-policy', () => { test('should prune old messages checkbox enabled by default in group and show retention policy banner', async () => { await poHomeChannel.sidenav.openChat(targetGroup); await expect(poHomeChannel.content.channelRetentionPolicyWarning).toBeVisible(); - + await poHomeChannel.tabs.btnRoomInfo.click(); await poHomeChannel.tabs.room.btnEdit.click(); await poHomeChannel.tabs.room.pruneAccordion.click(); @@ -150,10 +150,10 @@ test.describe.serial('retention-policy', () => { await poHomeChannel.tabs.room.btnEdit.click(); await poHomeChannel.tabs.room.pruneAccordion.click(); await poHomeChannel.tabs.room.checkboxOverrideGlobalRetention.click(); - + await expect(poHomeChannel.tabs.room.getMaxAgeLabel('15')).toBeVisible(); }); - + test('should display overridden retention max age value', async () => { await poHomeChannel.sidenav.openChat(targetChannel); await poHomeChannel.tabs.btnRoomInfo.click(); @@ -163,11 +163,11 @@ test.describe.serial('retention-policy', () => { await poHomeChannel.tabs.room.inputRetentionMaxAge.fill('365'); await poHomeChannel.tabs.room.btnSave.click(); await poHomeChannel.dismissToast(); - + await poHomeChannel.tabs.btnRoomInfo.click(); await poHomeChannel.tabs.room.btnEdit.click(); await poHomeChannel.tabs.room.pruneAccordion.click(); - + await expect(poHomeChannel.tabs.room.getMaxAgeLabel('15')).toBeVisible(); await expect(poHomeChannel.tabs.room.inputRetentionMaxAge).toHaveValue('365'); }); diff --git a/apps/meteor/tests/e2e/saml.spec.ts b/apps/meteor/tests/e2e/saml.spec.ts index 8859e46e71c5..b1c1687bfa6a 100644 --- a/apps/meteor/tests/e2e/saml.spec.ts +++ b/apps/meteor/tests/e2e/saml.spec.ts @@ -2,7 +2,7 @@ import child_process from 'child_process'; import path from 'path'; import { faker } from '@faker-js/faker'; -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { v2 as compose } from 'docker-compose'; import { MongoClient } from 'mongodb'; @@ -14,7 +14,8 @@ import { createCustomRole, deleteCustomRole } from './utils/custom-role'; import { getUserInfo } from './utils/getUserInfo'; import { parseMeteorResponse } from './utils/parseMeteorResponse'; import { setSettingValueById } from './utils/setSettingValueById'; -import { test, expect, BaseTest } from './utils/test'; +import type { BaseTest } from './utils/test'; +import { test, expect } from './utils/test'; const resetTestData = async (cleanupOnly = false) => { // Reset saml users' data on mongo in the beforeAll hook to allow re-running the tests within the same playwright session @@ -196,7 +197,7 @@ test.describe('SAML', () => { }); }); - test('Allow password change for OAuth users', async ({ api }) => { + test('Allow password change for OAuth users', async ({ api }) => { await test.step("should not send password reset mail if 'Allow Password Change for OAuth Users' setting is disabled", async () => { expect((await setSettingValueById(api, 'Accounts_AllowPasswordChangeForOAuthUsers', false)).status()).toBe(200); diff --git a/apps/meteor/tests/e2e/search-discussion.spec.ts b/apps/meteor/tests/e2e/search-discussion.spec.ts index e14813bc2dc3..0d645432d777 100644 --- a/apps/meteor/tests/e2e/search-discussion.spec.ts +++ b/apps/meteor/tests/e2e/search-discussion.spec.ts @@ -1,4 +1,4 @@ -import { Page } from '@playwright/test'; +import type { Page } from '@playwright/test'; import { Users } from './fixtures/userStates'; import { HomeChannel } from './page-objects'; @@ -33,7 +33,7 @@ test.describe.serial('search-discussion', () => { await poHomeChannel.sidenav.inputSearch.type(discussionName); const targetSearchItem = page.locator('role=listbox').getByText(discussionName).first(); await expect(targetSearchItem).toBeVisible(); - } + }; test('expect search discussion to show fname when UI_Allow_room_names_with_special_chars=true', async ({ page, api }) => { await setSettingValueById(api, 'UI_Allow_room_names_with_special_chars', true); diff --git a/apps/meteor/tests/e2e/sidebar-administration-menu.spec.ts b/apps/meteor/tests/e2e/sidebar-administration-menu.spec.ts index c5b1f68b4cd4..e72149242e90 100644 --- a/apps/meteor/tests/e2e/sidebar-administration-menu.spec.ts +++ b/apps/meteor/tests/e2e/sidebar-administration-menu.spec.ts @@ -18,17 +18,17 @@ test.describe.serial('sidebar-administration-menu', () => { test('should open workspace page', async ({ page }) => { test.skip(!IS_EE, 'Enterprise only'); await poHomeDiscussion.sidenav.openAdministrationByLabel('Workspace'); - + await expect(page).toHaveURL('admin/info'); }); - + test('should open omnichannel page', async ({ page }) => { await poHomeDiscussion.sidenav.openAdministrationByLabel('Omnichannel'); - + await expect(page).toHaveURL('omnichannel/current'); }); }); - + test.describe('regular user', () => { test.use({ storageState: Users.user1.state }); diff --git a/apps/meteor/tests/e2e/sidebar.spec.ts b/apps/meteor/tests/e2e/sidebar.spec.ts index dbe14f0733bf..a172fe72d1be 100644 --- a/apps/meteor/tests/e2e/sidebar.spec.ts +++ b/apps/meteor/tests/e2e/sidebar.spec.ts @@ -13,23 +13,23 @@ test.describe.serial('sidebar', () => { await page.goto('/home'); }); - test('should navigate on sidebar toolbar using arrow keys', async ({ page }) => { - await poHomeDiscussion.sidenav.userProfileMenu.focus(); - await page.keyboard.press('Tab'); - await page.keyboard.press('ArrowRight'); - - await expect(poHomeDiscussion.sidenav.sidebarToolbar.getByRole('button', { name: 'Search' })).toBeFocused(); - }); - - test('should navigate on sidebar items using arrow keys and restore focus', async ({ page }) => { - // focus should be on the next item - await poHomeDiscussion.sidenav.sidebarChannelsList.getByRole('link').first().focus(); - await page.keyboard.press('ArrowDown'); - await expect(poHomeDiscussion.sidenav.sidebarChannelsList.getByRole('link').first()).not.toBeFocused(); - - // shouldn't focus the first item - await page.keyboard.press('Shift+Tab'); - await page.keyboard.press('Tab'); - await expect(poHomeDiscussion.sidenav.sidebarChannelsList.getByRole('link').first()).not.toBeFocused(); - }); + test('should navigate on sidebar toolbar using arrow keys', async ({ page }) => { + await poHomeDiscussion.sidenav.userProfileMenu.focus(); + await page.keyboard.press('Tab'); + await page.keyboard.press('ArrowRight'); + + await expect(poHomeDiscussion.sidenav.sidebarToolbar.getByRole('button', { name: 'Search' })).toBeFocused(); + }); + + test('should navigate on sidebar items using arrow keys and restore focus', async ({ page }) => { + // focus should be on the next item + await poHomeDiscussion.sidenav.sidebarChannelsList.getByRole('link').first().focus(); + await page.keyboard.press('ArrowDown'); + await expect(poHomeDiscussion.sidenav.sidebarChannelsList.getByRole('link').first()).not.toBeFocused(); + + // shouldn't focus the first item + await page.keyboard.press('Shift+Tab'); + await page.keyboard.press('Tab'); + await expect(poHomeDiscussion.sidenav.sidebarChannelsList.getByRole('link').first()).not.toBeFocused(); + }); }); diff --git a/apps/meteor/tests/e2e/threads.spec.ts b/apps/meteor/tests/e2e/threads.spec.ts index a7fa19422ff5..16198c15a942 100644 --- a/apps/meteor/tests/e2e/threads.spec.ts +++ b/apps/meteor/tests/e2e/threads.spec.ts @@ -142,7 +142,7 @@ test.describe.serial('Threads', () => { await poHomeChannel.content.openLastThreadMessageMenu(); await page.locator('role=menuitem[name="Copy text"]').click(); - const clipboardText = await page.evaluate("navigator.clipboard.readText()"); + const clipboardText = await page.evaluate('navigator.clipboard.readText()'); expect(clipboardText).toBe('this is a message for reply'); }); @@ -151,7 +151,7 @@ test.describe.serial('Threads', () => { await poHomeChannel.content.openLastThreadMessageMenu(); await page.locator('role=menuitem[name="Copy link"]').click(); - const clipboardText = await page.evaluate("navigator.clipboard.readText()"); + const clipboardText = await page.evaluate('navigator.clipboard.readText()'); expect(clipboardText).toContain('http'); }); diff --git a/apps/meteor/tests/e2e/utils/create-target-channel.ts b/apps/meteor/tests/e2e/utils/create-target-channel.ts index d5b10aaa9e1a..8f7a25aa9718 100644 --- a/apps/meteor/tests/e2e/utils/create-target-channel.ts +++ b/apps/meteor/tests/e2e/utils/create-target-channel.ts @@ -48,7 +48,7 @@ export async function createTargetDiscussion(api: BaseTest['api']): Promise { await api.post('/users.setStatus', { diff --git a/apps/meteor/tests/e2e/utils/omnichannel/departments.ts b/apps/meteor/tests/e2e/utils/omnichannel/departments.ts index 455410808720..fb7d8cd14ec3 100644 --- a/apps/meteor/tests/e2e/utils/omnichannel/departments.ts +++ b/apps/meteor/tests/e2e/utils/omnichannel/departments.ts @@ -1,9 +1,9 @@ import { faker } from '@faker-js/faker'; -import { ILivechatDepartment } from '@rocket.chat/core-typings'; +import type { ILivechatDepartment } from '@rocket.chat/core-typings'; -import { BaseTest } from '../test'; +import type { BaseTest } from '../test'; -type CreateDepartmentParams = { +type CreateDepartmentParams = { name?: string; enabled?: boolean; description?: string; @@ -13,29 +13,32 @@ type CreateDepartmentParams = { email?: string; chatClosingTags?: string[]; offlineMessageChannelName?: string; - abandonedRoomsCloseCustomMessage?: string, + abandonedRoomsCloseCustomMessage?: string; waitingQueueMessage?: string; departmentsAllowedToForward?: string[]; fallbackForwardDepartment?: string; maxNumberSimultaneousChat?: number; - }; +}; -export const createDepartment = async (api: BaseTest['api'], { - name = '', - enabled = true, - description = '', - showOnRegistration = false, - showOnOfflineForm = false, - requestTagBeforeClosingChat = false, - email = '', - chatClosingTags = [], - offlineMessageChannelName = '', - abandonedRoomsCloseCustomMessage = '', - waitingQueueMessage = '', - departmentsAllowedToForward = [], - fallbackForwardDepartment = '', - maxNumberSimultaneousChat -}: CreateDepartmentParams = {}) => { +export const createDepartment = async ( + api: BaseTest['api'], + { + name = '', + enabled = true, + description = '', + showOnRegistration = false, + showOnOfflineForm = false, + requestTagBeforeClosingChat = false, + email = '', + chatClosingTags = [], + offlineMessageChannelName = '', + abandonedRoomsCloseCustomMessage = '', + waitingQueueMessage = '', + departmentsAllowedToForward = [], + fallbackForwardDepartment = '', + maxNumberSimultaneousChat, + }: CreateDepartmentParams = {}, +) => { const response = await api.post('/livechat/department', { department: { name: name || faker.string.uuid(), diff --git a/apps/meteor/tests/e2e/utils/omnichannel/managers.ts b/apps/meteor/tests/e2e/utils/omnichannel/managers.ts index 3fb5f04dcc96..f32ecad45900 100644 --- a/apps/meteor/tests/e2e/utils/omnichannel/managers.ts +++ b/apps/meteor/tests/e2e/utils/omnichannel/managers.ts @@ -1,4 +1,4 @@ -import { BaseTest } from '../test'; +import type { BaseTest } from '../test'; export const createManager = async (api: BaseTest['api'], username: string) => { const response = await api.post('/livechat/users/manager', { diff --git a/apps/meteor/tests/e2e/utils/omnichannel/monitors.ts b/apps/meteor/tests/e2e/utils/omnichannel/monitors.ts index f92ff9244ec5..5c14b4f607a9 100644 --- a/apps/meteor/tests/e2e/utils/omnichannel/monitors.ts +++ b/apps/meteor/tests/e2e/utils/omnichannel/monitors.ts @@ -1,5 +1,5 @@ import { parseMeteorResponse } from '../parseMeteorResponse'; -import { BaseTest } from '../test'; +import type { BaseTest } from '../test'; const removeMonitor = async (api: BaseTest['api'], id: string) => api.post('/method.call/livechat:removeMonitor', { diff --git a/apps/meteor/tests/e2e/utils/omnichannel/rooms.ts b/apps/meteor/tests/e2e/utils/omnichannel/rooms.ts index c07c5376130f..feec31e2a819 100644 --- a/apps/meteor/tests/e2e/utils/omnichannel/rooms.ts +++ b/apps/meteor/tests/e2e/utils/omnichannel/rooms.ts @@ -1,6 +1,6 @@ import { faker } from '@faker-js/faker'; -import { BaseTest } from '../test'; +import type { BaseTest } from '../test'; type UpdateRoomParams = { roomId: string; visitorId: string; tags: string[] }; diff --git a/apps/meteor/tests/e2e/utils/omnichannel/tags.ts b/apps/meteor/tests/e2e/utils/omnichannel/tags.ts index 169f4825bd75..ba2a6b43e4d2 100644 --- a/apps/meteor/tests/e2e/utils/omnichannel/tags.ts +++ b/apps/meteor/tests/e2e/utils/omnichannel/tags.ts @@ -1,7 +1,7 @@ -import { ILivechatTag } from '@rocket.chat/core-typings'; +import type { ILivechatTag } from '@rocket.chat/core-typings'; import { parseMeteorResponse } from '../parseMeteorResponse'; -import { BaseTest } from '../test'; +import type { BaseTest } from '../test'; type CreateTagParams = { id?: string | null; @@ -15,23 +15,21 @@ const removeTag = async (api: BaseTest['api'], id: string) => message: JSON.stringify({ msg: 'method', id: '33', method: 'livechat:removeTag', params: [id] }), }); -export const createTag = async ( - api: BaseTest['api'], - { id = null, name, description = '', departments = [] }: CreateTagParams = {}, - ) => { - const response = await api.post('/method.call/livechat:saveTag', { - message: JSON.stringify({ - msg: 'method', - id: '33', - method: 'livechat:saveTag', - params: [id, { name, description }, departments]}) - }); +export const createTag = async (api: BaseTest['api'], { id = null, name, description = '', departments = [] }: CreateTagParams = {}) => { + const response = await api.post('/method.call/livechat:saveTag', { + message: JSON.stringify({ + msg: 'method', + id: '33', + method: 'livechat:saveTag', + params: [id, { name, description }, departments], + }), + }); - const tag = await parseMeteorResponse(response); + const tag = await parseMeteorResponse(response); - return { - response, - data: tag, - delete: async () => removeTag(api, tag?._id), - }; + return { + response, + data: tag, + delete: async () => removeTag(api, tag?._id), + }; }; diff --git a/apps/meteor/tests/e2e/utils/omnichannel/units.ts b/apps/meteor/tests/e2e/utils/omnichannel/units.ts index bbc37ed12df8..596c074191ed 100644 --- a/apps/meteor/tests/e2e/utils/omnichannel/units.ts +++ b/apps/meteor/tests/e2e/utils/omnichannel/units.ts @@ -1,8 +1,8 @@ import { faker } from '@faker-js/faker'; -import { IOmnichannelBusinessUnit } from '@rocket.chat/core-typings'; +import type { IOmnichannelBusinessUnit } from '@rocket.chat/core-typings'; import { parseMeteorResponse } from '../parseMeteorResponse'; -import { BaseTest } from '../test'; +import type { BaseTest } from '../test'; type CreateUnitParams = { id?: string | null; diff --git a/apps/meteor/tests/e2e/utils/parseMeteorResponse.ts b/apps/meteor/tests/e2e/utils/parseMeteorResponse.ts index edecd3ea4ce3..24adc1574b28 100644 --- a/apps/meteor/tests/e2e/utils/parseMeteorResponse.ts +++ b/apps/meteor/tests/e2e/utils/parseMeteorResponse.ts @@ -1,5 +1,5 @@ -import { APIResponse } from '@playwright/test'; -import { Serialized } from '@rocket.chat/core-typings'; +import type { APIResponse } from '@playwright/test'; +import type { Serialized } from '@rocket.chat/core-typings'; export const parseMeteorResponse = async (response: APIResponse): Promise> => { const { message, success } = await response.json(); diff --git a/apps/meteor/tests/e2e/utils/setUserPreferences.ts b/apps/meteor/tests/e2e/utils/setUserPreferences.ts index fcb1f930d21a..2e55f22dd9e6 100644 --- a/apps/meteor/tests/e2e/utils/setUserPreferences.ts +++ b/apps/meteor/tests/e2e/utils/setUserPreferences.ts @@ -1,5 +1,5 @@ import type { APIResponse } from '@playwright/test'; -import { UsersSetPreferencesParamsPOST } from '@rocket.chat/rest-typings'; +import type { UsersSetPreferencesParamsPOST } from '@rocket.chat/rest-typings'; import type { BaseTest } from './test'; From c8069f728be7dcd629130e477d1ee20c873e5776 Mon Sep 17 00:00:00 2001 From: Rafael Tapia Date: Mon, 10 Jun 2024 13:50:39 -0300 Subject: [PATCH 28/29] fix: remove reason when password change is set to false (#31363) --- .changeset/wild-carrots-know.md | 5 ++++ .../app/lib/server/functions/saveUser.js | 4 +++ apps/meteor/tests/data/users.helper.js | 14 +++++++++ apps/meteor/tests/end-to-end/api/01-users.js | 30 ++++++++++++++++++- 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 .changeset/wild-carrots-know.md diff --git a/.changeset/wild-carrots-know.md b/.changeset/wild-carrots-know.md new file mode 100644 index 000000000000..6403b5fd0bfd --- /dev/null +++ b/.changeset/wild-carrots-know.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Remove password change reason when the `request password change` option is set to false diff --git a/apps/meteor/app/lib/server/functions/saveUser.js b/apps/meteor/app/lib/server/functions/saveUser.js index 3a2808b4171c..e11e68f99ab0 100644 --- a/apps/meteor/app/lib/server/functions/saveUser.js +++ b/apps/meteor/app/lib/server/functions/saveUser.js @@ -401,6 +401,7 @@ export const saveUser = async function (userId, userData) { const updateUser = { $set: {}, + $unset: {}, }; handleBio(updateUser, userData.bio); @@ -419,6 +420,9 @@ export const saveUser = async function (userId, userData) { if (typeof userData.requirePasswordChange !== 'undefined') { updateUser.$set.requirePasswordChange = userData.requirePasswordChange; + if (!userData.requirePasswordChange) { + updateUser.$unset.requirePasswordChangeReason = 1; + } } if (typeof userData.verified === 'boolean') { diff --git a/apps/meteor/tests/data/users.helper.js b/apps/meteor/tests/data/users.helper.js index cf6f90b3f877..841ec56d7db1 100644 --- a/apps/meteor/tests/data/users.helper.js +++ b/apps/meteor/tests/data/users.helper.js @@ -1,6 +1,8 @@ import { UserStatus } from '@rocket.chat/core-typings'; import { api, credentials, request } from './api-data'; import { password } from './user'; +import { MongoClient } from 'mongodb'; +import { URL_MONGODB } from '../e2e/config/constants'; export const createUser = (userData = {}) => new Promise((resolve) => { @@ -105,3 +107,15 @@ export const registerUser = async (userData = {}, overrideCredentials = credenti return result.body.user; }; + +// For changing user data when it's not possible to do so via API +export const updateUserInDb = async (userId, userData) => { + const connection = await MongoClient.connect(URL_MONGODB); + + await connection + .db() + .collection('users') + .updateOne({ _id: userId }, { $set: { ...userData } }); + + await connection.close(); +}; diff --git a/apps/meteor/tests/end-to-end/api/01-users.js b/apps/meteor/tests/end-to-end/api/01-users.js index c63422b071b6..b1d9a594996b 100644 --- a/apps/meteor/tests/end-to-end/api/01-users.js +++ b/apps/meteor/tests/end-to-end/api/01-users.js @@ -23,7 +23,7 @@ import { } from '../../data/rooms.helper'; import { createTeam, deleteTeam } from '../../data/teams.helper'; import { adminEmail, preferences, password, adminUsername } from '../../data/user'; -import { createUser, login, deleteUser, getUserStatus, getUserByUsername, registerUser } from '../../data/users.helper.js'; +import { createUser, login, deleteUser, getUserStatus, getUserByUsername, registerUser, updateUserInDb } from '../../data/users.helper.js'; const targetUser = {}; @@ -1653,6 +1653,34 @@ describe('[Users]', function () { }); }); + it('should delete requirePasswordChangeReason when requirePasswordChange is set to false', async () => { + const user = await createUser({ + requirePasswordChange: true, + }); + + await updateUserInDb(user._id, { requirePasswordChangeReason: 'any_data' }); + + await request + .post(api('users.update')) + .set(credentials) + .send({ + userId: user._id, + data: { + requirePasswordChange: false, + }, + }) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('user'); + expect(res.body.user).to.have.property('requirePasswordChange', false); + expect(res.body.user).to.not.have.property('requirePasswordChangeReason'); + }); + + await deleteUser(user); + }); + function failUpdateUser(name) { it(`should not update an user if the new username is the reserved word ${name}`, (done) => { request From 96e66c8393a4b29cd5939ba9e9d16f86192fd7a4 Mon Sep 17 00:00:00 2001 From: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> Date: Mon, 10 Jun 2024 17:16:25 -0300 Subject: [PATCH 29/29] regression: Fixed image gallery not working on Electron app (#32578) --- apps/meteor/client/components/ImageGallery/ImageGallery.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/meteor/client/components/ImageGallery/ImageGallery.tsx b/apps/meteor/client/components/ImageGallery/ImageGallery.tsx index 6b3b9f2c8488..0fb31c5a2560 100644 --- a/apps/meteor/client/components/ImageGallery/ImageGallery.tsx +++ b/apps/meteor/client/components/ImageGallery/ImageGallery.tsx @@ -182,13 +182,13 @@ export const ImageGallery = ({ images, onClose, loadMore }: { images: IUpload[]; onReachBeginning={loadMore} initialSlide={images.length - 1} > - {images.toReversed().map(({ _id, url }) => ( + {[...images].reverse().map(({ _id, url }) => (
    {/* eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions, - jsx-a11y/click-events-have-key-events - */} + jsx-a11y/click-events-have-key-events + */}