From 5cee21468e31dd81631e8f5903ac80ca5edeb5ea Mon Sep 17 00:00:00 2001 From: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:18:58 -0300 Subject: [PATCH 001/408] fix: Spotlight search does not find rooms with special characters (#29804) --- .changeset/lovely-snails-drop.md | 6 +++ apps/meteor/server/lib/spotlight.js | 2 +- apps/meteor/server/models/raw/Rooms.ts | 12 +++-- .../tests/end-to-end/api/00-miscellaneous.js | 46 +++++++++++++++---- .../model-typings/src/models/IRoomsModel.ts | 2 +- 5 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 .changeset/lovely-snails-drop.md diff --git a/.changeset/lovely-snails-drop.md b/.changeset/lovely-snails-drop.md new file mode 100644 index 000000000000..4e28c6a43c20 --- /dev/null +++ b/.changeset/lovely-snails-drop.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/model-typings": patch +--- + +Fix spotlight search does not find rooms with special or non-latin characters diff --git a/apps/meteor/server/lib/spotlight.js b/apps/meteor/server/lib/spotlight.js index 2fb68d983cef..38dc1b873878 100644 --- a/apps/meteor/server/lib/spotlight.js +++ b/apps/meteor/server/lib/spotlight.js @@ -65,7 +65,7 @@ export class Spotlight { return this.fetchRooms( userId, - await Rooms.findByNameAndTypesNotInIds(regex, searchableRoomTypeIds, roomIds, roomOptions, includeFederatedRooms).toArray(), + await Rooms.findByNameOrFNameAndTypesNotInIds(regex, searchableRoomTypeIds, roomIds, roomOptions, includeFederatedRooms).toArray(), ); } diff --git a/apps/meteor/server/models/raw/Rooms.ts b/apps/meteor/server/models/raw/Rooms.ts index abf3c44e71aa..ca898ecb10ea 100644 --- a/apps/meteor/server/models/raw/Rooms.ts +++ b/apps/meteor/server/models/raw/Rooms.ts @@ -1287,13 +1287,16 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { } // 3 - findByNameAndTypesNotInIds( + findByNameOrFNameAndTypesNotInIds( name: IRoom['name'] | RegExp, types: Array, ids: Array, options: FindOptions = {}, includeFederatedRooms = false, ): FindCursor { + const nameCondition: Filter = { + $or: [{ name }, { fname: name }], + }; const query: Filter = { _id: { $nin: ids, @@ -1327,9 +1330,12 @@ export class RoomsRaw extends BaseRaw implements IRoomsModel { }, includeFederatedRooms ? { - $or: [{ $and: [{ $or: [{ federated: { $exists: false } }, { federated: false }], name }] }, { federated: true, fname: name }], + $or: [ + { $and: [{ $or: [{ federated: { $exists: false } }, { federated: false }] }, nameCondition] }, + { federated: true, fname: name }, + ], } - : { $or: [{ federated: { $exists: false } }, { federated: false }], name }, + : { $and: [{ $or: [{ federated: { $exists: false } }, { federated: false }] }, nameCondition] }, ], }; diff --git a/apps/meteor/tests/end-to-end/api/00-miscellaneous.js b/apps/meteor/tests/end-to-end/api/00-miscellaneous.js index 2f3725048b7b..a893c8923aff 100644 --- a/apps/meteor/tests/end-to-end/api/00-miscellaneous.js +++ b/apps/meteor/tests/end-to-end/api/00-miscellaneous.js @@ -2,6 +2,7 @@ import { expect } from 'chai'; import { getCredentials, api, login, request, credentials } from '../../data/api-data.js'; import { updateSetting } from '../../data/permissions.helper'; +import { createRoom } from '../../data/rooms.helper'; import { adminEmail, adminUsername, adminPassword, password } from '../../data/user'; import { createUser, login as doLogin } from '../../data/users.helper'; import { IS_EE } from '../../e2e/config/constants'; @@ -215,7 +216,7 @@ describe('miscellaneous', function () { .end(done); user = undefined; }); - it('create an channel', (done) => { + it('create a channel', (done) => { request .post(api('channels.create')) .set(credentials) @@ -488,17 +489,25 @@ describe('miscellaneous', function () { }) .end(done); }); - after((done) => { - request - .post(api('users.delete')) - .set(credentials) - .send({ - userId: user._id, + let testChannelSpecialChars; + const fnameSpecialCharsRoom = `test ГДΕληνικά`; + before((done) => { + updateSetting('UI_Allow_room_names_with_special_chars', true) + .then(() => { + createRoom({ type: 'c', name: fnameSpecialCharsRoom, credentials: userCredentials }).end((err, res) => { + testChannelSpecialChars = res.body.channel; + }); }) - .end(done); + .then(done); + }); + after(async () => { + await request.post(api('users.delete')).set(credentials).send({ + userId: user._id, + }); user = undefined; + await updateSetting('UI_Allow_room_names_with_special_chars', false); }); - it('create an channel', (done) => { + it('create a channel', (done) => { request .post(api('channels.create')) .set(userCredentials) @@ -591,6 +600,25 @@ describe('miscellaneous', function () { }) .end(done); }); + it('must return rooms when searching for a valid fname', (done) => { + request + .get(api('spotlight')) + .query({ + query: `#${fnameSpecialCharsRoom}`, + }) + .set(credentials) + .expect('Content-Type', 'application/json') + .expect(200) + .expect((res) => { + expect(res.body).to.have.property('success', true); + expect(res.body).to.have.property('users').and.to.be.an('array'); + expect(res.body).to.have.property('rooms').and.to.be.an('array'); + expect(res.body.rooms[0]).to.have.property('_id', testChannelSpecialChars._id); + expect(res.body.rooms[0]).to.have.property('name', testChannelSpecialChars.name); + expect(res.body.rooms[0]).to.have.property('t', testChannelSpecialChars.t); + }) + .end(done); + }); }); describe('[/instances.get]', () => { diff --git a/packages/model-typings/src/models/IRoomsModel.ts b/packages/model-typings/src/models/IRoomsModel.ts index 8987a660aa83..a0053d7ea7ba 100644 --- a/packages/model-typings/src/models/IRoomsModel.ts +++ b/packages/model-typings/src/models/IRoomsModel.ts @@ -213,7 +213,7 @@ export interface IRoomsModel extends IBaseModel { options?: FindOptions, includeFederatedRooms?: boolean, ): FindCursor; - findByNameAndTypesNotInIds( + findByNameOrFNameAndTypesNotInIds( name: IRoom['name'] | RegExp, types: IRoom['t'][], ids: string[], From 5e89694bfa7e1c9674fcb54f9bf6020e9c2cb61e Mon Sep 17 00:00:00 2001 From: Matheus Barbosa Silva <36537004+matheusbsilva137@users.noreply.github.com> Date: Thu, 3 Aug 2023 14:54:09 -0300 Subject: [PATCH 002/408] fix: SAML full name update is not mirrored in DMs (#29838) --- .changeset/honest-numbers-compete.md | 5 +++++ apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .changeset/honest-numbers-compete.md diff --git a/.changeset/honest-numbers-compete.md b/.changeset/honest-numbers-compete.md new file mode 100644 index 000000000000..1fd017e7fc16 --- /dev/null +++ b/.changeset/honest-numbers-compete.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Fixes SAML full name updates not being mirrored to DM rooms. diff --git a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts index 7a2e59f02152..3b734e70e233 100644 --- a/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts +++ b/apps/meteor/app/meteor-accounts-saml/server/lib/SAML.ts @@ -123,6 +123,7 @@ export class SAML { })); let { username } = userObject; + const { fullName } = userObject; const active = !settings.get('Accounts_ManuallyApproveNewUsers'); @@ -131,7 +132,7 @@ export class SAML { const roles = userObject.roles?.length ? userObject.roles : ensureArray(defaultUserRole.split(',')); const newUser: Record = { - name: userObject.fullName, + name: fullName, active, globalRoles: roles, emails, @@ -199,7 +200,7 @@ export class SAML { // Overwrite fullname if needed if (nameOverwrite === true) { - updateData.name = userObject.fullName; + updateData.name = fullName; } // When updating an user, we only update the roles if we received them from the mapping @@ -220,8 +221,8 @@ export class SAML { }, ); - if (username && username !== user.username) { - await saveUserIdentity({ _id: user._id, username }); + if (username && fullName && (username !== user.username || fullName !== user.name)) { + await saveUserIdentity({ _id: user._id, name: fullName, username }); } // sending token along with the userId From 177506ea9118d1cdd7d0afc6c75b72148dd90031 Mon Sep 17 00:00:00 2001 From: Rafael Tapia Date: Fri, 4 Aug 2023 09:42:50 -0300 Subject: [PATCH 003/408] feat: make user default role setting public (#29934) --- .changeset/kind-students-worry.md | 5 +++++ apps/meteor/server/settings/accounts.ts | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/kind-students-worry.md diff --git a/.changeset/kind-students-worry.md b/.changeset/kind-students-worry.md new file mode 100644 index 000000000000..554c1c1204ea --- /dev/null +++ b/.changeset/kind-students-worry.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Make user default role setting public diff --git a/apps/meteor/server/settings/accounts.ts b/apps/meteor/server/settings/accounts.ts index c3273c282aa8..ea9ced816cd6 100644 --- a/apps/meteor/server/settings/accounts.ts +++ b/apps/meteor/server/settings/accounts.ts @@ -390,6 +390,7 @@ export const createAccountSettings = () => }); await this.add('Accounts_Registration_Users_Default_Roles', 'user', { type: 'string', + public: true, }); await this.add('Accounts_PasswordReset', true, { type: 'boolean', From e0ef24dced3df4c7670efd84c38d7ad85b8683c9 Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Fri, 4 Aug 2023 10:58:43 -0300 Subject: [PATCH 004/408] refactor(livechat): `@rocket.chat/random` instead of `crypto-js` (#30014) --- packages/livechat/package.json | 3 +-- packages/livechat/src/lib/random.ts | 27 +++++-------------------- packages/random/tsconfig.build.json | 2 +- yarn.lock | 31 +++++++---------------------- 4 files changed, 14 insertions(+), 49 deletions(-) diff --git a/packages/livechat/package.json b/packages/livechat/package.json index 1725534d996d..ddd57bd15ced 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -36,7 +36,6 @@ "@storybook/addon-postcss": "~2.0.0", "@storybook/preact": "~6.5.16", "@storybook/theming": "~6.5.16", - "@types/crypto-js": "~4.1.1", "@types/whatwg-fetch": "~0.0.33", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", @@ -89,9 +88,9 @@ "dependencies": { "@rocket.chat/gazzodown": "workspace:^", "@rocket.chat/message-parser": "next", + "@rocket.chat/random": "workspace:~", "@rocket.chat/sdk": "^1.0.0-alpha.42", "@rocket.chat/ui-kit": "next", - "crypto-js": "^4.1.1", "css-vars-ponyfill": "^2.4.8", "date-fns": "^2.15.0", "emoji-mart": "^3.0.1", diff --git a/packages/livechat/src/lib/random.ts b/packages/livechat/src/lib/random.ts index f004d82e7576..705fdcacc7da 100644 --- a/packages/livechat/src/lib/random.ts +++ b/packages/livechat/src/lib/random.ts @@ -1,26 +1,9 @@ -import * as crypto from 'crypto-js'; +import { Random } from '@rocket.chat/random'; -const UNMISTAKABLE_CHARS = '23456789ABCDEFGHJKLMNPQRSTWXYZabcdefghijkmnopqrstuvwxyz'; +export const chooseElement = Random.choice; -const fraction = () => { - const array = new Uint32Array(1); - window.crypto.getRandomValues(array); - return array[0] * 2.3283064365386963e-10; -}; +export const createRandomString = Random._randomString; -export const chooseElement = (arrayOrString: string | string[]) => { - const index = Math.floor(fraction() * arrayOrString.length); +export const createRandomId = Random.id; - if (typeof arrayOrString === 'string') { - return arrayOrString.slice(index, index + 1); - } - - return arrayOrString[index]; -}; - -export const createRandomString = (charsCount: number, alphabet: string | string[]) => - Array.from({ length: charsCount }, () => chooseElement(alphabet)).join(''); - -export const createRandomId = (charsCount = 17) => createRandomString(charsCount, UNMISTAKABLE_CHARS); - -export const createToken = () => crypto.lib.WordArray.random(32).toString(crypto.enc.Hex); +export const createToken = () => Random.hexString(64); diff --git a/packages/random/tsconfig.build.json b/packages/random/tsconfig.build.json index 4a856a106b58..591eed835a9a 100644 --- a/packages/random/tsconfig.build.json +++ b/packages/random/tsconfig.build.json @@ -2,7 +2,7 @@ "extends": "./tsconfig.json", "compilerOptions": { "target": "ES2015", - "module": "ESNext", + "module": "CommonJS", "declaration": true, "declarationMap": true, "sourceMap": true, diff --git a/yarn.lock b/yarn.lock index a6f0978f2277..a4505da7c419 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7730,20 +7730,19 @@ __metadata: "@rocket.chat/gazzodown": "workspace:^" "@rocket.chat/logo": next "@rocket.chat/message-parser": next + "@rocket.chat/random": "workspace:~" "@rocket.chat/sdk": ^1.0.0-alpha.42 "@rocket.chat/ui-kit": next "@storybook/addon-essentials": ~6.5.16 "@storybook/addon-postcss": ~2.0.0 "@storybook/preact": ~6.5.16 "@storybook/theming": ~6.5.16 - "@types/crypto-js": ~4.1.1 "@types/whatwg-fetch": ~0.0.33 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 autoprefixer: ^9.8.8 babel-loader: ^8.3.0 cross-env: ^7.0.3 - crypto-js: ^4.1.1 css-loader: ^4.3.0 css-vars-ponyfill: ^2.4.8 cssnano: ^4.1.11 @@ -8510,7 +8509,7 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/random@workspace:^, @rocket.chat/random@workspace:packages/random": +"@rocket.chat/random@workspace:^, @rocket.chat/random@workspace:packages/random, @rocket.chat/random@workspace:~": version: 0.0.0-use.local resolution: "@rocket.chat/random@workspace:packages/random" dependencies: @@ -11067,13 +11066,6 @@ __metadata: languageName: node linkType: hard -"@types/crypto-js@npm:~4.1.1": - version: 4.1.1 - resolution: "@types/crypto-js@npm:4.1.1" - checksum: ea3d6a67b69f88baeb6af96004395903d2367a41bd5cd86306da23a44dd96589749495da50974a9b01bb5163c500764c8a33706831eade036bddae016417e3ea - languageName: node - linkType: hard - "@types/cssom@npm:^0.4.1": version: 0.4.1 resolution: "@types/cssom@npm:0.4.1" @@ -12212,8 +12204,8 @@ __metadata: linkType: hard "@types/webpack@npm:^4.41.26, @types/webpack@npm:^4.41.8": - version: 4.41.32 - resolution: "@types/webpack@npm:4.41.32" + version: 4.41.33 + resolution: "@types/webpack@npm:4.41.33" dependencies: "@types/node": "*" "@types/tapable": ^1 @@ -12221,7 +12213,7 @@ __metadata: "@types/webpack-sources": "*" anymatch: ^3.0.0 source-map: ^0.6.0 - checksum: e594a1357cbbc2f7c6ca47785c5a11adb5591a774a69afaeab07cd6f6bff6c6aea2030bd37b32bdd19d0ec2336a346db754e8d8d236ba8effeab542716fb32b7 + checksum: 5f64818128c94026be0e43e77d687e2d90f0da526a3a7c308c6a0bb12e93a35c9243be427bbf6865f64fd71dc5b32715af9b9da0cd6ae8335081b6db995bad2b languageName: node linkType: hard @@ -16970,7 +16962,7 @@ __metadata: languageName: node linkType: hard -"crypto-js@npm:^4.0.0, crypto-js@npm:^4.1.1": +"crypto-js@npm:^4.0.0": version: 4.1.1 resolution: "crypto-js@npm:4.1.1" checksum: b3747c12ee3a7632fab3b3e171ea50f78b182545f0714f6d3e7e2858385f0f4101a15f2517e033802ce9d12ba50a391575ff4638c9de3dd9b2c4bc47768d5425 @@ -27671,16 +27663,7 @@ __metadata: languageName: node linkType: hard -"nan@npm:^2.12.1, nan@npm:^2.13.2": - version: 2.15.0 - resolution: "nan@npm:2.15.0" - dependencies: - node-gyp: latest - checksum: 33e1bb4dfca447fe37d4bb5889be55de154828632c8d38646db67293a21afd61ed9909cdf1b886214a64707d935926c4e60e2b09de9edfc2ad58de31d6ce8f39 - languageName: node - linkType: hard - -"nan@npm:^2.14.0": +"nan@npm:^2.12.1, nan@npm:^2.13.2, nan@npm:^2.14.0": version: 2.17.0 resolution: "nan@npm:2.17.0" dependencies: From 653987b85a25ed9bbc88516ea532f0fac74885aa Mon Sep 17 00:00:00 2001 From: Aleksander Nicacio da Silva Date: Fri, 4 Aug 2023 11:47:27 -0300 Subject: [PATCH 005/408] chore: Priorities sidebar e2e tests (#29847) --- .../hooks/useOmnichannelPrioritiesMenu.tsx | 2 +- .../tests/e2e/fixtures/createAuxContext.ts | 14 ++- .../omnichannel-priorities-sidebar.spec.ts | 111 ++++++++++++++++++ .../omnichannel-priorities.spec.ts | 1 + .../page-objects/fragments/home-sidenav.ts | 7 ++ .../e2e/page-objects/omnichannel-room-info.ts | 17 +++ 6 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts create mode 100644 apps/meteor/tests/e2e/page-objects/omnichannel-room-info.ts diff --git a/apps/meteor/ee/client/omnichannel/hooks/useOmnichannelPrioritiesMenu.tsx b/apps/meteor/ee/client/omnichannel/hooks/useOmnichannelPrioritiesMenu.tsx index 0910743e97f4..ebfa9bf08a0b 100644 --- a/apps/meteor/ee/client/omnichannel/hooks/useOmnichannelPrioritiesMenu.tsx +++ b/apps/meteor/ee/client/omnichannel/hooks/useOmnichannelPrioritiesMenu.tsx @@ -62,6 +62,6 @@ export const useOmnichannelPrioritiesMenu = (rid: string): ComponentProps => { +export const createAuxContext = async ( + browser: Browser, + userState: IUserState, + route = '/', + waitForMainContent = true, +): Promise<{ page: Page }> => { const page = await browser.newPage({ storageState: userState.state }); - await page.goto('/'); - await page.locator('.main-content').waitFor(); + await page.goto(route); + + if (waitForMainContent) { + await page.locator('.main-content').waitFor(); + } return { page }; }; diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts new file mode 100644 index 000000000000..b521090e7097 --- /dev/null +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities-sidebar.spec.ts @@ -0,0 +1,111 @@ +import { faker } from '@faker-js/faker'; + +import { IS_EE } from '../config/constants'; +import { createAuxContext } from '../fixtures/createAuxContext'; +import { Users } from '../fixtures/userStates'; +import { HomeChannel, OmnichannelLiveChat } from '../page-objects'; +import { OmnichannelRoomInfo } from '../page-objects/omnichannel-room-info'; +import { test, expect } from '../utils/test'; + +const NEW_USER = { + name: faker.person.firstName(), + email: faker.internet.email(), +}; + +const getPrioritySystemMessage = (username: string, priority: string) => + `Priority changed: ${username} changed the priority to ${priority}`; + +test.skip(!IS_EE, 'Omnichannel Priorities > Enterprise Only'); + +test.use({ storageState: Users.user1.state }); + +test.describe.serial('Omnichannel Priorities [Sidebar]', () => { + let poHomeChannel: HomeChannel; + let poRoomInfo: OmnichannelRoomInfo; + + test.beforeAll(async ({ api }) => { + ( + await Promise.all([ + api.post('/livechat/users/agent', { username: 'user1' }), + api.post('/livechat/users/manager', { username: 'user1' }), + api.post('/settings/Livechat_Routing_Method', { value: 'Manual_Selection' }), + ]) + ).every((res) => expect(res.status()).toBe(200)); + }); + + test.beforeEach(async ({ page }) => { + await page.goto('/'); + await page.locator('.main-content').waitFor(); + }); + + test.beforeEach(async ({ page }) => { + poHomeChannel = new HomeChannel(page); + poRoomInfo = new OmnichannelRoomInfo(page); + }); + + test.afterAll(async ({ api }) => { + ( + await Promise.all([ + api.delete('/livechat/users/agent/user1'), + api.delete('/livechat/users/manager/user1'), + api.post('/settings/Livechat_Routing_Method', { value: 'Auto_Selection' }), + ]) + ).every((res) => expect(res.status()).toBe(200)); + }); + + test('Priority updates with sidebar', async ({ browser, api }) => { + const systemMessage = poHomeChannel.content.lastSystemMessageBody; + + await test.step('Initiate conversation', async () => { + const poLivechat = await createAuxContext(browser, Users.user1, '/livechat', false).then( + ({ page }) => new OmnichannelLiveChat(page, api), + ); + await poLivechat.openLiveChat(); + await poLivechat.sendMessage(NEW_USER, false); + await poLivechat.onlineAgentMessage.type('this_a_test_message_from_visitor'); + await poLivechat.btnSendMessageToOnlineAgent.click(); + await poHomeChannel.sidenav.getSidebarItemByName(NEW_USER.name).click(); + }); + + await test.step('Queue: Sidebar priority change', async () => { + await poHomeChannel.sidenav.getSidebarItemByName(NEW_USER.name).click(); + + await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); + + await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Lowest'); + await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Lowest')}"`).waitFor(); + await expect(poRoomInfo.getLabel('Priority')).toBeVisible(); + await expect(poRoomInfo.getInfo('Lowest')).toBeVisible(); + + await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Highest'); + await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Highest')}"`).waitFor(); + await expect(poRoomInfo.getInfo('Highest')).toBeVisible(); + + await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Unprioritized'); + await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Unprioritized')}"`).waitFor(); + await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); + await expect(poRoomInfo.getInfo('Unprioritized')).not.toBeVisible(); + }); + + await test.step('Subscription: Sidebar priority change', async () => { + await poHomeChannel.content.takeOmnichannelChatButton.click(); + await systemMessage.locator('text="joined the channel"').waitFor(); + + await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); + + await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Lowest'); + await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Lowest')}"`).waitFor(); + await expect(poRoomInfo.getLabel('Priority')).toBeVisible(); + await expect(poRoomInfo.getInfo('Lowest')).toBeVisible(); + + await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Highest'); + await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Highest')}"`).waitFor(); + await expect(poRoomInfo.getInfo('Highest')).toBeVisible(); + + await poHomeChannel.sidenav.selectPriority(NEW_USER.name, 'Unprioritized'); + await systemMessage.locator(`text="${getPrioritySystemMessage('user1', 'Unprioritized')}"`).waitFor(); + await expect(poRoomInfo.getLabel('Priority')).not.toBeVisible(); + await expect(poRoomInfo.getInfo('Unprioritized')).not.toBeVisible(); + }); + }); +}); diff --git a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities.spec.ts b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities.spec.ts index cd66c7b164a4..1da1837572e5 100644 --- a/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities.spec.ts +++ b/apps/meteor/tests/e2e/omnichannel/omnichannel-priorities.spec.ts @@ -29,6 +29,7 @@ test.describe.serial('Omnichannel Priorities', () => { poOmnichannelPriorities = new OmnichannelPriorities(page); await page.goto('/omnichannel'); + await page.locator('.main-content').waitFor(); await poOmnichannelPriorities.sidenav.linkPriorities.click(); }); diff --git a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts index 3d2ddd3921d6..b24449d7b3a6 100644 --- a/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts +++ b/apps/meteor/tests/e2e/page-objects/fragments/home-sidenav.ts @@ -39,6 +39,13 @@ export class HomeSidenav { return this.page.locator(`[data-qa="sidebar-item"][aria-label="${name}"]`); } + async selectPriority(name: string, priority: string) { + const sidebarItem = this.getSidebarItemByName(name); + await sidebarItem.hover(); + await sidebarItem.locator(`[data-testid="menu"]`).click(); + await this.page.locator(`li[value="${priority}"]`).click(); + } + async openAdministrationByLabel(text: string): Promise { await this.page.locator('role=button[name="Administration"]').click(); await this.page.locator(`role=menuitem[name="${text}"]`).click(); diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-room-info.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-room-info.ts new file mode 100644 index 000000000000..5f3db0513af8 --- /dev/null +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-room-info.ts @@ -0,0 +1,17 @@ +import type { Locator, Page } from '@playwright/test'; + +export class OmnichannelRoomInfo { + private readonly page: Page; + + constructor(page: Page) { + this.page = page; + } + + getInfo(value: string): Locator { + return this.page.locator(`span >> text="${value}"`); + } + + getLabel(label: string): Locator { + return this.page.locator(`div >> text="${label}"`); + } +} From 19aec23cdae33c08cacc8c20d26dda7be4eae178 Mon Sep 17 00:00:00 2001 From: Luis Mauro <1216941+lmauromb@users.noreply.github.com> Date: Fri, 4 Aug 2023 10:54:11 -0600 Subject: [PATCH 006/408] feat: adds verification when inviting external matrixIds (#28096) --- .changeset/serious-garlics-clean.md | 7 ++ apps/meteor/app/api/server/index.ts | 1 + apps/meteor/app/api/server/v1/federation.ts | 24 ++++++ .../AddMatrixUsers/AddMatrixUsersModal.tsx | 83 +++++++++++++++++++ .../AddMatrixUsers/useAddMatrixUsers.tsx | 39 +++++++++ .../RoomMembers/AddUsers/AddUsers.tsx | 25 +++++- .../local-services/federation/service.ts | 4 + .../federation/domain/IFederationBridge.ts | 1 + .../infrastructure/matrix/Bridge.ts | 38 +++++++++ .../matrix/converters/room/RoomReceiver.ts | 4 + .../matrix/helpers/HtttpStatusCodes.ts | 58 +++++++++++++ .../matrix/helpers/MatrixIdStringTools.ts | 25 ++++++ .../helpers/MatrixIdVerificationTypes.ts | 7 ++ .../server/services/federation/service.ts | 8 ++ .../infrastructure/matrix/Bridge.spec.ts | 44 +++++++++- .../src/types/IFederationService.ts | 4 + .../FederationVerifyMatrixIdProps.ts | 22 +++++ .../rest-typings/src/v1/federation/index.ts | 1 + .../rest-typings/src/v1/federation/rooms.ts | 4 + 19 files changed, 393 insertions(+), 6 deletions(-) create mode 100644 .changeset/serious-garlics-clean.md create mode 100644 apps/meteor/app/api/server/v1/federation.ts create mode 100644 apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddMatrixUsers/AddMatrixUsersModal.tsx create mode 100644 apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddMatrixUsers/useAddMatrixUsers.tsx create mode 100644 apps/meteor/server/services/federation/infrastructure/matrix/helpers/HtttpStatusCodes.ts create mode 100644 apps/meteor/server/services/federation/infrastructure/matrix/helpers/MatrixIdStringTools.ts create mode 100644 apps/meteor/server/services/federation/infrastructure/matrix/helpers/MatrixIdVerificationTypes.ts create mode 100644 packages/rest-typings/src/v1/federation/FederationVerifyMatrixIdProps.ts diff --git a/.changeset/serious-garlics-clean.md b/.changeset/serious-garlics-clean.md new file mode 100644 index 000000000000..ccdc3c94dda4 --- /dev/null +++ b/.changeset/serious-garlics-clean.md @@ -0,0 +1,7 @@ +--- +'@rocket.chat/core-services': minor +'@rocket.chat/rest-typings': minor +'@rocket.chat/meteor': minor +--- + +New AddUser workflow for Federated Rooms diff --git a/apps/meteor/app/api/server/index.ts b/apps/meteor/app/api/server/index.ts index 699bfdacb3aa..00f1a62f1cbd 100644 --- a/apps/meteor/app/api/server/index.ts +++ b/apps/meteor/app/api/server/index.ts @@ -46,6 +46,7 @@ import './v1/voip/extensions'; import './v1/voip/queues'; import './v1/voip/omnichannel'; import './v1/voip'; +import './v1/federation'; import './v1/moderation'; export { API, APIClass, defaultRateLimiterOptions } from './api'; diff --git a/apps/meteor/app/api/server/v1/federation.ts b/apps/meteor/app/api/server/v1/federation.ts new file mode 100644 index 000000000000..02fc30763eeb --- /dev/null +++ b/apps/meteor/app/api/server/v1/federation.ts @@ -0,0 +1,24 @@ +import { Federation, FederationEE } from '@rocket.chat/core-services'; +import { isFederationVerifyMatrixIdProps } from '@rocket.chat/rest-typings'; + +import { isEnterprise } from '../../../../ee/app/license/server'; +import { API } from '../api'; + +API.v1.addRoute( + 'federation/matrixIds.verify', + { + authRequired: true, + validateParams: isFederationVerifyMatrixIdProps, + }, + { + async get() { + const { matrixIds } = this.queryParams; + + const federationService = isEnterprise() ? FederationEE : Federation; + + const results = await federationService.verifyMatrixIds(matrixIds); + + return API.v1.success({ results: Object.fromEntries(results) }); + }, + }, +); diff --git a/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddMatrixUsers/AddMatrixUsersModal.tsx b/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddMatrixUsers/AddMatrixUsersModal.tsx new file mode 100644 index 000000000000..6703b14f2507 --- /dev/null +++ b/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddMatrixUsers/AddMatrixUsersModal.tsx @@ -0,0 +1,83 @@ +import { Modal, Button, Box, Icon } from '@rocket.chat/fuselage'; +import { useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; +import type { ComponentProps, ReactElement } from 'react'; +import React from 'react'; +import { useForm } from 'react-hook-form'; + +type AddMatrixUsersModalProps = { + matrixIdVerifiedStatus: Map; + completeUserList: string[]; + onClose: () => void; + onSave: (args_0: any) => Promise; +}; + +type FormValues = { + usersToInvite: string[]; +}; + +const verificationStatusAsIcon = (verificationStatus: string) => { + if (verificationStatus === 'VERIFIED') { + return 'circle-check'; + } + + if (verificationStatus === 'UNVERIFIED') { + return 'circle-cross'; + } + + if (verificationStatus === 'UNABLE_TO_VERIFY') { + return 'circle-exclamation'; + } +}; + +const AddMatrixUsersModal = ({ onClose, matrixIdVerifiedStatus, onSave, completeUserList }: AddMatrixUsersModalProps): ReactElement => { + const dispatchToastMessage = useToastMessageDispatch(); + const usersToInvite = completeUserList.filter( + (user) => !(matrixIdVerifiedStatus.has(user) && matrixIdVerifiedStatus.get(user) === 'UNVERIFIED'), + ); + + const { handleSubmit } = useForm({ + defaultValues: { + usersToInvite, + }, + }); + + const onSubmit = (data: FormValues) => { + onSave({ users: data.usersToInvite }) + .then(onClose) + .catch((error) => dispatchToastMessage({ type: 'error', message: error as Error })); + }; + + const t = useTranslation(); + + return ( + + + + Sending Invitations + + + + + + + {[...matrixIdVerifiedStatus.entries()].map(([_matrixId, _verificationStatus]) => ( +
  • + {_matrixId}: ['name']} size='x20' /> +
  • + ))} +
    +
    +
    + + + + + + +
    + ); +}; + +export default AddMatrixUsersModal; diff --git a/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddMatrixUsers/useAddMatrixUsers.tsx b/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddMatrixUsers/useAddMatrixUsers.tsx new file mode 100644 index 000000000000..8e2ba65e02cb --- /dev/null +++ b/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddMatrixUsers/useAddMatrixUsers.tsx @@ -0,0 +1,39 @@ +import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useSetModal, useToastMessageDispatch, useEndpoint } from '@rocket.chat/ui-contexts'; +import { useMutation } from '@tanstack/react-query'; +import React from 'react'; + +import AddMatrixUsersModal from './AddMatrixUsersModal'; + +export type useAddMatrixUsersProps = { + handleSave: (args_0: any) => Promise; + users: string[]; +}; + +export const useAddMatrixUsers = () => { + const setModal = useSetModal(); + const dispatchToastMessage = useToastMessageDispatch(); + const handleClose = useMutableCallback(() => setModal(null)); + const dispatchVerifyEndpoint = useEndpoint('GET', '/v1/federation/matrixIds.verify'); + + return useMutation(async ({ users, handleSave }: useAddMatrixUsersProps) => { + try { + let matrixIdVerificationMap = new Map(); + const matrixIds = users.filter((user) => user.startsWith('@')); + const matrixIdsVerificationResponse = await dispatchVerifyEndpoint({ matrixIds }); + const { results: matrixIdsVerificationResults } = matrixIdsVerificationResponse; + matrixIdVerificationMap = new Map(Object.entries(matrixIdsVerificationResults)); + + setModal( + } + />, + ); + } catch (error) { + dispatchToastMessage({ type: 'error', message: error as Error }); + } + }); +}; diff --git a/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddUsers.tsx b/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddUsers.tsx index fc2a3a4e18ae..7a8f0d1e699a 100644 --- a/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddUsers.tsx +++ b/apps/meteor/client/views/room/contextualBar/RoomMembers/AddUsers/AddUsers.tsx @@ -19,6 +19,7 @@ import UserAutoCompleteMultiple from '../../../../../components/UserAutoComplete import UserAutoCompleteMultipleFederated from '../../../../../components/UserAutoCompleteMultiple/UserAutoCompleteMultipleFederated'; import { useRoom } from '../../../contexts/RoomContext'; import { useRoomToolbox } from '../../../contexts/RoomToolboxContext'; +import { useAddMatrixUsers } from './AddMatrixUsers/useAddMatrixUsers'; type AddUsersProps = { rid: IRoom['_id']; @@ -37,6 +38,7 @@ const AddUsers = ({ rid, onClickBack, reload }: AddUsersProps): ReactElement => const { handleSubmit, control, + getValues, formState: { isDirty }, } = useForm({ defaultValues: { users: [] } }); @@ -51,6 +53,8 @@ const AddUsers = ({ rid, onClickBack, reload }: AddUsersProps): ReactElement => } }); + const addClickHandler = useAddMatrixUsers(); + return ( <> @@ -80,9 +84,24 @@ const AddUsers = ({ rid, onClickBack, reload }: AddUsersProps): ReactElement => - + {isRoomFederated(room) ? ( + + ) : ( + + )} diff --git a/apps/meteor/ee/server/local-services/federation/service.ts b/apps/meteor/ee/server/local-services/federation/service.ts index 9635381d9236..a1272f5c8661 100644 --- a/apps/meteor/ee/server/local-services/federation/service.ts +++ b/apps/meteor/ee/server/local-services/federation/service.ts @@ -198,6 +198,10 @@ export class FederationServiceEE extends AbstractBaseFederationServiceEE impleme ); } + public async verifyMatrixIds(matrixIds: string[]): Promise> { + return super.verifyMatrixIds(matrixIds); + } + static async createFederationService(): Promise { const federationService = new FederationServiceEE(); await federationService.initialize(); diff --git a/apps/meteor/server/services/federation/domain/IFederationBridge.ts b/apps/meteor/server/services/federation/domain/IFederationBridge.ts index 59ed3b631ee9..06faada2d8e4 100644 --- a/apps/meteor/server/services/federation/domain/IFederationBridge.ts +++ b/apps/meteor/server/services/federation/domain/IFederationBridge.ts @@ -81,6 +81,7 @@ export interface IFederationBridge { getRoomTopic(externalRoomId: string, externalUserId: string): Promise; setRoomName(externalRoomId: string, externalUserId: string, roomName: string): Promise; setRoomTopic(externalRoomId: string, externalUserId: string, roomTopic: string): Promise; + verifyInviteeIds(matrixIds: string[]): Promise>; getRoomData( externalUserId: string, externalRoomId: string, diff --git a/apps/meteor/server/services/federation/infrastructure/matrix/Bridge.ts b/apps/meteor/server/services/federation/infrastructure/matrix/Bridge.ts index a9ab541afe7a..9a7e6735196d 100644 --- a/apps/meteor/server/services/federation/infrastructure/matrix/Bridge.ts +++ b/apps/meteor/server/services/federation/infrastructure/matrix/Bridge.ts @@ -16,6 +16,9 @@ import { RoomMembershipChangedEventType } from './definitions/events/RoomMembers import { MatrixEnumRelatesToRelType, MatrixEnumSendMessageType } from './definitions/events/RoomMessageSent'; import type { MatrixEventRoomNameChanged } from './definitions/events/RoomNameChanged'; import type { MatrixEventRoomTopicChanged } from './definitions/events/RoomTopicChanged'; +import { HttpStatusCodes } from './helpers/HtttpStatusCodes'; +import { extractUserIdAndHomeserverFromMatrixId } from './helpers/MatrixIdStringTools'; +import { VerificationStatus, MATRIX_USER_IN_USE } from './helpers/MatrixIdVerificationTypes'; let MatrixUserInstance: any; @@ -166,6 +169,41 @@ export class MatrixBridge implements IFederationBridge { } } + public async verifyInviteeIds(matrixIds: string[]): Promise> { + const matrixIdVerificationMap = new Map(); + const matrixIdsVerificationPromises = matrixIds.map((matrixId) => this.verifyInviteeId(matrixId)); + const matrixIdsVerificationPromiseResponse = await Promise.allSettled(matrixIdsVerificationPromises); + const matrixIdsVerificationFulfilledResults = matrixIdsVerificationPromiseResponse + .filter((result): result is PromiseFulfilledResult => result.status === 'fulfilled') + .map((result) => result.value); + + matrixIds.forEach((matrixId, idx) => matrixIdVerificationMap.set(matrixId, matrixIdsVerificationFulfilledResults[idx])); + return matrixIdVerificationMap; + } + + private async verifyInviteeId(externalInviteeId: string): Promise { + const [userId, homeserverUrl] = extractUserIdAndHomeserverFromMatrixId(externalInviteeId); + try { + const response = await fetch(`https://${homeserverUrl}/_matrix/client/v3/register/available`, { params: { username: userId } }); + + if (response.status === HttpStatusCodes.BAD_REQUEST) { + const responseBody = await response.json(); + + if (responseBody.errcode === MATRIX_USER_IN_USE) { + return VerificationStatus.VERIFIED; + } + } + + if (response.status === HttpStatusCodes.OK) { + return VerificationStatus.UNVERIFIED; + } + } catch (e) { + return VerificationStatus.UNABLE_TO_VERIFY; + } + + return VerificationStatus.UNABLE_TO_VERIFY; + } + public async createUser(username: string, name: string, domain: string, avatarUrl?: string): Promise { if (!MatrixUserInstance) { throw new Error('Error loading the Matrix User instance from the external library'); diff --git a/apps/meteor/server/services/federation/infrastructure/matrix/converters/room/RoomReceiver.ts b/apps/meteor/server/services/federation/infrastructure/matrix/converters/room/RoomReceiver.ts index a9734462ce52..b307e6e85e64 100644 --- a/apps/meteor/server/services/federation/infrastructure/matrix/converters/room/RoomReceiver.ts +++ b/apps/meteor/server/services/federation/infrastructure/matrix/converters/room/RoomReceiver.ts @@ -32,18 +32,22 @@ import type { } from '../../definitions/events/RoomPowerLevelsChanged'; import type { MatrixEventRoomTopicChanged } from '../../definitions/events/RoomTopicChanged'; +/** @deprecated export from {@link ../../helpers/MatrixIdStringTools} instead */ export const removeExternalSpecificCharsFromExternalIdentifier = (matrixIdentifier = ''): string => { return matrixIdentifier.replace('@', '').replace('!', '').replace('#', ''); }; +/** @deprecated export from {@link ../../helpers/MatrixIdStringTools} instead */ export const formatExternalUserIdToInternalUsernameFormat = (matrixUserId = ''): string => { return matrixUserId.split(':')[0]?.replace('@', ''); }; export const isAnExternalIdentifierFormat = (identifier: string): boolean => identifier.includes(':'); +/** @deprecated export from {@link ../../helpers/MatrixIdStringTools} instead */ export const isAnExternalUserIdFormat = (userId: string): boolean => isAnExternalIdentifierFormat(userId) && userId.includes('@'); +/** @deprecated export from {@link ../../helpers/MatrixIdStringTools} instead */ export const extractServerNameFromExternalIdentifier = (identifier = ''): string => { const splitted = identifier.split(':'); diff --git a/apps/meteor/server/services/federation/infrastructure/matrix/helpers/HtttpStatusCodes.ts b/apps/meteor/server/services/federation/infrastructure/matrix/helpers/HtttpStatusCodes.ts new file mode 100644 index 000000000000..012aa0d5cd08 --- /dev/null +++ b/apps/meteor/server/services/federation/infrastructure/matrix/helpers/HtttpStatusCodes.ts @@ -0,0 +1,58 @@ +export const enum HttpStatusCodes { + CONTINUE = 100, + SWITCHING_PROTOCOLS = 101, + PROCESSING = 102, + OK = 200, + CREATED = 201, + ACCEPTED = 202, + NON_AUTHORITATIVE_INFORMATION = 203, + NO_CONTENT = 204, + RESET_CONTENT = 205, + PARTIAL_CONTENT = 206, + MULTI_STATUS = 207, + MULTIPLE_CHOICES = 300, + MOVED_PERMANENTLY = 301, + MOVED_TEMPORARILY = 302, + SEE_OTHER = 303, + NOT_MODIFIED = 304, + USE_PROXY = 305, + TEMPORARY_REDIRECT = 307, + PERMANENT_REDIRECT = 308, + BAD_REQUEST = 400, + UNAUTHORIZED = 401, + PAYMENT_REQUIRED = 402, + FORBIDDEN = 403, + NOT_FOUND = 404, + METHOD_NOT_ALLOWED = 405, + NOT_ACCEPTABLE = 406, + PROXY_AUTHENTICATION_REQUIRED = 407, + REQUEST_TIMEOUT = 408, + CONFLICT = 409, + GONE = 410, + LENGTH_REQUIRED = 411, + PRECONDITION_FAILED = 412, + REQUEST_TOO_LONG = 413, + REQUEST_URI_TOO_LONG = 414, + UNSUPPORTED_MEDIA_TYPE = 415, + REQUESTED_RANGE_NOT_SATISFIABLE = 416, + EXPECTATION_FAILED = 417, + IM_A_TEAPOT = 418, + INSUFFICIENT_SPACE_ON_RESOURCE = 419, + METHOD_FAILURE = 420, + MISDIRECTED_REQUEST = 421, + UNPROCESSABLE_ENTITY = 422, + LOCKED = 423, + FAILED_DEPENDENCY = 424, + PRECONDITION_REQUIRED = 428, + TOO_MANY_REQUESTS = 429, + REQUEST_HEADER_FIELDS_TOO_LARGE = 431, + UNAVAILABLE_FOR_LEGAL_REASONS = 451, + INTERNAL_SERVER_ERROR = 500, + NOT_IMPLEMENTED = 501, + BAD_GATEWAY = 502, + SERVICE_UNAVAILABLE = 503, + GATEWAY_TIMEOUT = 504, + HTTP_VERSION_NOT_SUPPORTED = 505, + INSUFFICIENT_STORAGE = 507, + NETWORK_AUTHENTICATION_REQUIRED = 511, +} diff --git a/apps/meteor/server/services/federation/infrastructure/matrix/helpers/MatrixIdStringTools.ts b/apps/meteor/server/services/federation/infrastructure/matrix/helpers/MatrixIdStringTools.ts new file mode 100644 index 000000000000..fdd7c904d676 --- /dev/null +++ b/apps/meteor/server/services/federation/infrastructure/matrix/helpers/MatrixIdStringTools.ts @@ -0,0 +1,25 @@ +export const removeExternalSpecificCharsFromExternalIdentifier = (matrixId = ''): string => { + return matrixId.replace('@', '').replace('!', '').replace('#', ''); +}; + +export const formatExternalUserIdToInternalUsernameFormat = (matrixId = ''): string => { + return matrixId.split(':')[0]?.replace('@', ''); +}; + +export const formatExternalAliasIdToInternalFormat = (alias = ''): string => { + return alias.split(':')[0]?.replace('#', ''); +}; + +export const isAnExternalIdentifierFormat = (identifier: string): boolean => identifier.includes(':'); + +export const isAnExternalUserIdFormat = (userId: string): boolean => isAnExternalIdentifierFormat(userId) && userId.includes('@'); + +export const extractServerNameFromExternalIdentifier = (identifier = ''): string => { + const splitted = identifier.split(':'); + + return splitted.length > 1 ? splitted[1] : ''; +}; + +export const extractUserIdAndHomeserverFromMatrixId = (matrixId = ''): string[] => { + return matrixId.replace('@', '').split(':'); +}; diff --git a/apps/meteor/server/services/federation/infrastructure/matrix/helpers/MatrixIdVerificationTypes.ts b/apps/meteor/server/services/federation/infrastructure/matrix/helpers/MatrixIdVerificationTypes.ts new file mode 100644 index 000000000000..4fc48c129238 --- /dev/null +++ b/apps/meteor/server/services/federation/infrastructure/matrix/helpers/MatrixIdVerificationTypes.ts @@ -0,0 +1,7 @@ +export const enum VerificationStatus { + VERIFIED = 'VERIFIED', + UNVERIFIED = 'UNVERIFIED', + UNABLE_TO_VERIFY = 'UNABLE_TO_VERIFY', +} + +export const MATRIX_USER_IN_USE = 'M_USER_IN_USE'; diff --git a/apps/meteor/server/services/federation/service.ts b/apps/meteor/server/services/federation/service.ts index 7c37d4182ce1..be154cee4a68 100644 --- a/apps/meteor/server/services/federation/service.ts +++ b/apps/meteor/server/services/federation/service.ts @@ -230,6 +230,10 @@ export abstract class AbstractFederationService extends ServiceClassInternal { protected async cleanUpHandlers(): Promise { this.internalQueueInstance.setHandler(this.noop.bind(this), this.PROCESSING_CONCURRENCY); } + + protected async verifyMatrixIds(matrixIds: string[]): Promise> { + return this.bridge.verifyInviteeIds(matrixIds); + } } abstract class AbstractBaseFederationService extends AbstractFederationService { @@ -317,6 +321,10 @@ export class FederationService extends AbstractBaseFederationService implements ); } + public async verifyMatrixIds(matrixIds: string[]): Promise> { + return super.verifyMatrixIds(matrixIds); + } + static async createFederationService(): Promise { const federationService = new FederationService(); await federationService.initialize(); diff --git a/apps/meteor/tests/unit/server/federation/infrastructure/matrix/Bridge.spec.ts b/apps/meteor/tests/unit/server/federation/infrastructure/matrix/Bridge.spec.ts index db9ee3134f17..b1b8ebf42419 100644 --- a/apps/meteor/tests/unit/server/federation/infrastructure/matrix/Bridge.spec.ts +++ b/apps/meteor/tests/unit/server/federation/infrastructure/matrix/Bridge.spec.ts @@ -1,10 +1,14 @@ import { expect } from 'chai'; import proxyquire from 'proxyquire'; +import { VerificationStatus } from '../../../../../../server/services/federation/infrastructure/matrix/helpers/MatrixIdVerificationTypes'; + +const fetchStub = { + serverFetch: () => Promise.resolve({}), +}; + const { MatrixBridge } = proxyquire.noCallThru().load('../../../../../../server/services/federation/infrastructure/matrix/Bridge', { - 'meteor/fetch': { - '@global': true, - }, + '@rocket.chat/server-fetch': fetchStub, }); describe('Federation - Infrastructure - Matrix - Bridge', () => { @@ -49,4 +53,38 @@ describe('Federation - Infrastructure - Matrix - Bridge', () => { expect(bridge.isRoomFromTheSameHomeserver('!room:server2.com', 'server.com')).to.be.false; }); }); + + describe('#verifyInviteeId()', () => { + it('should return `VERIFIED` when the matrixId exists', async () => { + fetchStub.serverFetch = () => Promise.resolve({ status: 400, json: () => Promise.resolve({ errcode: 'M_USER_IN_USE' }) }); + + const verificationStatus = await bridge.verifyInviteeId('@user:server.com'); + + expect(verificationStatus).to.be.equal(VerificationStatus.VERIFIED); + }); + + it('should return `UNVERIFIED` when the matrixId does not exists', async () => { + fetchStub.serverFetch = () => Promise.resolve({ status: 200, json: () => Promise.resolve({}) }); + + const verificationStatus = await bridge.verifyInviteeId('@user:server.com'); + + expect(verificationStatus).to.be.equal(VerificationStatus.UNVERIFIED); + }); + + it('should return `UNABLE_TO_VERIFY` when the fetch() call fails', async () => { + fetchStub.serverFetch = () => Promise.reject(new Error('Error')); + + const verificationStatus = await bridge.verifyInviteeId('@user:server.com'); + + expect(verificationStatus).to.be.equal(VerificationStatus.UNABLE_TO_VERIFY); + }); + + it('should return `UNABLE_TO_VERIFY` when an unexepected status comes', async () => { + fetchStub.serverFetch = () => Promise.resolve({ status: 500 }); + + const verificationStatus = await bridge.verifyInviteeId('@user:server.com'); + + expect(verificationStatus).to.be.equal(VerificationStatus.UNABLE_TO_VERIFY); + }); + }); }); diff --git a/packages/core-services/src/types/IFederationService.ts b/packages/core-services/src/types/IFederationService.ts index 89dc2ae7383d..a30b03717822 100644 --- a/packages/core-services/src/types/IFederationService.ts +++ b/packages/core-services/src/types/IFederationService.ts @@ -2,6 +2,8 @@ import type { FederationPaginatedResult, IFederationPublicRooms } from '@rocket. export interface IFederationService { createDirectMessageRoomAndInviteUser(internalInviterId: string, internalRoomId: string, externalInviteeId: string): Promise; + + verifyMatrixIds(matrixIds: string[]): Promise>; } export interface IFederationJoinExternalPublicRoomInput { @@ -34,4 +36,6 @@ export interface IFederationServiceEE { scheduleJoinExternalPublicRoom(internalUserId: string, externalRoomId: string, roomName?: string, pageToken?: string): Promise; joinExternalPublicRoom(input: IFederationJoinExternalPublicRoomInput): Promise; + + verifyMatrixIds(matrixIds: string[]): Promise>; } diff --git a/packages/rest-typings/src/v1/federation/FederationVerifyMatrixIdProps.ts b/packages/rest-typings/src/v1/federation/FederationVerifyMatrixIdProps.ts new file mode 100644 index 000000000000..a63d37da07ba --- /dev/null +++ b/packages/rest-typings/src/v1/federation/FederationVerifyMatrixIdProps.ts @@ -0,0 +1,22 @@ +import Ajv from 'ajv'; + +const ajv = new Ajv(); + +export type FederationVerifyMatrixIdProps = { + matrixIds: string[]; +}; + +const FederationVerifyMatrixIdPropsSchema = { + type: 'object', + properties: { + matrixIds: { + type: 'array', + items: [{ type: 'string' }], + uniqueItems: true, + }, + }, + additionalProperties: false, + required: ['matrixIds'], +}; + +export const isFederationVerifyMatrixIdProps = ajv.compile(FederationVerifyMatrixIdPropsSchema); diff --git a/packages/rest-typings/src/v1/federation/index.ts b/packages/rest-typings/src/v1/federation/index.ts index 05a1503098ef..36a883c9d847 100644 --- a/packages/rest-typings/src/v1/federation/index.ts +++ b/packages/rest-typings/src/v1/federation/index.ts @@ -15,3 +15,4 @@ export * from './FederationJoinExternalPublicRoomProps'; export * from './FederationPublicRoomsProps'; export * from './FederationAddServerProps'; export * from './FederationRemoveServerProps'; +export * from './FederationVerifyMatrixIdProps'; diff --git a/packages/rest-typings/src/v1/federation/rooms.ts b/packages/rest-typings/src/v1/federation/rooms.ts index 2d3786a0757c..ce467990aacf 100644 --- a/packages/rest-typings/src/v1/federation/rooms.ts +++ b/packages/rest-typings/src/v1/federation/rooms.ts @@ -1,6 +1,7 @@ import type { FederationAddServerProps, FederationPaginatedResult, FederationRemoveServerProps } from '.'; import type { FederationJoinExternalPublicRoomProps } from './FederationJoinExternalPublicRoomProps'; import type { FederationSearchPublicRoomsProps } from './FederationPublicRoomsProps'; +import type { FederationVerifyMatrixIdProps } from './FederationVerifyMatrixIdProps'; export interface IFederationPublicRooms { id: string; @@ -30,4 +31,7 @@ export type FederationEndpoints = { '/v1/federation/removeServerByUser': { POST: (params: FederationRemoveServerProps) => void; }; + '/v1/federation/matrixIds.verify': { + GET: (params: FederationVerifyMatrixIdProps) => { results: Map }; + }; }; From 7a4fdf41f844239487f1388986d7e41ec901e33f Mon Sep 17 00:00:00 2001 From: Allan RIbeiro <35040806+AllanPazRibeiro@users.noreply.github.com> Date: Fri, 4 Aug 2023 16:01:01 -0300 Subject: [PATCH 007/408] fix: verifying if both app and environment is enterprise to enable (#29683) --- .changeset/small-rice-repair.md | 5 ++ .../client/views/marketplace/AppMenu.js | 73 +++++++++++-------- apps/meteor/ee/client/apps/orchestrator.ts | 10 --- .../ee/server/apps/communication/rest.ts | 42 ++++++++--- .../server/apps/marketplace/appEnableCheck.ts | 42 +++++++++++ .../ee/server/apps/marketplace/appInfo.ts | 28 +++++++ apps/meteor/package.json | 2 +- yarn.lock | 20 ++++- 8 files changed, 169 insertions(+), 53 deletions(-) create mode 100644 .changeset/small-rice-repair.md create mode 100644 apps/meteor/ee/server/apps/marketplace/appEnableCheck.ts create mode 100644 apps/meteor/ee/server/apps/marketplace/appInfo.ts diff --git a/.changeset/small-rice-repair.md b/.changeset/small-rice-repair.md new file mode 100644 index 000000000000..67fdff5ca758 --- /dev/null +++ b/.changeset/small-rice-repair.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fix validation in app status call that allowed Enterprise apps to be enabled in invalid environments diff --git a/apps/meteor/client/views/marketplace/AppMenu.js b/apps/meteor/client/views/marketplace/AppMenu.js index d6c2fe0c9875..5c5d373ac9dc 100644 --- a/apps/meteor/client/views/marketplace/AppMenu.js +++ b/apps/meteor/client/views/marketplace/AppMenu.js @@ -12,6 +12,7 @@ import React, { useMemo, useCallback, useState } from 'react'; import semver from 'semver'; import WarningModal from '../../components/WarningModal'; +import { useIsEnterprise } from '../../hooks/useIsEnterprise'; import IframeModal from './IframeModal'; import UninstallGrandfatheredAppModal from './components/UninstallGrandfatheredAppModal/UninstallGrandfatheredAppModal'; import { appEnabledStatuses, appButtonProps } from './helpers'; @@ -36,6 +37,9 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { const buildExternalUrl = useEndpoint('GET', '/apps'); const syncApp = useEndpoint('POST', `/apps/${app.id}/sync`); const uninstallApp = useEndpoint('DELETE', `/apps/${app.id}`); + const { data } = useIsEnterprise(); + + const isEnterpriseLicense = !!data?.isEnterprise; const [loading, setLoading] = useState(false); const [requestedEndUser, setRequestedEndUser] = useState(app.requestedEndUser); @@ -290,20 +294,26 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { }; const nonInstalledAppOptions = { - ...(!app.installed && { - acquire: { - label: ( - <> - {isAdminUser && } - {t(button.label.replace(' ', '_'))} - - ), - action: handleAcquireApp, - disabled: requestedEndUser, - }, - }), + ...(!app.installed && + button && { + acquire: { + label: ( + <> + {isAdminUser && } + {t(button.label.replace(' ', '_'))} + + ), + action: handleAcquireApp, + disabled: requestedEndUser, + }, + }), }; + const isEnterpriseOrNot = (app.isEnterpriseOnly && isEnterpriseLicense) || !app.isEnterpriseOnly; + const isPossibleToEnableApp = app.installed && isAdminUser && !isAppEnabled && isEnterpriseOrNot; + const doesItReachedTheLimit = + !app.migrated && !appCountQuery?.data?.hasUnlimitedApps && appCountQuery?.data?.enabled >= appCountQuery?.data?.limit; + const installedAppOptions = { ...(context !== 'details' && isAdminUser && @@ -344,20 +354,18 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { action: handleDisable, }, }), - ...(app.installed && - isAdminUser && - !isAppEnabled && { - enable: { - label: ( - <> - - {t('Enable')} - - ), - disabled: !app.migrated && !appCountQuery?.data?.hasUnlimitedApps && appCountQuery?.data?.enabled >= appCountQuery?.data?.limit, - action: handleEnable, - }, - }), + ...(isPossibleToEnableApp && { + enable: { + label: ( + <> + + {t('Enable')} + + ), + disabled: doesItReachedTheLimit, + action: handleEnable, + }, + }), ...(app.installed && isAdminUser && { divider: { @@ -391,19 +399,20 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { app, t, handleSubscription, - requestedEndUser, - button?.label, + button, handleAcquireApp, + requestedEndUser, + isEnterpriseLicense, + isAppEnabled, + appCountQuery?.data?.hasUnlimitedApps, + appCountQuery?.data?.enabled, + appCountQuery?.data?.limit, context, handleViewLogs, canUpdate, isAppDetailsPage, handleUpdate, - isAppEnabled, handleDisable, - appCountQuery?.data?.hasUnlimitedApps, - appCountQuery?.data?.enabled, - appCountQuery?.data?.limit, handleEnable, handleUninstall, ]); diff --git a/apps/meteor/ee/client/apps/orchestrator.ts b/apps/meteor/ee/client/apps/orchestrator.ts index 41efc3e6ed09..eb37890680bd 100644 --- a/apps/meteor/ee/client/apps/orchestrator.ts +++ b/apps/meteor/ee/client/apps/orchestrator.ts @@ -1,5 +1,4 @@ import { AppClientManager } from '@rocket.chat/apps-engine/client/AppClientManager'; -import { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; import type { IApiEndpointMetadata } from '@rocket.chat/apps-engine/definition/api'; import type { IPermission } from '@rocket.chat/apps-engine/definition/permissions/IPermission'; import type { ISetting } from '@rocket.chat/apps-engine/definition/settings'; @@ -171,15 +170,6 @@ class AppClientOrchestrator { throw new Error('App not found'); } - public async setAppStatus(appId: string, status: AppStatus): Promise { - const { status: effectiveStatus } = await sdk.rest.post(`/apps/${appId}/status`, { status }); - return effectiveStatus; - } - - public disableApp(appId: string): Promise { - return this.setAppStatus(appId, AppStatus.MANUALLY_ENABLED); - } - public async buildExternalUrl(appId: string, purchaseType: 'buy' | 'subscription' = 'buy', details = false): Promise { const result = await sdk.rest.get('/apps/buildExternalUrl', { appId, diff --git a/apps/meteor/ee/server/apps/communication/rest.ts b/apps/meteor/ee/server/apps/communication/rest.ts index 80f15652543b..3bbd89be89f3 100644 --- a/apps/meteor/ee/server/apps/communication/rest.ts +++ b/apps/meteor/ee/server/apps/communication/rest.ts @@ -1,6 +1,7 @@ import { AppStatus, AppStatusUtils } from '@rocket.chat/apps-engine/definition/AppStatus'; import type { IAppInfo } from '@rocket.chat/apps-engine/definition/metadata'; import type { AppManager } from '@rocket.chat/apps-engine/server/AppManager'; +import { AppInstallationSource } from '@rocket.chat/apps-engine/server/storage'; import type { IUser, IMessage } from '@rocket.chat/core-typings'; import { Settings, Users } from '@rocket.chat/models'; import { serverFetch as fetch } from '@rocket.chat/server-fetch'; @@ -16,8 +17,9 @@ import { settings } from '../../../../app/settings/server'; import { Info } from '../../../../app/utils/rocketchat.info'; import { i18n } from '../../../../server/lib/i18n'; import { sendMessagesToAdmins } from '../../../../server/lib/sendMessagesToAdmins'; -import { canEnableApp } from '../../../app/license/server/license'; +import { canEnableApp, isEnterprise } from '../../../app/license/server/license'; import { formatAppInstanceForRest } from '../../../lib/misc/formatAppInstanceForRest'; +import { appEnableCheck } from '../marketplace/appEnableCheck'; import { notifyAppInstall } from '../marketplace/appInstall'; import type { AppServerOrchestrator } from '../orchestrator'; import { Apps } from '../orchestrator'; @@ -1120,24 +1122,46 @@ export class AppsRestApi { return API.v1.notFound(`No App found by the id of: ${this.urlParams.id}`); }, async post() { - if (!this.bodyParams.status || typeof this.bodyParams.status !== 'string') { + const { id: appId } = this.urlParams; + const { status } = this.bodyParams; + + if (!status || typeof status !== 'string') { return API.v1.failure('Invalid status provided, it must be "status" field and a string.'); } - const prl = manager.getOneById(this.urlParams.id); - + const prl = manager.getOneById(appId); if (!prl) { - return API.v1.notFound(`No App found by the id of: ${this.urlParams.id}`); + return API.v1.notFound(`No App found by the id of: ${appId}`); } - if (AppStatusUtils.isEnabled(this.bodyParams.status)) { - if (!(await canEnableApp(prl.getStorageItem()))) { - return API.v1.failure('Enabled apps have been maxed out'); + const storedApp = prl.getStorageItem(); + const { installationSource, marketplaceInfo } = storedApp; + + if (!isEnterprise() && installationSource === AppInstallationSource.MARKETPLACE) { + try { + const baseUrl = orchestrator.getMarketplaceUrl() as string; + const headers = getDefaultHeaders(); + const { version } = prl.getInfo(); + + await appEnableCheck({ + baseUrl, + headers, + appId, + version, + marketplaceInfo, + status, + logger: orchestrator.getRocketChatLogger(), + }); + } catch (error: any) { + return API.v1.failure(error.message); } } - const result = await manager.changeStatus(prl.getID(), this.bodyParams.status); + if (AppStatusUtils.isEnabled(status) && !(await canEnableApp(storedApp))) { + return API.v1.failure('Enabled apps have been maxed out'); + } + const result = await manager.changeStatus(prl.getID(), status); return API.v1.success({ status: result.getStatus() }); }, }, diff --git a/apps/meteor/ee/server/apps/marketplace/appEnableCheck.ts b/apps/meteor/ee/server/apps/marketplace/appEnableCheck.ts new file mode 100644 index 000000000000..3f1c0a9ae735 --- /dev/null +++ b/apps/meteor/ee/server/apps/marketplace/appEnableCheck.ts @@ -0,0 +1,42 @@ +import { AppStatus } from '@rocket.chat/apps-engine/definition/AppStatus'; +import type { IMarketplaceInfo } from '@rocket.chat/apps-engine/server/marketplace'; + +import type { Logger } from '../../../../server/lib/logger/Logger'; +import { getMarketplaceAppInfo } from './appInfo'; + +export const appEnableCheck = async ({ + baseUrl, + headers, + appId, + version, + logger, + status, + marketplaceInfo, +}: { + baseUrl: string; + headers: Record; + appId: string; + version: string; + logger: Logger; + status: AppStatus; + marketplaceInfo?: IMarketplaceInfo; +}) => { + let isAppEnterpriseOnly = false; + + if (marketplaceInfo?.isEnterpriseOnly !== undefined) { + isAppEnterpriseOnly = marketplaceInfo.isEnterpriseOnly; + } else { + try { + const { isEnterpriseOnly } = await getMarketplaceAppInfo({ baseUrl, headers, appId, version }); + + isAppEnterpriseOnly = !!isEnterpriseOnly; + } catch (error: any) { + logger.error('Error getting the app info from the Marketplace:', error.message); + throw new Error(error.message); + } + } + + if (![AppStatus.DISABLED, AppStatus.MANUALLY_DISABLED].includes(status) && isAppEnterpriseOnly) { + throw new Error('Invalid environment for enabling enterprise app'); + } +}; diff --git a/apps/meteor/ee/server/apps/marketplace/appInfo.ts b/apps/meteor/ee/server/apps/marketplace/appInfo.ts new file mode 100644 index 000000000000..d2cc23ee9dcf --- /dev/null +++ b/apps/meteor/ee/server/apps/marketplace/appInfo.ts @@ -0,0 +1,28 @@ +import type { IMarketplaceInfo } from '@rocket.chat/apps-engine/server/marketplace'; +import { serverFetch as fetch } from '@rocket.chat/server-fetch'; + +export const getMarketplaceAppInfo = async ({ + baseUrl, + headers, + appId, + version, +}: { + baseUrl: string; + headers: Record; + appId: string; + version: string; +}): Promise => { + const appInfosURL = new URL(`${baseUrl}/v1/apps/${appId}`); + appInfosURL.searchParams.set('appVersion', String(version)); + const appInfoResponse = await fetch(appInfosURL.toString(), { + headers, + }); + + if (!appInfoResponse.ok) { + const result = await appInfoResponse.json(); + throw new Error(result?.error || 'Error fetching app information from the Marketplace.'); + } + + const [data] = await appInfoResponse.json(); + return data; +}; diff --git a/apps/meteor/package.json b/apps/meteor/package.json index add640a8fb13..bf2b6fe1427f 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -222,7 +222,7 @@ "@rocket.chat/account-utils": "workspace:^", "@rocket.chat/agenda": "workspace:^", "@rocket.chat/api-client": "workspace:^", - "@rocket.chat/apps-engine": "1.40.0", + "@rocket.chat/apps-engine": "1.41.0-alpha.295", "@rocket.chat/base64": "workspace:^", "@rocket.chat/cas-validate": "workspace:^", "@rocket.chat/core-services": "workspace:^", diff --git a/yarn.lock b/yarn.lock index a4505da7c419..3d16a196ad67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7154,6 +7154,24 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/apps-engine@npm:1.41.0-alpha.295": + version: 1.41.0-alpha.295 + resolution: "@rocket.chat/apps-engine@npm:1.41.0-alpha.295" + dependencies: + adm-zip: ^0.5.9 + cryptiles: ^4.1.3 + jose: ^4.11.1 + lodash.clonedeep: ^4.5.0 + semver: ^5.7.1 + stack-trace: 0.0.10 + uuid: ^3.4.0 + vm2: ^3.9.19 + peerDependencies: + "@rocket.chat/ui-kit": "*" + checksum: 14a7deb978460c5e615fa0103001ebee04b9db0823b4c8bbe1447ee94195233e8cfbb09ef42405249a978a2418f38ce2f55a546138735a69e2ecafc36a866ea7 + languageName: node + linkType: hard + "@rocket.chat/authorization-service@workspace:ee/apps/authorization-service": version: 0.0.0-use.local resolution: "@rocket.chat/authorization-service@workspace:ee/apps/authorization-service" @@ -7880,7 +7898,7 @@ __metadata: "@rocket.chat/account-utils": "workspace:^" "@rocket.chat/agenda": "workspace:^" "@rocket.chat/api-client": "workspace:^" - "@rocket.chat/apps-engine": 1.40.0 + "@rocket.chat/apps-engine": 1.41.0-alpha.295 "@rocket.chat/base64": "workspace:^" "@rocket.chat/cas-validate": "workspace:^" "@rocket.chat/core-services": "workspace:^" From 6fa30ddcd183d2d575ab0b81007c64aa72169713 Mon Sep 17 00:00:00 2001 From: Rafael Tapia Date: Fri, 4 Aug 2023 16:49:56 -0300 Subject: [PATCH 008/408] fix: check if 2FA is enabled to allow TOTP reset (#29723) --- .changeset/cuddly-houses-tie.md | 5 +++++ apps/meteor/app/api/server/v1/users.ts | 4 ++++ .../client/views/admin/users/hooks/useResetTOTPAction.tsx | 5 +++-- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100644 .changeset/cuddly-houses-tie.md diff --git a/.changeset/cuddly-houses-tie.md b/.changeset/cuddly-houses-tie.md new file mode 100644 index 000000000000..76d86a690388 --- /dev/null +++ b/.changeset/cuddly-houses-tie.md @@ -0,0 +1,5 @@ +--- +"@rocket.chat/meteor": patch +--- + +Hide Reset TOTP option if 2FA is disabled diff --git a/apps/meteor/app/api/server/v1/users.ts b/apps/meteor/app/api/server/v1/users.ts index 01c54e59b661..a4e3f974ac65 100644 --- a/apps/meteor/app/api/server/v1/users.ts +++ b/apps/meteor/app/api/server/v1/users.ts @@ -1034,6 +1034,10 @@ API.v1.addRoute( throw new Meteor.Error('error-not-allowed', 'Not allowed'); } + if (!settings.get('Accounts_TwoFactorAuthentication_Enabled')) { + throw new Meteor.Error('error-two-factor-not-enabled', 'Two factor authentication is not enabled'); + } + const user = await getUserFromParams(this.bodyParams); if (!user) { throw new Meteor.Error('error-invalid-user-id', 'Invalid user id'); diff --git a/apps/meteor/client/views/admin/users/hooks/useResetTOTPAction.tsx b/apps/meteor/client/views/admin/users/hooks/useResetTOTPAction.tsx index c00121f76bd2..1af5f628f959 100644 --- a/apps/meteor/client/views/admin/users/hooks/useResetTOTPAction.tsx +++ b/apps/meteor/client/views/admin/users/hooks/useResetTOTPAction.tsx @@ -1,5 +1,5 @@ import type { IUser } from '@rocket.chat/core-typings'; -import { useSetModal, usePermission, useEndpoint, useTranslation, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; +import { useSetModal, usePermission, useSetting, useEndpoint, useTranslation, useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import React, { useCallback } from 'react'; import GenericModal from '../../../../components/GenericModal'; @@ -10,6 +10,7 @@ export const useResetTOTPAction = (userId: IUser['_id']): Action | undefined => const setModal = useSetModal(); const dispatchToastMessage = useToastMessageDispatch(); const canResetTOTP = usePermission('edit-other-user-totp'); + const twoFactorEnabled = useSetting('Accounts_TwoFactorAuthentication_Enabled'); const resetTOTPRequest = useEndpoint('POST', '/v1/users.resetTOTP'); const resetTOTP = useCallback(async () => { @@ -31,7 +32,7 @@ export const useResetTOTPAction = (userId: IUser['_id']): Action | undefined => ); }, [resetTOTP, t, setModal]); - return canResetTOTP + return canResetTOTP && twoFactorEnabled ? { icon: 'key', label: t('Reset_TOTP'), From 8d67f09b8cd98d624e6c5b4a382a5459c0b9436e Mon Sep 17 00:00:00 2001 From: Tasso Evangelista Date: Fri, 4 Aug 2023 17:36:04 -0300 Subject: [PATCH 009/408] chore(livechat): Build configuration (#30019) Co-authored-by: Martin Schoeler --- packages/livechat/.storybook/logo.svg | 69 ++++- packages/livechat/.storybook/main.js | 52 +++- .../livechat/.storybook/preview-head.html | 6 - .../livechat/.storybook/webpack.config.js | 42 --- packages/livechat/LICENSE | 2 +- packages/livechat/package.json | 12 +- packages/livechat/src/assets/favicon.ico | Bin 7785 -> 4286 bytes .../livechat/src/components/Form/index.js | 9 +- .../livechat/src/components/Form/styles.scss | 3 - ...nent-loader.js => svg-component-loader.ts} | 8 +- packages/livechat/tsconfig.json | 1 + packages/livechat/tsconfig.webpack.json | 13 + packages/livechat/webpack.config.js | 228 ---------------- packages/livechat/webpack.config.ts | 200 ++++++++++++++ yarn.lock | 251 +++++++++++++----- 15 files changed, 540 insertions(+), 356 deletions(-) delete mode 100644 packages/livechat/.storybook/preview-head.html delete mode 100644 packages/livechat/.storybook/webpack.config.js delete mode 100644 packages/livechat/src/components/Form/styles.scss rename packages/livechat/{svg-component-loader.js => svg-component-loader.ts} (73%) create mode 100644 packages/livechat/tsconfig.webpack.json delete mode 100644 packages/livechat/webpack.config.js create mode 100644 packages/livechat/webpack.config.ts diff --git a/packages/livechat/.storybook/logo.svg b/packages/livechat/.storybook/logo.svg index db01bc208747..9f732657872d 100644 --- a/packages/livechat/.storybook/logo.svg +++ b/packages/livechat/.storybook/logo.svg @@ -1 +1,68 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + diff --git a/packages/livechat/.storybook/main.js b/packages/livechat/.storybook/main.js index bae78807f8b4..bcdef3ca5695 100644 --- a/packages/livechat/.storybook/main.js +++ b/packages/livechat/.storybook/main.js @@ -1,4 +1,6 @@ -module.exports = { +/** @type {import('@storybook/core-common').StorybookConfig} */ +const config = { + stories: ['../src/**/{*.story,story,*.stories,stories}.{js,tsx}'], addons: [ { name: '@storybook/addon-essentials', @@ -8,5 +10,51 @@ module.exports = { }, '@storybook/addon-postcss', ], - stories: ['../src/**/stories.{js,tsx}', '../src/**/story.{js,tsx}', '../src/**/*.stories.{js,tsx}', '../src/**/*.story.{js,tsx}'], + core: { + builder: 'webpack4', + }, + webpackFinal: async (config) => { + config.resolve.alias = { + ...config.resolve.alias, + 'react': 'preact/compat', + 'react-dom/test-utils': 'preact/test-utils', + 'react-dom': 'preact/compat', + 'react/jsx-runtime': 'preact/jsx-runtime', + [require.resolve('../src/lib/uiKit')]: require.resolve('./mocks/uiKit'), + }; + + config.module.rules = config.module.rules.filter(({ loader }) => !/json-loader/.test(loader)); + + const fileLoader = config.module.rules.find(({ loader }) => /file-loader/.test(loader)); + fileLoader.test = /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf|mp3|mp4)(\?.*)?$/; + + const urlLoader = config.module.rules.find(({ loader }) => /url-loader/.test(loader)); + urlLoader.test = /\.(webm|wav|m4a|aac|oga)(\?.*)?$/; + + config.module.rules.push({ + test: /\.scss$/, + use: [ + 'style-loader', + { + loader: 'css-loader', + options: { + sourceMap: true, + modules: true, + importLoaders: 1, + }, + }, + 'sass-loader', + ], + }); + + config.module.rules.push({ + test: /\.svg$/, + exclude: [__dirname], + use: ['desvg-loader/preact', 'svg-loader'], + }); + + return config; + }, }; + +module.exports = config; diff --git a/packages/livechat/.storybook/preview-head.html b/packages/livechat/.storybook/preview-head.html deleted file mode 100644 index 8a8e16adbd7b..000000000000 --- a/packages/livechat/.storybook/preview-head.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/packages/livechat/.storybook/webpack.config.js b/packages/livechat/.storybook/webpack.config.js deleted file mode 100644 index bc3cb22f7126..000000000000 --- a/packages/livechat/.storybook/webpack.config.js +++ /dev/null @@ -1,42 +0,0 @@ -module.exports = ({ config }) => { - config.resolve.alias = { - ...config.resolve.alias, - 'react': 'preact/compat', - 'react-dom/test-utils': 'preact/test-utils', - 'react-dom': 'preact/compat', - 'react/jsx-runtime': 'preact/jsx-runtime', - [require.resolve('../src/lib/uiKit')]: require.resolve('./mocks/uiKit'), - }; - - config.module.rules = config.module.rules.filter(({ loader }) => !/json-loader/.test(loader)); - - const fileLoader = config.module.rules.find(({ loader }) => /file-loader/.test(loader)); - fileLoader.test = /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani|pdf|mp3|mp4)(\?.*)?$/; - - const urlLoader = config.module.rules.find(({ loader }) => /url-loader/.test(loader)); - urlLoader.test = /\.(webm|wav|m4a|aac|oga)(\?.*)?$/; - - config.module.rules.push({ - test: /\.scss$/, - use: [ - 'style-loader', - { - loader: 'css-loader', - options: { - sourceMap: true, - modules: true, - importLoaders: 1, - }, - }, - 'sass-loader', - ], - }); - - config.module.rules.push({ - test: /\.svg$/, - exclude: [__dirname], - use: ['desvg-loader/preact', 'svg-loader'], - }); - - return config; -}; diff --git a/packages/livechat/LICENSE b/packages/livechat/LICENSE index c13d939669a1..28af00f723cc 100644 --- a/packages/livechat/LICENSE +++ b/packages/livechat/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018 Rocket.Chat +Copyright (c) 2023 Rocket.Chat Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/packages/livechat/package.json b/packages/livechat/package.json index ddd57bd15ced..9642e6b2b31c 100644 --- a/packages/livechat/package.json +++ b/packages/livechat/package.json @@ -13,9 +13,9 @@ }, "scripts": { "clean": "rimraf dist", - "build": "webpack-cli --mode production", + "build": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack-cli --mode production", "dev": "yarn build", - "start": "webpack-dev-server --mode development", + "start": "cross-env TS_NODE_PROJECT=\"tsconfig.webpack.json\" webpack-dev-server --mode development", "lint": "run-s eslint stylelint", "eslint": "eslint --ext .js,.jsx,.ts,.tsx .", "stylelint": "stylelint 'src/**/*.scss'", @@ -36,6 +36,11 @@ "@storybook/addon-postcss": "~2.0.0", "@storybook/preact": "~6.5.16", "@storybook/theming": "~6.5.16", + "@types/crypto-js": "~4.1.1", + "@types/mini-css-extract-plugin": "~1.4.3", + "@types/terser-webpack-plugin": "~4.2.2", + "@types/webpack": "~4.41.33", + "@types/webpack-dev-server": "~4.7.2", "@types/whatwg-fetch": "~0.0.33", "@typescript-eslint/eslint-plugin": "~5.60.1", "@typescript-eslint/parser": "~5.60.1", @@ -56,7 +61,7 @@ "if-env": "^1.0.4", "image-webpack-loader": "~8.1.0", "lorem-ipsum": "^2.0.8", - "mini-css-extract-plugin": "^0.11.3", + "mini-css-extract-plugin": "~1.6.2", "npm-run-all": "^4.1.5", "postcss-css-variables": "^0.17.0", "postcss-dir-pseudo-class": "^5.0.0", @@ -75,6 +80,7 @@ "stylelint": "^14.9.1", "stylelint-order": "^5.0.0", "svg-loader": "^0.0.2", + "terser-webpack-plugin": "~4.2.3", "typescript": "~5.1.6", "url-loader": "^4.1.1", "webpack": "~4.46.0", diff --git a/packages/livechat/src/assets/favicon.ico b/packages/livechat/src/assets/favicon.ico index 9e5bd34f07d4be9f4710175d47fba6a3a7d52b80..79ce5a476945a251143571110cddefac913bceb9 100644 GIT binary patch literal 4286 zcmeHLZBtcM6h8igKKa?1zVykzAld6^M(LD*fT@6Df`Fxo&KQ(vg&Dq8;tOb|BTWcn zuUO+GnuSw>C5oarYKRF5cHUo}*0Yb7D>CT0w_%!T?z*$jJ!jv&*IN5o&syuu)wBun znKVh`RXgyArcKl|?J*fLrKQQ>yb}5C(aGTmCo~NyNg|)j+b!1KrN5#CFAMvo*41DIMcwkbr#wMC&y0S5AJq!qMzW2~1=dY=>lzql+{&PCESKH|OBRS5PI#djJ))wJn z6!AQu_gVnPqGXN%V)ACOiK~|rC(IWO4sxH-@kV}f`+F|>c)QG0K9Ea8x1-~5{fdv` zECY*QGSDeJNLHw4MV_g0iE)c6T+0~l-4-Vh`OqOXp!>X!K#t;zTjziCarU$~%=atZ zK2HDS!8GEQzW&@rmguT_-GXJt=O1*ptHxG7pFAo7y(>Te;9=f$9n0n#xY-+^=Yo${ zUp7!6InvqgWALv)$MZF<4i#f4-ldWnuZ7*M7f;c29uEe`~we%ptjySO1(~s4K zrs_G364#a{SM_OPOU|;^<)=&C6T7Tk+|N3cj9lsp^NW30^%?dW8I0xZDdAv!B|fvo z9_Q$5fpBKsatrJk$-Xae-zMoL!#yr$TQJCbUYGu6_weW$Q ktxovFemjsLhZD7X|N2;+zkfdUoI>FLf z5|7XKpLou>&brQZogd%#eO@;J0KDt}H6VZoV9W&oFx~BA4fM1q$=Jy5wv;;B5TpNY z{~IJkcZ;=exeEZm#ij#MefDa0FON7Yee$&bE77=Atd5wE!`~7eV^v8eh+~8bgH(Y~ zdAT7!%`T4+L^XB>nqYGoZ*y4;qlkH{sro}x#XHb7*nxd6xJ~XLPrkOBE?}c=NoEhL zh`PQ{_M1v#N$z|;SbuBmJ&hU(Z{+{mL|5^J9~7v=c=`HlUcVvC67`w*f{y;kzbhd! z^5ND!HSP3!Q51Wit4_4`sKKcDXhxA0vYr0tCu$q^pQjTJr-TwGMabW=IrmcAs;U0o7mZ^HLPJf$}uqQ$2+lbSvupeUZg zO~-56du4aqs+-M{$?`Wa;p-4nHKQkUW6*O zBw)emLsm7A@o{|J=-W&Qp~tj835$A-e~=!|hbP;chSb0QHEkDHL;L2QdyGNxQVyGj zUCc{5fov<{(3Z$uzjfwSW=@`{dX)(d=cukWOAWW8xfK$lV2nLPWw4VY{M+!3OUw zhJULsj^1En17MY#zZ1q+3{=CF(aTQoUo`Y5(|32RBeZcw76Kk@mi=t zl%hCPROTSl*=vHK%aOZOWUmtFyC;|9Sm1aq(jlhl1xVE`5|Y23qO~UhJcbxU3NR4u zG%ChTA4Bq&K7R?QGLY@jXb#5{QUc2i*_HmG&P%4EA}kaal#*r2Q;9{p8*jCopW{i< zb-eZ$&xjSWz*Pv_?el>(;YDcpiEW-}Hcz%t>kO<&r=APM<|!hQBqK$sBgl+TTpJy8 z_GkdLyO2Z88w&s}E6e56zIXecXVNGfvc0{t*by(TmK#AqlP8>guhj%o4*Mi*u?YKB z;8SbvBEq}_#i_=B3xdr-s|8o-Hfj8eMEsziyy{p|#%?~N1xDW$ zYK4I2xF+5KMB^!p@}{sTk}8VU$jsg&X`)k@=BeQz!%0V>@Ev(qNITe-WcFqr(w=HX zCM$XKG*kAeF(ju)W;oj>IFt1wyqOGPO_I&AdaCf{v^~6>avG3TL@%_Ahs^>`8vP+Z zZhy>eR52Jg2oL}F4*GVHEI~R^#m#(lha!1R>bJE9*B?h=x~B}`!6zV?wzyB0IgAbY zIjORLVzFb3M7u1v+urbDqL53ZD2lRl%bm`PZm^Szz~{U@D~dkN5IFYbfQj43@3PQMr^-<#lDN8I}s6Eoxk#ivyXn+Z>Lpx;x3TL|1jOn1stHe z&UjCpYMEG&GlPgunKjxjOReO95TU7~00z{PWnHgbh=un-x?W=rD}w_w$OQNaKqqf5 zLb2xrxJ7i(BLnP3+!kw(r)sVi5Y#^}4d|a4u5C;a1c@#gYE>lgsz2KhE-T+PEPl3s zxmkIm`_Pck%&wXY*yIW1*X_a zbFqM%*=c0{FNGC?42gg$k(O-{6NRu&k+6THCLNCN5msHcQZE+}*(b-(exL0j8cQ`B zr6kLnJ~EZe&Q2)x}vMdq#_|T*zp1Jb- zCkd1Niz5+_3-3LSzLo$@s+4txY-q(X4RAH*L5uO7|HyOidv+ZbJ4r5FZ~Hm&7ww-28rIX2GY0z~Hdh+m9-d zbfMAV$7`a{TM{;{+&uh0NoYn}3JCifq^-z_OxLJG@K(n;B0F$tvj0OyyRqmif^am@ zP<;WEUw&McZ#w7l$KY>SeoZqdLLycS{0=;BzD^Qg`vEDm92X-I;-^jAJIJMIi99s% z>a3vbtnRe^K{gXA$;`Ml=zNVmuWXN{H|hU6u%7^L432Fw-kCce=qF#c}D0TarxZBf&6Hcq?)shDu-blcB{)skMuZ=znj{~j6UysB6Kfknp0_v6k zSViS4!IDL?z$SKiji#n!-{sjEC8a8^64_7BNNC4D^a-91)Gc^C)^d~ls@C>UmAt(b zsjqwm%Y(m@51Q{u8$q)A@Wkx_Q&SYY35H5r52N9DU!8A$map&{nAMN28HMZ-g+aP$Q{>jseCcXRVQ} z)S|e};Yq`f@y$fgQaLv>a0Ghs{I-uFvgKp@yM*Sr&Cjb`OS;M<^HuK3SK1)mLR?RY zr)r0ra=#{@q5DmAR;;Aw%c?8w#U6iKr`O;IkFB)`{=rk+%9{!IA^7O~Z+yshh>M0V z&SeF*5AozC|Yy?dDUiWyulR$ky_M6O@xN#_o!1nZy*) zA>|2tDa@4VipMd^KW15ce?-sov74EJ265>?(W94>Iu(gx}gzwFVQE#(2{ zCSYzN(8c47(q5~Bw4E<`&+?~D;2zA$W$UkbKYV3S0$1ab;ToE?4pwsr8Ml-tPFd@j=g9f)?w-j7kE(P zdwWPcnf^(qGPXw>F!>&4?JjI&jdp4~ifK9NntxJEowhuFI3&~X(Oi+f9AWf++QwCs zY*2htPqJSO9G)LLH7ABkSp8t!=rKL^#F0Z%bg1o6%_<1*yyP(%N$+Bq>lmt}G-TW` zikm9tSN6au(yE}#JllDKDKjZ5^>YGG9b{7P<5b&V~` z@-`+&C3AH8TDji8s=qpCaF*>j?zL9Ll!K1QheP45we>>FjCOan@2h6Fb4VK(t`Tg3 z9VezX_1~Eq#rwxWVW6=e-D?%0U}*Oezuf{$4Oc)LE4`Q}uJ-`}O^{vtC_1>b`_nSw zvJujjeZU8X5;;pOF{P0|ci10L{zY+k-Q$el{cn23;U&A==tTUByfjlgmYEb~XEG#q zu*Maruegrku#ZP)!T~S$Zaot(_4G_LknMDxJD`N&hxaG;s#5|ITJaYQXDa#mFXe>N zJbw+FQd%{Y_j`4j3|(F>>hZmF8x8hKw_H{1Hv6OVg50T>Q8I8r+>fWhwGuocpWO2G zsu##F;1Ir=qqmQ(kD{KY?waNyZ2Wh*>3{O1fo@<|{^^gQ|5U?oSPtqApB z)4^ia+n>LpQVC#%H=J0}9>sH~=` z3G+now)Be;MJ5bp>BAy^JJIFs#hY{|r`FWzioY4ij*SM(!>@St=Cpwv-Qq=idQAXE z-OSgnH~#)OFsAs!_B=4nhsc}hG(YSms3GH!%{U&csQ3FRSR`A~iu=P~u~1nR2sqEi z=4g|KvzuoWJznpr;*P+5qZ)g+v>E9T$l3juHxrlLc6){FJih;B9(UOL3)IiBi%*C@ zsC4plvev({KBKEZWgVK!5@POQy8fTOS5r~zdYINwRGTz!^(8!rFyq<&nJ3os(^G|v z8gIcL5ayeGzGP&*`?EJvE`nrB-3DskKxk%LaX!Q=SFqt?5;Esm$nDN+(i-UX<|VC& ztbRBj`QL((l%O?j{p-g}LwP$(MUiK@jPY0Fz!_;=9&0!`r_Jq8u8C^(rUmM@5rc`9 zh*arrg!6B;*OambkiOOO*&*4X1aVd3=J#NW)>mIaRDhp`gHZ3o zMQ91W_W+QG6zvJBbo=3l`qp)etZ7Oy>-@b_6LPs;V5`2T#eLb#^KteI9|83l2Y~qQ zYcPH`-#L`MK4fBVnf;;lPSIK6fRt^3!XU7A9{_O(1eE2{g%U51UM3O}i=|QV7&QY> z3adIBcDVIStKf@MrsajecjQhoUIA?V`@R9GCv8iFU4*aDylqzD!TU%3z!wYKC@T_d z$2C1?cyM(1BRMcZdh{6iliMq^yJK(EmWgn=diR*oZOjX+=_W`Z-h?n2uYoD6ogIkI2f0jX|MVFuTQfEBEq^;ScMet{nv>G9+ zhq&L)d8_H@AdX8i-=ft1pr&;cq-%gad1wPmNZ{2_i)Xg-0koK&BE(2OB~dL( zU@BzusJc5myD7AS|K6Ee-Jox-hT)6R(J(-(ug`2la^*2iUFLoB<@<~*Hffv~y>7U3 zF1M@>q2{OB%zCz?&vM@L>qSmmfO$W_W|RUc$@LbmItTL%T!{i^;+&+&G-mFu5H9C5 zK-6)*#7FT+WGqG7Qs{@uF{5yc9{c-=8jDqAE%}+0z4hEkp(=Mc7~Jg%^Je?z97l)# z?@jf@OiIP#7ni>J+~svzTu0m@{!JX_Tp`wc(l?vRrndNJ!-QtmUsn(I6IOcM3RPn> z`Z?%YS5;`tVk17|U%#e4+#Ja(yQ*$h*dq;(`LQxsd+OrINI4}yJTjDS9mQeFjLNHQ zCvc?_iXBosP{?Cz(~?L~k)WFB<_@k>Du-}&Ku1E!KLw%j8df*=aBP1X1&m^R(5`J7 zEF6|S6BSq9lK$tV{1a>5lDIIa z|7c(*PMIV5o-tk7dCgv&yT>Vki>yO~YOhGrIl#_uSjmc6Y=vRbU8cxBHM8#$+%ETx z5alKaBKQlM#8}cl@J%-#Z}uAbcG|>;S2ZX*qn0O6p{EZz_HOLm{*d-Y@;l^OTo$75 z${!=~{S1#+W)VMRa*mR^?RMA4*2o;)5KbloaB8_~gFI1F>jvgB`j%da;@7D0F9msNZ;{QTaD1zXJ1HnL=_Ad`N)N_e-gz1h zTpnbV+KyqwreX5Q=A2KZb~5{WxVKP@Cd&#!n{S^bY%<3yO1h-QX`K*!d+{1mz^kdk;9U+Y zsTKkxs*kY6>G4P>a3^ZOkzw-vNk?`k0=r8|m0{1<2@@DHX5n~)3@@t73ura=V(lss zud)8O{`s7%)Nt&U=4z4x$UA(CZQf;wbTFXcaMr`WS~j-seb-k*>bIkOV|%P&?_u|; zardT4Z`3dm)hX6Mtz_k(I`^A1D@&7x`!{rrg|qZScK10i2-R-eh9X7StiO!D4CwYY z?1X{}+AyE}K2+}2#c+H5=>~!_U8cz^_S{kEh5!Wu7c|u4A#+;OtJeo+TUy+n{v!2; z889P6te6f)HX=WMv2F{HEF9A-Kqprjx^Q(Wa!?c>zzTCTL@UZAUE|PDn(YTy6Q&5U z*8ZsC64}3L8|?}vt*{j3Zv!|4w=AYtZ1!OMqF7!TP@Uam&N}&K-si)BKW#MVCL;rJ zyqG$_U!dQ`ls;= zr$40Dt24mCU+IB=?JWR6YLx(`1mKNU*}+y zZyDes4<-1;CO39Ew%im&WOB4ykANRJzF8be&nOu%(Jyl(O^TQE!QyVyQB3G@n@brbPke9w%SY6YJsXi{*>?R6@>!JvB0 zc4K|c6R9*Zke!I_t{bD~#(s!Z(Y6D?+;%#B#&1_@MPRNwuN4tf29 zU|;{@3WAt)97Q3nF~)f%Gk4zEva+(#aMqW`d}!suehvEfF9NrNG#NseAgu3Yq~1}d zJ4Gv;L%33~{yS)ipJo@kIIKG6bgLx2l>07E#d*ixzK%cbjuX(e)(sH8BON9Fr8ZKb z%F7IRnjdqkLa^7B2@bu_ro6%`eNpoI>-wLH$dGM%jHrC%lY11oDR?K+aP}BhZrIMy@G1UEPNrWX??P8;~gP={D)qDLQiP9JV3T= z@bTFhg8l*Rsg8q&oi&@X_d*oqSz;IB3A=E@ObU?j_@6^ezt9R#!z?>&*|ord zDAYye;vj%Zuo`>bd@Fx%dPIJ9r`YC3qf{Z6h_;Lhz`Nwjp7zf2iS8a-n8tgNJLj6X zFLhLNZ@g1fHJ6?G>fbz&!;_0di#S}P-qlJG{!T);eTArbduG){%H_q4*V8m}Hr07H z<=1!@=ONAVHNfN!xwD^5uwO$acXSWh+gwI8Dl+;v!drQ7%F2zv8td;cz%+1vTbAci z%?rC@Ln49SBeh%T;u(AG_*xB?Ffrr$4tq*&ffs=t*mr-3;PQD&B zi8?)ukJ@RD5lK(K{Ylez8RVYj42?iLj}p4@5J&r@>b=J;F?PU8$Pdw@s?4`Mo=qoER=pkxTzE`LlO7Nz$9dFKx?~77hmMA z_@R;?Sh|$TQT9o35qVw7Mnp%}UY#?Sm|I{`V2>rUu(|=ShYw9nL`~5lL2m|`J0DNO zXe_-lvS{b1<8VCNtma#+|L8&ex9a1+ZT`+&XDXjg*h-&Qw+?p%>{;575^JqE9JIoW zJLKYf`Zl69(lp*dl>dGHJR^z2LVJ^3*ek<^TYP2*@ujZN&)=Eam#3>=JrpD;d~cE+ z_@HX!4@P2ipoqh;(E`dRoc@Tp4v>Ls?(c z_d?30{V2_x7MD2u1e&LEN0vZW^=J;i6JG)k{YTEf-m zq8`P6MY(53w<{!;Zw`7Q`sKQH_}QH}94P!!g`+zS;gzt6iuAStmcut2)A5kNEWuCH zu{Dn=CHrIaqzi+oNA-uGzkwcCr>mrjq&wS5N6>>GXxuj=c)Ymuf6Hy**d|XGF7IFGI$*Ycyl(&uTHt^}^FeeJzPl^KI)cP%wt(gmIx`h{d zElxi#>W2z*77x7km-4w~dD~dR9RI0qz*`0TMHW8p7zZz=(br99a90$`WD#VUi-+dJ zvVYpIh2|%BuqeN7A7Y&Bk6CfzS$8VxRN}(W)-kU}`|t}88ilYsb|2DqwDW@BK_8H8 z<>GgDzAFFu;8B86uh!`tx!@yQTa_1x|H897LU5hgv#|545oQ&)!ezT@mxzCo*><+~ zn>sz&fKwIG6^S8{*xwQ`c4rg*sq%``!lhBGP*29r@m{RtO27MrQ0wdPR}f(1ux-V>1`Rr5Bx{&b~)x zIs0n2VoT8n%0ub1IH5!$eQkKe{1yDRN(Dl01I6Ar6y-ZG%Ggm$+;Vq?sc8E8X2NOz iAA{2WrL_8&kAl7H6w9wgzubkz038iINR68P+y4W$yy?&Y diff --git a/packages/livechat/src/components/Form/index.js b/packages/livechat/src/components/Form/index.js index c8d618c4d1eb..f34516038eb3 100644 --- a/packages/livechat/src/components/Form/index.js +++ b/packages/livechat/src/components/Form/index.js @@ -1,9 +1,7 @@ import i18next from 'i18next'; import { MemoizedComponent } from '../../helpers/MemoizedComponent'; -import { createClassName } from '../../helpers/createClassName'; import { validateEmail } from '../../lib/email'; -import styles from './styles.scss'; export class Form extends MemoizedComponent { static defaultHandleSubmit = (event) => { @@ -11,12 +9,7 @@ export class Form extends MemoizedComponent { }; render = ({ onSubmit, className, style = {}, children }) => ( -
    + {children}
    ); diff --git a/packages/livechat/src/components/Form/styles.scss b/packages/livechat/src/components/Form/styles.scss deleted file mode 100644 index d17204757957..000000000000 --- a/packages/livechat/src/components/Form/styles.scss +++ /dev/null @@ -1,3 +0,0 @@ -@import '../../styles/colors'; -@import '../../styles/variables'; -@import './mixins'; diff --git a/packages/livechat/svg-component-loader.js b/packages/livechat/svg-component-loader.ts similarity index 73% rename from packages/livechat/svg-component-loader.js rename to packages/livechat/svg-component-loader.ts index 1e2a69da2a00..8a1624f276db 100644 --- a/packages/livechat/svg-component-loader.js +++ b/packages/livechat/svg-component-loader.ts @@ -1,7 +1,9 @@ -module.exports = (content) => ` +import type webpack from 'webpack'; + +const SvgComponentLoader: webpack.loader.Loader = (content) => ` var preact = require('preact'); var hooks = require('preact/hooks'); -${content} +${typeof content === 'string' ? content : content.toString('utf-8')} var attributes = module.exports.attributes; var content = module.exports.content; @@ -23,3 +25,5 @@ module.exports = function (props) { return preact.h('svg', Object.assign({ ref: ref }, attributes, props)); }; `; + +export default SvgComponentLoader; diff --git a/packages/livechat/tsconfig.json b/packages/livechat/tsconfig.json index e84923a169eb..0abc3fefa013 100644 --- a/packages/livechat/tsconfig.json +++ b/packages/livechat/tsconfig.json @@ -6,6 +6,7 @@ "checkJs": false, "jsxImportSource": "preact", }, + "include": ["./src", "./webpack.config.ts", "./svg-component-loader.ts"], "exclude": [ "./node_modules", "./dist" diff --git a/packages/livechat/tsconfig.webpack.json b/packages/livechat/tsconfig.webpack.json new file mode 100644 index 000000000000..415fd89c9114 --- /dev/null +++ b/packages/livechat/tsconfig.webpack.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "commonjs", + "target": "es5", + "esModuleInterop": true + }, + "include": ["./src"], + "exclude": [ + "./node_modules", + "./dist" + ] +} diff --git a/packages/livechat/webpack.config.js b/packages/livechat/webpack.config.js deleted file mode 100644 index 0a031214a885..000000000000 --- a/packages/livechat/webpack.config.js +++ /dev/null @@ -1,228 +0,0 @@ -const path = require('path'); - -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); -const webpack = require('webpack'); - -module.exports = (env, argv) => [ - { - stats: 'errors-warnings', - mode: argv.mode, - devtool: argv.mode === 'production' ? 'source-map' : 'eval', - resolve: { - extensions: ['.js', '.jsx', '.ts', '.tsx'], - alias: { - 'react': 'preact/compat', - 'react-dom': 'preact/compat', - }, - }, - node: { - console: false, - process: false, - Buffer: false, - __filename: false, - __dirname: false, - setImmediate: false, - }, - entry: { - bundle: ['core-js', 'regenerator-runtime/runtime', path.resolve(__dirname, './src/entry')], - polyfills: path.resolve(__dirname, './src/polyfills'), - }, - output: { - path: path.resolve(__dirname, './dist'), - publicPath: argv.mode === 'production' ? 'livechat/' : '/', - filename: argv.mode === 'production' ? '[name].[chunkhash:5].js' : '[name].js', - chunkFilename: '[name].chunk.[chunkhash:5].js', - }, - module: { - rules: [ - { - test: /\.jsx?$/, - exclude: [/\/node_modules\/core-js\//], - type: 'javascript/auto', - use: ['babel-loader'], - }, - { - test: /\.tsx?$/, - use: 'babel-loader', - exclude: ['/node_modules/'], - }, - { - test: /\.svg$/, - use: [require.resolve('./svg-component-loader'), 'svg-loader', 'image-webpack-loader'], - }, - { - test: /\.s?css$/, - exclude: [path.resolve(__dirname, './src/components'), path.resolve(__dirname, './src/routes')], - use: [ - argv.mode === 'production' ? MiniCssExtractPlugin.loader : 'style-loader', - { - loader: 'css-loader', - options: { - importLoaders: 1, - sourceMap: true, - }, - }, - { - loader: 'postcss-loader', - options: { - ident: 'postcss', - sourceMap: true, - }, - }, - ], - }, - { - test: /\.s?css$/, - include: [path.resolve(__dirname, './src/components'), path.resolve(__dirname, './src/routes')], - use: [ - argv.mode === 'production' ? MiniCssExtractPlugin.loader : 'style-loader', - { - loader: 'css-loader', - options: { - modules: { - localIdentName: '[local]__[hash:base64:5]', - }, - importLoaders: 1, - sourceMap: true, - }, - }, - { - loader: 'postcss-loader', - options: { - ident: 'postcss', - sourceMap: true, - }, - }, - ], - }, - { - enforce: 'pre', - test: /\.scss$/, - use: [ - { - loader: 'sass-loader', - options: { - sassOptions: { - fiber: false, - }, - }, - }, - ], - }, - { - test: /\.(woff2?|ttf|eot|jpe?g|png|webp|gif|mp4|mov|ogg|webm)(\?.*)?$/i, - loader: argv.mode === 'production' ? 'file-loader' : 'url-loader', - }, - ], - }, - plugins: [ - new MiniCssExtractPlugin({ - filename: argv.mode === 'production' ? '[name].[contenthash:5].css' : '[name].css', - chunkFilename: argv.mode === 'production' ? '[name].chunk.[contenthash:5].css' : '[name].chunk.css', - }), - new webpack.NoEmitOnErrorsPlugin(), - new webpack.DefinePlugin({ - 'process.env.NODE_ENV': JSON.stringify(argv.mode === 'production' ? 'production' : 'development'), - }), - new HtmlWebpackPlugin({ - title: 'Rocket.Chat.Livechat', - chunks: ['polyfills', 'vendor', 'bundle'], - chunksSortMode: 'manual', - }), - ], - optimization: { - sideEffects: false, - splitChunks: { - automaticNameDelimiter: '~', - chunks: 'all', - maxAsyncRequests: 30, - maxInitialRequests: 30, - minChunks: 1, - minSize: 20000, - enforceSizeThreshold: 500000, - maxSize: 0, - }, - }, - devServer: { - hot: true, - port: 8080, - host: '0.0.0.0', - allowedHosts: 'all', - open: true, - historyApiFallback: true, - devMiddleware: { - publicPath: argv.mode === 'production' ? 'livechat/' : '/', - stats: 'normal', - }, - client: { - logging: 'verbose', - }, - static: { - directory: path.resolve(__dirname, './src'), - publicPath: argv.mode === 'production' ? 'livechat/' : '/', - watch: { - ignored: [path.resolve(__dirname, './dist'), path.resolve(__dirname, './node_modules')], - }, - }, - }, - }, - { - stats: 'errors-warnings', - mode: argv.mode, - devtool: argv.mode === 'production' ? 'source-map' : 'eval', - resolve: { - extensions: ['.js', '.jsx', '.ts', '.tsx'], - alias: { - 'react': 'preact/compat', - 'react-dom': 'preact/compat', - }, - }, - node: { - console: false, - process: false, - Buffer: false, - __filename: false, - __dirname: false, - setImmediate: false, - }, - entry: { - script: path.resolve(__dirname, './src/widget.js'), - }, - output: { - path: path.resolve(__dirname, './dist'), - publicPath: argv.mode === 'production' ? 'livechat/' : '/', - filename: 'rocketchat-livechat.min.js', - }, - module: { - rules: [ - { - test: /\.js$/, - type: 'javascript/auto', - use: [ - { - loader: 'babel-loader', - options: { - babelrc: false, - presets: [ - [ - '@babel/preset-env', - { - useBuiltIns: 'entry', - corejs: 3, - }, - ], - ], - }, - }, - ], - }, - { - test: /\.tsx?$/, - use: 'babel-loader', - exclude: ['/node_modules/'], - }, - ], - }, - }, -]; diff --git a/packages/livechat/webpack.config.ts b/packages/livechat/webpack.config.ts new file mode 100644 index 000000000000..be1587356903 --- /dev/null +++ b/packages/livechat/webpack.config.ts @@ -0,0 +1,200 @@ +import path from 'path'; + +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import MiniCssExtractPlugin from 'mini-css-extract-plugin'; +import TerserPlugin from 'terser-webpack-plugin'; +import webpack from 'webpack'; +import 'webpack-dev-server'; + +// Helper to use absolute paths in the webpack config +const _ = (p: string) => path.resolve(__dirname, p); + +const common = (args: webpack.CliConfigOptions): Partial => ({ + stats: 'errors-warnings', + mode: args.mode, + devtool: args.mode === 'production' ? 'source-map' : 'eval', + resolve: { + extensions: ['.js', '.jsx', '.ts', '.tsx'], + alias: { + 'react': 'preact/compat', + 'react-dom': 'preact/compat', + }, + }, + optimization: { + sideEffects: false, + splitChunks: { + automaticNameDelimiter: '~', + chunks: 'all', + maxAsyncRequests: 30, + maxInitialRequests: 30, + minChunks: 1, + minSize: 20000, + maxSize: 0, + }, + noEmitOnErrors: true, + ...(args.mode === 'production' && { + minimizer: [ + new TerserPlugin({ + terserOptions: { + mangle: true, + }, + }), + ], + }), + }, +}); + +const config: webpack.MultiConfigurationFactory = (_env, args) => [ + { + ...common(args), + entry: { + bundle: ['core-js', 'regenerator-runtime/runtime', _('./src/entry')], + polyfills: _('./src/polyfills'), + } as webpack.Entry, + output: { + path: _('./dist'), + publicPath: args.mode === 'production' ? 'livechat/' : '/', + filename: args.mode === 'production' ? '[name].[chunkhash:5].js' : '[name].js', + chunkFilename: '[name].chunk.[chunkhash:5].js', + }, + module: { + rules: [ + { + test: /\.jsx?$/, + exclude: [/\/node_modules\/core-js\//], + type: 'javascript/auto', + use: ['babel-loader'], + }, + { + test: /\.tsx?$/, + use: 'babel-loader', + exclude: ['/node_modules/'], + }, + { + test: /\.svg$/, + use: [require.resolve('./svg-component-loader'), 'svg-loader', 'image-webpack-loader'], + }, + { + test: /\.s?css$/, + exclude: [_('./src/components'), _('./src/routes')], + use: [ + args.mode === 'production' ? MiniCssExtractPlugin.loader : 'style-loader', + { + loader: 'css-loader', + options: { + importLoaders: 1, + sourceMap: true, + }, + }, + { + loader: 'postcss-loader', + options: { + ident: 'postcss', + sourceMap: true, + }, + }, + ], + }, + { + test: /\.s?css$/, + include: [_('./src/components'), _('./src/routes')], + use: [ + args.mode === 'production' ? MiniCssExtractPlugin.loader : 'style-loader', + { + loader: 'css-loader', + options: { + modules: { + localIdentName: '[local]__[hash:base64:5]', + }, + importLoaders: 1, + sourceMap: true, + }, + }, + { + loader: 'postcss-loader', + options: { + ident: 'postcss', + sourceMap: true, + }, + }, + ], + }, + { + enforce: 'pre', + test: /\.scss$/, + use: [ + { + loader: 'sass-loader', + options: { + sassOptions: { + fiber: false, + }, + }, + }, + ], + }, + { + test: /\.(woff2?|ttf|eot|jpe?g|png|webp|gif|mp4|mov|ogg|webm)(\?.*)?$/i, + loader: args.mode === 'production' ? 'file-loader' : 'url-loader', + }, + ], + }, + plugins: [ + new MiniCssExtractPlugin({ + filename: args.mode === 'production' ? '[name].[contenthash:5].css' : '[name].css', + chunkFilename: args.mode === 'production' ? '[name].chunk.[contenthash:5].css' : '[name].chunk.css', + }) as unknown as webpack.Plugin, + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(args.mode === 'production' ? 'production' : 'development'), + }), + new HtmlWebpackPlugin({ + title: 'Livechat - Rocket.Chat', + chunks: ['polyfills', 'vendor', 'bundle'], + chunksSortMode: 'manual', + }), + ], + devServer: { + hot: true, + port: 8080, + host: '0.0.0.0', + allowedHosts: 'all', + open: true, + devMiddleware: { + publicPath: args.mode === 'production' ? 'livechat/' : '/', + stats: 'normal', + }, + client: { + logging: 'verbose', + }, + static: { + directory: _('./src'), + publicPath: args.mode === 'production' ? 'livechat/' : '/', + watch: { + ignored: [_('./dist'), _('./node_modules')], + }, + }, + }, + }, + { + ...common(args), + entry: { + script: _('./src/widget.js'), + } as webpack.Entry, + output: { + path: _('./dist'), + publicPath: args.mode === 'production' ? 'livechat/' : '/', + filename: 'rocketchat-livechat.min.js', + }, + module: { + rules: [ + { + test: /\.tsx?$/, + use: 'babel-loader', + exclude: ['/node_modules/'], + }, + ], + }, + }, +]; + +export default config; diff --git a/yarn.lock b/yarn.lock index 3d16a196ad67..e70e852f468e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7755,6 +7755,11 @@ __metadata: "@storybook/addon-postcss": ~2.0.0 "@storybook/preact": ~6.5.16 "@storybook/theming": ~6.5.16 + "@types/crypto-js": ~4.1.1 + "@types/mini-css-extract-plugin": ~1.4.3 + "@types/terser-webpack-plugin": ~4.2.2 + "@types/webpack": ~4.41.33 + "@types/webpack-dev-server": ~4.7.2 "@types/whatwg-fetch": ~0.0.33 "@typescript-eslint/eslint-plugin": ~5.60.1 "@typescript-eslint/parser": ~5.60.1 @@ -7782,7 +7787,7 @@ __metadata: lorem-ipsum: ^2.0.8 markdown-it: ^11.0.1 mem: ^6.1.1 - mini-css-extract-plugin: ^0.11.3 + mini-css-extract-plugin: ~1.6.2 mitt: ^2.1.0 npm-run-all: ^4.1.5 postcss-css-variables: ^0.17.0 @@ -7806,6 +7811,7 @@ __metadata: stylelint: ^14.9.1 stylelint-order: ^5.0.0 svg-loader: ^0.0.2 + terser-webpack-plugin: ~4.2.3 typescript: ~5.1.6 url-loader: ^4.1.1 webpack: ~4.46.0 @@ -11084,6 +11090,13 @@ __metadata: languageName: node linkType: hard +"@types/crypto-js@npm:~4.1.1": + version: 4.1.1 + resolution: "@types/crypto-js@npm:4.1.1" + checksum: ea3d6a67b69f88baeb6af96004395903d2367a41bd5cd86306da23a44dd96589749495da50974a9b01bb5163c500764c8a33706831eade036bddae016417e3ea + languageName: node + linkType: hard + "@types/cssom@npm:^0.4.1": version: 0.4.1 resolution: "@types/cssom@npm:0.4.1" @@ -11566,6 +11579,17 @@ __metadata: languageName: node linkType: hard +"@types/mini-css-extract-plugin@npm:~1.4.3": + version: 1.4.3 + resolution: "@types/mini-css-extract-plugin@npm:1.4.3" + dependencies: + "@types/node": "*" + tapable: ^2.2.0 + webpack: ^5 + checksum: 809ffb750926c8f66112fcff82e2c4773dd54bde9fadcfee70303b256fbac7d3833d99453044449f49633ce78b1a55bbbbeca9cc1fc86dc446bb77e25ccd5a20 + languageName: node + linkType: hard + "@types/minimatch@npm:*": version: 3.0.5 resolution: "@types/minimatch@npm:3.0.5" @@ -12101,6 +12125,16 @@ __metadata: languageName: node linkType: hard +"@types/terser-webpack-plugin@npm:~4.2.2": + version: 4.2.2 + resolution: "@types/terser-webpack-plugin@npm:4.2.2" + dependencies: + "@types/webpack": ^4 + terser: ^4.6.13 + checksum: 9e31abd59cacd8d60e3e16b65317b4bba56b66c564c089956b63aee27f0a00367c10f734151ebb4a7f6285ba1c600165a56fa2ba4ec83faa67aec6a5e4eb8e49 + languageName: node + linkType: hard + "@types/testing-library__jest-dom@npm:^5.9.1, @types/testing-library__jest-dom@npm:~5.14.6": version: 5.14.6 resolution: "@types/testing-library__jest-dom@npm:5.14.6" @@ -12203,6 +12237,15 @@ __metadata: languageName: node linkType: hard +"@types/webpack-dev-server@npm:~4.7.2": + version: 4.7.2 + resolution: "@types/webpack-dev-server@npm:4.7.2" + dependencies: + webpack-dev-server: "*" + checksum: 81b0d368b85f33759a3859c23d09c8a2af47997621c6350120ff80e20e9124568e4a30e15abead36e7992abe4e18ce2137785aa677d2041adfcd7e8fff9b2312 + languageName: node + linkType: hard + "@types/webpack-env@npm:^1.16.0": version: 1.16.3 resolution: "@types/webpack-env@npm:1.16.3" @@ -12221,6 +12264,20 @@ __metadata: languageName: node linkType: hard +"@types/webpack@npm:^4, @types/webpack@npm:~4.41.33": + version: 4.41.33 + resolution: "@types/webpack@npm:4.41.33" + dependencies: + "@types/node": "*" + "@types/tapable": ^1 + "@types/uglify-js": "*" + "@types/webpack-sources": "*" + anymatch: ^3.0.0 + source-map: ^0.6.0 + checksum: 5f64818128c94026be0e43e77d687e2d90f0da526a3a7c308c6a0bb12e93a35c9243be427bbf6865f64fd71dc5b32715af9b9da0cd6ae8335081b6db995bad2b + languageName: node + linkType: hard + "@types/webpack@npm:^4.41.26, @types/webpack@npm:^4.41.8": version: 4.41.33 resolution: "@types/webpack@npm:4.41.33" @@ -27048,17 +27105,16 @@ __metadata: languageName: node linkType: hard -"mini-css-extract-plugin@npm:^0.11.3": - version: 0.11.3 - resolution: "mini-css-extract-plugin@npm:0.11.3" +"mini-css-extract-plugin@npm:~1.6.2": + version: 1.6.2 + resolution: "mini-css-extract-plugin@npm:1.6.2" dependencies: - loader-utils: ^1.1.0 - normalize-url: 1.9.1 - schema-utils: ^1.0.0 + loader-utils: ^2.0.0 + schema-utils: ^3.0.0 webpack-sources: ^1.1.0 peerDependencies: webpack: ^4.4.0 || ^5.0.0 - checksum: 14fbdf1338fe0264a2f7f87b3fc640809b7443f6434c6532bdbec1c5ab113502325fec958e9cf0667c3790087dc1e83c02e1f4d7463c10c956b0d6ebe56ea99e + checksum: c2c1f3d7e5bc206b5bece0f37b65467ee58e0bb0b61d5e031bb818682b02db2552b296f5018af9058b18eb7127e00f6462fb718712a3d4432079dfa848b510cc languageName: node linkType: hard @@ -28222,18 +28278,6 @@ __metadata: languageName: node linkType: hard -"normalize-url@npm:1.9.1": - version: 1.9.1 - resolution: "normalize-url@npm:1.9.1" - dependencies: - object-assign: ^4.0.1 - prepend-http: ^1.0.0 - query-string: ^4.1.0 - sort-keys: ^1.0.0 - checksum: 4b03c22bebbb822874ce3b9204367ad1f27c314ae09b13aa201de730b3cf95f00dadf378277a56062322968c95c06e5764d01474d26af8b43d20bc4c8c491f84 - languageName: node - linkType: hard - "normalize-url@npm:2.0.1": version: 2.0.1 resolution: "normalize-url@npm:2.0.1" @@ -30827,7 +30871,7 @@ __metadata: languageName: node linkType: hard -"prepend-http@npm:^1.0.0, prepend-http@npm:^1.0.1": +"prepend-http@npm:^1.0.1": version: 1.0.4 resolution: "prepend-http@npm:1.0.4" checksum: 01e7baf4ad38af02257b99098543469332fc42ae50df33d97a124bf8172295907352fa6138c9b1610c10c6dd0847ca736e53fda736387cc5cf8fcffe96b47f29 @@ -31334,16 +31378,6 @@ __metadata: languageName: node linkType: hard -"query-string@npm:^4.1.0": - version: 4.3.4 - resolution: "query-string@npm:4.3.4" - dependencies: - object-assign: ^4.1.0 - strict-uri-encode: ^1.0.0 - checksum: 3b2bae6a8454cf0edf11cf1aa4d1f920398bbdabc1c39222b9bb92147e746fcd97faf00e56f494728fb66b2961b495ba0fde699d5d3bd06b11472d664b36c6cf - languageName: node - linkType: hard - "query-string@npm:^5.0.1": version: 5.1.1 resolution: "query-string@npm:5.1.1" @@ -35622,7 +35656,7 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:^4.2.3": +"terser-webpack-plugin@npm:^4.2.3, terser-webpack-plugin@npm:~4.2.3": version: 4.2.3 resolution: "terser-webpack-plugin@npm:4.2.3" dependencies: @@ -35676,6 +35710,19 @@ __metadata: languageName: node linkType: hard +"terser@npm:^4.6.13": + version: 4.8.1 + resolution: "terser@npm:4.8.1" + dependencies: + commander: ^2.20.0 + source-map: ~0.6.1 + source-map-support: ~0.5.12 + bin: + terser: bin/terser + checksum: b342819bf7e82283059aaa3f22bb74deb1862d07573ba5a8947882190ad525fd9b44a15074986be083fd379c58b9a879457a330b66dcdb77b485c44267f9a55a + languageName: node + linkType: hard + "terser@npm:^5.10.0, terser@npm:^5.16.8, terser@npm:^5.3.4": version: 5.18.0 resolution: "terser@npm:5.18.0" @@ -36393,58 +36440,58 @@ __metadata: languageName: node linkType: hard -"turbo-darwin-64@npm:1.10.9": - version: 1.10.9 - resolution: "turbo-darwin-64@npm:1.10.9" +"turbo-darwin-64@npm:1.10.12": + version: 1.10.12 + resolution: "turbo-darwin-64@npm:1.10.12" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"turbo-darwin-arm64@npm:1.10.9": - version: 1.10.9 - resolution: "turbo-darwin-arm64@npm:1.10.9" +"turbo-darwin-arm64@npm:1.10.12": + version: 1.10.12 + resolution: "turbo-darwin-arm64@npm:1.10.12" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"turbo-linux-64@npm:1.10.9": - version: 1.10.9 - resolution: "turbo-linux-64@npm:1.10.9" +"turbo-linux-64@npm:1.10.12": + version: 1.10.12 + resolution: "turbo-linux-64@npm:1.10.12" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"turbo-linux-arm64@npm:1.10.9": - version: 1.10.9 - resolution: "turbo-linux-arm64@npm:1.10.9" +"turbo-linux-arm64@npm:1.10.12": + version: 1.10.12 + resolution: "turbo-linux-arm64@npm:1.10.12" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"turbo-windows-64@npm:1.10.9": - version: 1.10.9 - resolution: "turbo-windows-64@npm:1.10.9" +"turbo-windows-64@npm:1.10.12": + version: 1.10.12 + resolution: "turbo-windows-64@npm:1.10.12" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"turbo-windows-arm64@npm:1.10.9": - version: 1.10.9 - resolution: "turbo-windows-arm64@npm:1.10.9" +"turbo-windows-arm64@npm:1.10.12": + version: 1.10.12 + resolution: "turbo-windows-arm64@npm:1.10.12" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard "turbo@npm:latest": - version: 1.10.9 - resolution: "turbo@npm:1.10.9" - dependencies: - turbo-darwin-64: 1.10.9 - turbo-darwin-arm64: 1.10.9 - turbo-linux-64: 1.10.9 - turbo-linux-arm64: 1.10.9 - turbo-windows-64: 1.10.9 - turbo-windows-arm64: 1.10.9 + version: 1.10.12 + resolution: "turbo@npm:1.10.12" + dependencies: + turbo-darwin-64: 1.10.12 + turbo-darwin-arm64: 1.10.12 + turbo-linux-64: 1.10.12 + turbo-linux-arm64: 1.10.12 + turbo-windows-64: 1.10.12 + turbo-windows-arm64: 1.10.12 dependenciesMeta: turbo-darwin-64: optional: true @@ -36460,7 +36507,7 @@ __metadata: optional: true bin: turbo: bin/turbo - checksum: 667867c3ea6ecf59cafe494e1bd4da8564bdae4ea735a14813656b2784a909fb69f12f8c6cdb140ca490c602fd11dc186b5d426af6a451ba51a487e73b742731 + checksum: 266b70404e149b92cd64051fcdd03c56b474ed22f6bd11cf4cf1b70f55c72f9a2aaa90109b19b95e43d68e53a6be54485f0cc0135c8d5b505db09fd126a34052 languageName: node linkType: hard @@ -37913,6 +37960,53 @@ __metadata: languageName: node linkType: hard +"webpack-dev-server@npm:*": + version: 4.15.1 + resolution: "webpack-dev-server@npm:4.15.1" + dependencies: + "@types/bonjour": ^3.5.9 + "@types/connect-history-api-fallback": ^1.3.5 + "@types/express": ^4.17.13 + "@types/serve-index": ^1.9.1 + "@types/serve-static": ^1.13.10 + "@types/sockjs": ^0.3.33 + "@types/ws": ^8.5.5 + ansi-html-community: ^0.0.8 + bonjour-service: ^1.0.11 + chokidar: ^3.5.3 + colorette: ^2.0.10 + compression: ^1.7.4 + connect-history-api-fallback: ^2.0.0 + default-gateway: ^6.0.3 + express: ^4.17.3 + graceful-fs: ^4.2.6 + html-entities: ^2.3.2 + http-proxy-middleware: ^2.0.3 + ipaddr.js: ^2.0.1 + launch-editor: ^2.6.0 + open: ^8.0.9 + p-retry: ^4.5.0 + rimraf: ^3.0.2 + schema-utils: ^4.0.0 + selfsigned: ^2.1.1 + serve-index: ^1.9.1 + sockjs: ^0.3.24 + spdy: ^4.0.2 + webpack-dev-middleware: ^5.3.1 + ws: ^8.13.0 + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + peerDependenciesMeta: + webpack: + optional: true + webpack-cli: + optional: true + bin: + webpack-dev-server: bin/webpack-dev-server.js + checksum: cd0063b068d2b938fd76c412d555374186ac2fa84bbae098265212ed50a5c15d6f03aa12a5a310c544a242943eb58c0bfde4c296d5c36765c182f53799e1bc71 + languageName: node + linkType: hard + "webpack-dev-server@npm:~4.13.3": version: 4.13.3 resolution: "webpack-dev-server@npm:4.13.3" @@ -38109,6 +38203,43 @@ __metadata: languageName: node linkType: hard +"webpack@npm:^5": + version: 5.88.2 + resolution: "webpack@npm:5.88.2" + dependencies: + "@types/eslint-scope": ^3.7.3 + "@types/estree": ^1.0.0 + "@webassemblyjs/ast": ^1.11.5 + "@webassemblyjs/wasm-edit": ^1.11.5 + "@webassemblyjs/wasm-parser": ^1.11.5 + acorn: ^8.7.1 + acorn-import-assertions: ^1.9.0 + browserslist: ^4.14.5 + chrome-trace-event: ^1.0.2 + enhanced-resolve: ^5.15.0 + es-module-lexer: ^1.2.1 + eslint-scope: 5.1.1 + events: ^3.2.0 + glob-to-regexp: ^0.4.1 + graceful-fs: ^4.2.9 + json-parse-even-better-errors: ^2.3.1 + loader-runner: ^4.2.0 + mime-types: ^2.1.27 + neo-async: ^2.6.2 + schema-utils: ^3.2.0 + tapable: ^2.1.1 + terser-webpack-plugin: ^5.3.7 + watchpack: ^2.4.0 + webpack-sources: ^3.2.3 + peerDependenciesMeta: + webpack-cli: + optional: true + bin: + webpack: bin/webpack.js + checksum: 79476a782da31a21f6dd38fbbd06b68da93baf6a62f0d08ca99222367f3b8668f5a1f2086b7bb78e23172e31fa6df6fa7ab09b25e827866c4fc4dc2b30443ce2 + languageName: node + linkType: hard + "websocket-driver@npm:>=0.5.1, websocket-driver@npm:^0.7.4": version: 0.7.4 resolution: "websocket-driver@npm:0.7.4" From 05f7536cc062c0550e6fdd3e0c1d09a993e46757 Mon Sep 17 00:00:00 2001 From: Douglas Fabris Date: Fri, 4 Aug 2023 18:46:42 -0300 Subject: [PATCH 010/408] chore: Omnichannel Empty State Improvements (#29815) --- .../GenericNoResults/GenericNoResults.tsx | 46 +++++++++----- .../agents/AgentsTable/AddAgent.tsx | 20 +++---- .../agents/AgentsTable/AgentsTable.tsx | 17 +++++- .../currentChats/CurrentChatsRoute.tsx | 31 +++++++--- .../currentChats/hooks/useCurrentChats.ts | 1 + .../customFields/CustomFieldsPage.tsx | 2 +- .../customFields/CustomFieldsTable.tsx | 43 ++++++++----- .../departments/DepartmentsPage.tsx | 2 +- .../DepartmentsTable/DepartmentsTable.tsx | 27 +++++++-- .../directory/ContactContextualBar.tsx | 2 +- .../omnichannel/directory/calls/CallTable.tsx | 18 +++++- .../omnichannel/directory/chats/ChatTable.tsx | 17 +++++- .../directory/contacts/ContactTable.tsx | 34 ++++++++--- .../views/omnichannel/managers/AddManager.tsx | 20 +++---- .../omnichannel/managers/ManagersTable.tsx | 11 +++- .../omnichannel/triggers/TriggersPage.tsx | 2 +- .../omnichannel/triggers/TriggersTable.tsx | 29 +++++++-- .../cannedResponses/CannedResponsesPage.tsx | 4 +- .../cannedResponses/CannedResponsesTable.tsx | 60 ++++++++++--------- .../CreateCannedResponseModal.tsx | 2 +- .../omnichannel/monitors/MonitorsTable.tsx | 39 ++++++++---- .../omnichannel/slaPolicies/SlaPage.tsx | 4 +- .../omnichannel/slaPolicies/SlaTable.tsx | 41 ++++++++----- .../ee/client/omnichannel/tags/TagsPage.tsx | 4 +- .../ee/client/omnichannel/tags/TagsTable.tsx | 43 +++++++------ .../ee/client/omnichannel/units/UnitsPage.tsx | 2 +- .../client/omnichannel/units/UnitsTable.tsx | 41 ++++++++----- .../rocketchat-i18n/i18n/en.i18n.json | 54 ++++++++++++++--- .../e2e/page-objects/omnichannel-agents.ts | 2 +- .../page-objects/omnichannel-contacts-list.ts | 2 +- .../page-objects/omnichannel-departments.ts | 2 +- .../omnichannel-manage-contact.ts | 2 +- .../e2e/page-objects/omnichannel-manager.ts | 2 +- .../page-objects/omnichannel-sla-policies.ts | 2 +- .../e2e/page-objects/omnichannel-triggers.ts | 2 +- yarn.lock | 35 ++++++----- 36 files changed, 451 insertions(+), 214 deletions(-) diff --git a/apps/meteor/client/components/GenericNoResults/GenericNoResults.tsx b/apps/meteor/client/components/GenericNoResults/GenericNoResults.tsx index 5a630898ab13..3fcfe2b0e0ac 100644 --- a/apps/meteor/client/components/GenericNoResults/GenericNoResults.tsx +++ b/apps/meteor/client/components/GenericNoResults/GenericNoResults.tsx @@ -1,30 +1,48 @@ -import { States, StatesIcon, StatesTitle, StatesSubtitle, StatesActions, StatesAction } from '@rocket.chat/fuselage'; +import { Box, States, StatesIcon, StatesLink, StatesTitle, StatesSubtitle, StatesActions, StatesAction } from '@rocket.chat/fuselage'; import type { Keys as IconName } from '@rocket.chat/icons'; import { useTranslation } from '@rocket.chat/ui-contexts'; import React from 'react'; +type LinkProps = { linkText: string; linkHref: string } | { linkText?: never; linkHref?: never }; +type ButtonProps = { buttonTitle: string; buttonAction: () => void } | { buttonTitle?: never; buttonAction?: never }; + type GenericNoResultsProps = { icon?: IconName; title?: string; description?: string; buttonTitle?: string; - buttonAction?: () => void; -}; +} & LinkProps & + ButtonProps; -const GenericNoResults = ({ icon = 'magnifier', title, description, buttonTitle, buttonAction }: GenericNoResultsProps) => { +const GenericNoResults = ({ + icon = 'magnifier', + title, + description, + buttonTitle, + buttonAction, + linkHref, + linkText, +}: GenericNoResultsProps) => { const t = useTranslation(); return ( - - - {title || t('No_results_found')} - {description && {description}} - {buttonTitle && buttonAction && ( - - {buttonTitle} - - )} - + + + + {title || t('No_results_found')} + {description && {description}} + {buttonTitle && buttonAction && ( + + {buttonTitle} + + )} + {linkText && linkHref && ( + + {linkText} + + )} + + ); }; diff --git a/apps/meteor/client/views/omnichannel/agents/AgentsTable/AddAgent.tsx b/apps/meteor/client/views/omnichannel/agents/AgentsTable/AddAgent.tsx index b714ac130eee..0dd293b5f3fb 100644 --- a/apps/meteor/client/views/omnichannel/agents/AgentsTable/AddAgent.tsx +++ b/apps/meteor/client/views/omnichannel/agents/AgentsTable/AddAgent.tsx @@ -1,6 +1,6 @@ import { Button, Box, Field } from '@rocket.chat/fuselage'; import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useTranslation } from '@rocket.chat/ui-contexts'; +import { useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import React, { useState } from 'react'; @@ -14,19 +14,19 @@ type AddAgentProps = { const AddAgent = ({ reload }: AddAgentProps): ReactElement => { const t = useTranslation(); const [username, setUsername] = useState(''); + const dispatchToastMessage = useToastMessageDispatch(); const saveAction = useEndpointAction('POST', '/v1/livechat/users/agent'); const handleSave = useMutableCallback(async () => { - if (!username) { - return; + try { + await saveAction({ username }); + reload(); + setUsername(''); + dispatchToastMessage({ type: 'success', message: t('Agent_added') }); + } catch (error) { + dispatchToastMessage({ type: 'error', message: error }); } - const result = await saveAction({ username }); - if (!result.success) { - return; - } - reload(); - setUsername(''); }); const handleChange = (value: unknown): void => { @@ -42,7 +42,7 @@ const AddAgent = ({ reload }: AddAgentProps): ReactElement => { diff --git a/apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTable.tsx b/apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTable.tsx index d08cc0dda352..a636433eaacb 100644 --- a/apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTable.tsx +++ b/apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTable.tsx @@ -1,6 +1,7 @@ import { Pagination } from '@rocket.chat/fuselage'; import { useDebouncedValue, useMediaQuery, useMutableCallback } from '@rocket.chat/fuselage-hooks'; import { useTranslation } from '@rocket.chat/ui-contexts'; +import { hashQueryKey } from '@tanstack/react-query'; import type { MutableRefObject } from 'react'; import React, { useMemo, useState, useEffect } from 'react'; @@ -37,6 +38,9 @@ const AgentsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { const query = useQuery({ text: debouncedFilter, current, itemsPerPage }, debouncedSort); const { data, isSuccess, isLoading, refetch } = useAgentsQuery(query); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + useEffect(() => { reload.current = refetch; }, [reload, refetch]); @@ -75,7 +79,7 @@ const AgentsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { return ( <> - setFilter(text)} /> + {((isSuccess && data?.users.length > 0) || queryHasChanged) && setFilter(text)} />} {isLoading && ( {headers} @@ -84,7 +88,16 @@ const AgentsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { )} - {isSuccess && data.users.length === 0 && } + {isSuccess && data?.users.length === 0 && queryHasChanged && } + {isSuccess && data.users.length === 0 && !queryHasChanged && ( + + )} {isSuccess && data?.users.length > 0 && ( <> diff --git a/apps/meteor/client/views/omnichannel/currentChats/CurrentChatsRoute.tsx b/apps/meteor/client/views/omnichannel/currentChats/CurrentChatsRoute.tsx index bccd437a650a..a8694fca5c35 100644 --- a/apps/meteor/client/views/omnichannel/currentChats/CurrentChatsRoute.tsx +++ b/apps/meteor/client/views/omnichannel/currentChats/CurrentChatsRoute.tsx @@ -2,6 +2,7 @@ import { Pagination } from '@rocket.chat/fuselage'; import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; import type { GETLivechatRoomsParams } from '@rocket.chat/rest-typings'; import { usePermission, useRoute, useRouteParameter, useTranslation } from '@rocket.chat/ui-contexts'; +import { hashQueryKey } from '@tanstack/react-query'; import moment from 'moment'; import type { ComponentProps, ReactElement } from 'react'; import React, { memo, useCallback, useMemo, useState } from 'react'; @@ -160,6 +161,9 @@ const CurrentChatsRoute = (): ReactElement => { const { data, isLoading, isSuccess } = useCurrentChats(query); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + const onRowClick = useMutableCallback((_id) => { directoryRoute.push({ id: _id }); }); @@ -306,12 +310,24 @@ const CurrentChatsRoute = (): ReactElement => { - ['setFilter']} - setCustomFields={setCustomFields} - customFields={customFields} - hasCustomFields={hasCustomFields} - /> + {((isSuccess && data?.rooms.length > 0) || queryHasChanged) && ( + ['setFilter']} + setCustomFields={setCustomFields} + customFields={customFields} + hasCustomFields={hasCustomFields} + /> + )} + {isSuccess && data?.rooms.length === 0 && queryHasChanged && } + {isSuccess && data?.rooms.length === 0 && !queryHasChanged && ( + + )} {isLoading && ( {headers} @@ -320,7 +336,7 @@ const CurrentChatsRoute = (): ReactElement => { )} - {isSuccess && data.rooms.length > 0 && ( + {isSuccess && data?.rooms.length > 0 && ( <> {headers} @@ -339,7 +355,6 @@ const CurrentChatsRoute = (): ReactElement => { /> )} - {isSuccess && data.rooms.length === 0 && } {id === 'custom-fields' && hasCustomFields && ( diff --git a/apps/meteor/client/views/omnichannel/currentChats/hooks/useCurrentChats.ts b/apps/meteor/client/views/omnichannel/currentChats/hooks/useCurrentChats.ts index 6ed25408e01b..4f3696709549 100644 --- a/apps/meteor/client/views/omnichannel/currentChats/hooks/useCurrentChats.ts +++ b/apps/meteor/client/views/omnichannel/currentChats/hooks/useCurrentChats.ts @@ -11,6 +11,7 @@ export const useCurrentChats = (query: GETLivechatRoomsParams): UseQueryResult currentChats(debouncedQuery), { // TODO: Update this to use an stream of room changes instead of polling + refetchOnWindowFocus: false, cacheTime: 0, }); }; diff --git a/apps/meteor/client/views/omnichannel/customFields/CustomFieldsPage.tsx b/apps/meteor/client/views/omnichannel/customFields/CustomFieldsPage.tsx index 17948f08394d..6ca2fea326c5 100644 --- a/apps/meteor/client/views/omnichannel/customFields/CustomFieldsPage.tsx +++ b/apps/meteor/client/views/omnichannel/customFields/CustomFieldsPage.tsx @@ -18,7 +18,7 @@ const CustomFieldsPage = ({ reload }: { reload: MutableRefObject<() => void> }) diff --git a/apps/meteor/client/views/omnichannel/customFields/CustomFieldsTable.tsx b/apps/meteor/client/views/omnichannel/customFields/CustomFieldsTable.tsx index b92fad97633a..ce7780181ddc 100644 --- a/apps/meteor/client/views/omnichannel/customFields/CustomFieldsTable.tsx +++ b/apps/meteor/client/views/omnichannel/customFields/CustomFieldsTable.tsx @@ -1,7 +1,7 @@ import { Pagination } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useRoute, useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; +import { useDebouncedValue, useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useTranslation, useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; +import { useQuery, hashQueryKey } from '@tanstack/react-query'; import type { MutableRefObject } from 'react'; import React, { useMemo, useState, useEffect } from 'react'; @@ -22,25 +22,32 @@ import RemoveCustomFieldButton from './RemoveCustomFieldButton'; const CustomFieldsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { const t = useTranslation(); + const router = useRouter(); const [filter, setFilter] = useState(''); - const departmentsRoute = useRoute('omnichannel-customfields'); + const debouncedFilter = useDebouncedValue(filter, 500); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); const { sortBy, sortDirection, setSort } = useSort<'_id' | 'label' | 'scope' | 'visibility'>('_id'); + const handleAddNew = useMutableCallback(() => router.navigate('/omnichannel/customfields/new')); + const onRowClick = useMutableCallback((id) => () => router.navigate(`/omnichannel/customfields/edit/${id}`)); + const query = useMemo( () => ({ - text: filter, + text: debouncedFilter, sort: `{ "${sortBy}": ${sortDirection === 'asc' ? 1 : -1} }`, ...(itemsPerPage && { count: itemsPerPage }), ...(current && { offset: current }), }), - [filter, itemsPerPage, current, sortBy, sortDirection], + [debouncedFilter, itemsPerPage, current, sortBy, sortDirection], ); const getCustomFields = useEndpoint('GET', '/v1/livechat/custom-fields'); const { data, isSuccess, isLoading, refetch } = useQuery(['livechat-customFields', query], async () => getCustomFields(query)); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + useEffect(() => { reload.current = refetch; }, [reload, refetch]); @@ -72,17 +79,9 @@ const CustomFieldsTable = ({ reload }: { reload: MutableRefObject<() => void> }) ); - const onRowClick = useMutableCallback( - (id) => () => - departmentsRoute.push({ - context: 'edit', - id, - }), - ); - return ( <> - setFilter(text)} /> + {((isSuccess && data?.customFields.length > 0) || queryHasChanged) && setFilter(text)} />} {isLoading && ( {headers} @@ -91,7 +90,19 @@ const CustomFieldsTable = ({ reload }: { reload: MutableRefObject<() => void> }) )} - {isSuccess && data.customFields.length === 0 && } + {isSuccess && data.customFields.length === 0 && queryHasChanged && } + {isSuccess && data.customFields.length === 0 && !queryHasChanged && ( + + )} + {isSuccess && data.customFields.length > 0 && ( <> diff --git a/apps/meteor/client/views/omnichannel/departments/DepartmentsPage.tsx b/apps/meteor/client/views/omnichannel/departments/DepartmentsPage.tsx index 6635d0da7525..ba90e953b0d5 100644 --- a/apps/meteor/client/views/omnichannel/departments/DepartmentsPage.tsx +++ b/apps/meteor/client/views/omnichannel/departments/DepartmentsPage.tsx @@ -39,7 +39,7 @@ const DepartmentsPage = () => { - + handleTabClick(undefined)}> diff --git a/apps/meteor/client/views/omnichannel/departments/DepartmentsTable/DepartmentsTable.tsx b/apps/meteor/client/views/omnichannel/departments/DepartmentsTable/DepartmentsTable.tsx index 3817e4680cf8..467be681b32d 100644 --- a/apps/meteor/client/views/omnichannel/departments/DepartmentsTable/DepartmentsTable.tsx +++ b/apps/meteor/client/views/omnichannel/departments/DepartmentsTable/DepartmentsTable.tsx @@ -1,8 +1,8 @@ import type { ILivechatDepartment } from '@rocket.chat/core-typings'; import { Pagination } from '@rocket.chat/fuselage'; -import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; -import { useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; +import { useDebouncedValue, useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useTranslation, useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; +import { useQuery, hashQueryKey } from '@tanstack/react-query'; import React, { useState, useMemo } from 'react'; import FilterByText from '../../../../components/FilterByText'; @@ -28,6 +28,7 @@ const DEPARTMENTS_ENDPOINTS = { const DepartmentsTable = ({ archived }: { archived: boolean }) => { const t = useTranslation(); const [text, setText] = useState(''); + const router = useRouter(); const debouncedText = useDebouncedValue(text, 500); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); @@ -35,6 +36,8 @@ const DepartmentsTable = ({ archived }: { archived: boolean }) => { const getDepartments = useEndpoint('GET', archived ? DEPARTMENTS_ENDPOINTS.archived : DEPARTMENTS_ENDPOINTS.department); + const handleAddNew = useMutableCallback(() => router.navigate('/omnichannel/departments/new')); + const query = useMemo( () => ({ onlyMyDepartments: 'true' as const, @@ -50,6 +53,9 @@ const DepartmentsTable = ({ archived }: { archived: boolean }) => { keepPreviousData: true, }); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + const headers = ( <> @@ -85,7 +91,7 @@ const DepartmentsTable = ({ archived }: { archived: boolean }) => { return ( <> - setText(text)} /> + {((isSuccess && data?.departments.length > 0) || queryHasChanged) && setText(text)} />} {isLoading && ( {headers} @@ -94,7 +100,18 @@ const DepartmentsTable = ({ archived }: { archived: boolean }) => { )} - {isSuccess && data?.departments.length === 0 && } + {isSuccess && data?.departments.length === 0 && (queryHasChanged || archived) && } + {isSuccess && data?.departments.length === 0 && !queryHasChanged && !archived && ( + + )} {isSuccess && data?.departments.length > 0 && ( <> diff --git a/apps/meteor/client/views/omnichannel/directory/ContactContextualBar.tsx b/apps/meteor/client/views/omnichannel/directory/ContactContextualBar.tsx index d31648aeaae2..4267b5b66733 100644 --- a/apps/meteor/client/views/omnichannel/directory/ContactContextualBar.tsx +++ b/apps/meteor/client/views/omnichannel/directory/ContactContextualBar.tsx @@ -13,7 +13,7 @@ import ContactInfo from './contacts/contextualBar/ContactInfo'; import ContactNewEdit from './contacts/contextualBar/ContactNewEdit'; const HEADER_OPTIONS = { - new: { icon: 'user', title: 'New_Contact' }, + new: { icon: 'user', title: 'New_contact' }, info: { icon: 'user', title: 'Contact_Info' }, edit: { icon: 'pencil', title: 'Edit_Contact_Profile' }, } as const; diff --git a/apps/meteor/client/views/omnichannel/directory/calls/CallTable.tsx b/apps/meteor/client/views/omnichannel/directory/calls/CallTable.tsx index 89ae577f4bb8..131510df625b 100644 --- a/apps/meteor/client/views/omnichannel/directory/calls/CallTable.tsx +++ b/apps/meteor/client/views/omnichannel/directory/calls/CallTable.tsx @@ -1,7 +1,7 @@ import { Pagination } from '@rocket.chat/fuselage'; import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; import { useRoute, useTranslation, useEndpoint, useUserId } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; +import { useQuery, hashQueryKey } from '@tanstack/react-query'; import React, { useState, useMemo } from 'react'; import FilterByText from '../../../../components/FilterByText'; @@ -52,6 +52,9 @@ const CallTable = () => { const getVoipRooms = useEndpoint('GET', '/v1/voip/rooms'); const { data, isSuccess, isLoading } = useQuery(['voip-rooms', query], async () => getVoipRooms(query)); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + const headers = ( <> @@ -92,7 +95,7 @@ const CallTable = () => { return ( <> - setText(text)} /> + {((isSuccess && data?.rooms.length > 0) || queryHasChanged) && setText(text)} />} {isLoading && ( {headers} @@ -101,7 +104,16 @@ const CallTable = () => { )} - {isSuccess && data?.rooms.length === 0 && } + {isSuccess && data?.rooms.length === 0 && queryHasChanged && } + {isSuccess && data?.rooms.length === 0 && !queryHasChanged && ( + + )} {isSuccess && data?.rooms.length > 0 && ( <> diff --git a/apps/meteor/client/views/omnichannel/directory/chats/ChatTable.tsx b/apps/meteor/client/views/omnichannel/directory/chats/ChatTable.tsx index 50c1651f69ff..206222e3dbdb 100644 --- a/apps/meteor/client/views/omnichannel/directory/chats/ChatTable.tsx +++ b/apps/meteor/client/views/omnichannel/directory/chats/ChatTable.tsx @@ -1,6 +1,7 @@ import { Tag, Box, Pagination, States, StatesIcon, StatesTitle, StatesActions, StatesAction } from '@rocket.chat/fuselage'; import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; import { useRoute, useTranslation, useUserId } from '@rocket.chat/ui-contexts'; +import { hashQueryKey } from '@tanstack/react-query'; import moment from 'moment'; import React, { useState, useMemo, useCallback } from 'react'; @@ -91,6 +92,9 @@ const ChatTable = () => { const { data, isLoading, isSuccess, isError, refetch } = useCurrentChats(query); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + const renderRow = useCallback( ({ _id, fname, ts, closedAt, department, tags }) => ( onRowClick(_id)} action qa-user-id={_id}> @@ -130,7 +134,7 @@ const ChatTable = () => { return ( <> - setText(text)} /> + {((isSuccess && data?.rooms.length > 0) || queryHasChanged) && setText(text)} />} {isLoading && ( {headers} @@ -139,7 +143,16 @@ const ChatTable = () => { )} - {isSuccess && data?.rooms.length === 0 && } + {isSuccess && data?.rooms.length === 0 && queryHasChanged && } + {isSuccess && data?.rooms.length === 0 && !queryHasChanged && ( + + )} {isSuccess && data?.rooms.length > 0 && ( <> diff --git a/apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx b/apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx index 94e8965024b5..edec4d43a612 100644 --- a/apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx +++ b/apps/meteor/client/views/omnichannel/directory/contacts/ContactTable.tsx @@ -1,11 +1,13 @@ import { Pagination, States, StatesAction, StatesActions, StatesIcon, StatesTitle, Box } from '@rocket.chat/fuselage'; import { useDebouncedState, useDebouncedValue, useMutableCallback } from '@rocket.chat/fuselage-hooks'; import { useRoute, useTranslation } from '@rocket.chat/ui-contexts'; +import { hashQueryKey } from '@tanstack/react-query'; import type { ReactElement } from 'react'; -import React, { useMemo } from 'react'; +import React, { useMemo, useState } from 'react'; import { parseOutboundPhoneNumber } from '../../../../../ee/client/lib/voip/parseOutboundPhoneNumber'; import FilterByText from '../../../../components/FilterByText'; +import GenericNoResults from '../../../../components/GenericNoResults'; import { GenericTable, GenericTableHeader, @@ -65,6 +67,9 @@ function ContactTable(): ReactElement { const { data, isLoading, isError, isSuccess, refetch } = useCurrentContacts(query); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + const headers = ( <> @@ -94,12 +99,14 @@ function ContactTable(): ReactElement { return ( <> - setTerm(text)} - /> + {((isSuccess && data?.visitors.length > 0) || queryHasChanged) && ( + setTerm(text)} + /> + )} {isLoading && ( {headers} @@ -108,6 +115,18 @@ function ContactTable(): ReactElement { )} + {isSuccess && data?.visitors.length === 0 && queryHasChanged && } + {isSuccess && data?.visitors.length === 0 && !queryHasChanged && ( + + )} {isSuccess && data?.visitors.length > 0 && ( <> @@ -140,6 +159,7 @@ function ContactTable(): ReactElement { void }): ReactElement => { const t = useTranslation(); const [username, setUsername] = useState(''); + const dispatchToastMessage = useToastMessageDispatch(); const saveAction = useEndpointAction('POST', '/v1/livechat/users/manager'); const handleSave = useMutableCallback(async () => { - if (!username) { - return; + try { + await saveAction({ username }); + dispatchToastMessage({ type: 'success', message: t('Manager_added') }); + reload(); + setUsername(''); + } catch (error) { + dispatchToastMessage({ type: 'error', message: error }); } - const result = await saveAction({ username }); - if (!result?.success) { - return; - } - reload(); - setUsername(''); }); const handleChange = (value: unknown): void => { @@ -38,7 +38,7 @@ const AddManager = ({ reload }: { reload: () => void }): ReactElement => { diff --git a/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx b/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx index 59ebdd3b884c..64f28a4aa23a 100644 --- a/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx +++ b/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx @@ -30,7 +30,6 @@ const ManagersTable = () => { const query = useDebouncedValue( useMemo( () => ({ - // text, fields: JSON.stringify({ name: 1, username: 1, emails: 1, avatarETag: 1 }), sort: `{ "${sortBy}": ${sortDirection === 'asc' ? 1 : -1} }`, count: itemsPerPage, @@ -78,7 +77,15 @@ const ManagersTable = () => { )} - {isSuccess && data.users.length === 0 && } + {isSuccess && data.users.length === 0 && ( + + )} {isSuccess && data.users.length > 0 && ( <> diff --git a/apps/meteor/client/views/omnichannel/triggers/TriggersPage.tsx b/apps/meteor/client/views/omnichannel/triggers/TriggersPage.tsx index 83ac8ff2ccc5..457f12b39a78 100644 --- a/apps/meteor/client/views/omnichannel/triggers/TriggersPage.tsx +++ b/apps/meteor/client/views/omnichannel/triggers/TriggersPage.tsx @@ -39,7 +39,7 @@ const TriggersPage = () => { - + diff --git a/apps/meteor/client/views/omnichannel/triggers/TriggersTable.tsx b/apps/meteor/client/views/omnichannel/triggers/TriggersTable.tsx index 5eba59d650c4..729ef41d4359 100644 --- a/apps/meteor/client/views/omnichannel/triggers/TriggersTable.tsx +++ b/apps/meteor/client/views/omnichannel/triggers/TriggersTable.tsx @@ -1,8 +1,9 @@ import { Callout, Pagination } from '@rocket.chat/fuselage'; -import { useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; +import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useTranslation, useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; +import { useQuery, hashQueryKey } from '@tanstack/react-query'; import type { MutableRefObject } from 'react'; -import React, { useEffect, useMemo } from 'react'; +import React, { useEffect, useMemo, useState } from 'react'; import GenericNoResults from '../../../components/GenericNoResults/GenericNoResults'; import { @@ -17,6 +18,12 @@ import TriggersRow from './TriggersRow'; const TriggersTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { const t = useTranslation(); + const router = useRouter(); + + const handleAddNew = useMutableCallback(() => { + router.navigate('/omnichannel/triggers/new'); + }); + const { current, itemsPerPage, setItemsPerPage, setCurrent, ...paginationProps } = usePagination(); const query = useMemo(() => ({ offset: current, count: itemsPerPage }), [current, itemsPerPage]); @@ -24,6 +31,9 @@ const TriggersTable = ({ reload }: { reload: MutableRefObject<() => void> }) => const getTriggers = useEndpoint('GET', '/v1/livechat/triggers'); const { data, refetch, isSuccess, isLoading, isError } = useQuery(['livechat-triggers', query], async () => getTriggers(query)); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + useEffect(() => { reload.current = refetch; }, [reload, refetch]); @@ -51,7 +61,18 @@ const TriggersTable = ({ reload }: { reload: MutableRefObject<() => void> }) => )} - {isSuccess && data.triggers.length === 0 && } + {isSuccess && data.triggers.length === 0 && queryHasChanged && } + {isSuccess && data.triggers.length === 0 && !queryHasChanged && ( + + )} {isSuccess && data.triggers.length > 0 && ( <> diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesPage.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesPage.tsx index 6a44a799e40a..50627fa0b694 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesPage.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesPage.tsx @@ -37,9 +37,7 @@ const CannedResponsesPage = () => { - + diff --git a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesTable.tsx b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesTable.tsx index efc64a8a4e09..728ce982927e 100644 --- a/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesTable.tsx +++ b/apps/meteor/ee/client/omnichannel/cannedResponses/CannedResponsesTable.tsx @@ -1,8 +1,8 @@ import { Box, Pagination } from '@rocket.chat/fuselage'; import { useDebouncedValue, useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useTranslation, usePermission, useToastMessageDispatch, useRoute, useEndpoint } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; -import React, { useMemo } from 'react'; +import { useTranslation, usePermission, useToastMessageDispatch, useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; +import { useQuery, hashQueryKey } from '@tanstack/react-query'; +import React, { useMemo, useState } from 'react'; import GenericNoResults from '../../../../client/components/GenericNoResults'; import { @@ -34,8 +34,10 @@ type Scope = 'global' | 'department' | 'user'; const CannedResponsesTable = () => { const t = useTranslation(); - const cannedResponseRoute = useRoute('omnichannel-canned-responses'); + const router = useRouter(); const dispatchToastMessage = useToastMessageDispatch(); + const getTime = useFormatDateAndTime(); + const isMonitor = usePermission('save-department-canned-responses'); const isManager = usePermission('save-all-canned-responses'); @@ -66,30 +68,25 @@ const CannedResponsesTable = () => { [createdBy, current, debouncedText, itemsPerPage, sharing, sortBy, sortDirection], ); - const getCannedResponses = useEndpoint('GET', '/v1/canned-responses'); - const { data, isLoading, isSuccess, refetch } = useQuery(['/v1/canned-responses', query], () => getCannedResponses(query)); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); - const getTime = useFormatDateAndTime(); + const getCannedResponses = useEndpoint('GET', '/v1/canned-responses'); + const { data, isLoading, isSuccess, refetch } = useQuery(['/v1/canned-responses', query], () => getCannedResponses(query), { + refetchOnWindowFocus: false, + }); - const handleClick = useMutableCallback(() => - cannedResponseRoute.push({ - context: 'new', - }), - ); + const handleAddNew = useMutableCallback(() => router.navigate('/omnichannel/canned-responses/new')); const onRowClick = useMutableCallback((id, scope) => (): void => { if (scope === 'global' && isMonitor && !isManager) { - dispatchToastMessage({ + return dispatchToastMessage({ type: 'error', message: t('Not_authorized'), }); - return; } - cannedResponseRoute.push({ - context: 'edit', - id, - }); + router.navigate(`/omnichannel/canned-responses/edit/${id}`); }); const defaultOptions = useMemo( @@ -132,14 +129,16 @@ const CannedResponsesTable = () => { return ( <> - + {((isSuccess && data?.cannedResponses.length > 0) || queryHasChanged) && ( + + )} {isLoading && ( {headers} @@ -148,13 +147,16 @@ const CannedResponsesTable = () => { )} - {isSuccess && data?.cannedResponses.length === 0 && ( + {isSuccess && data?.cannedResponses.length === 0 && queryHasChanged && } + {isSuccess && data?.cannedResponses.length === 0 && !queryHasChanged && ( )} {isSuccess && data?.cannedResponses.length > 0 && ( diff --git a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.tsx b/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.tsx index 55bab0c2ab73..1efba3a83b99 100644 --- a/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.tsx +++ b/apps/meteor/ee/client/omnichannel/components/CannedResponse/modals/CreateCannedResponse/CreateCannedResponseModal.tsx @@ -43,7 +43,7 @@ const CreateCannedResponseModal: FC<{ return ( - {_id ? t('Edit_Canned_Response') : t('Create_Canned_Response')} + {_id ? t('Edit_Canned_Response') : t('Create_canned_response')} { onClose(null); diff --git a/apps/meteor/ee/client/omnichannel/monitors/MonitorsTable.tsx b/apps/meteor/ee/client/omnichannel/monitors/MonitorsTable.tsx index 4061214b5a0b..cffce6b4daef 100644 --- a/apps/meteor/ee/client/omnichannel/monitors/MonitorsTable.tsx +++ b/apps/meteor/ee/client/omnichannel/monitors/MonitorsTable.tsx @@ -12,7 +12,7 @@ import { } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { useTranslation, useToastMessageDispatch, useMethod, useEndpoint, useSetModal } from '@rocket.chat/ui-contexts'; -import { useMutation, useQuery } from '@tanstack/react-query'; +import { useMutation, useQuery, hashQueryKey } from '@tanstack/react-query'; import React, { useMemo, useState } from 'react'; import FilterByText from '../../../../client/components/FilterByText'; @@ -54,15 +54,23 @@ const MonitorsTable = () => { const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = pagination; const { sortBy, sortDirection, setSort } = sort; - const { data, refetch, isLoading, isSuccess, isError } = useQuery(['omnichannel', 'monitors', debouncedText, pagination, sort], () => - getMonitors({ - text, - sort: JSON.stringify({ [sort.sortBy]: sort.sortDirection === 'asc' ? 1 : -1 }), - ...(pagination.current && { offset: pagination.current }), - ...(pagination.itemsPerPage && { count: pagination.itemsPerPage }), + const query = useMemo( + () => ({ + text: debouncedText, + sort: `{ "${sortBy}": ${sortDirection === 'asc' ? 1 : -1} }`, + ...(itemsPerPage && { count: itemsPerPage }), + ...(current && { offset: current }), }), + [debouncedText, itemsPerPage, current, sortBy, sortDirection], + ); + + const { data, refetch, isLoading, isSuccess, isError } = useQuery(['omnichannel', 'monitors', debouncedText, pagination, sort], () => + getMonitors(query), ); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + const addMutation = useMutation({ mutationFn: async (username: string) => { await addMonitor(username); @@ -121,12 +129,12 @@ const MonitorsTable = () => { void} /> - setText(text)} /> + {((isSuccess && data?.monitors.length > 0) || queryHasChanged) && setText(text)} />} {isLoading && ( {headers} @@ -135,6 +143,16 @@ const MonitorsTable = () => { )} + {isSuccess && data.monitors.length === 0 && queryHasChanged && } + {isSuccess && data.monitors.length === 0 && !queryHasChanged && ( + + )} {isSuccess && data.monitors.length > 0 && ( <> @@ -163,9 +181,6 @@ const MonitorsTable = () => { /> )} - {isSuccess && data?.total === 0 && ( - - )} {isError && ( diff --git a/apps/meteor/ee/client/omnichannel/slaPolicies/SlaPage.tsx b/apps/meteor/ee/client/omnichannel/slaPolicies/SlaPage.tsx index 01d57efe7bd3..55b4d93581c3 100644 --- a/apps/meteor/ee/client/omnichannel/slaPolicies/SlaPage.tsx +++ b/apps/meteor/ee/client/omnichannel/slaPolicies/SlaPage.tsx @@ -36,9 +36,7 @@ const SlaPage = () => { - + diff --git a/apps/meteor/ee/client/omnichannel/slaPolicies/SlaTable.tsx b/apps/meteor/ee/client/omnichannel/slaPolicies/SlaTable.tsx index a4754ff0419d..ec40f7a1255d 100644 --- a/apps/meteor/ee/client/omnichannel/slaPolicies/SlaTable.tsx +++ b/apps/meteor/ee/client/omnichannel/slaPolicies/SlaTable.tsx @@ -1,7 +1,7 @@ import { Pagination } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useRoute, useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; +import { useDebouncedValue, useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useTranslation, useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; +import { useQuery, hashQueryKey } from '@tanstack/react-query'; import type { MutableRefObject } from 'react'; import React, { useMemo, useState, useEffect } from 'react'; @@ -22,36 +22,36 @@ import RemoveSlaButton from './RemoveSlaButton'; const SlaTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { const t = useTranslation(); + const router = useRouter(); + const [filter, setFilter] = useState(''); - const slaPoliciesRoute = useRoute('omnichannel-sla-policies'); + const debouncedFilter = useDebouncedValue(filter, 500); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); const { sortBy, sortDirection, setSort } = useSort<'name' | 'description' | 'dueTimeInMinutes'>('name'); const query = useMemo( () => ({ - text: filter, + text: debouncedFilter, sort: JSON.stringify({ [sortBy]: sortDirection === 'asc' ? 1 : -1 }), ...(itemsPerPage && { count: itemsPerPage }), ...(current && { offset: current }), }), - [filter, itemsPerPage, current, sortBy, sortDirection], + [debouncedFilter, itemsPerPage, current, sortBy, sortDirection], ); const getSlaData = useEndpoint('GET', '/v1/livechat/sla'); const { data, isSuccess, isLoading, refetch } = useQuery(['/v1/livechat/sla', query], () => getSlaData(query)); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + useEffect(() => { reload.current = refetch; }, [reload, refetch]); - const onRowClick = useMutableCallback( - (id) => () => - slaPoliciesRoute.push({ - context: 'edit', - id, - }), - ); + const handleAddNew = useMutableCallback(() => router.navigate('/omnichannel/sla-policies/new')); + const onRowClick = useMutableCallback((id) => () => router.navigate(`/omnichannel/sla-policies/edit/${id}`)); const headers = ( <> @@ -84,7 +84,7 @@ const SlaTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { return ( <> - setFilter(text)} /> + {((isSuccess && data?.sla.length > 0) || queryHasChanged) && setFilter(text)} />} {isLoading && ( {headers} @@ -93,7 +93,18 @@ const SlaTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { )} - {isSuccess && data?.sla.length === 0 && } + {isSuccess && data?.sla.length === 0 && queryHasChanged && } + {isSuccess && data?.sla.length === 0 && !queryHasChanged && ( + + )} {isSuccess && data?.sla.length > 0 && ( <> diff --git a/apps/meteor/ee/client/omnichannel/tags/TagsPage.tsx b/apps/meteor/ee/client/omnichannel/tags/TagsPage.tsx index d107dea669cc..88d7da913048 100644 --- a/apps/meteor/ee/client/omnichannel/tags/TagsPage.tsx +++ b/apps/meteor/ee/client/omnichannel/tags/TagsPage.tsx @@ -22,9 +22,7 @@ const TagsPage = ({ reload }: { reload: MutableRefObject<() => void> }) => { - + diff --git a/apps/meteor/ee/client/omnichannel/tags/TagsTable.tsx b/apps/meteor/ee/client/omnichannel/tags/TagsTable.tsx index 76c33d8b238f..e2fb3f6a67a8 100644 --- a/apps/meteor/ee/client/omnichannel/tags/TagsTable.tsx +++ b/apps/meteor/ee/client/omnichannel/tags/TagsTable.tsx @@ -1,7 +1,7 @@ import { Pagination } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useRoute, useTranslation, useEndpoint } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; +import { useDebouncedValue, useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useTranslation, useEndpoint, useRouter } from '@rocket.chat/ui-contexts'; +import { useQuery, hashQueryKey } from '@tanstack/react-query'; import type { MutableRefObject } from 'react'; import React, { useMemo, useState, useEffect } from 'react'; @@ -23,35 +23,33 @@ import RemoveTagButton from './RemoveTagButton'; const TagsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { const t = useTranslation(); const [filter, setFilter] = useState(''); + const debouncedFilter = useDebouncedValue(filter, 500); + const router = useRouter(); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); const { sortBy, sortDirection, setSort } = useSort<'name' | 'description'>('name'); - const tagsRoute = useRoute('omnichannel-tags'); - - const onRowClick = useMutableCallback( - (id) => () => - tagsRoute.push({ - context: 'edit', - id, - }), - ); + const onRowClick = useMutableCallback((id) => router.navigate(`/omnichannel/tags/edit/${id}`)); + const handleAddNew = useMutableCallback(() => router.navigate('/omnichannel/tags/new')); const query = useMemo( () => ({ viewAll: 'true' as const, fields: JSON.stringify({ name: 1 }), - text: filter, + text: debouncedFilter, sort: JSON.stringify({ [sortBy]: sortDirection === 'asc' ? 1 : -1 }), ...(itemsPerPage && { count: itemsPerPage }), ...(current && { offset: current }), }), - [filter, itemsPerPage, current, sortBy, sortDirection], + [debouncedFilter, itemsPerPage, current, sortBy, sortDirection], ); const getTags = useEndpoint('GET', '/v1/livechat/tags'); const { data, refetch, isSuccess, isLoading } = useQuery(['livechat-tags', query], async () => getTags(query)); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + useEffect(() => { reload.current = refetch; }, [reload, refetch]); @@ -78,7 +76,7 @@ const TagsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { return ( <> - setFilter(text)} /> + {((isSuccess && data?.tags.length > 0) || queryHasChanged) && setFilter(text)} />} {isLoading && ( {headers} @@ -87,14 +85,25 @@ const TagsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { )} - {isSuccess && data?.tags.length === 0 && } + {isSuccess && data?.tags.length === 0 && queryHasChanged && } + {isSuccess && data?.tags.length === 0 && !queryHasChanged && ( + + )} {isSuccess && data?.tags.length > 0 && ( <> {headers} {data?.tags.map(({ _id, name, description }) => ( - + onRowClick(_id)} action qa-user-id={_id}> {name} {description} diff --git a/apps/meteor/ee/client/omnichannel/units/UnitsPage.tsx b/apps/meteor/ee/client/omnichannel/units/UnitsPage.tsx index 649d5e3e7cdf..b372264190ad 100644 --- a/apps/meteor/ee/client/omnichannel/units/UnitsPage.tsx +++ b/apps/meteor/ee/client/omnichannel/units/UnitsPage.tsx @@ -23,7 +23,7 @@ const UnitsPage = ({ reload }: { reload: MutableRefObject<() => void> }) => { diff --git a/apps/meteor/ee/client/omnichannel/units/UnitsTable.tsx b/apps/meteor/ee/client/omnichannel/units/UnitsTable.tsx index efeb40332f22..6784b53acd6b 100644 --- a/apps/meteor/ee/client/omnichannel/units/UnitsTable.tsx +++ b/apps/meteor/ee/client/omnichannel/units/UnitsTable.tsx @@ -1,7 +1,7 @@ import { Pagination } from '@rocket.chat/fuselage'; -import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useEndpoint, useRoute, useTranslation } from '@rocket.chat/ui-contexts'; -import { useQuery } from '@tanstack/react-query'; +import { useDebouncedValue, useMutableCallback } from '@rocket.chat/fuselage-hooks'; +import { useEndpoint, useRouter, useTranslation } from '@rocket.chat/ui-contexts'; +import { useQuery, hashQueryKey } from '@tanstack/react-query'; import type { MutableRefObject } from 'react'; import React, { useMemo, useState, useEffect } from 'react'; @@ -23,7 +23,8 @@ import RemoveUnitButton from './RemoveUnitButton'; const UnitsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { const t = useTranslation(); const [filter, setFilter] = useState(''); - const unitsRoute = useRoute('omnichannel-units'); + const debouncedFilter = useDebouncedValue(filter, 500); + const router = useRouter(); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); const { sortBy, sortDirection, setSort } = useSort<'name' | 'visibility'>('name'); @@ -31,28 +32,27 @@ const UnitsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { const query = useMemo( () => ({ fields: JSON.stringify({ name: 1 }), - text: filter, + text: debouncedFilter, sort: JSON.stringify({ [sortBy]: sortDirection === 'asc' ? 1 : -1 }), ...(itemsPerPage && { count: itemsPerPage }), ...(current && { offset: current }), }), - [filter, itemsPerPage, current, sortBy, sortDirection], + [debouncedFilter, itemsPerPage, current, sortBy, sortDirection], ); const getUnits = useEndpoint('GET', '/v1/livechat/units'); const { isSuccess, isLoading, data, refetch } = useQuery(['livechat-units', query], async () => getUnits(query)); + const [defaultQuery] = useState(hashQueryKey([query])); + const queryHasChanged = defaultQuery !== hashQueryKey([query]); + useEffect(() => { reload.current = refetch; }, [refetch, reload]); - const onRowClick = useMutableCallback( - (id) => () => - unitsRoute.push({ - context: 'edit', - id, - }), - ); + const handleAddNew = useMutableCallback(() => router.navigate('/omnichannel/units/new')); + const onRowClick = useMutableCallback((id) => () => router.navigate(`/omnichannel/units/edit/${id}`)); + const headers = ( <> @@ -75,7 +75,7 @@ const UnitsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { return ( <> - setFilter(text)} /> + {((isSuccess && data?.units.length > 0) || queryHasChanged) && setFilter(text)} />} {isLoading && ( {headers} @@ -84,7 +84,18 @@ const UnitsTable = ({ reload }: { reload: MutableRefObject<() => void> }) => { )} - {isSuccess && data.units.length === 0 && } + {isSuccess && data.units.length === 0 && queryHasChanged && } + {isSuccess && data.units.length === 0 && !queryHasChanged && ( + + )} {isSuccess && data?.units.length > 0 && ( <> diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index 8c6cdd9562fa..e406fb1d484e 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -871,7 +871,10 @@ "Canned_Response_Sharing_Public_Description": "Anyone can access this canned response", "Canned_Responses": "Canned Responses", "Canned_Responses_Enable": "Enable Canned Responses", - "Create_your_First_Canned_Response": "Create Your First Canned Response", + "Create_department": "Create department", + "Create_tag": "Create tag", + "Create_trigger": "Create trigger", + "Create_SLA_policy": "Create SLA policy", "Cannot_invite_users_to_direct_rooms": "Cannot invite users to direct rooms", "Cannot_open_conversation_with_yourself": "Cannot Direct Message with yourself", "Cannot_share_your_location": "Cannot share your location...", @@ -1386,7 +1389,8 @@ "Country_Zambia": "Zambia", "Country_Zimbabwe": "Zimbabwe", "Create": "Create", - "Create_Canned_Response": "Create Canned Response", + "Create_canned_response": "Create canned response", + "Create_custom_field": "Create custom field", "Create_channel": "Create Channel", "Create_channels": "Create channels", "Create_a_public_channel_that_new_workspace_members_can_join": "Create a public channel that new workspace members can join.", @@ -1394,6 +1398,7 @@ "Create_new": "Create new", "Create_new_members": "Create New Members", "Create_unique_rules_for_this_channel": "Create unique rules for this channel", + "Create_unit": "Create unit", "create-c": "Create Public Channels", "create-c_description": "Permission to create public channels", "create-d": "Create Direct Messages", @@ -2977,6 +2982,20 @@ "Lead_capture_email_regex": "Lead capture email regex", "Lead_capture_phone_regex": "Lead capture phone regex", "Learn_more": "Learn more", + "Learn_more_about_agents": "Learn more about agents", + "Learn_more_about_canned_responses": "Learn more about canned responses", + "Learn_more_about_contacts": "Learn more about contacts", + "Learn_more_about_current_chats": "Learn more about current chats", + "Learn_more_about_custom_fields": "Learn more about custom fields", + "Learn_more_about_conversations": "Learn more about conversations", + "Learn_more_about_departments": "Learn more about departments", + "Learn_more_about_managers": "Learn more about managers", + "Learn_more_about_monitors": "Learn more about monitors", + "Learn_more_about_SLA_policies": "Learn more about SLA policies", + "Learn_more_about_tags": "Learn more about tags", + "Learn_more_about_triggers": "Learn more about triggers", + "Learn_more_about_units": "Learn more about units", + "Learn_more_about_voice_channel": "Learn more about voice channel", "Least_recent_updated": "Least recent updated", "Learn_how_to_unlock_the_myriad_possibilities_of_rocket_chat": "Learn how to unlock the myriad possibilities of Rocket.Chat.", "Leave": "Leave", @@ -3541,14 +3560,13 @@ "New": "New", "New_Application": "New Application", "New_Business_Hour": "New Business Hour", - "New_Canned_Response": "New Canned Response", "New_Call": "New Call", "New_Call_Enterprise_Edition_Only": "New Call (Enterprise Edition Only)", "New_chat_in_queue": "New chat in queue", "New_chat_priority": "Priority Changed: {{user}} changed the priority to {{priority}}", "New_chat_transfer": "New Chat Transfer: {{transfer}}", "New_chat_transfer_fallback": "Transferred to fallback department: {{fallback}}", - "New_Contact": "New Contact", + "New_contact": "New contact", "New_Custom_Field": "New Custom Field", "New_Department": "New Department", "New_discussion": "New discussion", @@ -3587,10 +3605,24 @@ "No_app_matches_for": "No app matches for", "No_apps_installed": "No Apps Installed", "No_Canned_Responses": "No Canned Responses", - "No_Canned_Responses_Yet": "No Canned Responses Yet", + "No_Canned_Responses_Yet": "No canned responses yet", "No_Canned_Responses_Yet-description": "Use canned responses to provide quick and consistent answers to frequently asked questions.", "No_channels_in_team": "No Channels on this Team", + "No_agents_yet": "No agents yet", + "No_agents_yet_description": "Add agents to engage with your audience and provide optimized customer service.", "No_channels_yet": "You aren't part of any channels yet", + "No_chats_yet": "No chats yet", + "No_chats_yet_description": "All your chats will appear here.", + "No_calls_yet": "No calls yet", + "No_calls_yet_description": "All your calls will appear here.", + "No_contacts_yet": "No contacts yet", + "No_contacts_yet_description": "All contacts will appear here.", + "No_custom_fields_yet": "No custom fields yet", + "No_custom_fields_yet_description": "Add custom fields into contact or ticket details or display them on the live chat registration form for new visitors.", + "No_departments_yet": "No departments yet", + "No_departments_yet_description": "Organize agents into departments, set how tickets get forwarded and monitor their performance.", + "No_managers_yet": "No managers yet", + "No_managers_yet_description": "Managers have access to all omnichannel controls, being able to monitor and take actions.", "No_content_was_provided": "No content was provided", "No_data_found": "No data found", "No_direct_messages_yet": "No Direct Messages.", @@ -3611,8 +3643,14 @@ "No_mentions_found": "No mentions found", "No_messages_found_to_prune": "No messages found to prune", "No_messages_yet": "No messages yet", - "No_monitors_found": "No monitors found", - "No_monitors_found_description": "Assign a monitor now using the dropdown above or change your search parameters", + "No_monitors_yet": "No monitors yet", + "No_monitors_yet_description": "Monitors have partial control of Omnichannel. They can view department analytics and activities of the business units they are assigned.", + "No_tags_yet": "No tags yet", + "No_tags_yet_description": "Add tags to tickets to make organizing and finding related conversations easier.", + "No_triggers_yet": "No triggers yet", + "No_triggers_yet_description": "Triggers are events that cause the live chat widget to open and send messages automatically.", + "No_units_yet": "No units yet", + "No_units_yet_description": "Use units to group departments and manage them better.", "No_pages_yet_Try_hitting_Reload_Pages_button": "No pages yet. Try hitting \"Reload Pages\" button.", "No_pinned_messages": "No pinned messages", "No_previous_chat_found": "No previous chat found", @@ -3621,6 +3659,8 @@ "No_requests": "No requests", "No_results_found": "No results found", "No_results_found_for": "No results found for:", + "No_SLA_policies_yet": "No SLA policies yet", + "No_SLA_policies_yet_description": "Use SLA policies to change the order of Omnichannel queues based on estimated wait time.", "No_snippet_messages": "No snippet", "No_starred_messages": "No starred messages", "No_such_command": "No such command: `/{{command}}`", diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts index 6bc5875628d0..7e9ac3c48f50 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-agents.ts @@ -21,7 +21,7 @@ export class OmnichannelAgents { } get btnAdd(): Locator { - return this.page.locator('button.rcx-button--primary.rcx-button >> text="Add"'); + return this.page.locator('button.rcx-button--primary.rcx-button >> text="Add agent"'); } get firstRowInTable() { diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-contacts-list.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-contacts-list.ts index 0805b8f5e258..f5d863590bfa 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-contacts-list.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-contacts-list.ts @@ -17,7 +17,7 @@ export class OmnichannelContacts { } get btnNewContact(): Locator { - return this.page.locator('button >> text="New Contact"'); + return this.page.locator('button >> text="New contact"'); } get inputSearch(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts index 347708f312ef..c2f4fa51063e 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-departments.ts @@ -22,7 +22,7 @@ export class OmnichannelDepartments { } get btnNew() { - return this.page.locator('button.rcx-button >> text="New"'); + return this.page.locator('button.rcx-button >> text="Create department"'); } get btnEnabled() { diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-manage-contact.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-manage-contact.ts index cfae81ec6086..18bf71376626 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-manage-contact.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-manage-contact.ts @@ -8,7 +8,7 @@ export class OmnichannelManageContact { } get newContactTitle(): Locator { - return this.page.locator('h3 >> text="New Contact"'); + return this.page.locator('h3 >> text="New contact"'); } get editContactTitle(): Locator { diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts index 78ff9bcab652..7eecca8de892 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-manager.ts @@ -17,7 +17,7 @@ export class OmnichannelManager { } get btnAdd(): Locator { - return this.page.locator('button.rcx-button--primary.rcx-button >> text="Add"'); + return this.page.locator('button.rcx-button--primary.rcx-button >> text="Add manager"'); } firstRowInTable(userId: string) { diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-sla-policies.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-sla-policies.ts index 4514a80c12c5..3093cafeeea0 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-sla-policies.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-sla-policies.ts @@ -64,7 +64,7 @@ export class OmnichannelSlaPolicies { } get btnNew() { - return this.page.locator('button.rcx-button >> text="New"'); + return this.page.locator('button.rcx-button >> text="Create SLA policy"'); } get btnDelete() { diff --git a/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts index 3435b28314d0..abb1bb171279 100644 --- a/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts +++ b/apps/meteor/tests/e2e/page-objects/omnichannel-triggers.ts @@ -13,7 +13,7 @@ export class OmnichannelTriggers { } get btnNew(): Locator { - return this.page.locator('role=button[name="New"]'); + return this.page.locator('role=button[name="Create trigger"]'); } get Name(): Locator { diff --git a/yarn.lock b/yarn.lock index e70e852f468e..9411b87d17f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7295,7 +7295,7 @@ __metadata: languageName: unknown linkType: soft -"@rocket.chat/css-in-js@npm:^0.31.24, @rocket.chat/css-in-js@npm:~0.31.23-dev.174": +"@rocket.chat/css-in-js@npm:^0.31.24, @rocket.chat/css-in-js@npm:~0.31.23-dev.174, @rocket.chat/css-in-js@npm:~0.31.23-dev.177": version: 0.31.24 resolution: "@rocket.chat/css-in-js@npm:0.31.24" dependencies: @@ -7321,7 +7321,7 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/css-supports@npm:^0.31.24, @rocket.chat/css-supports@npm:~0.31.23-dev.174": +"@rocket.chat/css-supports@npm:^0.31.24, @rocket.chat/css-supports@npm:~0.31.23-dev.174, @rocket.chat/css-supports@npm:~0.31.23-dev.177": version: 0.31.24 resolution: "@rocket.chat/css-supports@npm:0.31.24" dependencies: @@ -7533,13 +7533,20 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/fuselage-tokens@npm:next, @rocket.chat/fuselage-tokens@npm:~0.32.0-dev.350": +"@rocket.chat/fuselage-tokens@npm:next": version: 0.32.0-dev.350 resolution: "@rocket.chat/fuselage-tokens@npm:0.32.0-dev.350" checksum: 2ebc0c892088377eacc6140657cc5859e6af3742a8c914922a1d95bed9f9f53dd6215f0f4abc854e74b51ff42e4d30b192b5698b9608f6828d32de7460733006 languageName: node linkType: hard +"@rocket.chat/fuselage-tokens@npm:~0.32.0-dev.353": + version: 0.32.0-dev.353 + resolution: "@rocket.chat/fuselage-tokens@npm:0.32.0-dev.353" + checksum: bb4afc1342e6d9c30f2f25c82de31e9f8f03dba2a81967ca634747b1fddd4b411743c202a72512b713e96205c16bf6e4192d258db75990171001e10ceeea1e7a + languageName: node + linkType: hard + "@rocket.chat/fuselage-ui-kit@workspace:^, @rocket.chat/fuselage-ui-kit@workspace:packages/fuselage-ui-kit, @rocket.chat/fuselage-ui-kit@workspace:~": version: 0.0.0-use.local resolution: "@rocket.chat/fuselage-ui-kit@workspace:packages/fuselage-ui-kit" @@ -7596,14 +7603,14 @@ __metadata: linkType: soft "@rocket.chat/fuselage@npm:next": - version: 0.32.0-dev.400 - resolution: "@rocket.chat/fuselage@npm:0.32.0-dev.400" - dependencies: - "@rocket.chat/css-in-js": ~0.31.23-dev.174 - "@rocket.chat/css-supports": ~0.31.23-dev.174 - "@rocket.chat/fuselage-tokens": ~0.32.0-dev.350 - "@rocket.chat/memo": ~0.31.23-dev.174 - "@rocket.chat/styled": ~0.31.23-dev.174 + version: 0.32.0-dev.403 + resolution: "@rocket.chat/fuselage@npm:0.32.0-dev.403" + dependencies: + "@rocket.chat/css-in-js": ~0.31.23-dev.177 + "@rocket.chat/css-supports": ~0.31.23-dev.177 + "@rocket.chat/fuselage-tokens": ~0.32.0-dev.353 + "@rocket.chat/memo": ~0.31.23-dev.177 + "@rocket.chat/styled": ~0.31.23-dev.177 invariant: ^2.2.4 react-aria: ~3.23.1 react-keyed-flatten-children: ^1.3.0 @@ -7615,7 +7622,7 @@ __metadata: react: ^17.0.2 react-dom: ^17.0.2 react-virtuoso: 1.2.4 - checksum: 1a9fd0f653ba43da3c13091682b9f4e3ff74ecd12fe30b0ee01a2d3e583a84fb736a4c0c9cc505d19ab96dff3a96c03525446badeeca99fdb52f86fa0424f92d + checksum: dc21d8c28031e6fbf623def836b84d636cfc778d8a585eb2dca7af05e1b6fb8cb3aeed251f4cc0571bfa8e98e0b6c379d7b6857e5dce424b9e85ccb25a44343c languageName: node linkType: hard @@ -7853,7 +7860,7 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/memo@npm:^0.31.24, @rocket.chat/memo@npm:~0.31.23-dev.174": +"@rocket.chat/memo@npm:^0.31.24, @rocket.chat/memo@npm:~0.31.23-dev.174, @rocket.chat/memo@npm:~0.31.23-dev.177": version: 0.31.24 resolution: "@rocket.chat/memo@npm:0.31.24" checksum: f63baeac39f50f67ced26c0770334b7e6fa35c81e227b813b7e49015bcd7f102aafff3b6a1fef3e2720ee483e729882dd5734ea339dcfdc30e6f193681a02487 @@ -8686,7 +8693,7 @@ __metadata: languageName: node linkType: hard -"@rocket.chat/styled@npm:~0.31.23-dev.174": +"@rocket.chat/styled@npm:~0.31.23-dev.174, @rocket.chat/styled@npm:~0.31.23-dev.177": version: 0.31.24 resolution: "@rocket.chat/styled@npm:0.31.24" dependencies: From 074db3b419098b860b27f80e16ab34d4921c90d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=83=87=E3=83=B4=E3=81=81=E3=82=93=E3=81=99?= <61188295+Dnouv@users.noreply.github.com> Date: Sat, 5 Aug 2023 21:01:44 +0530 Subject: [PATCH 011/408] feat: new context bar for moderation console (#29798) * add accordion to view reported messages * add changeset * update i18n and add new report message action * update the changeset * useToggle, fix format * fix ts and lint --------- Co-authored-by: Tasso Evangelista --- .changeset/slimy-wasps-double.md | 7 +++ .../admin/moderation/MessageContextFooter.tsx | 16 ++---- .../admin/moderation/MessageReportInfo.tsx | 55 ++++--------------- .../moderation/ModerationConsolePage.tsx | 8 +-- .../views/admin/moderation/UserMessages.tsx | 48 ++++++---------- .../moderation/helpers/ContextMessage.tsx | 15 ++++- .../admin/moderation/helpers/ReportReason.tsx | 26 +++++++++ .../helpers/ReportReasonCollapsible.tsx | 25 +++++++++ .../hooks/useDeactivateUserAction.tsx | 4 +- .../moderation/hooks/useDeleteMessage.tsx | 3 +- .../hooks/useDeleteMessagesAction.tsx | 2 +- .../hooks/useDismissMessageAction.tsx | 48 ++++++++++++++++ .../moderation/hooks/useDismissUserAction.tsx | 14 ++--- .../moderation/hooks/useResetAvatarAction.tsx | 2 +- .../rocketchat-i18n/i18n/en.i18n.json | 53 ++++++++++-------- 15 files changed, 194 insertions(+), 132 deletions(-) create mode 100644 .changeset/slimy-wasps-double.md create mode 100644 apps/meteor/client/views/admin/moderation/helpers/ReportReason.tsx create mode 100644 apps/meteor/client/views/admin/moderation/helpers/ReportReasonCollapsible.tsx create mode 100644 apps/meteor/client/views/admin/moderation/hooks/useDismissMessageAction.tsx diff --git a/.changeset/slimy-wasps-double.md b/.changeset/slimy-wasps-double.md new file mode 100644 index 000000000000..b28de342b274 --- /dev/null +++ b/.changeset/slimy-wasps-double.md @@ -0,0 +1,7 @@ +--- +'@rocket.chat/meteor': minor +'@rocket.chat/ui-contexts': minor +--- + +UX improvement for the Moderation Console Context bar for viewing the reported messages. The Report reason is now displayed in the reported messages context bar. +The Moderation Action Modal confirmation description is updated to be more clear and concise. diff --git a/apps/meteor/client/views/admin/moderation/MessageContextFooter.tsx b/apps/meteor/client/views/admin/moderation/MessageContextFooter.tsx index 37303c5e7d61..e8774853155c 100644 --- a/apps/meteor/client/views/admin/moderation/MessageContextFooter.tsx +++ b/apps/meteor/client/views/admin/moderation/MessageContextFooter.tsx @@ -10,24 +10,20 @@ import useResetAvatarAction from './hooks/useResetAvatarAction'; const MessageContextFooter: FC<{ userId: string; deleted: boolean }> = ({ userId, deleted }) => { const t = useTranslation(); + const { action: dismissReportAction } = useDismissUserAction(userId); const { action } = useDeleteMessagesAction(userId); return ( - - + { const t = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); const getReportsByMessage = useEndpoint('GET', `/v1/moderation.reports`); - const moderationRoute = useRoute('moderation-console'); - const formatDateAndTime = useFormatDateAndTime(); - const formatTime = useFormatTime(); - const formatDate = useFormatDate(); const useRealName = Boolean(useSetting('UI_Use_Real_Name')); const { @@ -60,39 +50,16 @@ const MessageReportInfo = ({ msgId }: { msgId: string }): JSX.Element => { return ( <> - - router.navigate(-1)} /> - {t('Report')} - moderationRoute.push({})} /> - {isSuccessReportsByMessage && reportsByMessage?.reports && ( - {reports.map((report) => ( - - {formatDate(report.ts)} - - - - - - - - {report.reportedBy - ? getUserDisplayName(report.reportedBy.name, report.reportedBy.username, useRealName) - : 'Rocket.Cat'} - - <> - {useRealName && ( -  @{report.reportedBy ? report.reportedBy.username : 'rocket.cat'} - )} - - - {formatTime(report.ts)} - - {report.description} - - - + {reports.map((report, index) => ( + ))} )} diff --git a/apps/meteor/client/views/admin/moderation/ModerationConsolePage.tsx b/apps/meteor/client/views/admin/moderation/ModerationConsolePage.tsx index 16445c291f67..005463f246ec 100644 --- a/apps/meteor/client/views/admin/moderation/ModerationConsolePage.tsx +++ b/apps/meteor/client/views/admin/moderation/ModerationConsolePage.tsx @@ -4,7 +4,6 @@ import React from 'react'; import { Contextualbar } from '../../../components/Contextualbar'; import Page from '../../../components/Page'; import { getPermaLink } from '../../../lib/getPermaLink'; -import MessageReportInfo from './MessageReportInfo'; import ModerationConsoleTable from './ModerationConsoleTable'; import UserMessages from './UserMessages'; @@ -32,12 +31,7 @@ const ModerationConsolePage = () => { - {context && ( - - {context === 'info' && id && } - {context === 'reports' && id && } - - )} + {context && {context === 'info' && id && }} ); }; diff --git a/apps/meteor/client/views/admin/moderation/UserMessages.tsx b/apps/meteor/client/views/admin/moderation/UserMessages.tsx index f3976d6045d9..943c0f53d5c9 100644 --- a/apps/meteor/client/views/admin/moderation/UserMessages.tsx +++ b/apps/meteor/client/views/admin/moderation/UserMessages.tsx @@ -1,12 +1,11 @@ -import { Box, Callout, Message } from '@rocket.chat/fuselage'; +import { Box, Callout, Message, StatesAction, StatesActions, StatesIcon, StatesTitle } from '@rocket.chat/fuselage'; import { useMutableCallback } from '@rocket.chat/fuselage-hooks'; -import { useEndpoint, useRoute, useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; +import { useEndpoint, useRouter, useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; -import React, { useMemo } from 'react'; +import React from 'react'; import { ContextualbarHeader, ContextualbarTitle, ContextualbarClose, ContextualbarFooter } from '../../../components/Contextualbar'; import GenericNoResults from '../../../components/GenericNoResults'; -import { useUserDisplayName } from '../../../hooks/useUserDisplayName'; import MessageContextFooter from './MessageContextFooter'; import ContextMessage from './helpers/ContextMessage'; @@ -14,7 +13,7 @@ import ContextMessage from './helpers/ContextMessage'; const UserMessages = ({ userId, onRedirect }: { userId: string; onRedirect: (mid: string) => void }): JSX.Element => { const t = useTranslation(); const dispatchToastMessage = useToastMessageDispatch(); - const moderationRoute = useRoute('moderation-console'); + const moderationRoute = useRouter(); const getUserMessages = useEndpoint('GET', '/v1/moderation.user.reportedMessages'); const { @@ -22,6 +21,7 @@ const UserMessages = ({ userId, onRedirect }: { userId: string; onRedirect: (mid refetch: reloadUserMessages, isLoading: isLoadingUserMessages, isSuccess: isSuccessUserMessages, + isError, } = useQuery( ['moderation.userMessages', { userId }], async () => { @@ -35,39 +35,15 @@ const UserMessages = ({ userId, onRedirect }: { userId: string; onRedirect: (mid }, ); - // opens up the 'reports' tab when the user clicks on a user in the 'users' tab - const handleClick = useMutableCallback((id): void => { - moderationRoute.push({ - context: 'reports', - id, - }); - }); - const handleChange = useMutableCallback(() => { reloadUserMessages(); }); - const { username, name } = useMemo(() => { - return ( - report?.user ?? - report?.messages?.[0]?.message?.u ?? { - username: t('Deleted_user'), - name: t('Deleted_user'), - } - ); - }, [report?.messages, report?.user, t]); - - const displayName = - useUserDisplayName({ - name, - username, - }) || userId; - return ( <> - {t('Moderation_Message_context_header', { displayName })} - moderationRoute.push({})} /> + {t('Moderation_Message_context_header')} + moderationRoute.navigate('/admin/moderation', { replace: true })} /> {isLoadingUserMessages && {t('Loading')}} @@ -95,7 +71,6 @@ const UserMessages = ({ userId, onRedirect }: { userId: string; onRedirect: (mid ))} {isSuccessUserMessages && report.messages.length === 0 && } + {isError && ( + + + {t('Something_went_wrong')} + + {t('Reload_page')} + + + )} {isSuccessUserMessages && report.messages.length > 0 && } diff --git a/apps/meteor/client/views/admin/moderation/helpers/ContextMessage.tsx b/apps/meteor/client/views/admin/moderation/helpers/ContextMessage.tsx index f390b25114fa..b9e7535243f4 100644 --- a/apps/meteor/client/views/admin/moderation/helpers/ContextMessage.tsx +++ b/apps/meteor/client/views/admin/moderation/helpers/ContextMessage.tsx @@ -12,20 +12,21 @@ import { useFormatDate } from '../../../../hooks/useFormatDate'; import { useFormatDateAndTime } from '../../../../hooks/useFormatDateAndTime'; import { useFormatTime } from '../../../../hooks/useFormatTime'; import { useUserDisplayName } from '../../../../hooks/useUserDisplayName'; +import MessageReportInfo from '../MessageReportInfo'; import useDeleteMessage from '../hooks/useDeleteMessage'; +import { useDismissMessageAction } from '../hooks/useDismissMessageAction'; +import ReportReasonCollapsible from './ReportReasonCollapsible'; const ContextMessage = ({ message, room, deleted, - handleClick, onRedirect, onChange, }: { message: any; room: IModerationReport['room']; deleted: boolean; - handleClick: (id: IMessage['_id']) => void; onRedirect: (id: IMessage['_id']) => void; onChange: () => void; }): JSX.Element => { @@ -34,6 +35,7 @@ const ContextMessage = ({ const isEncryptedMessage = isE2EEMessage(message); const deleteMessage = useDeleteMessage(message._id, message.rid, onChange); + const dismissMsgReport = useDismissMessageAction(message._id); const formatDateAndTime = useFormatDateAndTime(); const formatTime = useFormatTime(); @@ -76,10 +78,17 @@ const ContextMessage = ({ {message.blocks && } {message.attachments && } + + + - handleClick(message._id)} /> + dismissMsgReport.action()} + /> onRedirect(message._id)} /> deleteMessage()} /> diff --git a/apps/meteor/client/views/admin/moderation/helpers/ReportReason.tsx b/apps/meteor/client/views/admin/moderation/helpers/ReportReason.tsx new file mode 100644 index 000000000000..bd4af0143b8d --- /dev/null +++ b/apps/meteor/client/views/admin/moderation/helpers/ReportReason.tsx @@ -0,0 +1,26 @@ +import { Box, Tag } from '@rocket.chat/fuselage'; +import React from 'react'; + +import { useFormatDate } from '../../../../hooks/useFormatDate'; + +const ReportReason = ({ ind, uinfo, msg, ts }: { ind: number; uinfo: string | undefined; msg: string; ts: Date }): JSX.Element => { + const formatDate = useFormatDate(); + return ( + + Report #{ind} + + {msg} + + + + @{uinfo || 'rocket.cat'} + {' '} + + {formatDate(ts)} + + + + ); +}; + +export default ReportReason; diff --git a/apps/meteor/client/views/admin/moderation/helpers/ReportReasonCollapsible.tsx b/apps/meteor/client/views/admin/moderation/helpers/ReportReasonCollapsible.tsx new file mode 100644 index 000000000000..c22062228839 --- /dev/null +++ b/apps/meteor/client/views/admin/moderation/helpers/ReportReasonCollapsible.tsx @@ -0,0 +1,25 @@ +import { Box, Button } from '@rocket.chat/fuselage'; +import { useToggle } from '@rocket.chat/fuselage-hooks'; +import { useTranslation } from '@rocket.chat/ui-contexts'; +import React from 'react'; +import type { ReactNode } from 'react'; + +const ReportReasonCollapsible = ({ children }: { children: ReactNode }) => { + const [isOpen, setIsOpen] = useToggle(false); + const t = useTranslation(); + + const toggle = () => setIsOpen((prev) => !prev); + + return ( + <> + + + + {isOpen && children} + + ); +}; + +export default ReportReasonCollapsible; diff --git a/apps/meteor/client/views/admin/moderation/hooks/useDeactivateUserAction.tsx b/apps/meteor/client/views/admin/moderation/hooks/useDeactivateUserAction.tsx index f4b916aa2d82..c5ac3e788d4e 100644 --- a/apps/meteor/client/views/admin/moderation/hooks/useDeactivateUserAction.tsx +++ b/apps/meteor/client/views/admin/moderation/hooks/useDeactivateUserAction.tsx @@ -20,7 +20,7 @@ const useDeactivateUserAction = (userId: string) => { dispatchToastMessage({ type: 'error', message: error }); }, onSuccess: () => { - dispatchToastMessage({ type: 'success', message: t('User_has_been_deactivated') }); + dispatchToastMessage({ type: 'success', message: t('Moderation_User_deactivated') }); }, }); @@ -30,7 +30,7 @@ const useDeactivateUserAction = (userId: string) => { dispatchToastMessage({ type: 'error', message: error }); }, onSuccess: () => { - dispatchToastMessage({ type: 'success', message: t('Deleted') }); + dispatchToastMessage({ type: 'success', message: t('Moderation_Messages_deleted') }); }, }); diff --git a/apps/meteor/client/views/admin/moderation/hooks/useDeleteMessage.tsx b/apps/meteor/client/views/admin/moderation/hooks/useDeleteMessage.tsx index 9d727d2ea405..bf54eaf89e19 100644 --- a/apps/meteor/client/views/admin/moderation/hooks/useDeleteMessage.tsx +++ b/apps/meteor/client/views/admin/moderation/hooks/useDeleteMessage.tsx @@ -19,7 +19,6 @@ const useDeleteMessage = (mid: string, rid: string, onChange: () => void) => { setModal(); }, onSuccess: async () => { - dispatchToastMessage({ type: 'success', message: t('Deleted') }); await handleDismissMessage.mutateAsync({ msgId: mid }); }, }); @@ -30,7 +29,7 @@ const useDeleteMessage = (mid: string, rid: string, onChange: () => void) => { dispatchToastMessage({ type: 'error', message: error }); }, onSuccess: () => { - dispatchToastMessage({ type: 'success', message: t('Moderation_Reports_dismissed') }); + dispatchToastMessage({ type: 'success', message: t('Moderation_Message_deleted') }); }, onSettled: () => { onChange(); diff --git a/apps/meteor/client/views/admin/moderation/hooks/useDeleteMessagesAction.tsx b/apps/meteor/client/views/admin/moderation/hooks/useDeleteMessagesAction.tsx index dd884c868001..c0cce602cf88 100644 --- a/apps/meteor/client/views/admin/moderation/hooks/useDeleteMessagesAction.tsx +++ b/apps/meteor/client/views/admin/moderation/hooks/useDeleteMessagesAction.tsx @@ -18,7 +18,7 @@ const useDeleteMessagesAction = (userId: string) => { dispatchToastMessage({ type: 'error', message: error }); }, onSuccess: () => { - dispatchToastMessage({ type: 'success', message: t('Deleted') }); + dispatchToastMessage({ type: 'success', message: t('Moderation_Messages_deleted') }); }, }); diff --git a/apps/meteor/client/views/admin/moderation/hooks/useDismissMessageAction.tsx b/apps/meteor/client/views/admin/moderation/hooks/useDismissMessageAction.tsx new file mode 100644 index 000000000000..824255e57db1 --- /dev/null +++ b/apps/meteor/client/views/admin/moderation/hooks/useDismissMessageAction.tsx @@ -0,0 +1,48 @@ +import { useEndpoint, useSetModal, useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; +import { useMutation, useQueryClient } from '@tanstack/react-query'; +import React from 'react'; + +import GenericModal from '../../../../components/GenericModal'; + +export const useDismissMessageAction = (msgId: string): { action: () => void } => { + const t = useTranslation(); + const setModal = useSetModal(); + const dispatchToastMessage = useToastMessageDispatch(); + const queryClient = useQueryClient(); + + const dismissMessage = useEndpoint('POST', '/v1/moderation.dismissReports'); + + const handleDismissMessage = useMutation({ + mutationFn: dismissMessage, + onError: (error) => { + dispatchToastMessage({ type: 'error', message: error }); + }, + onSuccess: () => { + dispatchToastMessage({ type: 'success', message: t('Moderation_Reports_dismissed') }); + }, + }); + + const onDismissMessage = async () => { + await handleDismissMessage.mutateAsync({ msgId }); + queryClient.invalidateQueries({ queryKey: ['moderation.userMessages'] }); + setModal(); + }; + + const confirmDismissMessage = (): void => { + setModal( + onDismissMessage()} + onCancel={() => setModal()} + > + {t('Moderation_Dismiss_reports_confirm')} + , + ); + }; + + return { + action: () => confirmDismissMessage(), + }; +}; diff --git a/apps/meteor/client/views/admin/moderation/hooks/useDismissUserAction.tsx b/apps/meteor/client/views/admin/moderation/hooks/useDismissUserAction.tsx index 65b9b932b66b..de432b922cba 100644 --- a/apps/meteor/client/views/admin/moderation/hooks/useDismissUserAction.tsx +++ b/apps/meteor/client/views/admin/moderation/hooks/useDismissUserAction.tsx @@ -1,4 +1,4 @@ -import { useEndpoint, useRoute, useSetModal, useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; +import { useEndpoint, useRouter, useSetModal, useToastMessageDispatch, useTranslation } from '@rocket.chat/ui-contexts'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import React from 'react'; @@ -8,7 +8,7 @@ const useDismissUserAction = (userId: string) => { const t = useTranslation(); const setModal = useSetModal(); const dispatchToastMessage = useToastMessageDispatch(); - const moderationRoute = useRoute('moderation-console'); + const moderationRoute = useRouter(); const queryClient = useQueryClient(); const dismissUser = useEndpoint('POST', '/v1/moderation.dismissReports'); @@ -19,7 +19,7 @@ const useDismissUserAction = (userId: string) => { dispatchToastMessage({ type: 'error', message: error }); }, onSuccess: () => { - dispatchToastMessage({ type: 'success', message: t('Moderation_Reports_dismissed') }); + dispatchToastMessage({ type: 'success', message: t('Moderation_Reports_dismissed_plural') }); }, }); @@ -27,19 +27,19 @@ const useDismissUserAction = (userId: string) => { await handleDismissUser.mutateAsync({ userId }); queryClient.invalidateQueries({ queryKey: ['moderation.reports'] }); setModal(); - moderationRoute.push({}); + moderationRoute.navigate('/admin/moderation', { replace: true }); }; const confirmDismissUser = (): void => { setModal( onDismissUser()} onCancel={() => setModal()} > - {t('Moderation_Are_you_sure_dismiss_and_delete_reports')} + {t('Moderation_Dismiss_all_reports_confirm')} , ); }; diff --git a/apps/meteor/client/views/admin/moderation/hooks/useResetAvatarAction.tsx b/apps/meteor/client/views/admin/moderation/hooks/useResetAvatarAction.tsx index b88687f53549..516a231c9dfe 100644 --- a/apps/meteor/client/views/admin/moderation/hooks/useResetAvatarAction.tsx +++ b/apps/meteor/client/views/admin/moderation/hooks/useResetAvatarAction.tsx @@ -18,7 +18,7 @@ const useResetAvatarAction = (userId: string) => { dispatchToastMessage({ type: 'error', message: error }); }, onSuccess: () => { - dispatchToastMessage({ type: 'success', message: t('Moderation_Avatar_reset_successfully') }); + dispatchToastMessage({ type: 'success', message: t('Moderation_Avatar_reset_success') }); }, }); diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json index e406fb1d484e..3d601406d71b 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/en.i18n.json @@ -642,17 +642,12 @@ "is_uploading": "is uploading", "is_recording": "is recording", "Are_you_sure": "Are you sure?", - "Moderation_Are_you_sure_dismiss_and_delete_reports": "Are you sure you want to dismiss and delete all reports for this user's messages? This action cannot be undone.", "Are_you_sure_delete_department": "Are you sure you want to delete this department? This action cannot be undone. Please enter the department name to confirm.", - "Moderation_Are_you_sure_you_want_to_deactivate_this_user": "Are you sure you want to deactivate this user and delete all the reported messages? All the messages will be deleted permanently, and user will not be able to log in. This action cannot be undone.", "Are_you_sure_you_want_to_clear_all_unread_messages": "Are you sure you want to clear all unread messages?", - "Moderation_Are_you_sure_you_want_to_delete_this_message": "Are you sure you want to delete this message and dismiss all reports against this message? The message will be deleted from the message history and no one will be able to see it. This action cannot be undone.", "Are_you_sure_you_want_to_close_this_chat": "Are you sure you want to close this chat?", "Are_you_sure_you_want_to_delete_this_record": "Are you sure you want to delete this record?", "Are_you_sure_you_want_to_delete_your_account": "Are you sure you want to delete your account?", - "Moderation_Are_you_sure_you_want_to_delete_all_reported_messages_from_this_user": "Are you sure you want to delete all reported messages from this user? The messages will be deleted from the message history and no one will be able to see it. This action cannot be undone.", "Are_you_sure_you_want_to_disable_Facebook_integration": "Are you sure you want to disable Facebook integration?", - "Moderation_Are_you_sure_you_want_to_reset_the_avatar": "Are you sure you want to reset this users avatar? This action cannot be undone.", "Are_you_sure_you_want_to_reset_the_name_of_all_priorities": "Are you sure you want to reset the name of all priorities?", "Assets": "Assets", "Assets_Description": "Modify your workspace's logo, icon, favicon and more.", @@ -713,7 +708,6 @@ "Avatar": "Avatar", "Avatars": "Avatars", "Avatar_changed_successfully": "Avatar changed successfully", - "Moderation_Avatar_reset_successfully": "Avatar reset successfully", "Avatar_URL": "Avatar URL", "Avatar_format_invalid": "Invalid Format. Only image type is allowed", "Avatar_url_invalid_or_error": "The url provided is invalid or not accessible. Please try again, but with a different url.", @@ -1517,7 +1511,6 @@ "DDP_Rate_Limit_User_Interval_Time": "Limit by User: interval time", "DDP_Rate_Limit_User_Requests_Allowed": "Limit by User: requests allowed", "Deactivate": "Deactivate", - "Moderation_Deactivate_User": "Deactivate user", "Decline": "Decline", "Decode_Key": "Decode Key", "default": "default", @@ -1532,7 +1525,6 @@ "Delete_Department?": "Delete Department?", "Delete_File_Warning": "Deleting a file will delete it forever. This cannot be undone.", "Delete_message": "Delete message", - "Moderation_Delete_all_messages": "Delete all messages", "Delete_my_account": "Delete my account", "Delete_Role_Warning": "This cannot be undone", "Delete_Role_Warning_Community_Edition": "This cannot be undone. Note that it's not possible to create new custom roles in Community Edition", @@ -1664,7 +1656,6 @@ "Discussions_unavailable_for_federation": "Discussions are unavailable for Federated rooms", "discussion-created": "{{message}}", "Discussions": "Discussions", - "Moderation_Dismiss_reports": "Dismiss reports", "Display": "Display", "Display_avatars": "Display Avatars", "Display_Avatars_Sidebar": "Display Avatars in Sidebar", @@ -1713,8 +1704,6 @@ "Markdown_Marked_SmartLists": "Enable Marked Smart Lists", "Duplicate_private_group_name": "A Private Group with name '%s' exists", "Markdown_Marked_Smartypants": "Enable Marked Smartypants", - "Moderation_Duplicate_messages": "Duplicated messages", - "Moderation_Duplicate_messages_warning": "Following may contain same messages sent in multiple rooms.", "Duplicated_Email_address_will_be_ignored": "Duplicated email address will be ignored.", "Markdown_Marked_Tables": "Enable Marked Tables", "duplicated-account": "Duplicated account", @@ -3494,13 +3483,38 @@ "mobile-upload-file_description": "Permission to allow file upload on mobile devices", "Mobile_Push_Notifications_Default_Alert": "Push Notifications Default Alert", "Moderation": "Moderation", - "Moderation_View_reports": "View reports", + "Moderation_Show_reports": "Show reports", "Moderation_Go_to_message": "Go to message", "Moderation_Delete_message": "Delete message", "Moderation_Dismiss_and_delete": "Dismiss and delete", "Moderation_Delete_this_message": "Delete this message", - "Moderation_Message_context_header": "Message(s) from {{displayName}}", + "Moderation_Message_context_header": "Reported message(s)", + "Moderation_Message_deleted": "Message deleted and reports dismissed", + "Moderation_Messages_deleted": "Messages deleted and reports dismissed", "Moderation_Action_View_reports": "View reported messages", + "Moderation_Hide_reports": "Hide reports", + "Moderation_Dismiss_all_reports": "Dismiss all reports", + "Moderation_Deactivate_User": "Deactivate user", + "Moderation_User_deactivated": "User deactivated", + "Moderation_Delete_all_messages": "Delete all messages", + "Moderation_Dismiss_reports": "Dismiss reports", + "Moderation_Duplicate_messages": "Duplicated messages", + "Moderation_Duplicate_messages_warning": "Following may contain same messages sent in multiple rooms.", + "Moderation_Report_date": "Report date", + "Moderation_Report_plural": "Reports", + "Moderation_Reported_message": "Reported message", + "Moderation_Reports_dismissed": "Reports dismissed", + "Moderation_Reports_dismissed_plural": "All reports dismissed", + "Moderation_Message_already_deleted": "Message is already deleted", + "Moderation_Reset_user_avatar": "Reset user avatar", + "Moderation_See_messages": "See messages", + "Moderation_Avatar_reset_success": "Avatar reset", + "Moderation_Dismiss_reports_confirm": "Reports will be deleted and the reported message won't be affected.", + "Moderation_Dismiss_all_reports_confirm": "All reports will be deleted and the reported messages won't be affected.", + "Moderation_Are_you_sure_you_want_to_delete_this_message": "This message will be permanently deleted from its respective room and the report will be dismissed.", + "Moderation_Are_you_sure_you_want_to_reset_the_avatar": "Resetting user avatar will permanently remove their current avatar.", + "Moderation_Are_you_sure_you_want_to_deactivate_this_user": "User will be unable to log in unless reactivated. All reported messages will be permanently deleted from their respective room.", + "Moderation_Are_you_sure_you_want_to_delete_all_reported_messages_from_this_user": "All reported messages from this user will be permanently deleted from their respective room and the report will be dismissed.", "Moderation_User_deleted_warning": "The user who sent the message(s) no longer exists or has been removed.", "Monday": "Monday", "Mongo_storageEngine": "Mongo Storage Engine", @@ -3553,7 +3567,7 @@ "Name_Placeholder": "Please enter your name...", "Navigation": "Navigation", "Navigation_bar": "Navigation bar", - "Navigation_bar_description": "Introducing the navigation bar — a higher-level navigation designed to help users quickly find what they need. With its compact design and intuitive organization, this streamlined sidebar optimizes screen space while providing easy access to essential software features and sections.", + "Navigation_bar_description": "Introducing the navigation bar — a higher-level navigation designed to help users quickly find what they need. With its compact design and intuitive organization, this streamlined sidebar optimizes screen space while providing easy access to essential software features and sections.", "Navigation_History": "Navigation History", "Next": "Next", "Never": "Never", @@ -3963,7 +3977,6 @@ "Pool": "Pool", "Port": "Port", "Post_as": "Post as", - "Moderation_Report_date": "Report date", "Post_to": "Post to", "Post_to_Channel": "Post to Channel", "Post_to_s_as_s": "Post to %s as %s", @@ -4180,16 +4193,12 @@ "Reply_via_Email": "Reply via Email", "ReplyTo": "Reply-To", "Report": "Report", - "Moderation_Report_plural": "Reports", "Report_Abuse": "Report Abuse", "Report_exclamation_mark": "Report!", "Report_has_been_sent": "Report has been sent", "Report_Number": "Report Number", "Report_this_message_question_mark": "Report this message?", - "Moderation_Reported_message": "Reported message", "Reporting": "Reporting", - "Moderation_Reports_dismissed": "Reports dismissed", - "Moderation_Message_already_deleted": "Message is already deleted", "Request": "Request", "Request_seats": "Request Seats", "Request_more_seats": "Request more seats.", @@ -4222,7 +4231,6 @@ "Reset_password": "Reset password", "Reset_section_settings": "Restore defaults", "Reset_TOTP": "Reset TOTP", - "Moderation_Reset_user_avatar": "Reset user avatar", "reset-other-user-e2e-key": "Reset Other User E2E Key", "Responding": "Responding", "Response_description_post": "Empty bodies or bodies with an empty text property will simply be ignored. Non-200 responses will be retried a reasonable number of times. A response will be posted using the alias and avatar specified above. You can override these informations as in the example above.", @@ -4492,7 +4500,6 @@ "Secure_SaaS_solution": "Secure SaaS solution.", "Security": "Security", "See_documentation": "See documentation", - "Moderation_See_messages": "See messages", "See_Paid_Plan": "See paid plan", "See_Pricing": "See Pricing", "See_full_profile": "See full profile", @@ -4641,7 +4648,7 @@ "Show_video": "Show video", "Showing": "Showing", "Showing_archived_results": "

    Showing %s archived results

    ", - "Showing_current_of_total":"Showing {{current}} of {{total}}", + "Showing_current_of_total": "Showing {{current}} of {{total}}", "Showing_online_users": "Showing: {{total_showing}}, Online: {{online}}, Total: {{total}} users", "Showing_results": "

    Showing %s results

    ", "Showing_results_of": "Showing results %s - %s of %s", @@ -5968,4 +5975,4 @@ "Uninstall_grandfathered_app": "Uninstall {{appName}}?", "App_will_lose_grandfathered_status": "**This {{context}} app will lose its grandfathered status.** \n \nWorkspaces on Community Edition can have up to {{limit}} {{context}} apps enabled. Grandfathered apps count towards the limit but the limit is not applied to them.", "Theme_Appearence": "Theme Appearence" -} +} \ No newline at end of file From 7ed6ae04f955005c252f5213603e936b8dc63b73 Mon Sep 17 00:00:00 2001 From: "lingohub[bot]" <69908207+lingohub[bot]@users.noreply.github.com> Date: Mon, 7 Aug 2023 16:13:21 +0000 Subject: [PATCH 012/408] =?UTF-8?q?i18n:=20Language=20update=20from=20Ling?= =?UTF-8?q?oHub=20=F0=9F=A4=96=20on=202023-08-07Z=20(#30026)?= 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> --- .../rocketchat-i18n/i18n/af.i18n.json | 4 +-- .../rocketchat-i18n/i18n/ar.i18n.json | 9 +---- .../rocketchat-i18n/i18n/az.i18n.json | 4 +-- .../rocketchat-i18n/i18n/be-BY.i18n.json | 4 +-- .../rocketchat-i18n/i18n/bg.i18n.json | 4 +-- .../rocketchat-i18n/i18n/bs.i18n.json | 4 +-- .../rocketchat-i18n/i18n/ca.i18n.json | 9 +---- .../rocketchat-i18n/i18n/cs.i18n.json | 8 +---- .../rocketchat-i18n/i18n/cy.i18n.json | 4 +-- .../rocketchat-i18n/i18n/da.i18n.json | 6 +--- .../rocketchat-i18n/i18n/de-AT.i18n.json | 4 +-- .../rocketchat-i18n/i18n/de.i18n.json | 33 +++++++------------ .../rocketchat-i18n/i18n/el.i18n.json | 4 +-- .../rocketchat-i18n/i18n/eo.i18n.json | 4 +-- .../rocketchat-i18n/i18n/es.i18n.json | 9 +---- .../rocketchat-i18n/i18n/fa.i18n.json | 5 +-- .../rocketchat-i18n/i18n/fi.i18n.json | 10 +----- .../rocketchat-i18n/i18n/fr.i18n.json | 9 +---- .../rocketchat-i18n/i18n/gl.i18n.json | 1 - .../rocketchat-i18n/i18n/he.i18n.json | 3 +- .../rocketchat-i18n/i18n/hr.i18n.json | 4 +-- .../rocketchat-i18n/i18n/hu.i18n.json | 9 +---- .../rocketchat-i18n/i18n/id.i18n.json | 4 +-- .../rocketchat-i18n/i18n/it.i18n.json | 4 +-- .../rocketchat-i18n/i18n/ja.i18n.json | 9 +---- .../rocketchat-i18n/i18n/ka-GE.i18n.json | 6 +--- .../rocketchat-i18n/i18n/km.i18n.json | 5 +-- .../rocketchat-i18n/i18n/ko.i18n.json | 6 +--- .../rocketchat-i18n/i18n/ku.i18n.json | 4 +-- .../rocketchat-i18n/i18n/lo.i18n.json | 4 +-- .../rocketchat-i18n/i18n/lt.i18n.json | 4 +-- .../rocketchat-i18n/i18n/lv.i18n.json | 4 +-- .../rocketchat-i18n/i18n/mn.i18n.json | 4 +-- .../rocketchat-i18n/i18n/ms-MY.i18n.json | 4 +-- .../rocketchat-i18n/i18n/nl.i18n.json | 9 +---- .../rocketchat-i18n/i18n/no.i18n.json | 4 +-- .../rocketchat-i18n/i18n/pl.i18n.json | 11 ++----- .../rocketchat-i18n/i18n/pt-BR.i18n.json | 9 +---- .../rocketchat-i18n/i18n/pt.i18n.json | 5 +-- .../rocketchat-i18n/i18n/ro.i18n.json | 4 +-- .../rocketchat-i18n/i18n/ru.i18n.json | 9 +---- .../rocketchat-i18n/i18n/sk-SK.i18n.json | 4 +-- .../rocketchat-i18n/i18n/sl-SI.i18n.json | 4 +-- .../rocketchat-i18n/i18n/sq.i18n.json | 4 +-- .../rocketchat-i18n/i18n/sr.i18n.json | 4 +-- .../rocketchat-i18n/i18n/sv.i18n.json | 10 +----- .../rocketchat-i18n/i18n/ta-IN.i18n.json | 4 +-- .../rocketchat-i18n/i18n/th-TH.i18n.json | 4 +-- .../rocketchat-i18n/i18n/tr.i18n.json | 5 +-- .../rocketchat-i18n/i18n/ug.i18n.json | 3 +- .../rocketchat-i18n/i18n/uk.i18n.json | 4 +-- .../rocketchat-i18n/i18n/vi-VN.i18n.json | 4 +-- .../rocketchat-i18n/i18n/zh-HK.i18n.json | 4 +-- .../rocketchat-i18n/i18n/zh-TW.i18n.json | 9 +---- .../rocketchat-i18n/i18n/zh.i18n.json | 7 +--- 55 files changed, 65 insertions(+), 265 deletions(-) diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json index c7a5fd72c393..1f8dc09c9585 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/af.i18n.json @@ -795,7 +795,6 @@ "Custom_Sound_Has_Been_Deleted": "Die aangepaste klank is verwyder.", "Custom_Sound_Info": "Custom Sound Info", "Custom_Sound_Saved_Successfully": "Gepasmaakte klank is suksesvol gestoor", - "Custom_Sounds": "Aangepaste klanke", "Custom_Translations": "Aangepaste vertalings", "Custom_Translations_Description": "Moet 'n geldige JSON wees waar sleutels tale bevat wat 'n woordeboek van sleutel en vertalings bevat. Voorbeeld: `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "pas", @@ -1813,7 +1812,6 @@ "Num_Agents": "# Agente", "Number_of_messages": "Aantal boodskappe", "OAuth_Application": "OAuth Aansoek", - "OAuth_Applications": "OAuth Aansoeke", "Objects": "voorwerpe", "Off": "af", "Off_the_record_conversation": "Off-the-Record gesprek", @@ -2758,4 +2756,4 @@ "registration.component.form.invalidConfirmPass": "Die wagwoord bevestiging pas nie by die wagwoord nie", "registration.component.form.confirmPassword": "Bevestig jou wagwoord", "registration.component.form.sendConfirmationEmail": "Stuur bevestiging e-pos" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json index 1586c90737b3..3b61c7d46ef5 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ar.i18n.json @@ -729,7 +729,6 @@ "Canned_Response_Sharing_Public_Description": "يمكن لأي شخص الوصول إلى هذا الرد المسجَّل", "Canned_Responses": "الردود المسجَّلة", "Canned_Responses_Enable": "تمكين الردود المسجَّلة", - "Create_your_First_Canned_Response": "قم بإنشاء أول رد المسجَّل لك", "Cannot_invite_users_to_direct_rooms": "تتعذر دعوة المستخدمين إلى الغرف المباشرة", "Cannot_open_conversation_with_yourself": "لا يمكن توجيه رسالة مع نفسك", "Cannot_share_your_location": "لا يمكن مشاركة موقعك...", @@ -1216,7 +1215,6 @@ "Country_Zambia": "زامبيا", "Country_Zimbabwe": "زيمبابوي", "Create": "إنشاء", - "Create_Canned_Response": "إنشاء رد مسجَّل", "Create_channel": "إنشاء Channel", "Create_A_New_Channel": "إنشاء Channel جديدة", "Create_new": "إنشاء جديد", @@ -1285,7 +1283,6 @@ "Custom_Sound_Has_Been_Deleted": "تم حذف الصوت المخصص.", "Custom_Sound_Info": "معلومات الصوت المخصص", "Custom_Sound_Saved_Successfully": "تم حفظ الصوت المخصص بنجاح", - "Custom_Sounds": "أصوات مخصصة", "Custom_Status": "حالة مخصصة", "Custom_Translations": "ترجمة مخصصة", "Custom_Translations_Description": "يجب أن يكون كود JSON صالحًا حيث تكون المفاتيح فيه لغات تحتوي على قاموس للمفاتيح والترجمة. مثال: \n `‎{ \n \"en\": { \n \"Channels\": \"Rooms\" \n }, \n \"pt\": { \n \"Channels\": \"Salas\" \n } \n}` ", @@ -3026,12 +3023,10 @@ "New": "جديد", "New_Application": "تطبيق جديد", "New_Business_Hour": "ساعة عمل جديدة", - "New_Canned_Response": "رد مسجل جديد", "New_chat_in_queue": "دردشة جديدة في قائمة الانتظار", "New_chat_priority": "تم تغيير الأولوية: {{user}} غيّر الأولوية إلى {{priority}}", "New_chat_transfer": "نقل دردشة جديد: {{transfer}}", "New_chat_transfer_fallback": "تم النقل إلى القسم الاحتياطي: {{fallback}}", - "New_Contact": "جهة اتصال جديدة", "New_Custom_Field": "حقل مخصص جديد", "New_Department": "قسم جديد", "New_discussion": "مناقشة جديدة", @@ -3146,9 +3141,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "عدد الدردشات الأخيرة لحساب وقت الانتظار المقدر", "Number_of_most_recent_chats_estimate_wait_time_description": "يحدد هذا الرقم عدد الغرف التي تم تقديمها مؤخرًا والتي سيتم استخدامها لحساب أوقات الانتظار في قائمة الانتظار.", "Number_of_users_autocomplete_suggestions": "عدد اقتراحات الإكمال التلقائي للمستخدمين", - "OAuth Apps": "تطبيقات OAuth", "OAuth_Application": "تطبيق OAuth", - "OAuth_Applications": "تطبيقات OAuth", "Objects": "كائنات", "Off": "خارج", "Off_the_record_conversation": "المحادثة خارج نطاق السجل", @@ -4905,4 +4898,4 @@ "RegisterWorkspace_Features_Omnichannel_Title": "قناة متعددة الاتجاهات", "RegisterWorkspace_Setup_Label": "البريد الإلكتروني لحساب السحابة", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "أوافق على <1>البنود والشروط و<3>سياسة الخصوصية" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json index 36c8c42500e2..6eb91c5e0f93 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/az.i18n.json @@ -795,7 +795,6 @@ "Custom_Sound_Has_Been_Deleted": "Xüsusi səs silindi.", "Custom_Sound_Info": "Xüsusi səs məlumatı", "Custom_Sound_Saved_Successfully": "Xüsusi səs müvəffəqiyyətlə qeyd edildi", - "Custom_Sounds": "Xüsusi səslər", "Custom_Translations": "Xüsusi tərcümə", "Custom_Translations_Description": "Açar sözlər və tərcümələr olan dillərdə olan dillərdə olan düzgün JSON olmalıdır. Məsələn: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Özəlləşdirmək", @@ -1813,7 +1812,6 @@ "Num_Agents": "# Agentlər", "Number_of_messages": "Mesajların sayı", "OAuth_Application": "OAuth tətbiqi", - "OAuth_Applications": "OAuth Proqramlar", "Objects": "Obyektlər", "Off": "Off", "Off_the_record_conversation": "Off-the-Record söhbət", @@ -2758,4 +2756,4 @@ "registration.component.form.invalidConfirmPass": "Şifrənin təsdiqlənməsi şifrə uyğun gəlmir", "registration.component.form.confirmPassword": "Şifrənizi təsdiqləyin", "registration.component.form.sendConfirmationEmail": "Təsdiq e-poçt göndər" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json index f00f2e5a34e9..195ae7976527 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/be-BY.i18n.json @@ -814,7 +814,6 @@ "Custom_Sound_Has_Been_Deleted": "Звычай гук быў выдалены.", "Custom_Sound_Info": "Custom Sound інфармацыя", "Custom_Sound_Saved_Successfully": "Карыстацкі гук паспяхова захаваны", - "Custom_Sounds": "прыстасаваныя Гукі", "Custom_Translations": "прыстасаваныя Пераклады", "Custom_Translations_Description": "Павінна быць сапраўдным JSON, дзе ключы з'яўляюцца мовамі, якія змяшчаюць слоўнік ключа і перакладаў. Прыклад: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "наладзіць", @@ -1829,7 +1828,6 @@ "Num_Agents": "# Агенты", "Number_of_messages": "колькасць паведамленняў", "OAuth_Application": "OAuth Ужыванне", - "OAuth_Applications": "OAuth Прыкладанні", "Objects": "аб'екты", "Off": "ад", "Off_the_record_conversation": "Off-на-запісы размовы", @@ -2776,4 +2774,4 @@ "registration.component.form.invalidConfirmPass": "Пацвярджэнне пароля не супадае пароль", "registration.component.form.confirmPassword": "Пацвердзіць пароль", "registration.component.form.sendConfirmationEmail": "Адправіць па электроннай пошце пацвярджэнне" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json index 32d92f38feac..344c2a75a499 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/bg.i18n.json @@ -795,7 +795,6 @@ "Custom_Sound_Has_Been_Deleted": "Персонализираният звук е изтрит.", "Custom_Sound_Info": "Информация за персонализирания звук", "Custom_Sound_Saved_Successfully": "Персонализираният звук е запазен успешно", - "Custom_Sounds": "Персонализирани звуци", "Custom_Translations": "Потребителски преводи", "Custom_Translations_Description": "Трябва да е валидна JSON, където ключовете са езици, съдържащи речник на ключове и преводи. Пример: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Персонализирайте", @@ -1810,7 +1809,6 @@ "Num_Agents": "# Агенти", "Number_of_messages": "Брой съобщения", "OAuth_Application": "Приложение OAuth", - "OAuth_Applications": "OAuth приложения", "Objects": "Обекти", "Off": "Край", "Off_the_record_conversation": "Разговор извън рекорда", @@ -2750,4 +2748,4 @@ "registration.component.form.invalidConfirmPass": "Потвърждението на паролата не съвпада с паролата", "registration.component.form.confirmPassword": "Потвърдите паролата", "registration.component.form.sendConfirmationEmail": "Изпратете имейл за потвърждение" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json index c5b2c93390e1..c58116b0c42e 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/bs.i18n.json @@ -793,7 +793,6 @@ "Custom_Sound_Has_Been_Deleted": "Prilagođeni zvuk je izbrisan.", "Custom_Sound_Info": "Custom Sound Info", "Custom_Sound_Saved_Successfully": "Prilagođeni zvuk uspješno je spremljen", - "Custom_Sounds": "Prilagođeni zvukovi", "Custom_Translations": "Prilagođeni prijevodi", "Custom_Translations_Description": "Treba biti ispravan JSON gdje su ključevi jezici koji zadrže riječnik ključeva i prijevoda. Npr: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Prilagođavanje", @@ -1806,7 +1805,6 @@ "Num_Agents": "# agenata", "Number_of_messages": "Broj poruka", "OAuth_Application": "OAuth Aplikacija", - "OAuth_Applications": "OAuth Aplikacije", "Objects": "Objekti", "Off": "Isključeno", "Off_the_record_conversation": "Sigurnosno-nezabilježenih razgovora", @@ -2746,4 +2744,4 @@ "registration.component.form.invalidConfirmPass": "Potvrda lozinke se ne slaže sa lozinkom", "registration.component.form.confirmPassword": "Potvrdi svoju lozinku", "registration.component.form.sendConfirmationEmail": "Pošalji potvrdni email" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json index 3ef86bbf2bd8..c243fc4a5585 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ca.i18n.json @@ -727,7 +727,6 @@ "Canned_Response_Sharing_Public_Description": "Qualsevol pot accedir a aquesta resposta predefinida", "Canned_Responses": "Resposta predefinida", "Canned_Responses_Enable": "Habilitar resposta predefinida", - "Create_your_First_Canned_Response": "Crea primera resposta predefinida", "Cannot_invite_users_to_direct_rooms": "No es pot convidar els usuaris a les sales directes", "Cannot_open_conversation_with_yourself": "No es pot obrir una conversa amb un mateix", "Cannot_share_your_location": "No es posible compartir la ubicació ...", @@ -1211,7 +1210,6 @@ "Country_Zambia": "Zàmbia", "Country_Zimbabwe": "Zimbabwe", "Create": "Crea", - "Create_Canned_Response": "Crear resposta predefinida", "Create_channel": "Crear Channel", "Create_A_New_Channel": "Crea un nou canal", "Create_new": "Crea nou", @@ -1280,7 +1278,6 @@ "Custom_Sound_Has_Been_Deleted": "El so personalitzat s'ha esborrat.", "Custom_Sound_Info": "Informació del so personalitzat", "Custom_Sound_Saved_Successfully": "So personalitzat guardat correctament", - "Custom_Sounds": "Sons personalitzats", "Custom_Status": "Estat personalitzat", "Custom_Translations": "Traduccions personalitzades", "Custom_Translations_Description": "Ha de ser un JSON vàlid on les claus siguin idiomes que continguin un diccionari de clau i traduccions. Exemple: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -2997,12 +2994,10 @@ "New": "Nou", "New_Application": "Nova aplicació", "New_Business_Hour": "Nou horario comercial", - "New_Canned_Response": "Nova resposta preparada", "New_chat_in_queue": "Nou xat a la cua", "New_chat_priority": "Canvi de prioritat: {{user}} ha canviat la prioritat a {{priority}}", "New_chat_transfer": "Nova transferència de xat: {{transfer}}", "New_chat_transfer_fallback": "Transferit al departament de reserva: {{fallback}}", - "New_Contact": "Nou contacte", "New_Custom_Field": "Nou camp personalitzat", "New_Department": "Nou departament", "New_discussion": "Nova discussió", @@ -3112,9 +3107,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "Nombre d'xats recents per calcular el temps d'espera estimat", "Number_of_most_recent_chats_estimate_wait_time_description": "Aquest número defineix el nombre de les últimes sales ateses que es faran servir per calcular els temps d'espera de la cua.", "Number_of_users_autocomplete_suggestions": "Nombre de suggeriments d'emplenament dels usuaris", - "OAuth Apps": "Aplicacions OAuth", "OAuth_Application": "Aplicació OAuth", - "OAuth_Applications": "Aplicacions OAuth", "Objects": "Objectes", "Off": "Desactivar", "Off_the_record_conversation": "Conversa fora de registre", @@ -4706,4 +4699,4 @@ "registration.component.form.sendConfirmationEmail": "Envia correu-e de confirmació", "RegisterWorkspace_Features_Marketplace_Title": "Mercat", "RegisterWorkspace_Features_Omnichannel_Title": "LiveChat" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json index 7adc0bd0c665..cac3e0a65941 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/cs.i18n.json @@ -1086,7 +1086,6 @@ "Custom_Sound_Has_Been_Deleted": "Vlastní zvuk byl smazán.", "Custom_Sound_Info": "Informace vlastního zvuku", "Custom_Sound_Saved_Successfully": "Vlastní zvuk úspěšně uložen", - "Custom_Sounds": "Vlastní zvuky", "Custom_Translations": "Vlastní překlady", "Custom_Translations_Description": "Validní JSON kde klíče jsou kódy jazyků a obsahují překlady. Například \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Custom_User_Status": "Vlastní stav uživatele", @@ -1561,8 +1560,6 @@ "Favorite_Rooms": "Aktivovat oblíbené místnosti", "Favorites": "Oblíbené", "Feature_Depends_on_Livechat_Visitor_navigation_as_a_message_to_be_enabled": "Tato funkce závisí na povolení volby \"Odeslat historii navigace návštěv jako zprávu\".", - "Federation_Discovery_method": "Metoda zjišťování", - "Federation_Domain": "Doména", "Federation_Public_key": "Veřejný klíč", "FEDERATION_Discovery_Method": "Metoda zjišťování", "FEDERATION_Discovery_Method_Description": "Ve svých záznamech DNS můžete použít rozbočovač nebo SRV a záznam TXT.", @@ -2539,7 +2536,6 @@ "Never": "Nikdy", "New_Application": "Nová aplikace", "New_Business_Hour": "Nová otevírací doba", - "New_Canned_Response": "Nová zakonzervovaná odpověď", "New_chat_in_queue": "Nová konverzace ve frontě", "New_chat_priority": "Priorita změněna: {{user}} změnil prioritu na {{priority}}", "New_chat_transfer": "Nové přepojení chatu: {{transfer}}", @@ -2635,9 +2631,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "Počet nedávných konverzací k výpočtu odhadu času čekání", "Number_of_most_recent_chats_estimate_wait_time_description": "K výpočtu času ve frontě se použije několik nedávných zpracovaných konverzací.", "Number_of_users_autocomplete_suggestions": "Počet autocomplete návrhů ", - "OAuth Apps": "Aplikace OAuth", "OAuth_Application": "OAuth Aplikace", - "OAuth_Applications": "OAuth Aplikace", "Objects": "Objekty", "Off": "Vypnuto", "Off_the_record_conversation": "Konverzace mimo záznam", @@ -3972,4 +3966,4 @@ "registration.component.form.invalidConfirmPass": "Hesla nesouhlasí", "registration.component.form.confirmPassword": "Potvrďte heslo", "registration.component.form.sendConfirmationEmail": "Zaslat potvrzovací e-mail" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json index c4b850a37dfb..793b1691b7e9 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/cy.i18n.json @@ -794,7 +794,6 @@ "Custom_Sound_Has_Been_Deleted": "Mae'r sain arfer wedi cael ei ddileu.", "Custom_Sound_Info": "Gwybodaeth Sain Sain", "Custom_Sound_Saved_Successfully": "Sain sain wedi'i arbed yn llwyddiannus", - "Custom_Sounds": "Sain Sainiau", "Custom_Translations": "Cyfieithiadau Custom", "Custom_Translations_Description": "Dylai fod yn JSON dilys lle mae allweddi yn ieithoedd sy'n cynnwys geiriadur allweddol a chyfieithiadau. Enghraifft: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Addasu", @@ -1808,7 +1807,6 @@ "Num_Agents": "# Asiantau", "Number_of_messages": "Nifer y negeseuon", "OAuth_Application": "Cais OAuth", - "OAuth_Applications": "Ceisiadau OAuth", "Objects": "Gwrthrychau", "Off": "I ffwrdd", "Off_the_record_conversation": "Sgwrs y tu allan i'r record", @@ -2749,4 +2747,4 @@ "registration.component.form.invalidConfirmPass": "Nid yw'r cadarnhad cyfrinair yn cyfateb i'r cyfrinair", "registration.component.form.confirmPassword": "Cadarnhau eich cyfrinair", "registration.component.form.sendConfirmationEmail": "Anfon ebost cadarnhad" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json index 90c8febdbaac..ea4c9264efe9 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/da.i18n.json @@ -1091,7 +1091,6 @@ "Custom_Sound_Has_Been_Deleted": "Den brugerdefinerede lyd er blevet slettet.", "Custom_Sound_Info": "Brugerdefineret lydinfo", "Custom_Sound_Saved_Successfully": "Brugerdefineret lyd blev gemt", - "Custom_Sounds": "Brugerdefinerede lyde", "Custom_Translations": "Brugerdefinerede oversættelser", "Custom_Translations_Description": "Skal være et gyldigt JSON, hvor nøgler er sprog, der indeholder en ordbog med nøgle og oversættelser. F.eks: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Custom_User_Status": "Tilpasset brugerstatus", @@ -2550,7 +2549,6 @@ "Never": "Aldrig", "New_Application": "Nyt program", "New_Business_Hour": "Ny kontortid", - "New_Canned_Response": "Nyt opbevaret svar", "New_chat_in_queue": "Ny chat i kø", "New_chat_priority": "Prioritet ændret: {{user}} changed the priority to {{priority}}", "New_chat_transfer": "Ny chatoverførsel: {{transfer}}", @@ -2646,9 +2644,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "Antal seneste chats til beregning af estimeret ventetid", "Number_of_most_recent_chats_estimate_wait_time_description": "Dette antal definerer antallet af sidst anvendte rum, der vil blive brugt til at beregne kø-ventetider.", "Number_of_users_autocomplete_suggestions": "Antal autoudfyldte forslag fra brugerne", - "OAuth Apps": "OAuth-apps", "OAuth_Application": "OAuth Application", - "OAuth_Applications": "OAuth Applications", "Objects": "objekter", "Off": "Af", "Off_the_record_conversation": "Off-record-samtale", @@ -3992,4 +3988,4 @@ "registration.component.form.invalidConfirmPass": "Adgangskodebekræftelsen stemmer ikke overens med adgangskoden", "registration.component.form.confirmPassword": "Bekræft dit kodeord", "registration.component.form.sendConfirmationEmail": "Send bekræftelses-email" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json index aeea5bbe4021..78e458b50bbb 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/de-AT.i18n.json @@ -796,7 +796,6 @@ "Custom_Sound_Has_Been_Deleted": "Der benutzerdefinierte Sound wurde gelöscht.", "Custom_Sound_Info": "Benutzerdefinierte Klanginfo", "Custom_Sound_Saved_Successfully": "Benutzerdefinierter Sound wurde erfolgreich gespeichert", - "Custom_Sounds": "Benutzerdefinierte Sounds", "Custom_Translations": "Benutzerdefinierte Übersetzungen", "Custom_Translations_Description": "Sollte ein gültiger JSON sein, in dem die Schlüssel Sprachen sind, die ein Schlüsselwörterbuch und Übersetzungen enthalten. Beispiel: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Anpassen", @@ -1816,7 +1815,6 @@ "Num_Agents": "# Agents", "Number_of_messages": "Anzahl der Nachrichten", "OAuth_Application": "OAuth-Anwendung", - "OAuth_Applications": "OAuth-Anwendungen", "Objects": "Objekte", "Off": "Aus", "Off_the_record_conversation": "Off-the-record-Gespräche", @@ -2758,4 +2756,4 @@ "registration.component.form.invalidConfirmPass": "Die Passwörter stimmen nicht überein.", "registration.component.form.confirmPassword": "Bestätigen Sie Ihr Passwort.", "registration.component.form.sendConfirmationEmail": "Bestätigungsmail versenden" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json index 8e3a86a9f5d1..e5d66cd9accc 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/de.i18n.json @@ -618,17 +618,12 @@ "is_uploading": "lädt hoch", "is_recording": "nimmt auf", "Are_you_sure": "Sind Sie sicher?", - "Moderation_Are_you_sure_dismiss_and_delete_reports": "Möchten Sie wirklich alle Berichte für die Nachrichten dieses Benutzers verwerfen und löschen? Diese Aktion kann nicht rückgängig gemacht werden.", "Are_you_sure_delete_department": "Möchten Sie diese Abteilung wirklich löschen? Diese Aktion kann nicht rückgängig gemacht werden. Bitte geben Sie zur Bestätigung den Namen der Abteilung ein.", - "Moderation_Are_you_sure_you_want_to_deactivate_this_user": "Möchten Sie diesen Benutzer wirklich deaktivieren und alle gemeldeten Nachrichten löschen? Alle Nachrichten werden dauerhaft gelöscht und der Benutzer kann sich nicht anmelden. Diese Aktion kann nicht rückgängig gemacht werden.", "Are_you_sure_you_want_to_clear_all_unread_messages": "Sind Sie sicher, dass Sie alle ungelesenen Nachrichten löschen möchten?", - "Moderation_Are_you_sure_you_want_to_delete_this_message": "Möchten Sie diese Nachricht wirklich löschen und alle Berichte zu dieser Nachricht verwerfen? Die Nachricht wird aus dem Nachrichtenverlauf gelöscht und niemand kann sie sehen. Diese Aktion kann nicht rückgängig gemacht werden.", "Are_you_sure_you_want_to_close_this_chat": "Sind Sie sicher, dass Sie diesen Chat schließen möchten?", "Are_you_sure_you_want_to_delete_this_record": "Möchten Sie diesen Eintrag wirklich löschen?", "Are_you_sure_you_want_to_delete_your_account": "Sind Sie sich sicher, dass Sie Ihr Konto löschen möchten?", - "Moderation_Are_you_sure_you_want_to_delete_all_reported_messages_from_this_user": "Möchten Sie wirklich alle gemeldeten Nachrichten von diesem Benutzer löschen? Die Nachrichten werden aus dem Nachrichtenverlauf gelöscht und niemand kann sie sehen. Diese Aktion kann nicht rückgängig gemacht werden.", "Are_you_sure_you_want_to_disable_Facebook_integration": "Sind Sie sich sicher, dass Sie die Facebook-Integration deaktivieren möchten?", - "Moderation_Are_you_sure_you_want_to_reset_the_avatar": "Sind Sie sicher, dass Sie den Avatar dieses Benutzers zurücksetzen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", "Are_you_sure_you_want_to_reset_the_name_of_all_priorities": "Sind Sie sicher, dass Sie den Namen aller Prioritäten zurücksetzen möchten?", "Assets": "Assets", "Assets_Description": "Ändern Sie das Logo, das Symbol, das Favicon und vieles mehr für Ihren Arbeitsbereich.", @@ -689,7 +684,6 @@ "Avatar": "Profilbild", "Avatars": "Avatare", "Avatar_changed_successfully": "Das Profilbild wurde erfolgreich geändert.", - "Moderation_Avatar_reset_successfully": "Avatar wurde erfolgreich zurückgesetzt", "Avatar_URL": "URL des Profilbilds", "Avatar_format_invalid": "Ungültiges Format. Nur Bilddateien sind erlaubt", "Avatar_url_invalid_or_error": "Die angegebene Internetadresse ist ungültig oder nicht verfügbar. Bitte versuchen Sie es mit einer anderen Internetadresse erneut.", @@ -839,7 +833,6 @@ "Canned_Response_Sharing_Public_Description": "Jeder kann auf diese vorformulierte Antwort zugreifen", "Canned_Responses": "Vorformulierte Antworten", "Canned_Responses_Enable": "Vorformulierte Antworten aktivieren", - "Create_your_First_Canned_Response": "Erstellen Sie Ihre erste vorformulierte Antwort", "Cannot_invite_users_to_direct_rooms": "Benutzer können nicht in Direktnachrichten eingeladen werden", "Cannot_open_conversation_with_yourself": "Ein Selbstgespräch kann nicht gestartet werden", "Cannot_share_your_location": "Standort teilen nicht möglich...", @@ -1348,7 +1341,6 @@ "Country_Zambia": "Sambia", "Country_Zimbabwe": "Simbabwe", "Create": "Erstellen", - "Create_Canned_Response": "Vorformulierte Antwort erstellen", "Create_channel": "Channel erstellen", "Create_channels": "Channels erstellen", "Create_a_public_channel_that_new_workspace_members_can_join": "Erstellen Sie einen öffentlichen Kanal, dem neue Mitglieder des Arbeitsbereichs beitreten können.", @@ -1426,7 +1418,6 @@ "Custom_Sound_Has_Been_Deleted": "Der eigene Ton wurde gelöscht.", "Custom_Sound_Info": "Info zu eigenen Tönen", "Custom_Sound_Saved_Successfully": "Der eigene Ton wurde erfolgreich gespeichert", - "Custom_Sounds": "Benutzerdefinierte Töne", "Custom_Status": "Benutzerdefinierter Status", "Custom_Translations": "Benutzerdefinierte Übersetzungen", "Custom_Translations_Description": "Sollte ein gültiges JSON sein, bei dem die Schlüssel Sprachen sind, die ein Wörterbuch aus Schlüssel und Übersetzungen enthalten. Beispiel: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -1475,7 +1466,6 @@ "DDP_Rate_Limit_User_Interval_Time": "Beschränkung durch Benutzer: Intervallzeit", "DDP_Rate_Limit_User_Requests_Allowed": "Beschränkung durch Benutzer: Anforderungen zulässig", "Deactivate": "Deaktivieren", - "Moderation_Deactivate_User": "Nutzer deaktivieren", "Decline": "Ablehnen", "Decode_Key": "Entschlüsseln", "default": "Standard", @@ -1490,7 +1480,6 @@ "Delete_Department?": "Abteilung löschen?", "Delete_File_Warning": "Wenn Sie eine Datei löschen, wird diese für immer gelöscht. Dies kann nicht rückgängig gemacht werden.", "Delete_message": "Nachricht löschen", - "Moderation_Delete_all_messages": "Alle Nachrichten löschen", "Delete_my_account": "Mein Konto löschen", "Delete_Role_Warning": "Wenn Sie eine Rolle löschen, wird sie für immer gelöscht. Dies kann nicht rückgängig gemacht werden.", "Delete_Role_Warning_Community_Edition": "Dies kann nicht rückgängig gemacht werden. Beachten Sie, dass es in der Community Edition nicht möglich ist, neue benutzerdefinierte Rollen zu erstellen.", @@ -1620,7 +1609,6 @@ "Discussions_unavailable_for_federation": "Diskussionen sind für Verbundräume nicht verfügbar", "discussion-created": "{{message}}", "Discussions": "Diskussionen", - "Moderation_Dismiss_reports": "Berichte abweisen", "Display": "Anzeige", "Display_avatars": "Avatare anzeigen", "Display_Avatars_Sidebar": "Avatare in der Seitenleiste anzeigen", @@ -1669,7 +1657,6 @@ "Markdown_Marked_SmartLists": "Markierte intelligente Listen aktivieren", "Duplicate_private_group_name": "Eine private Gruppe mit dem Namen '%s' existiert bereits.", "Markdown_Marked_Smartypants": "Mit intelligenter Punktsetzung (\"Smartypants\") formatieren", - "Moderation_Duplicate_messages": "Doppelte Nachrichten", "Duplicated_Email_address_will_be_ignored": "Doppelte E-Mail-Adressen werden ignoriert.", "Markdown_Marked_Tables": "Markierte Tabellen aktivieren", "duplicated-account": "Doppeltes Konto", @@ -3347,14 +3334,22 @@ "mobile-upload-file": "Datei-Upload von Mobilgeräten erlauben", "mobile-upload-file_description": "Berechtigung zum Hochladen von Dateien auf mobilen Geräten", "Mobile_Push_Notifications_Default_Alert": "Push-Benachrichtigungen bei", - "Moderation_Console": "Moderationskonsole", - "Moderation_View_reports": "Meldungen ansehen", "Moderation_Go_to_message": "Zur Nachricht", "Moderation_Delete_message": "Nachricht löschen", "Moderation_Dismiss_and_delete": "Ablehnen und löschen", "Moderation_Delete_this_message": "Diese Nachricht löschen", "Moderation_Message_context_header": "Nachricht(en) von __displayName__", "Moderation_Action_View_reports": "Gemeldete Nachrichten anzeigen", + "Moderation_Deactivate_User": "Nutzer deaktivieren", + "Moderation_Delete_all_messages": "Alle Nachrichten löschen", + "Moderation_Dismiss_reports": "Berichte abweisen", + "Moderation_Duplicate_messages": "Doppelte Nachrichten", + "Moderation_Message_already_deleted": "Nachricht ist bereits gelöscht", + "Moderation_Reset_user_avatar": "Benutzer-Avatar zurücksetzen", + "Moderation_Are_you_sure_you_want_to_delete_this_message": "Möchten Sie diese Nachricht wirklich löschen und alle Berichte zu dieser Nachricht verwerfen? Die Nachricht wird aus dem Nachrichtenverlauf gelöscht und niemand kann sie sehen. Diese Aktion kann nicht rückgängig gemacht werden.", + "Moderation_Are_you_sure_you_want_to_reset_the_avatar": "Sind Sie sicher, dass Sie den Avatar dieses Benutzers zurücksetzen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", + "Moderation_Are_you_sure_you_want_to_deactivate_this_user": "Möchten Sie diesen Benutzer wirklich deaktivieren und alle gemeldeten Nachrichten löschen? Alle Nachrichten werden dauerhaft gelöscht und der Benutzer kann sich nicht anmelden. Diese Aktion kann nicht rückgängig gemacht werden.", + "Moderation_Are_you_sure_you_want_to_delete_all_reported_messages_from_this_user": "Möchten Sie wirklich alle gemeldeten Nachrichten von diesem Benutzer löschen? Die Nachrichten werden aus dem Nachrichtenverlauf gelöscht und niemand kann sie sehen. Diese Aktion kann nicht rückgängig gemacht werden.", "Monday": "Montag", "Mongo_storageEngine": "Mongo Storage-Engine", "Mongo_version": "Mongo Version", @@ -3410,14 +3405,12 @@ "New": "Neu", "New_Application": "Neue Anwendung", "New_Business_Hour": "Neue Öffnungszeiten", - "New_Canned_Response": "Neue vorformulierte Antwort", "New_Call": "Neuer Aufruf", "New_Call_Enterprise_Edition_Only": "Neuer Anruf (nur Enterprise Edition)", "New_chat_in_queue": "Neuer Chat in der Warteschlange", "New_chat_priority": "Priorität geändert: {{user}} hat die Priorität in {{priority}} geändert", "New_chat_transfer": "Neue Chatübertragung: {{transfer}}", "New_chat_transfer_fallback": "An die Ersatzabteilung weitergeleitet: {{fallback}}", - "New_Contact": "Neuer Kontakt", "New_Custom_Field": "Neues benutzerdefiniertes Feld", "New_Department": "Neue Abteilung", "New_discussion": "Neue Unterhaltung", @@ -3538,9 +3531,7 @@ "Number_of_users_autocomplete_suggestions": "Anzahl der Autovervollständigungsvorschläge der Benutzer", "OAuth": "OAuth", "OAuth_Description": "Konfigurieren Sie Authentifizierungsmethoden, die über Benutzernamen und Passwort hinausgehen.", - "OAuth Apps": "OAuth-Apps", "OAuth_Application": "OAuth-Anwendung", - "OAuth_Applications": "OAuth-Anwendungen", "Objects": "Objekte", "Off": "Aus", "Off_the_record_conversation": "Off-the-record-Gespräche", @@ -3964,7 +3955,6 @@ "Report_Number": "Berichtnummer", "Report_this_message_question_mark": "Diese Nachricht melden?", "Reporting": "Berichtswesen", - "Moderation_Message_already_deleted": "Nachricht ist bereits gelöscht", "Request": "Anfordern", "Request_seats": "Plätze anfordern", "Request_more_seats": "Mehr Plätze anfordern", @@ -3991,7 +3981,6 @@ "Reset_password": "Passwort zurücksetzen", "Reset_section_settings": "Abschnittseinstellungen zurücksetzen", "Reset_TOTP": "TOTP zurücksetzen", - "Moderation_Reset_user_avatar": "Benutzer-Avatar zurücksetzen", "reset-other-user-e2e-key": "Ende-zu-Ende-Verschlüsselungsschlüssel eines anderen Nutzers zurücksetzen", "Responding": "Antwortet", "Response_description_post": "Leere Textteile oder Textteile mit einem leeren Textmerkmal werden einfach ignoriert. Nicht-200-Antworten werden mehrmals wiederholt. Eine Antwort wird unter dem oben angegebenen Aliasnamen und Avatar veröffentlicht. Sie können diese Informationen wie im obigen Beispiel überschreiben.", @@ -5543,4 +5532,4 @@ "RegisterWorkspace_Connection_Error": "Beim Verbinden ist ein Fehler aufgetreten", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Ich bin mit den Nutzungsvereinbarung und den Datenschutzbestimmungen einverstanden", "Uninstall_grandfathered_app": "{{appName}} deinstallieren?" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json index 9816edb99efd..d36aee78cff4 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/el.i18n.json @@ -802,7 +802,6 @@ "Custom_Sound_Has_Been_Deleted": "Ο προσαρμοσμένος ήχος έχει διαγραφεί.", "Custom_Sound_Info": "Πληροφορίες Προσαρμοσμένου Ήχου", "Custom_Sound_Saved_Successfully": "Ο προσαρμοσμένος ήχος αποθηκεύτηκε επιτυχώς", - "Custom_Sounds": "Προσαρμοσμένοι Ήχοι", "Custom_Translations": "Προσαρμοσμένες Μεταφράσεις", "Custom_Translations_Description": "Θα πρέπει να είναι μια έγκυρη JSON όπου κλειδιά είναι οι γλώσσες που θα περιέχουν ένα λεξικό κλειδιών και μεταφράσεων. Παράδειγμα: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Προσαρμογή", @@ -1821,7 +1820,6 @@ "Num_Agents": "# Πράκτορες", "Number_of_messages": "Αριθμός μηνυμάτων", "OAuth_Application": "OAuth Εφαρμογή", - "OAuth_Applications": "OAuth Εφαρμογές", "Objects": "αντικείμενα", "Off": "Μακριά από", "Off_the_record_conversation": "Off-the-record συνομιλία", @@ -2767,4 +2765,4 @@ "registration.component.form.invalidConfirmPass": "Η επιβεβαίωση κωδικού δεν ταιριάζει με τον αρχικό κωδικό", "registration.component.form.confirmPassword": "Επιβεβαιώστε τον κωδικό σας", "registration.component.form.sendConfirmationEmail": "Αποστολή email επιβεβαίωσης" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json index 90af270766bd..8066b28297fa 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/eo.i18n.json @@ -795,7 +795,6 @@ "Custom_Sound_Has_Been_Deleted": "La kutimo sono estis forigita.", "Custom_Sound_Info": "Propra Sono Informoj", "Custom_Sound_Saved_Successfully": "Propra sono savis sukcese", - "Custom_Sounds": "Propra Sonoj", "Custom_Translations": "Propra Tradukoj", "Custom_Translations_Description": "Devus esti valida JSON kie klavoj estas lingvoj enhavantaj vortaron de ŝlosilo kaj tradukoj. Ekzemplo: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Agordu", @@ -1813,7 +1812,6 @@ "Num_Agents": "# Agentoj", "Number_of_messages": "Nombro da mesaĝoj", "OAuth_Application": "OAuth-Aplikaĵo", - "OAuth_Applications": "OAuth-Aplikoj", "Objects": "Objektoj", "Off": "Ekstere", "Off_the_record_conversation": "Off-the-Record-Konversacio", @@ -2759,4 +2757,4 @@ "registration.component.form.invalidConfirmPass": "La konfirmilo de pasvorto ne kongruas kun pasvorto", "registration.component.form.confirmPassword": "Konfirmu vian pasvorton", "registration.component.form.sendConfirmationEmail": "Sendu konfirman retpoŝton" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json index fb52edb5ba84..cb9e83821017 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/es.i18n.json @@ -722,7 +722,6 @@ "Canned_Response_Sharing_Public_Description": "Cualquiera puede acceder a esta respuesta predefinida", "Canned_Responses": "Respuestas predefinidas", "Canned_Responses_Enable": "Habilitar respuestas predefinidas", - "Create_your_First_Canned_Response": "Crea tu primera respuesta predefinida", "Cannot_invite_users_to_direct_rooms": "No se puede invitar a los usuarios a las salas directas", "Cannot_open_conversation_with_yourself": "No puedes enviarte mensajes directos a ti mismo", "Cannot_share_your_location": "No se puede compartir tu ubicación...", @@ -1205,7 +1204,6 @@ "Country_Zambia": "Zambia", "Country_Zimbabwe": "Zimbabue", "Create": "Crear", - "Create_Canned_Response": "Crear respuesta predefinida", "Create_channel": "Crear Channel", "Create_channels": "Crea canales", "Create_a_public_channel_that_new_workspace_members_can_join": "Cree un canal público al que puedan unirse los nuevos miembros del espacio de trabajo.", @@ -1276,7 +1274,6 @@ "Custom_Sound_Has_Been_Deleted": "El sonido personalizado se ha eliminado.", "Custom_Sound_Info": "Información de sonido Personalizado", "Custom_Sound_Saved_Successfully": "Sonido personalizado guardado correctamente", - "Custom_Sounds": "Sonidos personalizados", "Custom_Status": "Estado personalizado", "Custom_Translations": "Traducciones personalizadas", "Custom_Translations_Description": "Debe ser un JSON válido, donde las claves son los idiomas que contienen un diccionario de clave y traducciones. Ejemplo: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -3001,12 +2998,10 @@ "New": "Nuevo", "New_Application": "Nueva aplicación", "New_Business_Hour": "Nuevo horario comercial", - "New_Canned_Response": "Nueva respuesta predefinida", "New_chat_in_queue": "Nuevo chat en la cola", "New_chat_priority": "Prioridad cambiada: {{user}} ha cambiado la prioridad a {{priority}}", "New_chat_transfer": "Nueva transferencia de chat: {{transfer}}", "New_chat_transfer_fallback": "Se ha transferido al departamento alternativo: {{fallback}}", - "New_Contact": "Nuevo contacto", "New_Custom_Field": "Nuevo campo personalizado", "New_Department": "Nuevo departamento", "New_discussion": "Nueva discusión", @@ -3121,9 +3116,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "Número de chats recientes para calcular el tiempo de espera estimado", "Number_of_most_recent_chats_estimate_wait_time_description": "Indica el número de últimas salas atendidas que se usará para calcular los tiempos de espera de la cola.", "Number_of_users_autocomplete_suggestions": "Número de sugerencias de autocompletado de usuarios", - "OAuth Apps": "Aplicaciones OAuth", "OAuth_Application": "Aplicación OAuth", - "OAuth_Applications": "Aplicaciones OAuth", "Objects": "Objetos", "Off": "Desactivado", "Off_the_record_conversation": "Conversación sin registro", @@ -4856,4 +4849,4 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "Cuenta de correo electrónico en la nube", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Acepto los <1>términos y condiciones y la <3>política de privacidad" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json index 406f238df0b7..ea451b6ad4d5 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fa.i18n.json @@ -988,7 +988,6 @@ "Custom_Sound_Has_Been_Deleted": "صدای سفارشی حذف شده است.", "Custom_Sound_Info": "اطلاعات سفارشی صدا", "Custom_Sound_Saved_Successfully": "صدا سفارشی با موفقیت ذخیره شد", - "Custom_Sounds": "برای تلفن های موبایل سفارشی", "Custom_Status": "وضعیت سفارشی", "Custom_Translations": "ترجمه های سفارشی", "Custom_Translations_Description": "باید JSON معتبر باشد که کلیدها زبان هایی هستند که شامل یک فرهنگ لغت کلید و ترجمه هستند. به عنوان مثال: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -2043,7 +2042,6 @@ "Navigation_History": "تاریخچه ناوبری", "New_Application": "برنامه جدید", "New_Business_Hour": "ساعت کار جدید", - "New_Canned_Response": "پاسخ آماده جدید", "New_Custom_Field": "جدید درست سفارشی", "New_Department": "بخش جدید", "New_discussion": "بحث جدید", @@ -2109,7 +2107,6 @@ "Number_of_messages": "تعداد پیام ها", "Number_of_most_recent_chats_estimate_wait_time": "تعداد چت های اخیر برای محاسبه زمان انتظار تقریبی", "OAuth_Application": "OAuth تأیید نرم افزار", - "OAuth_Applications": "نرم افزار OAuth تأیید", "Objects": "اشیاء", "Off": "خاموش", "Off_the_record_conversation": "مکالمه محرمانه (Off-the-record)", @@ -3104,4 +3101,4 @@ "registration.component.form.confirmPassword": "رمز عبور خود را تأیید کنید", "registration.component.form.sendConfirmationEmail": "ارسال ایمیل تایید", "RegisterWorkspace_Features_Omnichannel_Title": "کانال همه‌کاره" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json index f1a44b3a1fcb..d595a205f3a0 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fi.i18n.json @@ -849,7 +849,6 @@ "Canned_Response_Sharing_Public_Description": "Kuka tahansa voi käyttää tätä valmista vastausta", "Canned_Responses": "Valmiit vastaukset", "Canned_Responses_Enable": "Ota käyttöön valmiit vastaukset", - "Create_your_First_Canned_Response": "Luo ensimmäinen valmis vastaus", "Cannot_invite_users_to_direct_rooms": "Et voi kutsua käyttäjiä suoriin huoneisiin", "Cannot_open_conversation_with_yourself": "Et voi lähettää suoraa viestiä itsellesi", "Cannot_share_your_location": "Sijaintiasi ei voi jakaa...", @@ -1359,7 +1358,6 @@ "Country_Zambia": "Sambia", "Country_Zimbabwe": "Zimbabwe", "Create": "Luo", - "Create_Canned_Response": "Luo valmis vastaus", "Create_channel": "Luo kanava", "Create_channels": "Luo kanavia", "Create_a_public_channel_that_new_workspace_members_can_join": "Luo julkinen kanava, jolle työtilan uudet jäsenet voivat liittyä.", @@ -1436,7 +1434,6 @@ "Custom_Sound_Has_Been_Deleted": "Mukautettu ääni on poistettu.", "Custom_Sound_Info": "Mukautetun äänen tiedot", "Custom_Sound_Saved_Successfully": "Mukautettu ääni on tallennettu", - "Custom_Sounds": "Mukautetut äänet", "Custom_Status": "Mukautettu tila", "Custom_Translations": "Mukautetut käännökset", "Custom_Translations_Description": "Oltava kelvollinen JSON, jossa avaimet ovat kieliä, jotka sisältävät avainten ja käännösten sanaston. Esimerkki: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -1856,7 +1853,6 @@ "Enterprise_Departments_description_upgrade": "Yhteisöversion työtiloissa voidaan luoda vain yksi osasto. Poista rajat ja tehosta työtilaasi päivittämällä yritysversioon.", "Enterprise_Departments_description_free_trial": "Yhteisöversion työtiloissa voi luoda yhden osaston. Aloita maksuton yritysversion kokeilu, jotta voit luoda useita osastoja heti!", "Enterprise_Description": "Päivitä yrityskäyttöoikeus manuaalisesti.", - "Enterprise_feature": "Yritysominaisuus", "Enterprise_License": "Yrityskäyttöoikeus", "Enterprise_License_Description": "Jos työtilasi on rekisteröity ja sinulla on Rocket.Chat-pilven käyttöoikeus, sinun ei tarvitse päivittää käyttöoikeutta manuaalisesti tässä.", "Enterprise_Only": "Vain yritysversio", @@ -3445,14 +3441,12 @@ "New": "Uusi", "New_Application": "Uusi sovellus", "New_Business_Hour": "Uusi aukioloaika", - "New_Canned_Response": "Uusi esivalmistettu vastaus", "New_Call": "Uusi puhelu", "New_Call_Enterprise_Edition_Only": "Uusi puhelu (vain yritysversio)", "New_chat_in_queue": "Uusi keskustelu jonossa", "New_chat_priority": "Prioriteetti muutettu: {{user}} prioriteettti muutettu {{priority}}", "New_chat_transfer": "Uusi chat-siirto: {{transfer}}", "New_chat_transfer_fallback": "Siirretty vara-osastolle: {{fallback}}", - "New_Contact": "Uusi yhteyshenkilö", "New_Custom_Field": "Uusi mukautettu kenttä", "New_Department": "Uusi osasto", "New_discussion": "Uusi keskustelu", @@ -3581,9 +3575,7 @@ "Number_of_users_autocomplete_suggestions": "Käyttäjien automaattisten täydennysehdotusten määrä", "OAuth": "OAuth", "OAuth_Description": "Määritä muitakin todennusmenetelmiä kuin vain käyttäjätunnus ja salasana.", - "OAuth Apps": "OAuth sovellukset", "OAuth_Application": "OAuth-sovellus", - "OAuth_Applications": "OAuth-sovellukset", "Objects": "Kohteet", "Off": "Ei käytössä", "Off_the_record_conversation": "Epävirallinen keskustelu", @@ -5768,4 +5760,4 @@ "Uninstall_grandfathered_app": "Poistetaanko {{appName}}?", "App_will_lose_grandfathered_status": "**Tämä {{context}}sovellus menettää aikaisemmin käytetössä olleen sovelluksen tilansa.** \n \nYhteisöversion työtiloissa voi olla käytössä enintään {{limit}} {{context}} sovellusta. aikaisemmin Aikaisemmin käytössä olleet sovellukset lasketaan mukaan rajoitukseen, mutta rajoitusta ei sovelleta niihin.", "Theme_Appearence": "Teeman ulkoasu" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json index 25dac6e2cc9d..96a4880a3044 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/fr.i18n.json @@ -733,7 +733,6 @@ "Canned_Response_Sharing_Public_Description": "Tout le monde a accès à cette réponse standardisée", "Canned_Responses": "Réponses standardisées", "Canned_Responses_Enable": "Activer les réponses standardisées", - "Create_your_First_Canned_Response": "Créez votre première réponse standardisée", "Cannot_invite_users_to_direct_rooms": "Impossible d'inviter des utilisateurs dans les salons directs", "Cannot_open_conversation_with_yourself": "Impossible de diriger le message vers vous-même", "Cannot_share_your_location": "Impossible de partager votre position...", @@ -1219,7 +1218,6 @@ "Country_Zambia": "Zambie", "Country_Zimbabwe": "Zimbabwe", "Create": "Créer", - "Create_Canned_Response": "Créer une réponse standardisée", "Create_channel": "Créer un Channel", "Create_channels": "Créer des canaux", "Create_a_public_channel_that_new_workspace_members_can_join": "Créez un canal public auquel les nouveaux membres de l'espace de travail peuvent se joindre.", @@ -1290,7 +1288,6 @@ "Custom_Sound_Has_Been_Deleted": "Le son personnalisé a été supprimé.", "Custom_Sound_Info": "Informations sur le son personnalisé", "Custom_Sound_Saved_Successfully": "Son personnalisé enregistré avec succès", - "Custom_Sounds": "Son personnalisés", "Custom_Status": "Statut personnalisé", "Custom_Translations": "Traductions personnalisées", "Custom_Translations_Description": "Doit être un code JSON valide où les clés sont des langues contenant un dictionnaire de clés et de traductions. Exemple : \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -3018,12 +3015,10 @@ "New": "Nouveau", "New_Application": "Nouvelle application", "New_Business_Hour": "Nouvelle heure d'ouverture", - "New_Canned_Response": "Nouvelle réponse standardisée", "New_chat_in_queue": "Nouveau chat en file d'attente", "New_chat_priority": "Priorité modifiée : {{user}} a changé la priorité en {{priority}}", "New_chat_transfer": "Nouveau transfert de chat : {{transfer}}", "New_chat_transfer_fallback": "Transféré au département de secours : {{fallback}}", - "New_Contact": "Nouveau contact", "New_Custom_Field": "Nouveau champ personnalisé", "New_Department": "Nouveau département", "New_discussion": "Nouvelle discussion", @@ -3139,9 +3134,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "Nombre de chats récents pour calculer le temps d'attente estimé", "Number_of_most_recent_chats_estimate_wait_time_description": "Nombre de salons servis en dernier qui sera utilisé pour calculer le temps en file d'attente.", "Number_of_users_autocomplete_suggestions": "Nombre de suggestions de saisie semi-automatique des utilisateurs", - "OAuth Apps": "Applications OAuth", "OAuth_Application": "Application OAuth", - "OAuth_Applications": "Applications OAuth", "Objects": "Objets", "Off": "Désactivé", "Off_the_record_conversation": "Conversation privée chiffrée", @@ -4905,4 +4898,4 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnicanal", "RegisterWorkspace_Setup_Label": "E-mail du compte cloud", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "J'accepte les <1>Conditions d'utilisation et la <3>Politique de confidentialité" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/gl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/gl.i18n.json index 6952be4a7824..bac8e5c28aa3 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/gl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/gl.i18n.json @@ -216,7 +216,6 @@ "More_groups": "Máis grupos privados", "More_unreads": "Máis sen ler", "My_Account": "A miña conta", - "New_Contact": "Novo contacto", "New_messages": "Novas mensaxes", "No_files_left_to_download": "Non quedan ficheiros para descargar", "No_pinned_messages": "Sen mensaxes fixadas", diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/he.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/he.i18n.json index 970bfe2f9633..beefb3f030db 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/he.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/he.i18n.json @@ -982,7 +982,6 @@ "Num_Agents": "סוכני #", "Number_of_messages": "מספר הודעות", "OAuth_Application": "יישום OAuth", - "OAuth_Applications": "יישומי OAuth", "Objects": "אובייקטים", "Off": "לא פועל", "Off_the_record_conversation": "שיחה לא לציטוט", @@ -1534,4 +1533,4 @@ "registration.component.form.invalidConfirmPass": "אימות הססמה אינו זהה לססמה", "registration.component.form.confirmPassword": "אמת את הסיסמה שלך", "registration.component.form.sendConfirmationEmail": "שליחת דוא״ל אימות" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json index d54cc0c1b309..8c11ff0d62b7 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/hr.i18n.json @@ -886,7 +886,6 @@ "Custom_Sound_Has_Been_Deleted": "Prilagođeni zvuk je izbrisan.", "Custom_Sound_Info": "Custom Sound Info", "Custom_Sound_Saved_Successfully": "Prilagođeni zvuk uspješno je spremljen", - "Custom_Sounds": "Prilagođeni zvukovi", "Custom_Translations": "Prilagođeni prijevodi", "Custom_Translations_Description": "Treba biti ispravan JSON gdje su ključevi jezici koji zadrže riječnik ključeva i prijevoda. Npr: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Prilagođavanje", @@ -1946,7 +1945,6 @@ "Num_Agents": "# agenata", "Number_of_messages": "Broj poruka", "OAuth_Application": "OAuth Aplikacija", - "OAuth_Applications": "OAuth Aplikacije", "Objects": "Objekti", "Off": "Isključeno", "Off_the_record_conversation": "Sigurnosno-nezabilježenih razgovora", @@ -2895,4 +2893,4 @@ "registration.component.form.invalidConfirmPass": "Potvrda lozinke se ne slaže sa lozinkom", "registration.component.form.confirmPassword": "Potvrdi svoju lozinku", "registration.component.form.sendConfirmationEmail": "Pošalji potvrdni email" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json index 32a6cccc3c99..0402967c47a8 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/hu.i18n.json @@ -816,7 +816,6 @@ "Canned_Response_Sharing_Public_Description": "Bárki hozzáférhet ehhez a sablonválaszhoz", "Canned_Responses": "Sablonválaszok", "Canned_Responses_Enable": "Sablonválaszok engedélyezése", - "Create_your_First_Canned_Response": "Első sablonválasz létrehozása", "Cannot_invite_users_to_direct_rooms": "Nem hívhat meg felhasználókat a közvetlen szobákba", "Cannot_open_conversation_with_yourself": "Nem küldhet közvetlen üzenetet önmagának", "Cannot_share_your_location": "Nem oszthatja meg a tartózkodási helyét…", @@ -1322,7 +1321,6 @@ "Country_Zambia": "Zambia", "Country_Zimbabwe": "Zimbabwe", "Create": "Létrehozás", - "Create_Canned_Response": "Sablonválasz létrehozása", "Create_channel": "Csatorna létrehozása", "Create_channels": "Csatornák létrehozása", "Create_a_public_channel_that_new_workspace_members_can_join": "Nyilvános csatorna létrehozása, amelyhez az új munkaterület tagjai csatlakozhatnak.", @@ -1396,7 +1394,6 @@ "Custom_Sound_Has_Been_Deleted": "Az egyéni hang törölve lett.", "Custom_Sound_Info": "Egyéni hang információi", "Custom_Sound_Saved_Successfully": "Az egyéni hang sikeresen elmentve", - "Custom_Sounds": "Egyéni hangok", "Custom_Status": "Egyéni állapot", "Custom_Translations": "Egyéni fordítások", "Custom_Translations_Description": "Érvényes JSON-adatnak kell lennie, ahol a kulcsok olyan nyelvek, amelyek kulcs és fordítások szótárát tartalmazzák. Például: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -3320,14 +3317,12 @@ "New": "Új", "New_Application": "Új alkalmazás", "New_Business_Hour": "Új munkaidő", - "New_Canned_Response": "Új sablonválasz", "New_Call": "Új hívás", "New_Call_Enterprise_Edition_Only": "Új hívás (csak vállalati kiadás)", "New_chat_in_queue": "Új csevegés a várólistában", "New_chat_priority": "Prioritás megváltoztatva: {{user}} megváltoztatta a prioritást {{priority}} szintre", "New_chat_transfer": "Új csevegésátadás: {{transfer}}", "New_chat_transfer_fallback": "Átadva a tartalék részlegnek: {{fallback}}", - "New_Contact": "Új partner", "New_Custom_Field": "Új egyéni mező", "New_Department": "Új részleg", "New_discussion": "Új megbeszélés", @@ -3449,9 +3444,7 @@ "Number_of_users_autocomplete_suggestions": "A felhasználók automatikus kiegészítési javaslatainak száma", "OAuth": "OAuth", "OAuth_Description": "A csak egy felhasználónevet és jelszót meghaladó hitelesítési módszerek beállítása.", - "OAuth Apps": "OAuth-alkalmazások", "OAuth_Application": "OAuth-alkalmazás", - "OAuth_Applications": "OAuth-alkalmazások", "Objects": "Tárgyak", "Off": "Ki", "Off_the_record_conversation": "Off-the-Record beszélgetés", @@ -5445,4 +5438,4 @@ "Join_your_team": "Csatlakozás csapathoz", "Create_an_account": "Fiók létrehozása", "RegisterWorkspace_Features_Marketplace_Title": "Piactér" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json index 6dc7eb5f4bcb..ff9a52bddb49 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/id.i18n.json @@ -795,7 +795,6 @@ "Custom_Sound_Has_Been_Deleted": "Suara khusus telah dihapus.", "Custom_Sound_Info": "Info Suara Kustom", "Custom_Sound_Saved_Successfully": "Suara khusus berhasil disimpan", - "Custom_Sounds": "Suara Khusus", "Custom_Translations": "Terjemahan kustom", "Custom_Translations_Description": "Harus menjadi JSON yang valid dimana kunci adalah bahasa yang berisi kamus kunci dan terjemahan. Contoh: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Sesuaikan", @@ -1821,7 +1820,6 @@ "Num_Agents": "# Agen", "Number_of_messages": "Jumlah pesan", "OAuth_Application": "OAuth Aplikasi", - "OAuth_Applications": "Aplikasi OAuth", "Objects": "benda", "Off": "Lepas", "Off_the_record_conversation": "Off-the-record Conversation", @@ -2768,4 +2766,4 @@ "registration.component.form.invalidConfirmPass": "Kata sandi konfirmasi tidak cocok dengan kata sandi utama", "registration.component.form.confirmPassword": "Konfirmasikan kata sandi anda", "registration.component.form.sendConfirmationEmail": "Kirim email konfirmasi" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json index 1bd10ace6345..b2da95a84e62 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/it.i18n.json @@ -828,7 +828,6 @@ "Custom_Sound_Has_Been_Deleted": "Il suono personalizzato è stato cancellato.", "Custom_Sound_Info": "Informazioni Suono Personalizzato", "Custom_Sound_Saved_Successfully": "Suono personalizzato salvato con successo", - "Custom_Sounds": "Suoni personalizzati", "Custom_Status": "Stato personalizzato", "Custom_Translations": "Traduzioni personalizzate", "Custom_Translations_Description": "Dovrebbe essere un JSON valido dove le chiavi sono le lingue che contengono un dizionario delle traduzioni. Esempio: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -1882,7 +1881,6 @@ "Num_Agents": "# Operatori", "Number_of_messages": "Numero di messaggi", "OAuth_Application": "Applicazione OAuth", - "OAuth_Applications": "Applicazioni OAuth", "Objects": "Oggetti", "Off": "Spegni", "Off_the_record_conversation": "Conversazione Off-the-record", @@ -2862,4 +2860,4 @@ "registration.component.form.invalidConfirmPass": "La password di conferma non corrisponde con la password", "registration.component.form.confirmPassword": "Conferma la tua password", "registration.component.form.sendConfirmationEmail": "Invia email di conferma" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json index b281715ff0b6..689bdf0a8216 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ja.i18n.json @@ -722,7 +722,6 @@ "Canned_Response_Sharing_Public_Description": "全員がこの返信定型文にアクセスできます", "Canned_Responses": "返信定型文", "Canned_Responses_Enable": "返信定型文を有効にする", - "Create_your_First_Canned_Response": "最初の返信定型文の作成", "Cannot_invite_users_to_direct_rooms": "ダイレクトルームにユーザーを招待できません", "Cannot_open_conversation_with_yourself": "自分にダイレクトメッセージを送ることはできません", "Cannot_share_your_location": "場所を共有できません...", @@ -1206,7 +1205,6 @@ "Country_Zambia": "ザンビア", "Country_Zimbabwe": "ジンバブエ", "Create": "作成", - "Create_Canned_Response": "返信定型文の作成", "Create_channel": "Channelの作成", "Create_A_New_Channel": "新しいChannelの作成", "Create_new": "新規作成", @@ -1275,7 +1273,6 @@ "Custom_Sound_Has_Been_Deleted": "カスタムサウンドが削除されました。", "Custom_Sound_Info": "カスタムサウンド情報", "Custom_Sound_Saved_Successfully": "カスタムサウンドが正常に保存されました", - "Custom_Sounds": "カスタムサウンド", "Custom_Status": "カスタムステータス", "Custom_Translations": "カスタム翻訳", "Custom_Translations_Description": "キーがキーと翻訳のディレクトリを含む言語である、有効なJSONであることが必要です。例: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -2994,12 +2991,10 @@ "New": "新規", "New_Application": "新しいアプリケーション", "New_Business_Hour": "新しい営業時間", - "New_Canned_Response": "新しい返信定型文", "New_chat_in_queue": "キューの新しいチャット", "New_chat_priority": "優先度の変更:{{user}}が優先度を{{priority}}に変更しました", "New_chat_transfer": "新しいチャット転送:{{transfer}}", "New_chat_transfer_fallback": "フォールバック部署に転送しました:{{fallback}}", - "New_Contact": "新しい連絡先", "New_Custom_Field": "新しいカスタムフィールド", "New_Department": "新しい部署", "New_discussion": "新しいディスカッション", @@ -3114,9 +3109,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "推定待ち時間を計算するための最近のチャットの数", "Number_of_most_recent_chats_estimate_wait_time_description": "この数は、キュー待機時間の計算に使用される最後に提供されたルームの数を定義します。", "Number_of_users_autocomplete_suggestions": "ユーザーのオートコンプリート候補の数", - "OAuth Apps": "OAuthアプリ", "OAuth_Application": "OAuthアプリケーション", - "OAuth_Applications": "OAuthアプリケーション", "Objects": "オブジェクト", "Off": "オフ", "Off_the_record_conversation": "オフレコ会話", @@ -4855,4 +4848,4 @@ "RegisterWorkspace_Features_Omnichannel_Title": "オムニチャネル", "RegisterWorkspace_Setup_Label": "クラウドアカウントメール", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "<1>使用と<3>プライバシーポリシーに同意します" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json index 1c8fcc2331ca..b9ab44fa5495 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ka-GE.i18n.json @@ -1025,7 +1025,6 @@ "Custom_Sound_Has_Been_Deleted": "პერსონალური სიგნალი წაიშალა", "Custom_Sound_Info": "პერსონალური სიგნალის ინფორმაცია", "Custom_Sound_Saved_Successfully": "პერსონალური სიგნალი შენახულია", - "Custom_Sounds": "პერსონალური სიგნალები", "Custom_Translations": "პერსონალური თარგმანები", "Custom_Translations_Description": "უნდა იყოს მოქმედი JSON, სადაც გასაღებები არის ენები, რომლებიც შეიცავს კლავიშთა მნიშვნელობებს და თარგმანების. მაგალითი: \n ` { \n \"en\": { \n \"Channels\": \"Rooms\" \n }, \"pt\": { \n \"Channels\": \"Salas\" \n } `", "Custom_User_Status": "მომხმარებლის პერსონალური სტატუსი", @@ -2394,7 +2393,6 @@ "Navigation_History": "ნავიგაციის ისტორია", "Never": "არასდროს", "New_Application": "ახალი აპლიკაცია", - "New_Canned_Response": "ახალი შენახული პასუხი", "New_chat_in_queue": "ახალი ჩატი რიგში", "New_chat_priority": "პრიორიტეტი შეიცვალა: {{user}}– მა პრიორიტეტი შეცვალა {{priority}}– მდე", "New_chat_transfer": "ახალი ჩატის ტრანსფერი {{transfer}}", @@ -2481,9 +2479,7 @@ "Number_of_messages": "შეტყობინებების რაოდენობა", "Number_of_most_recent_chats_estimate_wait_time": "ახლანდელი ჩეტების რაოდენობა, ლოდინის სავარაუდო დროის გამოსათვლელად", "Number_of_most_recent_chats_estimate_wait_time_description": "ეს რიცხვი განსაზღვრავს ბოლო მომსახურებული ოთახების რაოდენობას, რომლებიც გამოყენებული იქნება რიგების ლოდინის დროის გამოსათვლელად.", - "OAuth Apps": "OAuth პროგრამები", "OAuth_Application": "OAuth აპლიკაცია", - "OAuth_Applications": "OAuth აპლიკაციები", "Objects": "ობიექტები", "Off": "გამორთულია", "Off_the_record_conversation": "ჩანაწერის გარეშე საუბარი", @@ -3674,4 +3670,4 @@ "registration.component.form.invalidConfirmPass": "პაროლის დასტური არ შეესაბამება პაროლს", "registration.component.form.confirmPassword": "დაადასტურეთ თქვენი პაროლი", "registration.component.form.sendConfirmationEmail": "დადასტურების ელ.ფოსტის გაგზავნა" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json index 51396ee597f7..bc06b13a5749 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/km.i18n.json @@ -967,7 +967,6 @@ "Custom_Sound_Has_Been_Deleted": "សំឡេងផ្ទាល់ខ្លួនត្រូវបានលុប។", "Custom_Sound_Info": "ព័ត៌មានសំឡេងផ្ទាល់ខ្លួន", "Custom_Sound_Saved_Successfully": "សម្លេងផ្ទាល់ខ្លួនបានរក្សាទុកដោយជោគជ័យ", - "Custom_Sounds": "សំឡេងផ្ទាល់ខ្លួន", "Custom_Translations": "ឃ្លាផ្ទាល់ខ្លួន", "Custom_Translations_Description": "គួរតែជា JSON ត្រឹមត្រូវដែលគ្រាប់ចុចជាភាសាដែលមានវចនានុក្រមគន្លឹះនិងការបកប្រែ។ ឧទាហរណ៍: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "ប្ដូរតាមបំណង", @@ -2061,7 +2060,6 @@ "Name_Placeholder": "សូម​បញ្ចូល​ឈ្មោះ​របស់​អ្នក...", "Navigation_History": "ប្រវត្តិរុករក", "New_Application": "កម្មវិធីថ្មី", - "New_Canned_Response": "ការឆ្លើយតបថ្មី", "New_Custom_Field": "វាលផ្ទាល់ខ្លួនថ្មី", "New_Department": "នាយកដ្ឋានថ្មី", "New_encryption_password": "ពាក្យសម្ងាត់ការបំលែងកូដថ្មី", @@ -2120,7 +2118,6 @@ "Num_Agents": "ភ្នាក់ងារ #", "Number_of_messages": "ចំនួននៃសារដែលបាន", "OAuth_Application": "កម្មវិធី OAuth", - "OAuth_Applications": "កម្មវិធី OAuth", "Objects": "វត្ថុ", "Off": "បិទ", "Off_the_record_conversation": "បិទការកត់ត្រាការសន្ទនា", @@ -3114,4 +3111,4 @@ "registration.component.form.invalidConfirmPass": "ពាក្យ​សម្ងាត់​បញ្ជាក់​មិន​ដូច​ពាក្យ​សម្ងាត់​បាន​បញ្ចូល​", "registration.component.form.confirmPassword": "បញ្ជាក់​ពាក្យ​សម្ងាត់", "registration.component.form.sendConfirmationEmail": "ផ្ញើរអ៊ីម៉ែល​បញ្ជាក់" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json index dbbea51a0026..6cdbbf56113e 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ko.i18n.json @@ -1129,7 +1129,6 @@ "Custom_Sound_Has_Been_Deleted": "사용자 정의 사운드가 삭제되었습니다.", "Custom_Sound_Info": "사용자 정의 사운드 정보", "Custom_Sound_Saved_Successfully": "사용자 정의 사운드를 저장했습니다.", - "Custom_Sounds": "사용자 정의 사운드", "Custom_Translations": "사용자 정의 번역(해석)", "Custom_Translations_Description": " Key는 Key와 번역의 사전이 포함된 언어로 유효한 JSON 이어야 합니다. 예: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Custom_User_Status": "사용자 상태 정의", @@ -2595,7 +2594,6 @@ "Never": "불가", "New_Application": "새 응용프로그램", "New_Business_Hour": "새 영업 시간", - "New_Canned_Response": "예상 답변", "New_chat_in_queue": "대기열의 새 대화", "New_chat_priority": "우선 순위 변경 : {{user}}가 우선 순위를 {{priority}} (으)로 변경했습니다.", "New_chat_transfer": "새 대화 전송 : {{transfer}}", @@ -2691,9 +2689,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "예상 대기 시간을 계산하기 위한 최근 대화 수", "Number_of_most_recent_chats_estimate_wait_time_description": "이 숫자는 대기열 대기 시간을 계산하는 데 사용될 최근 사용된 대화방 수를 정의합니다.", "Number_of_users_autocomplete_suggestions": "사용자의 자동 완성 제안 수", - "OAuth Apps": "OAuth 앱", "OAuth_Application": "OAuth 응용 프로그램", - "OAuth_Applications": "OAuth 응용 프로그램", "Objects": "대상", "Off": "끄기", "Off_the_record_conversation": "비밀 대화", @@ -4034,4 +4030,4 @@ "registration.component.form.invalidConfirmPass": "비밀번호가 일치하지 않습니다.", "registration.component.form.confirmPassword": "비밀번호를 확인하세요", "registration.component.form.sendConfirmationEmail": "확인 메일 보내기" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json index 8d66fd5c8cc2..4eaeac24e15a 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ku.i18n.json @@ -795,7 +795,6 @@ "Custom_Sound_Has_Been_Deleted": "Dengek şexsî hatiye jêbirin.", "Custom_Sound_Info": "Agahiya Taybet", "Custom_Sound_Saved_Successfully": "Dengê xerîdar bi serkeftî rizgar kirin", - "Custom_Sounds": "Dengên Custom", "Custom_Translations": "Wergerên Custom", "Custom_Translations_Description": "Divê JSON ê ku derheq in ku zimanên ku bi zimanê key-ê û wergeran tê wergerandin divê derbasdar e. Nimûne: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Xweş bikin", @@ -1808,7 +1807,6 @@ "Num_Agents": "# Agents", "Number_of_messages": "Hejmara peyamên", "OAuth_Application": "OAuth Application", - "OAuth_Applications": "Applications OAuth", "Objects": "Objekt", "Off": "Ji", "Off_the_record_conversation": "Off-the-record Conversation", @@ -2748,4 +2746,4 @@ "registration.component.form.invalidConfirmPass": "دووبارەکراوەی تێپەڕەوشە یەکناگرێتەوە لەگەڵ تێپەڕەوشە", "registration.component.form.confirmPassword": "تێپەڕەوشەکەت پشتڕاستکەوە", "registration.component.form.sendConfirmationEmail": "ئیمەیڵی پشتڕاستکردنەوە بنێرە" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json index bc2f6d031680..a62baae6717a 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/lo.i18n.json @@ -813,7 +813,6 @@ "Custom_Sound_Has_Been_Deleted": "ສຽງຂອງລູກຄ້າໄດ້ຖືກລຶບ.", "Custom_Sound_Info": "Custom Sound Info", "Custom_Sound_Saved_Successfully": "ສຽງຂອງລູກຄ້າໄດ້ຖືກບັນທຶກໄວ້ແລ້ວ", - "Custom_Sounds": "Custom Sounds", "Custom_Translations": "Custom Translations", "Custom_Translations_Description": "ຄວນຈະເປັນ JSON ທີ່ຖືກຕ້ອງທີ່ຄີແມ່ນພາສາທີ່ມີພົດຈະນານຸກົມຂອງຄີແລະການແປ. ຕົວຢ່າງ: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "ປັບແຕ່ງ", @@ -1850,7 +1849,6 @@ "Num_Agents": "ຕົວແທນ #", "Number_of_messages": "ຈໍານວນຂອງຂໍ້ຄວາມ", "OAuth_Application": "ການນໍາໃຊ້ OAuth", - "OAuth_Applications": "ຄໍາຮ້ອງສະຫມັກ OAuth", "Objects": "ຈຸດປະສົງ", "Off": "ປິດ", "Off_the_record_conversation": "ໄປໄດ້, ການບັນທຶກການສົນທະນາ", @@ -2796,4 +2794,4 @@ "registration.component.form.invalidConfirmPass": "ການຢືນຢັນລະຫັດຜ່ານບໍ່ກົງກັບລະຫັດຜ່ານ", "registration.component.form.confirmPassword": "ຢືນຢັນລະຫັດຜ່ານຂອງທ່ານ", "registration.component.form.sendConfirmationEmail": "ສົ່ງອີເມວການຢືນຢັນ" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json index 00dc1ab4afd5..1d68a9db90c9 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/lt.i18n.json @@ -850,7 +850,6 @@ "Custom_Sound_Has_Been_Deleted": "Pasirinktinis garsas ištrintas.", "Custom_Sound_Info": "Pasirinktinė garso informacija", "Custom_Sound_Saved_Successfully": "Tinkintas garso įrašas sėkmingai išsaugotas", - "Custom_Sounds": "Pasirinktiniai garsai", "Custom_Translations": "Tinkinti vertimai", "Custom_Translations_Description": "Turėtų būti galiojantis JSON, kur raktai yra kalbos, kuriose yra raktinių žodžių ir vertimų žodynas. Pavyzdys: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Pritaikyti", @@ -1868,7 +1867,6 @@ "Num_Agents": "# Agentai", "Number_of_messages": "Pranešimų skaičius", "OAuth_Application": "\"OAuth\" programa", - "OAuth_Applications": "\"OAuth\" programos", "Objects": "Objektai", "Off": "Išjungtas", "Off_the_record_conversation": "Neakivaizdinė pokalbis", @@ -2813,4 +2811,4 @@ "registration.component.form.invalidConfirmPass": "Slaptažodžio patvirtinimas nesutampa su slaptažodžiu", "registration.component.form.confirmPassword": "Patvirtinkite savo slaptažodį", "registration.component.form.sendConfirmationEmail": "Siųsti patvirtinimo el. Laišką" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json index b29b50f0e6ce..de9ed7f71f81 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/lv.i18n.json @@ -803,7 +803,6 @@ "Custom_Sound_Has_Been_Deleted": "Pielāgotais signāls ir dzēsts.", "Custom_Sound_Info": "Pielāgotā signāla informācija", "Custom_Sound_Saved_Successfully": "Pielāgotais signāls tika veiksmīgi saglabāts", - "Custom_Sounds": "Pielāgotie signāli", "Custom_Translations": "Pielāgotie tulkojumi", "Custom_Translations_Description": "Jābūt derīgam JSON, kur taustiņi ir valodas, kurās ir taustiņu vārdnīca un tulkojumi. Piemērs: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Pielāgot", @@ -1826,7 +1825,6 @@ "Num_Agents": "# Aģenti", "Number_of_messages": "Ziņojumu skaits", "OAuth_Application": "OAuth lietotne", - "OAuth_Applications": "OAuth lietotnes", "Objects": "Objekti", "Off": "Izslēgts", "Off_the_record_conversation": "Slepena saruna", @@ -2754,4 +2752,4 @@ "registration.component.form.invalidConfirmPass": "Paroles apstiprinājums neatbilst parolei", "registration.component.form.confirmPassword": "Apstipriniet savu paroli", "registration.component.form.sendConfirmationEmail": "Nosūtīt apstiprinājuma e-pastu" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json index 56f2e20017bf..75c1882c0313 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/mn.i18n.json @@ -794,7 +794,6 @@ "Custom_Sound_Has_Been_Deleted": "Гаалийн дуу устгагдсан байна.", "Custom_Sound_Info": "Custom Sound Info", "Custom_Sound_Saved_Successfully": "Гаалийн дуу амжилттай хадгалагдсан", - "Custom_Sounds": "Гаалийн дуу чимээ", "Custom_Translations": "Гаалийн хэлүүд", "Custom_Translations_Description": "Хүчинтэй JSON байх ёстой түлхүүрүүд нь түлхүүр үг болон орчуулгын толь агуулсан хэлүүд байх ёстой. Жишээ нь: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Тохируулах", @@ -1808,7 +1807,6 @@ "Num_Agents": "# Агентууд", "Number_of_messages": "Мессежний тоо", "OAuth_Application": "OAuth програм", - "OAuth_Applications": "OAuth програмууд", "Objects": "Объект", "Off": "Off", "Off_the_record_conversation": "Бичлэгээс гадуурх ярилцлага", @@ -2747,4 +2745,4 @@ "registration.component.form.invalidConfirmPass": "Нууц үг баталгаажуулалт нь нууц үгтэй таарахгүй байна", "registration.component.form.confirmPassword": "Нууц үгээ батлах", "registration.component.form.sendConfirmationEmail": "Баталгаажуулах имэйл илгээх" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json index a17441f282a6..ae8be0bd18e1 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ms-MY.i18n.json @@ -795,7 +795,6 @@ "Custom_Sound_Has_Been_Deleted": "Bunyi adat telah dipadamkan.", "Custom_Sound_Info": "Maklumat Bunyi Khas", "Custom_Sound_Saved_Successfully": "Bunyi adat berjaya disimpan", - "Custom_Sounds": "Bunyi adat", "Custom_Translations": "Terjemahan Tradisional", "Custom_Translations_Description": "Harus menjadi JSON yang sah di mana kekunci adalah bahasa yang mengandungi kamus kunci dan terjemahan. Contoh: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Peribadikan", @@ -1820,7 +1819,6 @@ "Num_Agents": "# Agents", "Number_of_messages": "Bilangan mesej", "OAuth_Application": "OAuth Permohonan", - "OAuth_Applications": "Aplikasi OAuth", "Objects": "objek", "Off": "Off", "Off_the_record_conversation": "Off-the-rekod Perbualan", @@ -2764,4 +2762,4 @@ "registration.component.form.invalidConfirmPass": "Pengesahan kata laluan tidak sepadan dengan kata laluan", "registration.component.form.confirmPassword": "Sahkan kata laluan anda", "registration.component.form.sendConfirmationEmail": "Hantar e-mel pengesahan" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json index bda320108894..5a4891a48f02 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/nl.i18n.json @@ -728,7 +728,6 @@ "Canned_Response_Sharing_Public_Description": "Iedereen heeft toegang tot dit standaardantwoord", "Canned_Responses": "Standaardantwoorden", "Canned_Responses_Enable": "Schakel standaardantwoorden in", - "Create_your_First_Canned_Response": "Creëer uw eerste standaardantwoord", "Cannot_invite_users_to_direct_rooms": "Kan geen gebruikers in directe kamers uitnodigen", "Cannot_open_conversation_with_yourself": "U kunt geen directe berichten naar uzelf sturen", "Cannot_share_your_location": "Kan uw locatie niet delen...", @@ -1214,7 +1213,6 @@ "Country_Zambia": "Zambia", "Country_Zimbabwe": "Zimbabwe", "Create": "Aanmaken", - "Create_Canned_Response": "Standaardantwoord maken", "Create_channel": "Channel aanmaken", "Create_channels": "Kanalen aanmaken", "Create_a_public_channel_that_new_workspace_members_can_join": "Maak een openbaar kanaal aan waarbij nieuwe leden er lid van kunnen worden.", @@ -1285,7 +1283,6 @@ "Custom_Sound_Has_Been_Deleted": "Het aangepaste geluid is verwijderd.", "Custom_Sound_Info": "Aangepaste geluidsinfo", "Custom_Sound_Saved_Successfully": "Aangepast geluid is succesvol opgeslagen", - "Custom_Sounds": "Aangepaste geluiden", "Custom_Status": "Aangepaste status", "Custom_Translations": "Aangepaste vertalingen", "Custom_Translations_Description": "Moet een geldige JSON zijn waarbij sleutels talen zijn die een woordenboek met sleutel en vertaling bevatten. Voorbeeld: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -3012,12 +3009,10 @@ "New": "Nieuw", "New_Application": "Nieuwe app", "New_Business_Hour": "Nieuw zakenuur", - "New_Canned_Response": "Nieuwe standaardreactie", "New_chat_in_queue": "Nieuwe chat in wachtrij", "New_chat_priority": "Prioriteit gewijzigd: {{user}} heeft de prioriteit gewijzigd naar {{priority}}", "New_chat_transfer": "Nieuwe chatoverdracht: {{transfer}}", "New_chat_transfer_fallback": "Overgedragen naar fallback-afdeling: {{fallback}}", - "New_Contact": "Nieuw contact", "New_Custom_Field": "Nieuw aangepast veld", "New_Department": "Nieuwe afdeling", "New_discussion": "Nieuwe discussie", @@ -3132,9 +3127,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "Aantal recente chats om de geschatte wachttijd te berekenen", "Number_of_most_recent_chats_estimate_wait_time_description": "Dit aantal definieert het aantal laatst bediende kamers dat zal worden gebruikt om wachttijden in de wachtrij te berekenen.", "Number_of_users_autocomplete_suggestions": "Aantal autoaanvullingsvoorstellen van gebruikers", - "OAuth Apps": "OAuth-apps", "OAuth_Application": "OAuth-applicatie", - "OAuth_Applications": "OAuth-applicaties", "Objects": "Voorwerpen", "Off": "Uit", "Off_the_record_conversation": "Off-the-record gesprek", @@ -4893,4 +4886,4 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "E-mailadres van cloudaccount", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Ik ga akkoord met de <1>Algemene voorwaarden en <3>Privacybeleid" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json index ea1b17a028e7..4d148f582c36 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/no.i18n.json @@ -858,7 +858,6 @@ "Custom_Sound_Has_Been_Deleted": "Den egendefinerte lyden er slettet.", "Custom_Sound_Info": "Tilpasset lydinfo", "Custom_Sound_Saved_Successfully": "Tilpasset lyd lagret vellykket", - "Custom_Sounds": "Egendefinerte lyder", "Custom_Translations": "Tilpassede oversettelser", "Custom_Translations_Description": "Bør være en gyldig JSON der nøkler er språk som inneholder en nøkkelord og oversettelser. Eksempel: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Tilpass", @@ -1899,7 +1898,6 @@ "Number_of_most_recent_chats_estimate_wait_time": "Antall nylige chatter for å beregne estimert ventetid", "Number_of_most_recent_chats_estimate_wait_time_description": "Dette tallet definerer antall sist betjente rom som skal brukes til å beregne ventetid for kø.", "OAuth_Application": "OAuth Application", - "OAuth_Applications": "OAuth-applikasjoner", "Objects": "objekter", "Off": "Av", "Off_the_record_conversation": "Off-record-samtalen", @@ -2860,4 +2858,4 @@ "registration.component.form.invalidConfirmPass": "Passordbekreftelsen stemmer ikke overens med passordet", "registration.component.form.confirmPassword": "Bekreft passordet ditt", "registration.component.form.sendConfirmationEmail": "Send bekreftelses-e-post" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json index 857d4f98248f..e30eaad0bb08 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pl.i18n.json @@ -800,7 +800,6 @@ "Canned_Response_Sharing_Public_Description": "Każdy może uzyskać dostęp do tej predefiniowanej odpowiedzi", "Canned_Responses": "Predefiniowane odpowiedzi", "Canned_Responses_Enable": "Włącz predefiniowane odpowiedzi", - "Create_your_First_Canned_Response": "Utwórz swoją pierwszą predefiniowaną odpowiedź", "Cannot_invite_users_to_direct_rooms": "Nie można zaprosić użytkowników do pokoi bezpośrednich", "Cannot_open_conversation_with_yourself": "Nie można wysłać wiadomości bezpośredniej do siebie", "Cannot_share_your_location": "Nie można udostępnić Twojej lokalizacji…", @@ -1302,7 +1301,6 @@ "Country_Zambia": "Zambia", "Country_Zimbabwe": "Zimbabwe", "Create": "Utwórz", - "Create_Canned_Response": "Utwórz predefiniowaną odpowiedź", "Create_channel": "Utwórz kanał", "Create_channels": "Tworzenie kanałów", "Create_a_public_channel_that_new_workspace_members_can_join": "Utwórz publiczny kanał, do którego mogą dołączyć nowi członkowie obszaru roboczego.", @@ -1377,7 +1375,6 @@ "Custom_Sound_Has_Been_Deleted": "Dźwięk niestandardowy został usunięty.", "Custom_Sound_Info": "Informacje o dźwięku niestandardowym", "Custom_Sound_Saved_Successfully": "Dźwięk niestandardowy został zapisany", - "Custom_Sounds": "Dźwięki niestandardowe", "Custom_Status": "Status niestandardowy", "Custom_Translations": "Tłumaczenia niestandardowe", "Custom_Translations_Description": "Powinien to być prawidłowy JSON, w którym klucze są językami zawierającymi słownik klucza i tłumaczenia. Przykład: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -3261,14 +3258,12 @@ "New": "Nowy", "New_Application": "Nowa aplikacja", "New_Business_Hour": "Nowe godziny pracy", - "New_Canned_Response": "Nowa predefiniowana odpowiedź", "New_Call": "Nowe połączenie", "New_Call_Enterprise_Edition_Only": "Nowe połączenie (tylko wersja Enterprise)", "New_chat_in_queue": "Nowa rozmowa w kolejce", "New_chat_priority": "Zmieniono priorytet: {{user}} zmienił priorytet na {{priority}}", "New_chat_transfer": "Nowy transfer czatu: {{transfer}}", "New_chat_transfer_fallback": "Przeniesiony do działu zastępczego: {{fallback}}", - "New_Contact": "Nowy kontakt", "New_Custom_Field": "Nowe niestandardowe pole", "New_Department": "Nowy oddział", "New_discussion": "Nowa dyskusja", @@ -3389,9 +3384,7 @@ "Number_of_users_autocomplete_suggestions": "Liczba użytkowników sugestii autouzupełniania", "OAuth": "OAuth", "OAuth_Description": "Skonfiguruj metody uwierzytelniania poza samą nazwą użytkownika i hasłem.", - "OAuth Apps": "Aplikacje OAuth", "OAuth_Application": "Aplikacja OAuth", - "OAuth_Applications": "Aplikacje OAuth", "Objects": "Przedmioty", "Off": "Wyłączony", "Off_the_record_conversation": "Konwersacja \"Off-the-record\"", @@ -5146,8 +5139,8 @@ "Wednesday": "Środa", "Weekly_Active_Users": "Tygodniowo aktywni użytkownicy", "Welcome": "Witamy %s.", - "Welcome_to_workspace": "Witamy w {{Site_Name}}", "Welcome_to": "Witamy w [Site_Name]", + "Welcome_to_workspace": "Witamy w {{Site_Name}}", "Welcome_to_the": "Witamy w", "When": "Kiedy", "When_a_line_starts_with_one_of_there_words_post_to_the_URLs_below": "Gdy linia zaczyna się od jednego z tych słów, należy wysłać wiadomość na adres(y) URL poniżej", @@ -5365,4 +5358,4 @@ "RegisterWorkspace_Setup_Label": "E-mail konta w chmurze", "RegisterWorkspace_Syncing_Complete": "Synchronizacja zakończona", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Zgadzam się z <1>zasadami i warunkami i <3>Polityką prywatności." -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json index 6f7898d8a7af..10735c8f1d29 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pt-BR.i18n.json @@ -755,7 +755,6 @@ "Canned_Response_Sharing_Public_Description": "Qualquer um pode acessar esta resposta modelo", "Canned_Responses": "Respostas modelo", "Canned_Responses_Enable": "Habilitar respostas modelo", - "Create_your_First_Canned_Response": "Criar sua primeira resposta modelo", "Cannot_invite_users_to_direct_rooms": "Não é possível convidar pessoas para salas diretas", "Cannot_open_conversation_with_yourself": "Não é possível dirigir a mensagem com você mesmo", "Cannot_share_your_location": "Não foi possível compartilhar sua localização...", @@ -1242,7 +1241,6 @@ "Country_Zambia": "Zâmbia", "Country_Zimbabwe": "Zimbábue", "Create": "Criar", - "Create_Canned_Response": "Criar resposta modelo", "Create_channel": "Criar canal", "Create_A_New_Channel": "Criar um novo canal", "Create_new": "Criar um novo", @@ -1311,7 +1309,6 @@ "Custom_Sound_Has_Been_Deleted": "O som personalizado foi excluído.", "Custom_Sound_Info": "Informação de som personalizada", "Custom_Sound_Saved_Successfully": "Som personalizado salvo com sucesso", - "Custom_Sounds": "Sons personalizados", "Custom_Status": "Situação personalizada", "Custom_Translations": "Traduções personalizadas", "Custom_Translations_Description": "Deve ser um JSON válido no qual as chaves são idiomas contendo um dicionário de termos e traduções. Exemplo: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -3048,12 +3045,10 @@ "New": "Novo", "New_Application": "Novo aplicativo", "New_Business_Hour": "Novo horário de expediente", - "New_Canned_Response": "Nova resposta modelo", "New_chat_in_queue": "Novo chat na fila", "New_chat_priority": "Prioridade alterada: {{user}} alterou a prioridade para {{priority}}", "New_chat_transfer": "Nova transferência de conversa: {{transfer}}", "New_chat_transfer_fallback": "Transferido para departamento de fallback: {{fallback}}", - "New_Contact": "Novo contato", "New_Custom_Field": "Novo campo personalizado", "New_Department": "Novo departamento", "New_discussion": "Nova discussão", @@ -3169,9 +3164,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "Número de conversas recentes para cálculo de tempo na fila", "Number_of_most_recent_chats_estimate_wait_time_description": "Este numero define a quantidade de últimas salas atendidas que será usada para calculo de estimativa de tempo de espera da fila.", "Number_of_users_autocomplete_suggestions": "Número de sugestões de preenchimento automático dos usuários", - "OAuth Apps": "Aplicativos OAuth", "OAuth_Application": "Aplicativo OAuth", - "OAuth_Applications": "Aplicativos OAuth", "Objects": "Objetos", "Off": "Fora", "Off_the_record_conversation": "Conversa sem registro", @@ -4946,4 +4939,4 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "E-mail da conta da nuvem", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Eu concordo com os <1>Termos e condições e a <3>Política de privacidade" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json index 17a78e40d108..0d87a6512f51 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/pt.i18n.json @@ -941,7 +941,6 @@ "Custom_Sound_Has_Been_Deleted": "O som personalizado foi excluído.", "Custom_Sound_Info": "Informação de som personalizada", "Custom_Sound_Saved_Successfully": "Som personalizado salvo com sucesso", - "Custom_Sounds": "Sons Personalizados", "Custom_Translations": "Traduções Personalizados", "Custom_Translations_Description": "Deve ser um JSON válido onde as chaves são idiomas que contêm um dicionário de chave e traduções. Exemplo: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Custom_User_Status_Edit": "Editar Estado Personalizado do Utilizador", @@ -2113,9 +2112,7 @@ "Num_Agents": "# Agentes", "Number_of_events": "Número de eventos", "Number_of_messages": "Número de mensagens", - "OAuth Apps": "Aplicativos OAuth", "OAuth_Application": "Aplicação OAuth", - "OAuth_Applications": "Aplicações OAuth", "Objects": "Objetos", "Off": "Desligado", "Off_the_record_conversation": "Conversa Off-the-record", @@ -3176,4 +3173,4 @@ "registration.component.form.invalidConfirmPass": "A confirmação da senha não é igual à senha", "registration.component.form.confirmPassword": "Confirmar a senha", "registration.component.form.sendConfirmationEmail": "Enviar email de confirmação" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json index e9332c55be80..d7a84c0d5367 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ro.i18n.json @@ -796,7 +796,6 @@ "Custom_Sound_Has_Been_Deleted": "Sunetul particularizat a fost șters.", "Custom_Sound_Info": "Informații despre sunet personalizat", "Custom_Sound_Saved_Successfully": "Sunetul particularizat a fost salvat cu succes", - "Custom_Sounds": "Sunete personalizate", "Custom_Translations": "Traduceri personalizate", "Custom_Translations_Description": "Ar trebui să fie un JSON valid în cazul în care cheile sunt limbi care conțin un dicționar de chei și traduceri. Exemplu: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Personalizați", @@ -1812,7 +1811,6 @@ "Num_Agents": "# Agenți", "Number_of_messages": "Numărul de mesaje", "OAuth_Application": "Aplicație OAuth", - "OAuth_Applications": "Aplicații OAuth", "Objects": "Obiecte", "Off": "De pe", "Off_the_record_conversation": "Off-the-record conversație", @@ -2753,4 +2751,4 @@ "registration.component.form.invalidConfirmPass": "Confirmarea parolei nu se potrivește cu parola introdusă", "registration.component.form.confirmPassword": "Confirmați parola", "registration.component.form.sendConfirmationEmail": "Trimite email de confirmare" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json index 8f595d4122bb..bf4713cf7bb5 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ru.i18n.json @@ -827,7 +827,6 @@ "Canned_Response_Sharing_Public_Description": "Любой может получить доступ к этому заготовленному ответу", "Canned_Responses": "Заготовленные ответы", "Canned_Responses_Enable": "Включить заготовленные ответы", - "Create_your_First_Canned_Response": "Создайте свой первый заготовленный ответ", "Cannot_invite_users_to_direct_rooms": "Нельзя приглашать пользователей в личную переписку", "Cannot_open_conversation_with_yourself": "Нельзя создавать чат с самим собой", "Cannot_share_your_location": "Не могу поделиться местоположением...", @@ -1319,7 +1318,6 @@ "Country_Zambia": "Замбия", "Country_Zimbabwe": "Зимбабве", "Create": "Создать", - "Create_Canned_Response": "Создать заготовленный ответ", "Create_channel": "Создать канал", "Create_channels": "Создать канал", "Create_A_New_Channel": "Создать новый канал ", @@ -1389,7 +1387,6 @@ "Custom_Sound_Has_Been_Deleted": "Пользовательский звук успешно удален", "Custom_Sound_Info": "Информация о пользовательском звуке", "Custom_Sound_Saved_Successfully": "Пользовательский звук успешно сохранен", - "Custom_Sounds": "Пользовательские звуки", "Custom_Status": "Пользовательский статус", "Custom_Translations": "Пользовательские переводы", "Custom_Translations_Description": "Должен быть валидным JSON, где ключи - языки, значения - словари ключей и их переводов. Пример: \n ` \n \"en\": { \n \"Channels\": \"Rooms\" \n }, \n \"pt\": { \n \"Channels\": \"Salas\" \n } \n}`", @@ -3163,14 +3160,12 @@ "New": "Новый", "New_Application": "Новое приложение", "New_Business_Hour": "Новые рабочие часы", - "New_Canned_Response": "Новый заготовленный ответ", "New_Call": "Новый звонок", "New_Call_Enterprise_Edition_Only": "Новый звонок (Только для ЕЕ)", "New_chat_in_queue": "Новый чат в очереди", "New_chat_priority": "Приоритет изменен: {{user}} изменил приоритет на {{priority}}", "New_chat_transfer": "Новый чат-трансфер: {{transfer}}", "New_chat_transfer_fallback": "Передано в резервный отдел: {{fallback}}", - "New_Contact": "Новый контакт", "New_Custom_Field": "Новое пользовательское поле", "New_Department": "Новый отдел", "New_discussion": "Новое обсуждение", @@ -3289,9 +3284,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "Количество недавних чатов для расчета предполагаемого времени ожидания", "Number_of_most_recent_chats_estimate_wait_time_description": "Это число определяет количество последних обслуженных чатов, которое будет использовано для вычисления времени ожидания очереди.", "Number_of_users_autocomplete_suggestions": "Количество автозаполненных предложений пользователей", - "OAuth Apps": "Приложения OAuth", "OAuth_Application": "Приложение OAuth", - "OAuth_Applications": "Приложения OAuth", "Objects": "Объекты", "Off": "Выключено", "Off_the_record_conversation": "Конфиденциальная беседа", @@ -5107,4 +5100,4 @@ "RegisterWorkspace_Setup_Label": "Адрес электронной почты учетной записи в облаке", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "Я принимаю <1>Положения и условия и <3>Политику конфиденциальности", "Theme_Appearence": "Внешний вид" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json index b1da116ee0c2..881d6dfc7016 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sk-SK.i18n.json @@ -801,7 +801,6 @@ "Custom_Sound_Has_Been_Deleted": "Vlastný zvuk bol odstránený.", "Custom_Sound_Info": "Informácie o vlastnom zvuku", "Custom_Sound_Saved_Successfully": "Vlastný zvuk bol úspešne uložený", - "Custom_Sounds": "Vlastné zvuky", "Custom_Translations": "Vlastné preklady", "Custom_Translations_Description": "Mala by to byť platná JSON, kde kľúče sú jazyky obsahujúce slovník kľúčov a prekladov. Príklad: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Prispôsobiť", @@ -1822,7 +1821,6 @@ "Num_Agents": "# Agenti", "Number_of_messages": "Počet správ", "OAuth_Application": "Aplikácia OAuth", - "OAuth_Applications": "Aplikácie OAuth", "Objects": "objektov", "Off": "preč", "Off_the_record_conversation": "Konverzácia mimo záznamu", @@ -2763,4 +2761,4 @@ "registration.component.form.invalidConfirmPass": "Potvrdenie hesla sa nezhoduje s heslom", "registration.component.form.confirmPassword": "Potvrďte svoje heslo", "registration.component.form.sendConfirmationEmail": "Pošlite potvrdzovací e-mail" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json index d44949f6f2bc..4655855136ae 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sl-SI.i18n.json @@ -792,7 +792,6 @@ "Custom_Sound_Has_Been_Deleted": "Zvok po meri je bil izbrisan.", "Custom_Sound_Info": "Informacije zvoka po meri", "Custom_Sound_Saved_Successfully": "Zvok po meri uspešno shranjen", - "Custom_Sounds": "Zvoki po meri", "Custom_Translations": "Prevodi po meri", "Custom_Translations_Description": "Naj bo veljaven JSON, kjer so ključi jeziki, ki vsebujejo slovar ključa in prevodov. Primer: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Prilagodi", @@ -1802,7 +1801,6 @@ "Num_Agents": "# agenti", "Number_of_messages": "Število sporočil", "OAuth_Application": "Aplikacija OAuth", - "OAuth_Applications": "Aplikacije OAuth", "Objects": "Predmeti", "Off": "Izklop", "Off_the_record_conversation": "Zaupni pogovor", @@ -2743,4 +2741,4 @@ "registration.component.form.invalidConfirmPass": "Potrditev gesla se ne ujema z geslom", "registration.component.form.confirmPassword": "Potrdi geslo", "registration.component.form.sendConfirmationEmail": "Pošlji potrditveno e-poštno sporočilo" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json index a90ab5234b22..9e95d7d2e600 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sq.i18n.json @@ -796,7 +796,6 @@ "Custom_Sound_Has_Been_Deleted": "Tingujt me porosi janë fshirë.", "Custom_Sound_Info": "Informacioni personal i zërit", "Custom_Sound_Saved_Successfully": "Tingulli i personalizuar ruhet me sukses", - "Custom_Sounds": "Custom Tinguj", "Custom_Translations": "Trajnime të personalizuara", "Custom_Translations_Description": "Duhet të jetë një JSON i vlefshëm ku çelësat janë gjuhë që përmbajnë një fjalor të çelësave dhe përkthimeve. Shembull: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Customize", @@ -1812,7 +1811,6 @@ "Num_Agents": "# Agents", "Number_of_messages": "Numri i mesazheve", "OAuth_Application": "OAuth Aplikimi", - "OAuth_Applications": "Aplikime OAuth", "Objects": "objektet", "Off": "nga", "Off_the_record_conversation": "Off-the-rekord bisedë", @@ -2754,4 +2752,4 @@ "registration.component.form.invalidConfirmPass": "Konfirmimi Fjalëkalimi nuk përputhet me fjalëkalimin", "registration.component.form.confirmPassword": "Konfirmoni fjalëkalimin tuaj", "registration.component.form.sendConfirmationEmail": "Dërgo email konfirmimi" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json index cfedcb3e0c46..e86375f295fd 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sr.i18n.json @@ -711,7 +711,6 @@ "Custom_Sound_Has_Been_Deleted": "Прилагођени звук је обрисан.", "Custom_Sound_Info": "Информације о прилагођеном звуку", "Custom_Sound_Saved_Successfully": "Прилагођен звук је успешно сачуван", - "Custom_Sounds": "Прилагођени звуци", "Custom_Translations": "Прилагођени преводи", "Customize": "Прилагоди", "Dashboard": "Kомандна табла", @@ -1651,7 +1650,6 @@ "Num_Agents": "# Агенти", "Number_of_messages": "Број порука", "OAuth_Application": "ОАутх Апликација", - "OAuth_Applications": "ОАутх Апликације", "Objects": "Објекти", "Off": "С", "Off_the_record_conversation": "Офф-тхе-рецорд Разговор", @@ -2564,4 +2562,4 @@ "registration.component.form.invalidConfirmPass": "Потврдна лозинка се не поклапа са лозинком", "registration.component.form.confirmPassword": "Потврдите лозинку", "registration.component.form.sendConfirmationEmail": "Пошаљи потврдну поруку" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json index e2d570e46574..97b4015b0c1f 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/sv.i18n.json @@ -849,7 +849,6 @@ "Canned_Response_Sharing_Public_Description": "Alla har åtkomst till standardsvaret", "Canned_Responses": "Standardsvar", "Canned_Responses_Enable": "Aktivera standardsvar", - "Create_your_First_Canned_Response": "Skapa ditt första standardsvar", "Cannot_invite_users_to_direct_rooms": "Det går inte att bjuda in användare att styra rum", "Cannot_open_conversation_with_yourself": "Kan inte skicka direktmeddelande till dig själv", "Cannot_share_your_location": "Kan inte dela din plats...", @@ -1359,7 +1358,6 @@ "Country_Zambia": "Zambia", "Country_Zimbabwe": "Zimbabwe", "Create": "Skapa", - "Create_Canned_Response": "Skapa standardsvar", "Create_channel": "Skapa kanal", "Create_channels": "Skapa kanaler", "Create_a_public_channel_that_new_workspace_members_can_join": "Skapa en offentlig kanal som nya arbetsytemedlemmar kan ansluta till.", @@ -1436,7 +1434,6 @@ "Custom_Sound_Has_Been_Deleted": "Det anpassade ljudet har tagits bort.", "Custom_Sound_Info": "Anpassad ljudinfo", "Custom_Sound_Saved_Successfully": "Anpassat ljud sparades", - "Custom_Sounds": "Anpassade ljud", "Custom_Status": "Anpassad status", "Custom_Translations": "Anpassade översättningar", "Custom_Translations_Description": "Bör vara en giltig JSON där nycklar är språk som innehåller en ordbok för nyckel och översättningar. Exempel: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -1858,7 +1855,6 @@ "Enterprise_Departments_description_upgrade": "Arbetsytorna i Community Edition kan bara skapa en avdelning. Uppgradera till Enterprise för att ta bort begränsningar och ge ditt arbetsområde mer kraft.", "Enterprise_Departments_description_free_trial": "Arbetsytorna i Community Edition kan skapa en avdelning. Starta en kostnadsfri testversion för Enterprise för att skapa flera avdelningar idag!", "Enterprise_Description": "Uppdatera Enterprise-licensen manuellt.", - "Enterprise_feature": "Funktion för Enterprise", "Enterprise_License": "Enterprise-licens", "Enterprise_License_Description": "Om din arbetsyta är registrerad och en licens har tillhandahållits av Rocket.Chat-molnet behöver du inte uppdatera licensen manuellt här.", "Enterprise_Only": "Endast Enterprise", @@ -3450,14 +3446,12 @@ "New": "Nytt", "New_Application": "Ny applikation", "New_Business_Hour": "Ny kontorstid", - "New_Canned_Response": "Nytt standardsvar", "New_Call": "Nytt samtal", "New_Call_Enterprise_Edition_Only": "Nytt samtal (endast Enterprise Edition)", "New_chat_in_queue": "Ny chatt i kö", "New_chat_priority": "Prioriteten har ändrats: {{user}} ändrade prioriteten till {{priority}}", "New_chat_transfer": "Ny chattöverföring: {{transfer}}", "New_chat_transfer_fallback": "Överförd till reservavdelning: {{fallback}}", - "New_Contact": "Ny kontakt", "New_Custom_Field": "Nytt anpassat fält", "New_Department": "Ny avdelning", "New_discussion": "Ny diskussion", @@ -3586,9 +3580,7 @@ "Number_of_users_autocomplete_suggestions": "Antal användarförslag på automatisk komplettering", "OAuth": "OAuth", "OAuth_Description": "Konfigurera autentiseringsmetoder som omfattar mer än bara användarnamn och lösenord.", - "OAuth Apps": "OAuth-appar", "OAuth_Application": "OAuth-applikation", - "OAuth_Applications": "OAuth-tillämpningar", "Objects": "Objekt", "Off": "Av", "Off_the_record_conversation": "Off-the-record-konversation", @@ -5773,4 +5765,4 @@ "Uninstall_grandfathered_app": "Avinstallera {{appName}}?", "App_will_lose_grandfathered_status": "**Denna {{context}}-app kommer att förlora sin status som gammal app.** \n \nArbetsytorna i Community Edition kan ha upp till {{limit}} __kontext__-appar aktiverade. Gamla appar inkluderas i gränsen, men gränsen tillämpas inte på dem.", "Theme_Appearence": "Utseende för tema" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json index 5a9bc2039e2a..87ea611e9dc8 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ta-IN.i18n.json @@ -796,7 +796,6 @@ "Custom_Sound_Has_Been_Deleted": "தனிப்பயன் ஒலி நீக்கப்பட்டது.", "Custom_Sound_Info": "விருப்ப ஒலி தகவல்", "Custom_Sound_Saved_Successfully": "தனிப்பயன் ஒலி வெற்றிகரமாக சேமிக்கப்பட்டது", - "Custom_Sounds": "விருப்ப ஒலிகள்", "Custom_Translations": "தனிப்பயன் மொழிபெயர்ப்புகள்", "Custom_Translations_Description": "விசைகள் விசை மற்றும் மொழிபெயர்ப்புகளின் ஒரு மொழியைக் கொண்டுள்ள மொழிகளில் எங்கே சரியான JSON ஆக இருக்க வேண்டும். எடுத்துக்காட்டு: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "தனிப்பயனாக்கலாம்", @@ -1813,7 +1812,6 @@ "Num_Agents": "# முகவர்கள்", "Number_of_messages": "செய்திகளின் எண்ணிக்கை", "OAuth_Application": "அறிந்திருந்தால் விண்ணப்ப", - "OAuth_Applications": "அறிந்திருந்தால் பயன்பாடுகள்", "Objects": "பொருள்கள்", "Off": "ஆஃப்", "Off_the_record_conversation": "பதிவில் உரையாடல்", @@ -2758,4 +2756,4 @@ "registration.component.form.invalidConfirmPass": "கடவுச்சொல்லை உறுதிப்படுத்தும் கடவுச்சொல் பொருந்தவில்லை", "registration.component.form.confirmPassword": "உங்கள் கடவுச்சொல்லை உறுதிப்படுத்துக", "registration.component.form.sendConfirmationEmail": "உறுதிப்படுத்தும் மின்னஞ்சல் அனுப்பவும்" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json index f8fa070b4e4f..a57b7da81f20 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/th-TH.i18n.json @@ -794,7 +794,6 @@ "Custom_Sound_Has_Been_Deleted": "เสียงที่กำหนดเองถูกลบแล้ว", "Custom_Sound_Info": "ข้อมูลเสียงที่กำหนดเอง", "Custom_Sound_Saved_Successfully": "บันทึกเสียงที่กำหนดเองเรียบร้อยแล้ว", - "Custom_Sounds": "เสียงที่กำหนดเอง", "Custom_Translations": "การแปลแบบกำหนดเอง", "Custom_Translations_Description": "ควรเป็น JSON ที่ถูกต้องซึ่งคีย์คือภาษาที่มีพจนานุกรมสำคัญและคำแปล ตัวอย่าง: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "ปรับแต่ง", @@ -1806,7 +1805,6 @@ "Num_Agents": "# Agents", "Number_of_messages": "จำนวนข้อความ", "OAuth_Application": "แอ็พพลิเคชัน OAuth", - "OAuth_Applications": "แอ็พพลิเคชัน OAuth", "Objects": "วัตถุ", "Off": "ปิด", "Off_the_record_conversation": "บทสนทนานอกแช็ท", @@ -2741,4 +2739,4 @@ "registration.component.form.invalidConfirmPass": "การยืนยันรหัสผ่านไม่ตรงกับรหัสผ่าน", "registration.component.form.confirmPassword": "ยืนยันรหัสผ่านของคุณ", "registration.component.form.sendConfirmationEmail": "ส่งอีเมลยืนยัน" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json index 6795c10d16af..24b5ef7f7b00 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/tr.i18n.json @@ -935,7 +935,6 @@ "Custom_Sound_Has_Been_Deleted": "Özel ses silindi.", "Custom_Sound_Info": "Özel Ses Bilgisi", "Custom_Sound_Saved_Successfully": "Özel ses başarıyla kaydedildi", - "Custom_Sounds": "Özel Sesler", "Custom_Status": "Özelleştirilmiş durum", "Custom_Translations": "Özel Çeviriler", "Custom_Translations_Description": "Anahtarların bir anahtar sözcük ve çeviriler içeren diller olduğu geçerli bir JSON olmalıdır. Örnek: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -2168,9 +2167,7 @@ "Number_of_events": "Etkinlik sayısı", "Number_of_federated_users": "Federe kullanıcı sayısı", "Number_of_messages": "İleti sayısı", - "OAuth Apps": "OAuth Uygulamaları", "OAuth_Application": "OAuth Uygulaması", - "OAuth_Applications": "OAuth Uygulamaları", "Objects": "Nesneler", "Off": "Kapalı", "Off_the_record_conversation": "Kayıt Dışı Görüşme", @@ -3265,4 +3262,4 @@ "registration.component.form.confirmPassword": "Parolanızı onaylayın", "registration.component.form.sendConfirmationEmail": "Doğrulama e-postası gönder", "RegisterWorkspace_Features_Omnichannel_Title": "Çoklu Kanal" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/ug.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/ug.i18n.json index c12c6d2464d8..4c8759aad52c 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/ug.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/ug.i18n.json @@ -759,7 +759,6 @@ "Num_Agents": "مۇلازىم#", "Number_of_messages": "ئۇچۇر سانى", "OAuth_Application": "ئەپ OAuth", - "OAuth_Applications": "ئەپ OAuth", "Objects": "نەرسە", "Off_the_record_conversation": "خاتىرىلەنمىگەن دىيالوگ", "Off_the_record_conversation_is_not_available_for_your_browser_or_device": "سىزنىڭ توركۆرگۈچىڭىز ياكى ئۈسكىنىڭىز خاتىرلەنمەيدىغان دىئالوگنى قوللىمايدۇ.", @@ -1242,4 +1241,4 @@ "registration.component.form.invalidConfirmPass": "ئىككىنچى قېتىم كىرگۈزۈلگەن مەخپىي نومۇر بىلەن بىرىنچى قېتىم كىرگۈزۈلگىنى بىلەن ماس كەلمىدى.", "registration.component.form.confirmPassword": "مەخپىي نومۇرنى جەزملەشتۈرۈش", "registration.component.form.sendConfirmationEmail": "جەزملەشتۈرگەن ئىلخەت يوللاندى" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json index 067c3be37daf..220552fce279 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/uk.i18n.json @@ -1018,7 +1018,6 @@ "Custom_Sound_Has_Been_Deleted": "Користувацькиц звук було видалено.", "Custom_Sound_Info": "Власна звукова інформація", "Custom_Sound_Saved_Successfully": "Користувальницький звук успішно збережено", - "Custom_Sounds": "Користувацькі звуки", "Custom_Translations": "Користувацькі переклади", "Custom_Translations_Description": "Повинен бути дійсний JSON, де ключами є мови, що містять словник ключа та переклади. Приклад: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Custom_User_Status": "Спеціальний статус користувача", @@ -2331,7 +2330,6 @@ "Num_Agents": "# Агенти", "Number_of_messages": "кількість повідомлень", "OAuth_Application": "OAuth Застосування", - "OAuth_Applications": "OAuth Додатки", "Objects": "об'єкти", "Off": "вимкнено", "Off_the_record_conversation": "Off-записувані Діалог", @@ -3350,4 +3348,4 @@ "registration.component.form.invalidConfirmPass": "Підтвердження пароля не збігаються пароль", "registration.component.form.confirmPassword": "Підтвердити новий пароль", "registration.component.form.sendConfirmationEmail": "Надіслати електронною поштою підтвердження" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json index 4c57b5fd674f..9f4e82a71173 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/vi-VN.i18n.json @@ -890,7 +890,6 @@ "Custom_Sound_Has_Been_Deleted": "Âm thanh tùy chỉnh đã bị xóa.", "Custom_Sound_Info": "Thông tin âm thanh tùy chỉnh", "Custom_Sound_Saved_Successfully": "Đã lưu âm tùy chỉnh thành công", - "Custom_Sounds": "Âm thanh tuỳ chỉnh", "Custom_Translations": "Bản dịch tùy chỉnh", "Custom_Translations_Description": "Nên là một JSON hợp lệ, trong đó các phím là các ngôn ngữ chứa từ điển của khóa và bản dịch. Ví dụ: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "Tùy chỉnh", @@ -1913,7 +1912,6 @@ "Num_Agents": "# Agent", "Number_of_messages": "Số lượng tin nhắn", "OAuth_Application": "Ứng dụng OAuth", - "OAuth_Applications": "Ứng dụng OAuth", "Objects": "Các đối tượng", "Off": "Tắt", "Off_the_record_conversation": "Cuộc trò chuyện ngoài bản ghi", @@ -2852,4 +2850,4 @@ "registration.component.form.invalidConfirmPass": "Xác nhận mật khẩu không khớp với mật khẩu", "registration.component.form.confirmPassword": "Xác nhận mật khẩu của bạn", "registration.component.form.sendConfirmationEmail": "Gửi email xác nhận" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json index 121795ea5629..d2295fedf80d 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh-HK.i18n.json @@ -817,7 +817,6 @@ "Custom_Sound_Has_Been_Deleted": "自定义声音已被删除。", "Custom_Sound_Info": "自定义声音信息", "Custom_Sound_Saved_Successfully": "自定义声音保存成功", - "Custom_Sounds": "自定义声音", "Custom_Translations": "定制翻译", "Custom_Translations_Description": "应该是有效的JSON,其中键是包含键和翻译字典的语言。例如: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", "Customize": "定制", @@ -1837,7 +1836,6 @@ "Num_Agents": "#代理商", "Number_of_messages": "消息的数量", "OAuth_Application": "OAuth应用程序", - "OAuth_Applications": "OAuth应用程序", "Objects": "对象", "Off": "离", "Off_the_record_conversation": "最新的对话", @@ -2773,4 +2771,4 @@ "registration.component.form.invalidConfirmPass": "第二次密码输入与第一次不匹配", "registration.component.form.confirmPassword": "确认密码", "registration.component.form.sendConfirmationEmail": "已发送确认电子邮件" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json index b87c3f482273..fef07d94e499 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh-TW.i18n.json @@ -721,7 +721,6 @@ "Canned_Response_Sharing_Public_Description": "任何人都可以存取此罐頭回覆", "Canned_Responses": "罐頭訊息", "Canned_Responses_Enable": "啟用罐頭訊息", - "Create_your_First_Canned_Response": "建立您的第一個罐頭回覆", "Cannot_invite_users_to_direct_rooms": "無法邀請使用者至私訊", "Cannot_open_conversation_with_yourself": "無法與自己私訊", "Cannot_share_your_location": "無法分享您的位置...", @@ -1205,7 +1204,6 @@ "Country_Zambia": "贊比亞", "Country_Zimbabwe": "津巴布韋", "Create": "建立", - "Create_Canned_Response": "建立固定回覆", "Create_channel": "建立 Channel", "Create_A_New_Channel": "建立一個新Channel", "Create_new": "建立新的", @@ -1273,7 +1271,6 @@ "Custom_Sound_Has_Been_Deleted": "自訂音效已刪除。", "Custom_Sound_Info": "自訂音效資訊", "Custom_Sound_Saved_Successfully": "自訂音效已成功保存", - "Custom_Sounds": "自訂音效", "Custom_Status": "自訂狀態", "Custom_Translations": "自訂翻譯", "Custom_Translations_Description": "應該是有效的JSON,其中鍵是包含鍵和翻譯字典的語言。例如: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -2942,12 +2939,10 @@ "New": "新的", "New_Application": "新應用程式", "New_Business_Hour": "新營業時間", - "New_Canned_Response": "新的罐頭訊息", "New_chat_in_queue": "佇列中的新聊天", "New_chat_priority": "優先權已更改:{{user}}將優先權更改為{{priority}}", "New_chat_transfer": "新的聊天轉換: {{transfer}}", "New_chat_transfer_fallback": "轉移到後方部門:{{fallback}}", - "New_Contact": "新的聯絡人", "New_Custom_Field": "新的自定欄位", "New_Department": "新部門", "New_discussion": "新的討論", @@ -3056,9 +3051,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "最近聊天的次數以計算預估的等待時間", "Number_of_most_recent_chats_estimate_wait_time_description": "此數字定義將用於計算隊列等待時間的最後服務房間數。", "Number_of_users_autocomplete_suggestions": "使用者自動完成建議的數量", - "OAuth Apps": "OAuth 應用程式", "OAuth_Application": "OAuth 應用程式", - "OAuth_Applications": "OAuth 應用程式", "Objects": "對象", "Off": "關閉", "Off_the_record_conversation": "不公開的對話", @@ -4603,4 +4596,4 @@ "RegisterWorkspace_Features_Omnichannel_Title": "Omnichannel", "RegisterWorkspace_Setup_Label": "雲端帳戶電子郵件", "cloud.RegisterWorkspace_Setup_Terms_Privacy": "我同意<1>條款及條件和<3>隱私權政策" -} +} \ No newline at end of file diff --git a/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json b/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json index 93655d47231d..8b08aa0c1489 100644 --- a/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json +++ b/apps/meteor/packages/rocketchat-i18n/i18n/zh.i18n.json @@ -1149,7 +1149,6 @@ "Custom_Sound_Has_Been_Deleted": "自定义声音已删除。", "Custom_Sound_Info": "自定义声音信息", "Custom_Sound_Saved_Successfully": "自定义声音保存成功", - "Custom_Sounds": "自定义声音", "Custom_Status": "自定义状态", "Custom_Translations": "自定义翻译", "Custom_Translations_Description": "应使用 JSON 文件格式,键为语言,值为翻译。例如: \n `{\"en\": {\"Channels\": \"Rooms\"},\"pt\": {\"Channels\": \"Salas\"}}`", @@ -2645,11 +2644,9 @@ "New": "新", "New_Application": "新应用", "New_Business_Hour": "新的营业时间", - "New_Canned_Response": "新的自动回复", "New_chat_in_queue": "新聊天等候处理", "New_chat_priority": "已变更优先级:{{user}} 变更优先级为 {{priority}}", "New_chat_transfer": "新聊天转移:{{transfer}}", - "New_Contact": "新联系人", "New_Custom_Field": "新的自定义字段", "New_Department": "新部门", "New_discussion": "新讨论", @@ -2747,9 +2744,7 @@ "Number_of_most_recent_chats_estimate_wait_time": "用于计算预计等待时间的最近聊天数", "Number_of_most_recent_chats_estimate_wait_time_description": "此数值将定义用于计算队列等候时间的近期服务聊天室数量", "Number_of_users_autocomplete_suggestions": "自动建议数量", - "OAuth Apps": "OAuth 应用", "OAuth_Application": "OAuth 应用", - "OAuth_Applications": "OAuth 应用", "Objects": "物品", "Off": "关闭", "Off_the_record_conversation": "无记录会话", @@ -4143,4 +4138,4 @@ "registration.component.form.invalidConfirmPass": "两次输入的密码不一致", "registration.component.form.confirmPassword": "确认密码", "registration.component.form.sendConfirmationEmail": "已发送确认电子邮件" -} +} \ No newline at end of file From 39322413fbd7f4a34e287c9e82932976d943a24d Mon Sep 17 00:00:00 2001 From: Guilherme Gazzo Date: Mon, 7 Aug 2023 16:14:38 -0300 Subject: [PATCH 013/408] chore: use pixels for margins and paddings (#30023) Co-authored-by: dougfabris --- .../client/emojione-sprites.css | 4 +- .../emoji-emojione/lib/generateEmojiIndex.mjs | 4 +- .../theme/client/imports/components/emoji.css | 4 +- .../client/imports/general/variables.css | 6 +- .../client/popup/ComposerBoxPopup.tsx | 6 +- .../ComposerBoxPopupPreview.tsx | 6 +- .../BurgerMenu/BurgerBadge.stories.tsx | 2 +- .../BurgerMenu/BurgerMenuButton.tsx | 2 +- .../client/components/BurgerMenu/Wrapper.tsx | 4 +- .../components/ConfirmOwnerChangeModal.tsx | 4 +- .../ContextualbarScrollableContent.tsx | 4 +- .../meteor/client/components/FilterByText.tsx | 6 +- .../GenericModal/withDoNotAskAgain.tsx | 2 +- .../GenericResourceUsage.tsx | 2 +- .../GenericResourceUsageSkeleton.tsx | 2 +- .../GenericTable/GenericTable.stories.tsx | 2 +- .../components/GenericTable/GenericTable.tsx | 2 +- .../GenericTable/GenericTableLoadingRow.tsx | 2 +- .../GenericUpsellModal/GenericUpsellModal.tsx | 2 +- .../components/InfoPanel/InfoPanelAction.tsx | 2 +- .../components/InfoPanel/InfoPanelField.tsx | 2 +- .../components/InfoPanel/InfoPanelLabel.tsx | 2 +- .../components/InfoPanel/InfoPanelSection.tsx | 2 +- .../components/InfoPanel/InfoPanelText.tsx | 2 +- .../components/InfoPanel/InfoPanelTitle.tsx | 2 +- .../client/components/ListItem.stories.tsx | 8 +- .../client/components/Navbar/Navbar.tsx | 2 +- .../client/components/NotFoundState.tsx | 2 +- .../components/Omnichannel/Skeleton.tsx | 6 +- .../client/components/Omnichannel/Tags.tsx | 6 +- .../Omnichannel/modals/CloseChatModal.tsx | 164 +++++++++--------- .../modals/EnterpriseDepartmentsModal.tsx | 2 +- .../Omnichannel/modals/ForwardChatModal.tsx | 91 +++++----- .../Omnichannel/modals/TranscriptModal.tsx | 52 +++--- .../components/Page/PageBlockWithBorder.tsx | 2 +- .../client/components/Page/PageContent.tsx | 2 +- .../client/components/Page/PageFooter.tsx | 4 +- .../client/components/Page/PageHeader.tsx | 6 +- apps/meteor/client/components/PlanTag.tsx | 2 +- .../RoomAutoComplete/RoomAutoComplete.tsx | 4 +- .../RoomAutoCompleteMultiple.tsx | 4 +- .../client/components/Sidebar/Header.tsx | 4 +- .../components/Sidebar/SidebarGenericItem.tsx | 2 +- .../Sidebar/SidebarNavigationItem.tsx | 4 +- apps/meteor/client/components/Skeleton.tsx | 14 +- apps/meteor/client/components/TextCopy.tsx | 4 +- .../client/components/UrlChangeModal.tsx | 2 +- .../UserAndRoomAutoCompleteMultiple.tsx | 4 +- .../UserAutoComplete/UserAutoComplete.tsx | 4 +- .../UserAutoCompleteMultiple.tsx | 4 +- .../UserAutoCompleteMultipleFederated.tsx | 4 +- .../client/components/UserCard/UserCard.tsx | 22 +-- .../components/UserCard/UserCardAction.tsx | 2 +- .../components/UserCard/UserCardContainer.tsx | 2 +- .../components/UserCard/UserCardInfo.tsx | 2 +- .../components/UserCard/UserCardRole.tsx | 2 +- .../components/UserCard/UserCardUsername.tsx | 2 +- .../client/components/UserInfo/UserInfo.tsx | 4 +- .../components/UserInfo/UserInfoAction.tsx | 2 +- .../client/components/UserStatusMenu.tsx | 2 +- .../components/avatar/RoomAvatarEditor.tsx | 2 +- .../UserAvatarEditor/UserAvatarEditor.tsx | 10 +- .../UserAvatarEditor/UserAvatarSuggestions.js | 2 +- .../client/components/dataView/Counter.tsx | 2 +- .../components/message/IgnoredContent.tsx | 2 +- .../message/content/actions/MessageAction.tsx | 2 +- .../attachments/default/ActionAttachtment.tsx | 2 +- .../content/attachments/default/Field.tsx | 2 +- .../attachments/structure/Attachment.tsx | 2 +- .../attachments/structure/image/Retry.tsx | 2 +- .../content/location/MapViewFallback.tsx | 2 +- .../urlPreviews/OEmbedPreviewContent.tsx | 2 +- .../components/voip/room/VoipRoomForeword.tsx | 8 +- .../navbar/actions/NavbarUserAction.tsx | 2 +- .../client/providers/LayoutProvider.tsx | 2 +- .../client/sidebar/Item/Condensed.stories.tsx | 2 +- .../client/sidebar/Item/Extended.stories.tsx | 2 +- .../client/sidebar/Item/Medium.stories.tsx | 2 +- apps/meteor/client/sidebar/SidebarRegion.tsx | 61 ++++--- .../sidebar/footer/SidebarFooterDefault.tsx | 4 +- .../footer/voip/VoipFooter.stories.tsx | 2 +- .../CreateChannel/CreateChannelModal.tsx | 2 +- .../sidebar/header/CreateDirectMessage.tsx | 4 +- .../header/CreateTeam/CreateTeamModal.tsx | 2 +- .../FederatedRoomListItem.tsx | 10 +- .../MatrixFederationManageServerModal.tsx | 4 +- .../MatrixFederationSearchModalContent.tsx | 4 +- .../sidebar/header/UserAvatarWithStatus.tsx | 2 +- .../client/sidebar/header/UserMenuHeader.tsx | 6 +- .../actions/hooks/useGroupingListItems.tsx | 6 +- .../header/actions/hooks/useSortModeItems.tsx | 4 +- .../header/actions/hooks/useViewModeItems.tsx | 8 +- .../sidebar/header/hooks/useStatusItems.tsx | 2 +- .../AccountFeaturePreviewPage.tsx | 8 +- .../views/account/preferences/MyDataModal.tsx | 2 +- .../preferences/PreferencesSoundSection.tsx | 2 +- .../account/profile/AccountProfileForm.tsx | 10 +- .../account/profile/AccountProfilePage.tsx | 2 +- .../account/profile/ActionConfirmModal.tsx | 2 +- .../account/security/BackupCodesModal.tsx | 6 +- .../views/account/security/EndToEnd.tsx | 6 +- .../views/account/security/TwoFactorEmail.tsx | 4 +- .../views/account/security/TwoFactorTOTP.tsx | 4 +- .../client/views/account/themes/ThemePage.tsx | 12 +- .../tokens/AccountTokensTable/AddToken.tsx | 4 +- .../client/views/admin/cloud/CopyStep.tsx | 2 +- .../client/views/admin/cloud/PasteStep.tsx | 2 +- .../admin/customEmoji/AddCustomEmoji.tsx | 2 +- .../admin/customEmoji/EditCustomEmoji.tsx | 4 +- .../customEmoji/EditCustomEmojiWithData.tsx | 10 +- .../admin/customSounds/AddCustomSound.tsx | 4 +- .../admin/customSounds/EditCustomSound.tsx | 10 +- .../views/admin/customSounds/EditSound.tsx | 4 +- .../customUserStatus/CustomUserStatusForm.tsx | 2 +- .../CustomUserStatusFormWithData.tsx | 12 +- .../CustomUserStatusService.tsx | 20 +-- .../views/admin/emailInbox/EmailInboxForm.tsx | 2 +- .../FederationDashboardPage.tsx | 2 +- .../views/admin/import/ImportProgressPage.tsx | 4 +- .../views/admin/info/InformationPage.tsx | 4 +- .../info/InstancesModal/DescriptionList.tsx | 4 +- .../views/admin/info/OfflineLicenseModal.tsx | 6 +- .../client/views/admin/info/UsagePieGraph.tsx | 4 +- .../integrations/edit/EditIncomingWebhook.js | 2 +- .../edit/EditIncomingWebhookWithData.js | 16 +- .../integrations/edit/EditOutgoingWebhook.js | 2 +- .../edit/EditOutgoingWebhookWithData.js | 16 +- .../integrations/edit/HistoryContent.tsx | 16 +- .../admin/integrations/edit/HistoryItem.js | 2 +- .../views/admin/integrations/new/NewBot.js | 2 +- .../views/admin/integrations/new/NewZapier.js | 2 +- .../moderation/ModerationConsoleTableRow.tsx | 2 +- .../views/admin/moderation/UserMessages.tsx | 6 +- .../admin/oauthApps/EditOauthAppWithData.tsx | 12 +- .../views/admin/permissions/EditRolePage.tsx | 2 +- .../PermissionsTable/PermissionsTable.tsx | 4 +- .../permissions/PermissionsTable/RoleCell.tsx | 2 +- .../PermissionsTable/RoleHeader.tsx | 2 +- .../UsersInRole/UsersInRolePage.tsx | 8 +- .../UsersInRoleTable/UsersInRoleTableRow.tsx | 2 +- .../client/views/admin/rooms/EditRoom.tsx | 4 +- .../views/admin/rooms/EditRoomWithData.tsx | 14 +- .../views/admin/rooms/FilterByTypeAndText.tsx | 6 +- .../client/views/admin/rooms/RoomsTable.tsx | 6 +- .../views/admin/settings/MemoizedSetting.tsx | 2 +- .../client/views/admin/settings/Section.tsx | 2 +- .../views/admin/settings/SettingsPage.tsx | 2 +- .../groups/voip/VoipExtensionsPage.tsx | 6 +- .../settings/inputs/BooleanSettingInput.tsx | 2 +- .../inputs/CodeMirror/CodeMirrorBox.tsx | 4 +- .../settings/inputs/ColorSettingInput.tsx | 4 +- .../views/admin/sidebar/AdminSidebarPages.tsx | 2 +- .../client/views/admin/sidebar/UpgradeTab.tsx | 4 +- .../admin/users/AdminUserInfoActions.tsx | 2 +- .../admin/users/AdminUserInfoWithData.tsx | 2 +- .../views/admin/users/EditUserWithData.tsx | 6 +- .../client/views/admin/users/InviteUsers.tsx | 6 +- .../client/views/admin/users/UserForm.js | 2 +- .../admin/users/UsersTable/UsersTableRow.tsx | 4 +- .../views/admin/viewLogs/ServerLogs.tsx | 8 +- .../client/views/banners/LegacyBanner.tsx | 2 +- .../client/views/banners/UiKitBanner.tsx | 2 +- .../AudioMessageRecorder.tsx | 2 +- .../composer/EmojiPicker/EmojiCategoryRow.tsx | 4 +- .../composer/EmojiPicker/EmojiElement.tsx | 4 +- .../composer/EmojiPicker/EmojiPicker.tsx | 2 +- .../EmojiPickerDesktopDropdown.tsx | 4 +- .../EmojiPicker/ToneSelector/ToneSelector.tsx | 2 +- .../VideoMessageRecorder.tsx | 2 +- .../client/views/directory/RoomTags.tsx | 4 +- .../ChannelsTable/ChannelsTableRow.tsx | 4 +- .../tabs/teams/TeamsTable/TeamsTableRow.tsx | 4 +- .../tabs/users/UsersTable/UsersTableRow.tsx | 4 +- .../views/e2e/EnterE2EPasswordModal.tsx | 2 +- .../client/views/e2e/SaveE2EPasswordModal.tsx | 2 +- .../client/views/home/DefaultHomePage.tsx | 6 +- .../client/views/home/HomepageGridItem.tsx | 2 +- .../views/home/cards/CustomContentCard.tsx | 8 +- .../views/marketplace/AccordionLoading.tsx | 2 +- .../AppDetailsPage/AppDetailsPage.tsx | 2 +- .../AppDetailsPage/AppDetailsPageHeader.tsx | 18 +- .../AppDetailsPage/AppDetailsPageLoading.tsx | 4 +- .../tabs/AppDetails/AppDetails.tsx | 12 +- .../tabs/AppDetails/AppDetailsAPIs.tsx | 4 +- .../tabs/AppReleases/AppReleasesItem.tsx | 4 +- .../tabs/AppRequests/AppRequestItem.tsx | 10 +- .../tabs/AppRequests/AppRequests.tsx | 4 +- .../tabs/AppRequests/AppRequestsLoading.tsx | 6 +- .../tabs/AppSecurity/AppSecurity.tsx | 4 +- .../tabs/AppSecurity/AppSecurityLabel.tsx | 2 +- .../tabs/AppSettings/AppSettings.tsx | 2 +- .../tabs/AppStatus/AppStatus.tsx | 6 +- .../client/views/marketplace/AppMenu.js | 12 +- .../marketplace/AppPermissionsReviewModal.tsx | 2 +- .../views/marketplace/AppsList/AppRow.tsx | 18 +- .../views/marketplace/AppsList/AppsList.tsx | 4 +- .../marketplace/AppsPage/AppsFilters.tsx | 2 +- .../AppsPage/AppsPageConnectionError.tsx | 2 +- .../AppsPage/AppsPageContentBody.tsx | 2 +- .../AppsPage/AppsPageContentSkeleton.tsx | 14 +- .../NoInstalledAppMatchesEmptyState.tsx | 2 +- .../AppsPage/NoInstalledAppsEmptyState.tsx | 2 +- ...etplaceOrInstalledAppMatchesEmptyState.tsx | 2 +- .../components/BannerEnterpriseTrialEnded.tsx | 2 +- .../CategoryFilter/CategoryDropDownAnchor.tsx | 8 +- .../CategoryFilter/CategoryDropDownList.tsx | 4 +- .../components/CategoryFilter/TagList.tsx | 2 +- .../components/RadioButtonList.tsx | 4 +- .../components/ScreenshotCarousel.tsx | 2 +- .../components/ScreenshotCarouselAnchor.tsx | 6 +- .../views/notAuthorized/NotAuthorizedPage.tsx | 2 +- .../omnichannel/agents/AgentEditWithData.tsx | 2 +- .../views/omnichannel/agents/AgentInfo.tsx | 8 +- .../omnichannel/agents/AgentInfoAction.tsx | 2 +- .../agents/AgentsTable/AddAgent.tsx | 2 +- .../agents/AgentsTable/AgentsTableRow.tsx | 4 +- .../omnichannel/analytics/AnalyticsPage.tsx | 16 +- .../omnichannel/analytics/DateRangePicker.tsx | 6 +- .../views/omnichannel/analytics/Overview.tsx | 11 +- .../BusinessHoursForm.stories.tsx | 2 +- .../businessHours/TimeRangeInput.js | 4 +- .../components/AgentInfoDetails.tsx | 4 +- .../omnichannel/components/CustomField.tsx | 2 +- .../views/omnichannel/components/Field.tsx | 2 +- .../views/omnichannel/components/Label.tsx | 2 +- .../contactHistory/ContactHistoryItem.tsx | 2 +- .../contactHistory/ContactHistoryList.tsx | 6 +- .../ContactHistoryMessagesList.tsx | 6 +- .../omnichannel/currentChats/FilterByText.tsx | 34 ++-- .../currentChats/RemoveAllClosed.tsx | 6 +- .../customFields/CustomFieldsForm.stories.tsx | 2 +- .../DepartmentAgentsTable/AddAgent.tsx | 2 +- .../DepartmentAgentsTable/AgentAvatar.tsx | 2 +- .../departments/DepartmentTags/index.tsx | 4 +- .../DepartmentsTable/DepartmentItemMenu.tsx | 6 +- .../departments/EditDepartment.tsx | 4 +- .../EditDepartmentWithAllowedForwardData.tsx | 2 +- .../directory/CallsContextualBarDirectory.tsx | 4 +- .../directory/ChatsContextualBar.tsx | 4 +- .../calls/contextualBar/VoipInfo.tsx | 4 +- .../omnichannel/directory/chats/ChatTable.tsx | 2 +- .../directory/chats/contextualBar/ChatInfo.js | 4 +- .../chats/contextualBar/ChatInfoDirectory.js | 4 +- .../RoomEdit/RoomEditWithData.tsx | 4 +- .../directory/components/ContactField.tsx | 4 +- .../directory/components/FormSkeleton.tsx | 14 +- .../directory/components/PriorityField.tsx | 2 +- .../directory/components/SlaField.tsx | 2 +- .../directory/components/SourceField.tsx | 2 +- .../directory/contacts/ContactTable.tsx | 2 +- .../contextualBar/ContactEditWithData.js | 2 +- .../contacts/contextualBar/ContactInfo.tsx | 10 +- .../omnichannel/installation/Wrapper.tsx | 2 +- .../views/omnichannel/managers/AddManager.tsx | 2 +- .../omnichannel/managers/ManagersTable.tsx | 4 +- .../omnichannel/queueList/QueueListFilter.tsx | 14 +- .../omnichannel/queueList/QueueListTable.tsx | 2 +- .../RealTimeMonitoringPage.js | 16 +- .../counter/CounterItem.tsx | 4 +- .../realTimeMonitoring/counter/CounterRow.js | 2 +- .../OutlookEventsList/OutlookEventItem.tsx | 4 +- .../OutlookEventsList/OutlookEventsList.tsx | 4 +- .../OutlookSettingItem.tsx | 6 +- .../Announcement/AnnouncementComponent.tsx | 2 +- .../views/room/Room/ComposerSkeleton.tsx | 2 +- .../views/room/UserCard/UserCardWithData.tsx | 2 +- .../body/JumpToRecentMessageButton.tsx | 2 +- .../views/room/components/body/LeaderBar.tsx | 10 +- .../body/RoomForeword/RoomForeword.tsx | 4 +- .../RoomForewordUsernameListItem.tsx | 2 +- .../body/composer/ComposerAnonymous.tsx | 2 +- .../body/composer/messageBox/MessageBox.tsx | 2 +- .../composer/messageBox/MessageBoxReplies.tsx | 4 +- .../contextualBar/MessageListTab.tsx | 2 +- .../AutoTranslate/AutoTranslate.tsx | 2 +- .../Discussions/DiscussionsList.tsx | 8 +- .../components/DiscussionsListItem.tsx | 2 +- .../ExportMessages/FileExport.tsx | 2 +- .../ExportMessages/MailExportForm.tsx | 2 +- .../ChannelToTeamSelection.tsx | 2 +- .../Info/EditRoomInfo/EditChannel.js | 4 +- .../contextualBar/Info/RoomInfo/RoomInfo.tsx | 6 +- .../KeyboardShortcutSection.tsx | 2 +- .../NotificationPreferencesForm.tsx | 4 +- .../components/NotificationByDevice.tsx | 2 +- .../views/room/contextualBar/OTR/OTR.tsx | 4 +- .../PruneMessagesDateTimeRow.tsx | 2 +- .../room/contextualBar/RoomFiles/RoomFiles.js | 8 +- .../RoomFiles/components/FileItem.js | 4 +- .../RoomFiles/components/MenuItem.js | 4 +- .../InviteUsers/EditInviteLink.tsx | 2 +- .../RoomMembers/InviteUsers/InviteLink.tsx | 4 +- .../contextualBar/RoomMembers/RoomMembers.tsx | 12 +- .../room/contextualBar/Threads/ThreadList.tsx | 2 +- .../Threads/components/ThreadSkeleton.tsx | 2 +- .../UserInfo/UserInfoActions.tsx | 2 +- .../UserInfo/UserInfoWithData.tsx | 2 +- .../VideoConference/VideoConfBlockModal.tsx | 4 +- .../VideoConference/VideoConfConfigModal.tsx | 8 +- .../VideoConfList/VideoConfListItem.tsx | 8 +- .../actions/useRemoveUserAction.tsx | 2 +- .../FileUploadModal/FileUploadModal.tsx | 2 +- .../modals/FileUploadModal/MediaPreview.tsx | 2 +- .../ReactionListModal/ReactionUserTag.tsx | 2 +- .../modals/ReactionListModal/Reactions.tsx | 4 +- .../ReadReceiptsModal/ReadReceiptRow.tsx | 6 +- .../ReportMessageModal/ReportMessageModal.tsx | 2 +- .../FilePickerBreadcrumbs.tsx | 2 +- .../WebdavFilePickerGrid.tsx | 4 +- .../WebdavFilePickerTable.tsx | 2 +- .../ChannelDesertionTable.tsx | 4 +- .../ChannelDesertionTableRow.tsx | 2 +- .../ModalSteps/FirstStep.tsx | 4 +- .../ModalSteps/SecondStep.tsx | 2 +- .../AddExistingModal/AddExistingModal.tsx | 2 +- .../RoomsAvailableForTeamsAutoComplete.tsx | 4 +- .../channels/BaseTeamsChannels.tsx | 12 +- .../channels/TeamsChannelItem.js | 2 +- .../info/Delete/ChannelDeletionTable.tsx | 4 +- .../info/Delete/ChannelDeletionTableRow.tsx | 2 +- .../contextualBar/info/Delete/StepOne.js | 2 +- .../teams/contextualBar/info/TeamsInfo.tsx | 6 +- .../RemoveUsersModal/RemoveUsersFirstStep.js | 2 +- .../RemoveUsersModal/RemoveUsersSecondStep.js | 2 +- .../apps/gameCenter/GameCenterContainer.tsx | 2 +- .../GameCenterInvitePlayersModal.tsx | 4 +- .../deviceManagement/LoggedOutBanner.tsx | 2 +- .../components/DeviceIcon.tsx | 4 +- .../ee/client/hooks/useDevicesMenuOption.tsx | 2 +- .../BusinessHoursTable.stories.tsx | 2 +- .../client/omnichannel/ContactManagerInfo.js | 2 +- .../BusinessHoursMultiple.stories.tsx | 2 +- .../BusinessHoursTimeZone.stories.tsx | 2 +- .../CannedResponseEditWithData.tsx | 2 +- .../CannedResponseEditWithDepartmentData.tsx | 2 +- .../cannedResponses/CannedResponseFilter.tsx | 14 +- .../cannedResponses/CannedResponsesTable.tsx | 2 +- .../components/cannedResponseForm.tsx | 10 +- .../CannedResponse/CannedResponseList.tsx | 4 +- .../contextualBar/CannedResponse/Item.tsx | 2 +- .../omnichannel/monitors/MonitorsTable.tsx | 2 +- .../priorities/PriorityEditFormWithData.tsx | 2 +- .../omnichannel/slaPolicies/SlaEdit.tsx | 2 +- .../slaPolicies/SlaEditWithData.tsx | 2 +- .../omnichannel/tags/TagEditWithData.js | 2 +- .../tags/TagEditWithDepartmentData.tsx | 2 +- .../omnichannel/units/UnitEditWithData.tsx | 2 +- .../sidebar/footer/SidebarFooterWatermark.tsx | 6 +- .../DeviceManagementInfo.tsx | 2 +- .../EngagementDashboardCard.tsx | 2 +- .../EngagementDashboardPage.tsx | 2 +- .../channels/ChannelsOverview.tsx | 2 +- .../dataView/DownloadDataButton.tsx | 2 +- .../dataView/LegendSymbol.tsx | 2 +- .../messages/MessagesPerChannelSection.tsx | 10 +- .../users/ContentForDays.tsx | 2 +- .../users/ContentForHours.tsx | 2 +- .../admin/users/CloseToSeatsCapModal.tsx | 2 +- .../admin/users/ReachedSeatsCapModal.tsx | 4 +- .../UserPageHeaderContentWithSeatsCap.tsx | 2 +- .../src/blocks/DividerBlock.tsx | 2 +- .../src/blocks/TabNavigationBlock.tsx | 2 +- .../src/elements/CheckboxElement.tsx | 4 +- .../src/elements/RadioButtonElement.tsx | 4 +- .../src/elements/ToggleSwitchElement.tsx | 4 +- .../src/surfaces/BannerSurface.tsx | 2 +- .../src/surfaces/ContextualBarSurface.tsx | 2 +- .../src/surfaces/MessageSurface.tsx | 2 +- .../src/surfaces/ModalSurface.tsx | 2 +- .../ui-client/src/components/Card/Card.tsx | 2 +- .../src/components/Card/CardBody.tsx | 2 +- .../src/components/Card/CardColSection.tsx | 2 +- .../src/components/Card/CardDivider.tsx | 2 +- .../src/components/Card/CardFooterWrapper.tsx | 2 +- .../src/components/Card/CardTitle.tsx | 2 +- .../ui-client/src/components/DotLeader.tsx | 2 +- .../EmojiPicker/EmojiPickerCategoryHeader.tsx | 2 +- .../EmojiPicker/EmojiPickerFooter.tsx | 2 +- .../EmojiPicker/EmojiPickerHeader.tsx | 2 +- .../EmojiPicker/EmojiPickerListArea.tsx | 2 +- .../EmojiPicker/EmojiPickerLoadMore.tsx | 2 +- .../EmojiPicker/EmojiPickerNotFound.tsx | 2 +- .../EmojiPicker/EmojiPickerPreview.tsx | 2 +- .../EmojiPicker/EmojiPickerPreviewArea.tsx | 2 +- .../src/components/Header/HeaderAvatar.tsx | 2 +- .../src/components/Header/HeaderContent.tsx | 2 +- .../src/components/Header/HeaderIcon.tsx | 2 +- .../src/components/Header/HeaderState.tsx | 2 +- .../components/Header/HeaderTag/HeaderTag.tsx | 2 +- .../Header/HeaderTag/HeaderTagIcon.tsx | 4 +- .../src/components/Header/HeaderTitle.tsx | 2 +- .../Header/HeaderToolbox/HeaderToolbox.tsx | 2 +- .../HeaderToolbox/HeaderToolboxDivider.tsx | 2 +- .../PasswordVerifier/PasswordVerifier.tsx | 4 +- .../PasswordVerifier/PasswordVerifierItem.tsx | 4 +- .../src/components/TextSeparator.tsx | 2 +- .../MessageComposerActionsDivider.tsx | 2 +- .../MessageComposer/MessageComposerIcon.tsx | 2 +- .../MessageComposerSkeleton.tsx | 14 +- .../MessageComposerToolbar.tsx | 11 +- .../MessageComposerToolbarActions.tsx | 2 +- .../MessageFooterCallout.tsx | 4 +- .../MessageFooterCalloutAction.tsx | 2 +- .../MessageFooterCalloutContent.tsx | 2 +- .../MessageFooterCalloutDivider.tsx | 2 +- .../src/VideoConfMessage/VideoConfMessage.tsx | 2 +- .../VideoConfMessageButton.tsx | 2 +- .../VideoConfMessageFooterText.tsx | 2 +- .../VideoConfMessage/VideoConfMessageRow.tsx | 2 +- .../VideoConfMessageSkeleton.tsx | 4 +- .../VideoConfMessage/VideoConfMessageText.tsx | 2 +- .../VideoConfMessageUserStack.tsx | 4 +- .../src/VideoConfPopup/VideoConfPopup.tsx | 2 +- .../VideoConfPopup/VideoConfPopupBackdrop.tsx | 2 +- .../VideoConfPopup/VideoConfPopupContent.tsx | 2 +- .../VideoConfPopup/VideoConfPopupFooter.tsx | 2 +- .../src/VideoConfPopup/VideoConfPopupIcon.tsx | 2 +- .../src/VideoConfPopup/VideoConfPopupInfo.tsx | 4 +- .../VideoConfPopup/VideoConfPopupTitle.tsx | 2 +- .../src/Components/DropDown/Items.tsx | 96 +++++----- .../Components/NavBar/BurgerIcon/Wrapper.tsx | 32 ++-- .../Display/Surface/ContextualBarSurface.tsx | 99 +++++------ .../Preview/Display/Surface/Surface.tsx | 66 ++++--- .../Components/Preview/NavPanel/NavPanel.tsx | 76 ++++---- .../Components/Preview/NavPanel/PanelBtn.tsx | 47 ++--- .../src/Components/navMenu/Menu/MenuItem.tsx | 45 ++--- packages/web-ui-registration/src/CMSPage.tsx | 2 +- .../src/ResetPasswordForm.tsx | 2 +- .../src/components/LoginPoweredBy.tsx | 2 +- yarn.lock | 157 ++++++++--------- 430 files changed, 1295 insertions(+), 1353 deletions(-) diff --git a/apps/meteor/app/emoji-emojione/client/emojione-sprites.css b/apps/meteor/app/emoji-emojione/client/emojione-sprites.css index f6c4cf58512e..eb6d29ef768c 100644 --- a/apps/meteor/app/emoji-emojione/client/emojione-sprites.css +++ b/apps/meteor/app/emoji-emojione/client/emojione-sprites.css @@ -15,8 +15,8 @@ display: inline-block; overflow: hidden; - width: 22px; - height: 22px; + width: 1.375rem; + height: 1.375rem; margin: 0 0.15em; vertical-align: middle; diff --git a/apps/meteor/app/emoji-emojione/lib/generateEmojiIndex.mjs b/apps/meteor/app/emoji-emojione/lib/generateEmojiIndex.mjs index 1361a72c0dd2..009ef3dcc8f4 100644 --- a/apps/meteor/app/emoji-emojione/lib/generateEmojiIndex.mjs +++ b/apps/meteor/app/emoji-emojione/lib/generateEmojiIndex.mjs @@ -161,8 +161,8 @@ function generateEmojiPicker(data) { display: inline-block; overflow: hidden; - width: 22px; - height: 22px; + width: 1.375rem; + height: 1.375rem; margin: 0 0.15em; vertical-align: middle; diff --git a/apps/meteor/app/theme/client/imports/components/emoji.css b/apps/meteor/app/theme/client/imports/components/emoji.css index 4d7f19f4acb6..5180c05c5f5c 100644 --- a/apps/meteor/app/theme/client/imports/components/emoji.css +++ b/apps/meteor/app/theme/client/imports/components/emoji.css @@ -4,8 +4,8 @@ display: inline-block; overflow: hidden; - width: 22px; - height: 22px; + width: 1.375rem; + height: 1.375rem; margin: 0 0.15em; vertical-align: middle; diff --git a/apps/meteor/app/theme/client/imports/general/variables.css b/apps/meteor/app/theme/client/imports/general/variables.css index f50fc614c4bb..e8e06ac68f42 100644 --- a/apps/meteor/app/theme/client/imports/general/variables.css +++ b/apps/meteor/app/theme/client/imports/general/variables.css @@ -205,9 +205,9 @@ /* * Sidebar */ - --sidebar-width: 280px; - --sidebar-md-width: 320px; - --sidebar-lg-width: 336px; + --sidebar-width: 17.5rem; + --sidebar-md-width: 20rem; + --sidebar-lg-width: 21rem; --sidebar-small-width: 90%; --sidebar-background-hover: var(--rc-color-primary-dark); --sidebar-background-light: var(--rc-color-primary-lightest); diff --git a/apps/meteor/app/ui-message/client/popup/ComposerBoxPopup.tsx b/apps/meteor/app/ui-message/client/popup/ComposerBoxPopup.tsx index 328135fdbbec..5ead8ef295a5 100644 --- a/apps/meteor/app/ui-message/client/popup/ComposerBoxPopup.tsx +++ b/apps/meteor/app/ui-message/client/popup/ComposerBoxPopup.tsx @@ -77,13 +77,13 @@ const ComposerBoxPopup = < return ( - + {title && ( - + {title} )} - + {!isLoading && itemsFlat.length === 0 && } {isLoading && } {itemsFlat.map((item, index) => { diff --git a/apps/meteor/app/ui-message/client/popup/components/composerBoxPopupPreview/ComposerBoxPopupPreview.tsx b/apps/meteor/app/ui-message/client/popup/components/composerBoxPopupPreview/ComposerBoxPopupPreview.tsx index 89c7de840820..0a2478f7bf9a 100644 --- a/apps/meteor/app/ui-message/client/popup/components/composerBoxPopupPreview/ComposerBoxPopupPreview.tsx +++ b/apps/meteor/app/ui-message/client/popup/components/composerBoxPopupPreview/ComposerBoxPopupPreview.tsx @@ -92,12 +92,12 @@ const ComposerBoxPopupPreview = forwardRef< return ( - + {isLoading && Array(5) .fill(5) - .map((_, index) => )} + .map((_, index) => )} {!isLoading && itemsFlat.map((item) => ( @@ -111,7 +111,7 @@ const ComposerBoxPopupPreview = forwardRef< borderColor={item === focused ? 'highlight' : 'transparent'} tabIndex={item === focused ? 0 : -1} aria-selected={item === focused} - m='x2' + m={2} borderWidth='default' borderRadius='x4' > diff --git a/apps/meteor/client/components/BurgerMenu/BurgerBadge.stories.tsx b/apps/meteor/client/components/BurgerMenu/BurgerBadge.stories.tsx index bc2459f4e589..caf450192c85 100644 --- a/apps/meteor/client/components/BurgerMenu/BurgerBadge.stories.tsx +++ b/apps/meteor/client/components/BurgerMenu/BurgerBadge.stories.tsx @@ -13,7 +13,7 @@ export default { }, decorators: [ (fn): ReactElement => ( - + {fn()} ), diff --git a/apps/meteor/client/components/BurgerMenu/BurgerMenuButton.tsx b/apps/meteor/client/components/BurgerMenu/BurgerMenuButton.tsx index d4cc98a0d1fd..1ebe31439c1e 100644 --- a/apps/meteor/client/components/BurgerMenu/BurgerMenuButton.tsx +++ b/apps/meteor/client/components/BurgerMenu/BurgerMenuButton.tsx @@ -23,7 +23,7 @@ const BurgerMenuButton = ({ open, badge, onClick }: BurgerMenuButtonProps): Reac aria-label={open ? t('Close_menu') : t('Open_menu')} type='button' position='relative' - marginInlineEnd='x8' + marginInlineEnd={8} className={css` cursor: pointer; `} diff --git a/apps/meteor/client/components/BurgerMenu/Wrapper.tsx b/apps/meteor/client/components/BurgerMenu/Wrapper.tsx index 135e24cc7cec..279536559aaa 100644 --- a/apps/meteor/client/components/BurgerMenu/Wrapper.tsx +++ b/apps/meteor/client/components/BurgerMenu/Wrapper.tsx @@ -9,8 +9,8 @@ const Wrapper = ({ children }: { children: ReactNode }): ReactElement => ( flexDirection='column' alignItems='center' justifyContent='space-between' - paddingBlock='x4' - paddingInline='x2' + paddingBlock={4} + paddingInline={2} verticalAlign='middle' children={children} height='x24' diff --git a/apps/meteor/client/components/ConfirmOwnerChangeModal.tsx b/apps/meteor/client/components/ConfirmOwnerChangeModal.tsx index c18c0d750026..0865a1c26ae9 100644 --- a/apps/meteor/client/components/ConfirmOwnerChangeModal.tsx +++ b/apps/meteor/client/components/ConfirmOwnerChangeModal.tsx @@ -63,12 +63,12 @@ const ConfirmOwnerChangeModal: FC = ({ {contentTitle} {changeOwnerRooms && ( - + {changeOwnerRooms} )} {removedRooms && ( - + {removedRooms} )} diff --git a/apps/meteor/client/components/Contextualbar/ContextualbarScrollableContent.tsx b/apps/meteor/client/components/Contextualbar/ContextualbarScrollableContent.tsx index ade28661e87b..6be178f86f77 100644 --- a/apps/meteor/client/components/Contextualbar/ContextualbarScrollableContent.tsx +++ b/apps/meteor/client/components/Contextualbar/ContextualbarScrollableContent.tsx @@ -7,8 +7,8 @@ import Page from '../Page'; const ContextualbarScrollableContent = forwardRef>( function ContextualbarScrollableContent({ children, ...props }, ref) { return ( - - {children} + + {children} ); }, diff --git a/apps/meteor/client/components/FilterByText.tsx b/apps/meteor/client/components/FilterByText.tsx index c97e98062fea..66cc6f2b4408 100644 --- a/apps/meteor/client/components/FilterByText.tsx +++ b/apps/meteor/client/components/FilterByText.tsx @@ -40,8 +40,8 @@ const FilterByText = ({ placeholder, onChange: setFilter, inputRef, children, au }, []); return ( - - + + {isFilterByTextPropsWithButton(props) ? ( - ) : ( diff --git a/apps/meteor/client/components/GenericModal/withDoNotAskAgain.tsx b/apps/meteor/client/components/GenericModal/withDoNotAskAgain.tsx index 6d344a8a9674..9d3d754d17d4 100644 --- a/apps/meteor/client/components/GenericModal/withDoNotAskAgain.tsx +++ b/apps/meteor/client/components/GenericModal/withDoNotAskAgain.tsx @@ -49,7 +49,7 @@ function withDoNotAskAgain( {...props} dontAskAgain={ - + } diff --git a/apps/meteor/client/components/GenericResourceUsage/GenericResourceUsage.tsx b/apps/meteor/client/components/GenericResourceUsage/GenericResourceUsage.tsx index ec81d15d640b..c226139b9489 100644 --- a/apps/meteor/client/components/GenericResourceUsage/GenericResourceUsage.tsx +++ b/apps/meteor/client/components/GenericResourceUsage/GenericResourceUsage.tsx @@ -21,7 +21,7 @@ const GenericResourceUsage = ({ variant?: 'warning' | 'danger' | 'success'; }) => { return ( - + {title} {subTitle && {subTitle}} diff --git a/apps/meteor/client/components/GenericResourceUsage/GenericResourceUsageSkeleton.tsx b/apps/meteor/client/components/GenericResourceUsage/GenericResourceUsageSkeleton.tsx index 9224fcd634de..2820379e7469 100644 --- a/apps/meteor/client/components/GenericResourceUsage/GenericResourceUsageSkeleton.tsx +++ b/apps/meteor/client/components/GenericResourceUsage/GenericResourceUsageSkeleton.tsx @@ -3,7 +3,7 @@ import React from 'react'; const GenericResourceUsageSkeleton = ({ title, ...props }: { title?: string }) => { return ( - + {title ? {title} : } diff --git a/apps/meteor/client/components/GenericTable/GenericTable.stories.tsx b/apps/meteor/client/components/GenericTable/GenericTable.stories.tsx index f563999b0722..2fe2a834cec3 100644 --- a/apps/meteor/client/components/GenericTable/GenericTable.stories.tsx +++ b/apps/meteor/client/components/GenericTable/GenericTable.stories.tsx @@ -40,7 +40,7 @@ const results = Array.from({ length: 10 }, (_, i) => ({ const filter = ( <> - + } /> diff --git a/apps/meteor/client/components/GenericTable/GenericTable.tsx b/apps/meteor/client/components/GenericTable/GenericTable.tsx index ae33cce07a3a..00e7ed4f7cba 100644 --- a/apps/meteor/client/components/GenericTable/GenericTable.tsx +++ b/apps/meteor/client/components/GenericTable/GenericTable.tsx @@ -11,7 +11,7 @@ type GenericTableProps = { export const GenericTable = forwardRef(function GenericTable({ fixed = true, children, ...props }, ref) { return ( - + {/* TODO: Fix fuselage */} diff --git a/apps/meteor/client/components/GenericTable/GenericTableLoadingRow.tsx b/apps/meteor/client/components/GenericTable/GenericTableLoadingRow.tsx index 5c539e732b3a..d7cd06e6a286 100644 --- a/apps/meteor/client/components/GenericTable/GenericTableLoadingRow.tsx +++ b/apps/meteor/client/components/GenericTable/GenericTableLoadingRow.tsx @@ -7,7 +7,7 @@ export const GenericTableLoadingRow = ({ cols }: { cols: number }): ReactElement - + diff --git a/apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.tsx b/apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.tsx index 79215ef7c103..98621c82b27b 100644 --- a/apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.tsx +++ b/apps/meteor/client/components/GenericUpsellModal/GenericUpsellModal.tsx @@ -55,7 +55,7 @@ const GenericUpsellModal = ({ )} {description && ( - + {description} )} diff --git a/apps/meteor/client/components/InfoPanel/InfoPanelAction.tsx b/apps/meteor/client/components/InfoPanel/InfoPanelAction.tsx index e179c790f2dd..bd2c7d100b53 100644 --- a/apps/meteor/client/components/InfoPanel/InfoPanelAction.tsx +++ b/apps/meteor/client/components/InfoPanel/InfoPanelAction.tsx @@ -13,7 +13,7 @@ const InfoPanelAction = ({ label, icon, ...props }: InfoPanelActionProps): React title={typeof label === 'string' ? label : undefined} aria-label={typeof label === 'string' ? label : undefined} {...props} - mi='x4' + mi={4} icon={icon} > {label} diff --git a/apps/meteor/client/components/InfoPanel/InfoPanelField.tsx b/apps/meteor/client/components/InfoPanel/InfoPanelField.tsx index 0ec4f7030b69..982e6ab8e25d 100644 --- a/apps/meteor/client/components/InfoPanel/InfoPanelField.tsx +++ b/apps/meteor/client/components/InfoPanel/InfoPanelField.tsx @@ -2,6 +2,6 @@ import { Box } from '@rocket.chat/fuselage'; import type { FC } from 'react'; import React from 'react'; -const InfoPanelField: FC = ({ children }) => {children}; +const InfoPanelField: FC = ({ children }) => {children}; export default InfoPanelField; diff --git a/apps/meteor/client/components/InfoPanel/InfoPanelLabel.tsx b/apps/meteor/client/components/InfoPanel/InfoPanelLabel.tsx index 5bd09c561919..77450ea0e9ea 100644 --- a/apps/meteor/client/components/InfoPanel/InfoPanelLabel.tsx +++ b/apps/meteor/client/components/InfoPanel/InfoPanelLabel.tsx @@ -2,6 +2,6 @@ import { Box } from '@rocket.chat/fuselage'; import type { ComponentProps, FC } from 'react'; import React from 'react'; -const InfoPanelLabel: FC> = (props) => ; +const InfoPanelLabel: FC> = (props) => ; export default InfoPanelLabel; diff --git a/apps/meteor/client/components/InfoPanel/InfoPanelSection.tsx b/apps/meteor/client/components/InfoPanel/InfoPanelSection.tsx index 78b0a7b02027..7db13dad751f 100644 --- a/apps/meteor/client/components/InfoPanel/InfoPanelSection.tsx +++ b/apps/meteor/client/components/InfoPanel/InfoPanelSection.tsx @@ -2,6 +2,6 @@ import { Box } from '@rocket.chat/fuselage'; import type { ComponentProps, FC } from 'react'; import React from 'react'; -const InfoPanelSection: FC> = (props) => ; +const InfoPanelSection: FC> = (props) => ; export default InfoPanelSection; diff --git a/apps/meteor/client/components/InfoPanel/InfoPanelText.tsx b/apps/meteor/client/components/InfoPanel/InfoPanelText.tsx index 50e4c4d82460..7b82d0d02aa0 100644 --- a/apps/meteor/client/components/InfoPanel/InfoPanelText.tsx +++ b/apps/meteor/client/components/InfoPanel/InfoPanelText.tsx @@ -8,7 +8,7 @@ const wordBreak = css` `; const InfoPanelText: FC> = (props) => ( - + ); export default InfoPanelText; diff --git a/apps/meteor/client/components/InfoPanel/InfoPanelTitle.tsx b/apps/meteor/client/components/InfoPanel/InfoPanelTitle.tsx index 2714b5fec0e3..7ea4de6d9867 100644 --- a/apps/meteor/client/components/InfoPanel/InfoPanelTitle.tsx +++ b/apps/meteor/client/components/InfoPanel/InfoPanelTitle.tsx @@ -13,7 +13,7 @@ const isValidIcon = (icon: ReactNode): icon is IconName => typeof icon === 'stri const InfoPanelTitle: FC = ({ title, icon }) => ( {isValidIcon(icon) ? : icon} - + {title} diff --git a/apps/meteor/client/components/ListItem.stories.tsx b/apps/meteor/client/components/ListItem.stories.tsx index 712e9f46ea66..d2ff597f46dc 100644 --- a/apps/meteor/client/components/ListItem.stories.tsx +++ b/apps/meteor/client/components/ListItem.stories.tsx @@ -19,7 +19,7 @@ export default { export const ListWithIcon: ComponentStory = () => { return ( - + Title @@ -32,7 +32,7 @@ export const ListWithIcon: ComponentStory = () => { export const NoIcon: ComponentStory = () => { return ( - + Title @@ -46,7 +46,7 @@ export const NoIcon: ComponentStory = () => { export const MixedWithGap: ComponentStory = () => { return ( - + Title @@ -67,7 +67,7 @@ MixedWithGap.parameters = { export const MixedWithoutGap: ComponentStory = () => { return ( - + Title diff --git a/apps/meteor/client/components/Navbar/Navbar.tsx b/apps/meteor/client/components/Navbar/Navbar.tsx index 22b9329e3f06..2963f06ae494 100644 --- a/apps/meteor/client/components/Navbar/Navbar.tsx +++ b/apps/meteor/client/components/Navbar/Navbar.tsx @@ -4,7 +4,7 @@ import React from 'react'; export const Navbar: FC = ({ children }) => { return ( - + {children} diff --git a/apps/meteor/client/components/NotFoundState.tsx b/apps/meteor/client/components/NotFoundState.tsx index 421fa1a9ca87..9ed42fc14366 100644 --- a/apps/meteor/client/components/NotFoundState.tsx +++ b/apps/meteor/client/components/NotFoundState.tsx @@ -22,7 +22,7 @@ const NotFoundState = ({ title, subtitle }: NotFoundProps): ReactElement => { {title} {subtitle} - + {t('Homepage')} diff --git a/apps/meteor/client/components/Omnichannel/Skeleton.tsx b/apps/meteor/client/components/Omnichannel/Skeleton.tsx index 0afb367fc892..ebbd07d361e7 100644 --- a/apps/meteor/client/components/Omnichannel/Skeleton.tsx +++ b/apps/meteor/client/components/Omnichannel/Skeleton.tsx @@ -3,8 +3,8 @@ import type { FC } from 'react'; import React from 'react'; export const FormSkeleton: FC = (props) => ( - - - + + + ); diff --git a/apps/meteor/client/components/Omnichannel/Tags.tsx b/apps/meteor/client/components/Omnichannel/Tags.tsx index c0edcd96164b..39564ca7f89f 100644 --- a/apps/meteor/client/components/Omnichannel/Tags.tsx +++ b/apps/meteor/client/components/Omnichannel/Tags.tsx @@ -71,7 +71,7 @@ const Tags = ({ tags = [], handler, error, tagRequired, department }: TagsProps) return ( <> - + {t('Tags')} @@ -96,7 +96,7 @@ const Tags = ({ tags = [], handler, error, tagRequired, department }: TagsProps) flexGrow={1} placeholder={t('Enter_a_tag')} /> - @@ -106,7 +106,7 @@ const Tags = ({ tags = [], handler, error, tagRequired, department }: TagsProps) {customTags.length > 0 && ( {customTags?.map((tag, i) => ( - removeTag(tag)} mie='x8'> + removeTag(tag)} mie={8}> {tag} ))} diff --git a/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx b/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx index c8307e2045f9..943c2c33a5fe 100644 --- a/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx +++ b/apps/meteor/client/components/Omnichannel/modals/CloseChatModal.tsx @@ -1,5 +1,5 @@ import type { ILivechatDepartment } from '@rocket.chat/core-typings'; -import { Field, Button, TextInput, Modal, Box, CheckBox, Divider, EmailInput } from '@rocket.chat/fuselage'; +import { Field, FieldGroup, Button, TextInput, Modal, Box, CheckBox, Divider, EmailInput } from '@rocket.chat/fuselage'; import { usePermission, useSetting, useTranslation, useUserPreference } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; import React, { useCallback, useState, useEffect, useMemo } from 'react'; @@ -132,91 +132,93 @@ const CloseChatModal = ({ {t('Close_room_description')} - - {t('Comment')} - - - - {errors.comment?.message} - - - - {errors.tags?.message} - - {canSendTranscript && ( - <> - - - {t('Chat_transcript')} - - {canSendTranscriptPDF && ( - - - - - {t('Omnichannel_transcript_pdf')} - - + + + {t('Comment')} + + + + {errors.comment?.message} + + + + {errors.tags?.message} + + {canSendTranscript && ( + <> + + + {t('Chat_transcript')} - )} - {canSendTranscriptEmail && ( - <> - + {canSendTranscriptPDF && ( + - - - {t('Omnichannel_transcript_email')} + + + {t('Omnichannel_transcript_pdf')} - {transcriptEmail && ( - <> - - {t('Contact_email')} - - - - - - {t('Subject')} - - - - {errors.subject?.message} - - - )} - - )} - - - {canSendTranscriptPDF && canSendTranscriptEmail - ? t('These_options_affect_this_conversation_only_To_set_default_selections_go_to_My_Account_Omnichannel') - : t('This_option_affect_this_conversation_only_To_set_default_selection_go_to_My_Account_Omnichannel')} - - - - )} + )} + {canSendTranscriptEmail && ( + <> + + + + + {t('Omnichannel_transcript_email')} + + + + {transcriptEmail && ( + <> + + {t('Contact_email')} + + + + + + {t('Subject')} + + + + {errors.subject?.message} + + + )} + + )} + + + {canSendTranscriptPDF && canSendTranscriptEmail + ? t('These_options_affect_this_conversation_only_To_set_default_selections_go_to_My_Account_Omnichannel') + : t('This_option_affect_this_conversation_only_To_set_default_selection_go_to_My_Account_Omnichannel')} + + + + )} + diff --git a/apps/meteor/client/components/Omnichannel/modals/EnterpriseDepartmentsModal.tsx b/apps/meteor/client/components/Omnichannel/modals/EnterpriseDepartmentsModal.tsx index 8ef394b43149..8187776a4192 100644 --- a/apps/meteor/client/components/Omnichannel/modals/EnterpriseDepartmentsModal.tsx +++ b/apps/meteor/client/components/Omnichannel/modals/EnterpriseDepartmentsModal.tsx @@ -44,7 +44,7 @@ const EnterpriseDepartmentsModal = ({ closeModal }: { closeModal: () => void }): - + {t('Enterprise_Departments_title')} {isTypeUpgradeYourPlan ? t('Enterprise_Departments_description_free_trial') : t('Enterprise_Departments_description_upgrade')} diff --git a/apps/meteor/client/components/Omnichannel/modals/ForwardChatModal.tsx b/apps/meteor/client/components/Omnichannel/modals/ForwardChatModal.tsx index 4754e0bcbd63..82c92d39cc8f 100644 --- a/apps/meteor/client/components/Omnichannel/modals/ForwardChatModal.tsx +++ b/apps/meteor/client/components/Omnichannel/modals/ForwardChatModal.tsx @@ -1,5 +1,5 @@ import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; -import { Field, Button, TextAreaInput, Modal, Box, PaginatedSelectFiltered, Divider } from '@rocket.chat/fuselage'; +import { Field, FieldGroup, Button, TextAreaInput, Modal, Box, PaginatedSelectFiltered, Divider } from '@rocket.chat/fuselage'; import { useDebouncedValue } from '@rocket.chat/fuselage-hooks'; import { useEndpoint, useSetting, useTranslation } from '@rocket.chat/ui-contexts'; import type { ReactElement } from 'react'; @@ -41,7 +41,6 @@ const ForwardChatModal = ({ useMemo(() => ({ filter: debouncedDepartmentsFilter as string, enabled: true }), [debouncedDepartmentsFilter]), ); const { phase: departmentsPhase, items: departments, itemCount: departmentsTotal } = useRecordList(departmentsList); - const hasDepartments = useMemo(() => departments && departments.length > 0, [departments]); const _id = { $ne: room.servedBy?._id }; const conditions = { @@ -101,49 +100,51 @@ const ForwardChatModal = ({ - - {t('Forward_to_department')} - - { - setValue('department', value); - }} - flexGrow={1} - endReached={endReached} - /> - - - - - {t('Forward_to_user')} - - { - setValue('username', value); - }} - value={getValues().username} - /> - - - - - {t('Leave_a_comment')}{' '} - - ({t('Optional')}) - - - - - - + + + {t('Forward_to_department')} + + { + setValue('department', value); + }} + flexGrow={1} + endReached={endReached} + /> + + + + + {t('Forward_to_user')} + + { + setValue('username', value); + }} + value={getValues().username} + /> + + + + + {t('Leave_a_comment')}{' '} + + ({t('Optional')}) + + + + + + + diff --git a/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.tsx b/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.tsx index c5bd65d82421..013e0598f10c 100644 --- a/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.tsx +++ b/apps/meteor/client/components/Omnichannel/modals/TranscriptModal.tsx @@ -1,5 +1,5 @@ import type { IOmnichannelRoom } from '@rocket.chat/core-typings'; -import { Field, Button, TextInput, Modal, Box } from '@rocket.chat/fuselage'; +import { Field, Button, TextInput, Modal, Box, FieldGroup } from '@rocket.chat/fuselage'; import { useTranslation } from '@rocket.chat/ui-contexts'; import type { FC } from 'react'; import React, { useCallback, useEffect } from 'react'; @@ -76,30 +76,32 @@ const TranscriptModal: FC = ({ {!!transcriptRequest &&

    {t('Livechat_transcript_already_requested_warning')}

    } - - {t('Email')}* - - - - {errors.email?.message} - - - {t('Subject')}* - - - - {errors.subject?.message} - + + + {t('Email')}* + + + + {errors.email?.message} + + + {t('Subject')}* + + + + {errors.subject?.message} + +
    diff --git a/apps/meteor/client/components/Page/PageBlockWithBorder.tsx b/apps/meteor/client/components/Page/PageBlockWithBorder.tsx index f36927a06aee..8176f6734bfd 100644 --- a/apps/meteor/client/components/Page/PageBlockWithBorder.tsx +++ b/apps/meteor/client/components/Page/PageBlockWithBorder.tsx @@ -10,7 +10,7 @@ const PageBlockWithBorder = forwardRef>( return ( >(function PageContent(props, ref) { - return ; + return ; }); export default PageContent; diff --git a/apps/meteor/client/components/Page/PageFooter.tsx b/apps/meteor/client/components/Page/PageFooter.tsx index 6aabea0c68ba..1cae326589a4 100644 --- a/apps/meteor/client/components/Page/PageFooter.tsx +++ b/apps/meteor/client/components/Page/PageFooter.tsx @@ -7,10 +7,10 @@ type PageFooterProps = { isDirty: boolean } & ComponentProps; const PageFooter: FC = ({ children, isDirty, ...props }) => { return ( - + = ({ children = undefined, title, onClickB = ({ children = undefined, title, onClickB )} - {onClickBack && } + {onClickBack && } {title} diff --git a/apps/meteor/client/components/PlanTag.tsx b/apps/meteor/client/components/PlanTag.tsx index 7e3f120b69de..d9dece057cb1 100644 --- a/apps/meteor/client/components/PlanTag.tsx +++ b/apps/meteor/client/components/PlanTag.tsx @@ -20,7 +20,7 @@ function PlanTag(): ReactElement { return ( <> {plans.map((name) => ( - + {name} ))} diff --git a/apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.tsx b/apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.tsx index 64c1c946d06d..93509618827c 100644 --- a/apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.tsx +++ b/apps/meteor/client/components/RoomAutoComplete/RoomAutoComplete.tsx @@ -45,10 +45,10 @@ const RoomAutoComplete = ({ value, onChange, ...props }: RoomAutoCompleteProps): setFilter={setFilter} renderSelected={({ selected: { value, label } }): ReactElement => ( <> - + - + {label?.name} diff --git a/apps/meteor/client/components/RoomAutoCompleteMultiple/RoomAutoCompleteMultiple.tsx b/apps/meteor/client/components/RoomAutoCompleteMultiple/RoomAutoCompleteMultiple.tsx index 6bab51355404..7026c6cab35f 100644 --- a/apps/meteor/client/components/RoomAutoCompleteMultiple/RoomAutoCompleteMultiple.tsx +++ b/apps/meteor/client/components/RoomAutoCompleteMultiple/RoomAutoCompleteMultiple.tsx @@ -50,9 +50,9 @@ const RoomAutoCompleteMultiple = ({ value, onChange, ...props }: RoomAutoComplet setFilter={setFilter} multiple renderSelected={({ selected: { value, label }, onRemove }): ReactElement => ( - + - + {label?.name} diff --git a/apps/meteor/client/components/Sidebar/Header.tsx b/apps/meteor/client/components/Sidebar/Header.tsx index 2ae61f18bcdc..bbe64d71bd06 100644 --- a/apps/meteor/client/components/Sidebar/Header.tsx +++ b/apps/meteor/client/components/Sidebar/Header.tsx @@ -12,9 +12,9 @@ const Header: FC = ({ title, onClose, children, ...props }) => { const t = useTranslation(); return ( - + {(title || onClose) && ( - + {title && ( {title} diff --git a/apps/meteor/client/components/Sidebar/SidebarGenericItem.tsx b/apps/meteor/client/components/Sidebar/SidebarGenericItem.tsx index f17e35417a81..7b6c01ca0a7c 100644 --- a/apps/meteor/client/components/Sidebar/SidebarGenericItem.tsx +++ b/apps/meteor/client/components/Sidebar/SidebarGenericItem.tsx @@ -25,7 +25,7 @@ const SidebarGenericItem = ({ href, active, externalUrl, children, ...props }: S {...(externalUrl && { target: '_blank', rel: 'noopener noreferrer' })} {...props} > - + {children} diff --git a/apps/meteor/client/components/Sidebar/SidebarNavigationItem.tsx b/apps/meteor/client/components/Sidebar/SidebarNavigationItem.tsx index 4bfacbedbdfc..c8cfec4862da 100644 --- a/apps/meteor/client/components/Sidebar/SidebarNavigationItem.tsx +++ b/apps/meteor/client/components/Sidebar/SidebarNavigationItem.tsx @@ -36,11 +36,11 @@ const SidebarNavigationItem: FC = ({ return ( - {icon && } + {icon && } ): ReactElement => ( - - - - - - - + + + + + + + ); diff --git a/apps/meteor/client/components/TextCopy.tsx b/apps/meteor/client/components/TextCopy.tsx index 64daea167213..049ef6a9447a 100644 --- a/apps/meteor/client/components/TextCopy.tsx +++ b/apps/meteor/client/components/TextCopy.tsx @@ -4,7 +4,7 @@ import type { ComponentProps, ReactElement } from 'react'; import React, { useCallback } from 'react'; const defaultWrapperRenderer = (text: string): ReactElement => ( - + {text} ); @@ -35,7 +35,7 @@ const TextCopy = ({ text, wrapper = defaultWrapperRenderer, ...props }: TextCopy justifyContent='stretch' alignItems='flex-start' flexGrow={1} - padding='x16' + padding={16} backgroundColor='surface' width='full' {...props} diff --git a/apps/meteor/client/components/UrlChangeModal.tsx b/apps/meteor/client/components/UrlChangeModal.tsx index 1418d04c5b33..13d0523c92aa 100644 --- a/apps/meteor/client/components/UrlChangeModal.tsx +++ b/apps/meteor/client/components/UrlChangeModal.tsx @@ -18,7 +18,7 @@ const UrlChangeModal = ({ onConfirm, siteUrl, currentUrl, onClose }: UrlChangeMo ( - + {label.t === 'd' ? ( ) : ( )} - + {label.name} diff --git a/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx b/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx index f557c5a339e4..ebe3ecc5ee72 100644 --- a/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx +++ b/apps/meteor/client/components/UserAutoComplete/UserAutoComplete.tsx @@ -39,9 +39,9 @@ const UserAutoComplete = ({ value, onChange, ...props }: UserAutoCompleteProps): setFilter={setFilter} data-qa-id='UserAutoComplete' renderSelected={({ selected: { value, label } }): ReactElement | null => ( - + - + {label} diff --git a/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultiple.tsx b/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultiple.tsx index f1f079150bbe..dfda12cdd2e4 100644 --- a/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultiple.tsx +++ b/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultiple.tsx @@ -32,9 +32,9 @@ const UserAutoCompleteMultiple = ({ onChange, ...props }: UserAutoCompleteMultip onChange={onChange} multiple renderSelected={({ selected: { value, label }, onRemove }): ReactElement => ( - + - + {label} diff --git a/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultipleFederated.tsx b/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultipleFederated.tsx index 0d04d555ae2d..7ee1078c859d 100644 --- a/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultipleFederated.tsx +++ b/apps/meteor/client/components/UserAutoCompleteMultiple/UserAutoCompleteMultipleFederated.tsx @@ -103,9 +103,9 @@ const UserAutoCompleteMultipleFederated = ({ const currentCachedOption = selectedCache[value] || {}; return ( - + {currentCachedOption._federated ? : } - + {currentCachedOption.name || currentCachedOption.username || value} diff --git a/apps/meteor/client/components/UserCard/UserCard.tsx b/apps/meteor/client/components/UserCard/UserCard.tsx index 84bc8672b595..83edd9e3d8cb 100644 --- a/apps/meteor/client/components/UserCard/UserCard.tsx +++ b/apps/meteor/client/components/UserCard/UserCard.tsx @@ -50,9 +50,9 @@ const UserCard = forwardRef(function UserCard( customStatus = , roles = ( <> - - - + + + ), bio = , @@ -76,29 +76,29 @@ const UserCard = forwardRef(function UserCard( ) : ( )} - + {isLoading ? ( <> - - - + + + ) : ( actions )} - - + + {isLoading ? : } {nickname && ( - + ({nickname}) )} {customStatus && ( - + {typeof customStatus === 'string' ? ( ) : ( diff --git a/apps/meteor/client/components/UserCard/UserCardAction.tsx b/apps/meteor/client/components/UserCard/UserCardAction.tsx index e17716886dac..f13e71b601b5 100644 --- a/apps/meteor/client/components/UserCard/UserCardAction.tsx +++ b/apps/meteor/client/components/UserCard/UserCardAction.tsx @@ -5,7 +5,7 @@ import React from 'react'; type UserCardActionProps = ComponentProps; const UserCardAction = ({ label, icon, ...props }: UserCardActionProps): ReactElement => ( - + ); export default UserCardAction; diff --git a/apps/meteor/client/components/UserCard/UserCardContainer.tsx b/apps/meteor/client/components/UserCard/UserCardContainer.tsx index 4d897e182ef1..c1279e4ff513 100644 --- a/apps/meteor/client/components/UserCard/UserCardContainer.tsx +++ b/apps/meteor/client/components/UserCard/UserCardContainer.tsx @@ -3,7 +3,7 @@ import type { ComponentProps } from 'react'; import React, { forwardRef } from 'react'; const UserCardContainer = forwardRef(function UserCardContainer(props: ComponentProps, ref) { - return ; + return ; }); export default UserCardContainer; diff --git a/apps/meteor/client/components/UserCard/UserCardInfo.tsx b/apps/meteor/client/components/UserCard/UserCardInfo.tsx index 1db62882c740..8e235670a3dc 100644 --- a/apps/meteor/client/components/UserCard/UserCardInfo.tsx +++ b/apps/meteor/client/components/UserCard/UserCardInfo.tsx @@ -3,7 +3,7 @@ import type { ReactElement, ComponentProps } from 'react'; import React from 'react'; const UserCardInfo = (props: ComponentProps): ReactElement => ( - + ); export default UserCardInfo; diff --git a/apps/meteor/client/components/UserCard/UserCardRole.tsx b/apps/meteor/client/components/UserCard/UserCardRole.tsx index 2934aef8eda0..2b558af6b9b3 100644 --- a/apps/meteor/client/components/UserCard/UserCardRole.tsx +++ b/apps/meteor/client/components/UserCard/UserCardRole.tsx @@ -3,7 +3,7 @@ import type { ReactNode, ReactElement } from 'react'; import React from 'react'; const UserCardRole = ({ children }: { children: ReactNode }): ReactElement => ( - + ); diff --git a/apps/meteor/client/components/UserCard/UserCardUsername.tsx b/apps/meteor/client/components/UserCard/UserCardUsername.tsx index b72344a10e33..4aff0192d316 100644 --- a/apps/meteor/client/components/UserCard/UserCardUsername.tsx +++ b/apps/meteor/client/components/UserCard/UserCardUsername.tsx @@ -23,7 +23,7 @@ const UserCardUsername = ({ name, status = , ...props }: U {...props} > {status} - + {name} diff --git a/apps/meteor/client/components/UserInfo/UserInfo.tsx b/apps/meteor/client/components/UserInfo/UserInfo.tsx index 142f31026d6e..bdce27d028ad 100644 --- a/apps/meteor/client/components/UserInfo/UserInfo.tsx +++ b/apps/meteor/client/components/UserInfo/UserInfo.tsx @@ -67,7 +67,7 @@ const UserInfo = ({ const userCustomFields = useUserCustomFields(customFields); return ( - + {username && ( @@ -156,7 +156,7 @@ const UserInfo = ({ {email} - + {verified ? t('Verified') : t('Not_verified')} diff --git a/apps/meteor/client/components/UserInfo/UserInfoAction.tsx b/apps/meteor/client/components/UserInfo/UserInfoAction.tsx index c96a65bc85ef..97c64ecbede1 100644 --- a/apps/meteor/client/components/UserInfo/UserInfoAction.tsx +++ b/apps/meteor/client/components/UserInfo/UserInfoAction.tsx @@ -8,7 +8,7 @@ type UserInfoActionProps = { } & ComponentProps; const UserInfoAction = ({ icon, label, ...props }: UserInfoActionProps): ReactElement => ( - ); diff --git a/apps/meteor/client/components/UserStatusMenu.tsx b/apps/meteor/client/components/UserStatusMenu.tsx index 72f526998616..b5d317b444ac 100644 --- a/apps/meteor/client/components/UserStatusMenu.tsx +++ b/apps/meteor/client/components/UserStatusMenu.tsx @@ -28,7 +28,7 @@ const UserStatusMenu = ({ const options = useMemo(() => { const renderOption = (status: UserStatusType, label: string): ReactElement => ( - + {label} diff --git a/apps/meteor/client/components/avatar/RoomAvatarEditor.tsx b/apps/meteor/client/components/avatar/RoomAvatarEditor.tsx index 925ee059d300..32948eb42243 100644 --- a/apps/meteor/client/components/avatar/RoomAvatarEditor.tsx +++ b/apps/meteor/client/components/avatar/RoomAvatarEditor.tsx @@ -59,7 +59,7 @@ const RoomAvatarEditor = ({ disabled = false, room, roomAvatar, onChangeAvatar } `, ]} position='absolute' - m='x12' + m={12} > @@ -110,7 +110,7 @@ function UserAvatarEditor({ currentUsername, username, setAvatarObj, suggestions )} - + {t('Use_url_for_avatar')} {Object.values(suggestions).map((suggestion) => ( diff --git a/apps/meteor/client/components/dataView/Counter.tsx b/apps/meteor/client/components/dataView/Counter.tsx index 31a2ec01493c..8203a1169667 100644 --- a/apps/meteor/client/components/dataView/Counter.tsx +++ b/apps/meteor/client/components/dataView/Counter.tsx @@ -28,7 +28,7 @@ const Counter = ({ count, variation = 0, description }: CounterProps): ReactElem {variation} - + {description} diff --git a/apps/meteor/client/components/message/IgnoredContent.tsx b/apps/meteor/client/components/message/IgnoredContent.tsx index 7a155061713f..31b62639b849 100644 --- a/apps/meteor/client/components/message/IgnoredContent.tsx +++ b/apps/meteor/client/components/message/IgnoredContent.tsx @@ -18,7 +18,7 @@ const IgnoredContent = ({ onShowMessageIgnored }: IgnoredContentProps): ReactEle return ( - +

    {t('Message_Ignored')}

    diff --git a/apps/meteor/client/components/message/content/actions/MessageAction.tsx b/apps/meteor/client/components/message/content/actions/MessageAction.tsx index 8cdf4d097e75..7a787cdd7508 100644 --- a/apps/meteor/client/components/message/content/actions/MessageAction.tsx +++ b/apps/meteor/client/components/message/content/actions/MessageAction.tsx @@ -28,7 +28,7 @@ const MessageAction = ({ icon, methodId, i18nLabel, label, runAction, danger }: const resolvedIcon = resolveLegacyIcon(icon); return ( - ); diff --git a/apps/meteor/client/components/message/content/attachments/default/ActionAttachtment.tsx b/apps/meteor/client/components/message/content/attachments/default/ActionAttachtment.tsx index 8c72a84f6721..df3b2674b897 100644 --- a/apps/meteor/client/components/message/content/attachments/default/ActionAttachtment.tsx +++ b/apps/meteor/client/components/message/content/attachments/default/ActionAttachtment.tsx @@ -10,7 +10,7 @@ export const ActionAttachment: FC = ({ actions }) => { const handleLinkClick = useExternalLink(); return ( - + {actions .filter( ({ type, msg_in_chat_window: msgInChatWindow, url, image_url: image, text }) => diff --git a/apps/meteor/client/components/message/content/attachments/default/Field.tsx b/apps/meteor/client/components/message/content/attachments/default/Field.tsx index 9cd2ee32abd2..935e9fb0d9ad 100644 --- a/apps/meteor/client/components/message/content/attachments/default/Field.tsx +++ b/apps/meteor/client/components/message/content/attachments/default/Field.tsx @@ -10,7 +10,7 @@ type FieldProps = { // TODO: description missing color token const Field: FC = ({ title, value, ...props }) => ( - + {title} {value} diff --git a/apps/meteor/client/components/message/content/attachments/structure/Attachment.tsx b/apps/meteor/client/components/message/content/attachments/structure/Attachment.tsx index aa4509f9c7c6..6b1d422eba45 100644 --- a/apps/meteor/client/components/message/content/attachments/structure/Attachment.tsx +++ b/apps/meteor/client/components/message/content/attachments/structure/Attachment.tsx @@ -13,7 +13,7 @@ const Attachment: FC> = (props) => { return ( = ({ retry }) => { } `; return ( - + {t('Retry')} diff --git a/apps/meteor/client/components/message/content/location/MapViewFallback.tsx b/apps/meteor/client/components/message/content/location/MapViewFallback.tsx index 2d7c88f5baa4..34b00d67e0fe 100644 --- a/apps/meteor/client/components/message/content/location/MapViewFallback.tsx +++ b/apps/meteor/client/components/message/content/location/MapViewFallback.tsx @@ -13,7 +13,7 @@ const MapViewFallback: FC = ({ linkUrl }) => { return ( - + {t('Shared_Location')} ); diff --git a/apps/meteor/client/components/message/content/urlPreviews/OEmbedPreviewContent.tsx b/apps/meteor/client/components/message/content/urlPreviews/OEmbedPreviewContent.tsx index 97a01c552523..550b325012ed 100644 --- a/apps/meteor/client/components/message/content/urlPreviews/OEmbedPreviewContent.tsx +++ b/apps/meteor/client/components/message/content/urlPreviews/OEmbedPreviewContent.tsx @@ -39,7 +39,7 @@ const OEmbedPreviewContent = ({ {showSiteName && } - {showFooterSeparator && |} + {showFooterSeparator && |} {showAuthorName && } diff --git a/apps/meteor/client/components/voip/room/VoipRoomForeword.tsx b/apps/meteor/client/components/voip/room/VoipRoomForeword.tsx index f02ebc3fad37..983c5cdc2c4a 100644 --- a/apps/meteor/client/components/voip/room/VoipRoomForeword.tsx +++ b/apps/meteor/client/components/voip/room/VoipRoomForeword.tsx @@ -16,14 +16,14 @@ export const VoipRoomForeword = ({ room }: { room: IVoipRoom }): ReactElement => return ( - + - + {t('You_have_joined_a_new_call_with')} - - + + {roomName && parseOutboundPhoneNumber(roomName)} diff --git a/apps/meteor/client/navbar/actions/NavbarUserAction.tsx b/apps/meteor/client/navbar/actions/NavbarUserAction.tsx index 3b0a6cf99578..b0adcae19bef 100644 --- a/apps/meteor/client/navbar/actions/NavbarUserAction.tsx +++ b/apps/meteor/client/navbar/actions/NavbarUserAction.tsx @@ -12,7 +12,7 @@ const NavbarUserAction = (props: AllHTMLAttributes) => { return ( - {user ? : } + {user ? : } ); }; diff --git a/apps/meteor/client/providers/LayoutProvider.tsx b/apps/meteor/client/providers/LayoutProvider.tsx index 95b6b04f9f53..bbd68f953341 100644 --- a/apps/meteor/client/providers/LayoutProvider.tsx +++ b/apps/meteor/client/providers/LayoutProvider.tsx @@ -10,7 +10,7 @@ const LayoutProvider: FC = ({ children }) => { const isEmbedded = layout === 'embedded'; const breakpoints = useBreakpoints(); // ["xs", "sm", "md", "lg", "xl", xxl"] - const isMobile = !breakpoints.includes('md'); + const isMobile = !breakpoints.includes('lg'); useEffect(() => { setIsCollapsed(isMobile); diff --git a/apps/meteor/client/sidebar/Item/Condensed.stories.tsx b/apps/meteor/client/sidebar/Item/Condensed.stories.tsx index 915c4646f082..61e392e77e2e 100644 --- a/apps/meteor/client/sidebar/Item/Condensed.stories.tsx +++ b/apps/meteor/client/sidebar/Item/Condensed.stories.tsx @@ -27,7 +27,7 @@ const Template: ComponentStory = (args) => ( + } diff --git a/apps/meteor/client/sidebar/Item/Extended.stories.tsx b/apps/meteor/client/sidebar/Item/Extended.stories.tsx index 04c993bc963c..7e2b79ad1d6f 100644 --- a/apps/meteor/client/sidebar/Item/Extended.stories.tsx +++ b/apps/meteor/client/sidebar/Item/Extended.stories.tsx @@ -52,7 +52,7 @@ const Template: ComponentStory = (args) => ( } titleIcon={ - + } diff --git a/apps/meteor/client/sidebar/Item/Medium.stories.tsx b/apps/meteor/client/sidebar/Item/Medium.stories.tsx index d7698356f1b1..823244047c51 100644 --- a/apps/meteor/client/sidebar/Item/Medium.stories.tsx +++ b/apps/meteor/client/sidebar/Item/Medium.stories.tsx @@ -27,7 +27,7 @@ const Template: ComponentStory = (args) => ( + } diff --git a/apps/meteor/client/sidebar/SidebarRegion.tsx b/apps/meteor/client/sidebar/SidebarRegion.tsx index b0bf900be6a3..ce8c2aa28966 100644 --- a/apps/meteor/client/sidebar/SidebarRegion.tsx +++ b/apps/meteor/client/sidebar/SidebarRegion.tsx @@ -11,6 +11,25 @@ const Navbar = lazy(() => import('../navbar/Navbar')); const SidebarRegion = () => { const { isMobile, sidebar } = useLayout(); + const sidebarMobileClass = css` + position: absolute; + user-select: none; + transform: translate3d(-100%, 0, 0); + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); + -webkit-user-drag: none; + touch-action: pan-y; + will-change: transform; + + .rtl & { + transform: translate3d(200%, 0, 0); + + &.opened { + box-shadow: rgba(0, 0, 0, 0.3) 0px 0px 15px 1px; + transform: translate3d(0px, 0px, 0px); + } + } + `; + const sideBarStyle = css` position: relative; z-index: 2; @@ -25,34 +44,23 @@ const SidebarRegion = () => { transform: translate3d(0px, 0px, 0px); } - @media (max-width: 767px) { - position: absolute; - user-select: none; - transform: translate3d(-100%, 0, 0); - -webkit-tap-highlight-color: rgba(0, 0, 0, 0); - touch-action: pan-y; - -webkit-user-drag: none; - will-change: transform; - - .rtl & { - transform: translate3d(200%, 0, 0); - - &.opened { - box-shadow: rgba(0, 0, 0, 0.3) 0px 0px 15px 1px; - transform: translate3d(0px, 0px, 0px); - } - } + // 768px to 1599px + // using em unit base 16 + @media (max-width: 48em) { + width: 80%; + min-width: 80%; } + // 1600px to 1919px + // using em unit base 16 - @media (min-width: 768px) and (max-width: 1599px) { - width: var(--sidebar-width); - min-width: var(--sidebar-width); - } - @media (min-width: 1600px) and (max-width: 1919px) { + @media (min-width: 100em) { width: var(--sidebar-md-width); min-width: var(--sidebar-md-width); } - @media (min-width: 1920px) { + + // 1920px and up + // using em unit base 16 + @media (min-width: 120em) { width: var(--sidebar-lg-width); min-width: var(--sidebar-lg-width); } @@ -87,7 +95,12 @@ const SidebarRegion = () => { <> - + {isMobile && ( diff --git a/apps/meteor/client/sidebar/footer/SidebarFooterDefault.tsx b/apps/meteor/client/sidebar/footer/SidebarFooterDefault.tsx index 753baaf8e39f..7ecc7b8ab96d 100644 --- a/apps/meteor/client/sidebar/footer/SidebarFooterDefault.tsx +++ b/apps/meteor/client/sidebar/footer/SidebarFooterDefault.tsx @@ -27,8 +27,8 @@ const SidebarFooterDefault = (): ReactElement => { = (args) => { deviceSettings: { label: ( - + Device Settings ), diff --git a/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx b/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx index 264837df2335..a57ad2fd50fd 100644 --- a/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx +++ b/apps/meteor/client/sidebar/header/CreateChannel/CreateChannelModal.tsx @@ -175,7 +175,7 @@ const CreateChannelModal = ({ teamId = '', onClose }: CreateChannelModalProps): {t('Create_channel')} - + {t('Name')} diff --git a/apps/meteor/client/sidebar/header/CreateDirectMessage.tsx b/apps/meteor/client/sidebar/header/CreateDirectMessage.tsx index ad6b478ca4f4..df45740d9271 100644 --- a/apps/meteor/client/sidebar/header/CreateDirectMessage.tsx +++ b/apps/meteor/client/sidebar/header/CreateDirectMessage.tsx @@ -45,9 +45,9 @@ const CreateDirectMessage: FC = ({ onClose }) => { {t('Direct_Messages')} - + {t('Direct_message_creation_description')} - + diff --git a/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx b/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx index a84aaf2339c4..1f12c2b59b49 100644 --- a/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx +++ b/apps/meteor/client/sidebar/header/CreateTeam/CreateTeamModal.tsx @@ -135,7 +135,7 @@ const CreateTeamModal = ({ onClose }: { onClose: () => void }): ReactElement => {t('Teams_New_Title')} - + {t('Teams_New_Name_Label')} diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomListItem.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomListItem.tsx index 90d7885b4a62..161c7ff61c94 100644 --- a/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomListItem.tsx +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/FederatedRoomListItem.tsx @@ -26,8 +26,8 @@ const FederatedRoomListItem: VFC = ({ const t = useTranslation(); return ( - - + + {name} @@ -46,15 +46,15 @@ const FederatedRoomListItem: VFC = ({ {topic && ( - + {topic} )} - + {canonicalAlias}{' '} - + {joinedMembers} diff --git a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationManageServerModal.tsx b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationManageServerModal.tsx index 56752d5c3a68..a0f90a7d2f2f 100644 --- a/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationManageServerModal.tsx +++ b/apps/meteor/client/sidebar/header/MatrixFederationSearch/MatrixFederationManageServerModal.tsx @@ -74,7 +74,7 @@ const MatrixFederationAddServerModal: VFC = setErrorKey(undefined); } }} - mie='x4' + mie={4} />
    +
    {children}
    diff --git a/apps/meteor/client/views/admin/info/OfflineLicenseModal.tsx b/apps/meteor/client/views/admin/info/OfflineLicenseModal.tsx index b8d9df52372f..0ece529fc2d3 100644 --- a/apps/meteor/client/views/admin/info/OfflineLicenseModal.tsx +++ b/apps/meteor/client/views/admin/info/OfflineLicenseModal.tsx @@ -73,13 +73,13 @@ const OfflineLicenseModal = ({ onClose, license, licenseStatus, ...props }: Offl display='flex' flexDirection='column' alignItems='stretch' - paddingInline='x16' - pb='x8' + paddingInline={16} + pb={8} flexGrow={1} backgroundColor='dark' mb={status === 'invalid' ? 'x8' : undefined} > - + - + {' '} / {unlimited ? '∞' : total} - + {label} diff --git a/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhook.js b/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhook.js index 7de5944b48cc..cbe3c3e5377d 100644 --- a/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhook.js +++ b/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhook.js @@ -85,7 +85,7 @@ function EditIncomingWebhook({ data, onChange, ...props }) {
    - diff --git a/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhookWithData.js b/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhookWithData.js index a876d6565903..cccdc346ccd7 100644 --- a/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhookWithData.js +++ b/apps/meteor/client/views/admin/integrations/edit/EditIncomingWebhookWithData.js @@ -33,20 +33,20 @@ function EditIncomingWebhookWithData({ integrationId, ...props }) { if (isLoading) { return ( - - - - - - - + + + + + + + ); } if (error) { return ( - + {t('Oops_page_not_found')} ); diff --git a/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhook.js b/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhook.js index b7e63063cf39..1734f32968c9 100644 --- a/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhook.js +++ b/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhook.js @@ -104,7 +104,7 @@ function EditOutgoingWebhook({ data, onChange, setSaveAction, ...props }) { - diff --git a/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhookWithData.js b/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhookWithData.js index 8aa0ed79b803..5eac5b2fdc22 100644 --- a/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhookWithData.js +++ b/apps/meteor/client/views/admin/integrations/edit/EditOutgoingWebhookWithData.js @@ -33,20 +33,20 @@ function EditOutgoingWebhookWithData({ integrationId, ...props }) { if (isLoading) { return ( - - - - - - - + + + + + + + ); } if (error) { return ( - + {t('Oops_page_not_found')} ); diff --git a/apps/meteor/client/views/admin/integrations/edit/HistoryContent.tsx b/apps/meteor/client/views/admin/integrations/edit/HistoryContent.tsx index e88efa0bdf0e..255205352323 100644 --- a/apps/meteor/client/views/admin/integrations/edit/HistoryContent.tsx +++ b/apps/meteor/client/views/admin/integrations/edit/HistoryContent.tsx @@ -11,19 +11,19 @@ function HistoryContent({ data, isLoading }: { data: Serialized - - - - - - + + + + + + + ); } if (data.length < 1) { - return {t('Integration_Outgoing_WebHook_No_History')}; + return {t('Integration_Outgoing_WebHook_No_History')}; } return ( diff --git a/apps/meteor/client/views/admin/integrations/edit/HistoryItem.js b/apps/meteor/client/views/admin/integrations/edit/HistoryItem.js index bbe4b0f38855..426a79c9c473 100644 --- a/apps/meteor/client/views/admin/integrations/edit/HistoryItem.js +++ b/apps/meteor/client/views/admin/integrations/edit/HistoryItem.js @@ -53,7 +53,7 @@ function HistoryItem({ data, ...props }) { title={ - + {formatDateAndTime(_createdAt)} @@ -43,7 +43,7 @@ const EditOauthAppWithData = ({ _id, ...props }: { _id: string }): ReactElement - + @@ -54,7 +54,7 @@ const EditOauthAppWithData = ({ _id, ...props }: { _id: string }): ReactElement if (error || !data || !_id) { return ( - + {t('error-application-not-found')} ); diff --git a/apps/meteor/client/views/admin/permissions/EditRolePage.tsx b/apps/meteor/client/views/admin/permissions/EditRolePage.tsx index 81f6e3ef7fc9..b7948d571254 100644 --- a/apps/meteor/client/views/admin/permissions/EditRolePage.tsx +++ b/apps/meteor/client/views/admin/permissions/EditRolePage.tsx @@ -93,7 +93,7 @@ const EditRolePage = ({ role, isEnterprise }: { role?: IRole; isEnterprise: bool <> - + diff --git a/apps/meteor/client/views/admin/permissions/PermissionsTable/PermissionsTable.tsx b/apps/meteor/client/views/admin/permissions/PermissionsTable/PermissionsTable.tsx index 244717b4f151..4b956654cd5e 100644 --- a/apps/meteor/client/views/admin/permissions/PermissionsTable/PermissionsTable.tsx +++ b/apps/meteor/client/views/admin/permissions/PermissionsTable/PermissionsTable.tsx @@ -63,7 +63,7 @@ const PermissionsTable = ({ isEnterprise }: { isEnterprise: boolean }): ReactEle {t('New_role')} - + - + {permissions?.length === 0 && } {permissions?.length > 0 && ( diff --git a/apps/meteor/client/views/admin/permissions/PermissionsTable/RoleCell.tsx b/apps/meteor/client/views/admin/permissions/PermissionsTable/RoleCell.tsx index cb686584b2c0..8e1b8f987ca9 100644 --- a/apps/meteor/client/views/admin/permissions/PermissionsTable/RoleCell.tsx +++ b/apps/meteor/client/views/admin/permissions/PermissionsTable/RoleCell.tsx @@ -34,7 +34,7 @@ const RoleCell = ({ _id, name, description, onChange, lineHovered, permissionId, return ( - + {!loading && ( diff --git a/apps/meteor/client/views/admin/permissions/PermissionsTable/RoleHeader.tsx b/apps/meteor/client/views/admin/permissions/PermissionsTable/RoleHeader.tsx index bea2cc5ad1c0..69f99d67f114 100644 --- a/apps/meteor/client/views/admin/permissions/PermissionsTable/RoleHeader.tsx +++ b/apps/meteor/client/views/admin/permissions/PermissionsTable/RoleHeader.tsx @@ -24,7 +24,7 @@ const RoleHeader = ({ _id, name, description }: RoleHeaderProps): ReactElement = }); return ( - + diff --git a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRolePage.tsx b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRolePage.tsx index 2341995afe45..c91f530cca3a 100644 --- a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRolePage.tsx +++ b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRolePage.tsx @@ -68,9 +68,9 @@ const UsersInRolePage = ({ role }: { role: IRole }): ReactElement => { - + {role.scope !== 'Users' && ( - + {t('Choose_a_room')} { )} /> - + @@ -102,7 +102,7 @@ const UsersInRolePage = ({ role }: { role: IRole }): ReactElement => { - + {(role.scope === 'Users' || rid) && ( )} 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 a754d1136529..1fbce402a21b 100644 --- a/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx +++ b/apps/meteor/client/views/admin/permissions/UsersInRole/UsersInRoleTable/UsersInRoleTableRow.tsx @@ -26,7 +26,7 @@ const UsersInRoleTableRow = ({ user, onRemove }: UsersInRoleTableRowProps): Reac - + {name || username} diff --git a/apps/meteor/client/views/admin/rooms/EditRoom.tsx b/apps/meteor/client/views/admin/rooms/EditRoom.tsx index 1dbc3bf0356f..a6b4e75c47ad 100644 --- a/apps/meteor/client/views/admin/rooms/EditRoom.tsx +++ b/apps/meteor/client/views/admin/rooms/EditRoom.tsx @@ -211,7 +211,7 @@ const EditRoom = ({ room, onChange, onDelete }: EditRoomProps): ReactElement => <> e.preventDefault())}> {room.t !== 'd' && ( - + )} @@ -346,7 +346,7 @@ const EditRoom = ({ room, onChange, onDelete }: EditRoomProps): ReactElement => {t('Save')} - + diff --git a/apps/meteor/client/views/admin/rooms/EditRoomWithData.tsx b/apps/meteor/client/views/admin/rooms/EditRoomWithData.tsx index 963b28958be0..a3d959fa4781 100644 --- a/apps/meteor/client/views/admin/rooms/EditRoomWithData.tsx +++ b/apps/meteor/client/views/admin/rooms/EditRoomWithData.tsx @@ -26,13 +26,13 @@ const EditRoomWithData: FC<{ rid?: string; onReload: () => void }> = ({ rid, onR if (isLoading) { return ( - - - - - - - + + + + + + + ); } diff --git a/apps/meteor/client/views/admin/rooms/FilterByTypeAndText.tsx b/apps/meteor/client/views/admin/rooms/FilterByTypeAndText.tsx index 2496cb875027..2bbdc10be000 100644 --- a/apps/meteor/client/views/admin/rooms/FilterByTypeAndText.tsx +++ b/apps/meteor/client/views/admin/rooms/FilterByTypeAndText.tsx @@ -40,7 +40,7 @@ const FilterByTypeAndText = ({ setFilter, ...props }: { setFilter?: Dispatch e.preventDefault(), [])} display='flex' flexDirection='column' {...props}> + e.preventDefault(), [])} display='flex' flexDirection='column' {...props}> - - + + handleCheckBox('d')} /> {t('Direct')} diff --git a/apps/meteor/client/views/admin/rooms/RoomsTable.tsx b/apps/meteor/client/views/admin/rooms/RoomsTable.tsx index c2c819a29614..0667ab1decaa 100644 --- a/apps/meteor/client/views/admin/rooms/RoomsTable.tsx +++ b/apps/meteor/client/views/admin/rooms/RoomsTable.tsx @@ -178,9 +178,9 @@ const RoomsTable = ({ reload }: { reload: MutableRefObject<() => void> }): React - + - {icon && } + {icon && } {roomName} @@ -192,7 +192,7 @@ const RoomsTable = ({ reload }: { reload: MutableRefObject<() => void> }): React {t(getRoomType(room))} - + {usersCount} {mediaQuery && {msgs}} diff --git a/apps/meteor/client/views/admin/settings/MemoizedSetting.tsx b/apps/meteor/client/views/admin/settings/MemoizedSetting.tsx index d9889472ea55..72b97bf446d4 100644 --- a/apps/meteor/client/views/admin/settings/MemoizedSetting.tsx +++ b/apps/meteor/client/views/admin/settings/MemoizedSetting.tsx @@ -97,7 +97,7 @@ const MemoizedSetting = ({ /> {hint && type !== 'code' && {hint}} {callout && ( - + {callout} )} diff --git a/apps/meteor/client/views/admin/settings/Section.tsx b/apps/meteor/client/views/admin/settings/Section.tsx index bde10df56d09..ef1baf47f165 100644 --- a/apps/meteor/client/views/admin/settings/Section.tsx +++ b/apps/meteor/client/views/admin/settings/Section.tsx @@ -95,7 +95,7 @@ function Section({ groupId, hasReset = true, sectionName, tabName = '', solo, he children={t('Reset_section_settings')} secondary danger - marginBlockStart='x16' + marginBlockStart={16} data-section={sectionName} onClick={handleResetSectionClick} /> diff --git a/apps/meteor/client/views/admin/settings/SettingsPage.tsx b/apps/meteor/client/views/admin/settings/SettingsPage.tsx index b60cf0d72c54..f1141c399a56 100644 --- a/apps/meteor/client/views/admin/settings/SettingsPage.tsx +++ b/apps/meteor/client/views/admin/settings/SettingsPage.tsx @@ -29,7 +29,7 @@ const SettingsPage = (): ReactElement => { {isLoadingGroups && } - + {!isLoadingGroups && !!groups.length && groups.map((group) => ( diff --git a/apps/meteor/client/views/admin/settings/groups/voip/VoipExtensionsPage.tsx b/apps/meteor/client/views/admin/settings/groups/voip/VoipExtensionsPage.tsx index 1a6b79c47502..8841a607fa87 100644 --- a/apps/meteor/client/views/admin/settings/groups/voip/VoipExtensionsPage.tsx +++ b/apps/meteor/client/views/admin/settings/groups/voip/VoipExtensionsPage.tsx @@ -57,7 +57,7 @@ const VoipExtensionsPage = () => { return ( - + {data?.total} {t('Extensions')} @@ -88,7 +88,7 @@ const VoipExtensionsPage = () => { {username ? ( - + {name || username} @@ -106,7 +106,7 @@ const VoipExtensionsPage = () => { {queues?.map( (queue: string, index: number) => index <= 1 && ( - + {queue} ), diff --git a/apps/meteor/client/views/admin/settings/inputs/BooleanSettingInput.tsx b/apps/meteor/client/views/admin/settings/inputs/BooleanSettingInput.tsx index b6e32940e8a0..acac16b5b7e8 100644 --- a/apps/meteor/client/views/admin/settings/inputs/BooleanSettingInput.tsx +++ b/apps/meteor/client/views/admin/settings/inputs/BooleanSettingInput.tsx @@ -30,7 +30,7 @@ function BooleanSettingInput({ }; return ( - + {fullScreen && ( - + {label} )} {children} - + diff --git a/apps/meteor/client/views/admin/settings/inputs/ColorSettingInput.tsx b/apps/meteor/client/views/admin/settings/inputs/ColorSettingInput.tsx index 4ca25c0eb405..1fd112f48b90 100644 --- a/apps/meteor/client/views/admin/settings/inputs/ColorSettingInput.tsx +++ b/apps/meteor/client/views/admin/settings/inputs/ColorSettingInput.tsx @@ -62,9 +62,9 @@ function ColorSettingInput({ {hasResetButton && } - + - + {editor === 'color' && ( = ({ currentPath }) => { const { tabType, trialEndDate, isLoading } = useUpgradeTabParams(); return ( - + {!isLoading && tabType && } diff --git a/apps/meteor/client/views/admin/sidebar/UpgradeTab.tsx b/apps/meteor/client/views/admin/sidebar/UpgradeTab.tsx index 37fa2598390f..a676ccbf10f5 100644 --- a/apps/meteor/client/views/admin/sidebar/UpgradeTab.tsx +++ b/apps/meteor/client/views/admin/sidebar/UpgradeTab.tsx @@ -26,8 +26,8 @@ const UpgradeTab = ({ type, currentPath, trialEndDate }: UpgradeTabProps): React return ( - - + + {t(label)} {displayEmoji && } diff --git a/apps/meteor/client/views/admin/users/AdminUserInfoActions.tsx b/apps/meteor/client/views/admin/users/AdminUserInfoActions.tsx index 5ff61cdfdb06..d003b47ba2af 100644 --- a/apps/meteor/client/views/admin/users/AdminUserInfoActions.tsx +++ b/apps/meteor/client/views/admin/users/AdminUserInfoActions.tsx @@ -110,7 +110,7 @@ const AdminUserInfoActions = ({ return ( + {t('User_not_found')} ); diff --git a/apps/meteor/client/views/admin/users/EditUserWithData.tsx b/apps/meteor/client/views/admin/users/EditUserWithData.tsx index 23437a7dae85..9c1fd703a022 100644 --- a/apps/meteor/client/views/admin/users/EditUserWithData.tsx +++ b/apps/meteor/client/views/admin/users/EditUserWithData.tsx @@ -53,7 +53,7 @@ const EditUserWithData = ({ uid, onReload, ...props }: EditUserWithDataProps): R if (state || roleState) { return ( - + ); @@ -61,7 +61,7 @@ const EditUserWithData = ({ uid, onReload, ...props }: EditUserWithDataProps): R if (error || roleError) { return ( - + {t('User_not_found')} ); @@ -69,7 +69,7 @@ const EditUserWithData = ({ uid, onReload, ...props }: EditUserWithDataProps): R if (data?.user && isUserFederated(data?.user as unknown as IUser)) { return ( - + {t('Edit_Federated_User_Not_Allowed')} ); diff --git a/apps/meteor/client/views/admin/users/InviteUsers.tsx b/apps/meteor/client/views/admin/users/InviteUsers.tsx index e1bb865b4a33..9d549ef19c0b 100644 --- a/apps/meteor/client/views/admin/users/InviteUsers.tsx +++ b/apps/meteor/client/views/admin/users/InviteUsers.tsx @@ -51,17 +51,17 @@ const InviteUsers = (props: InviteUsersProps): ReactElement => { return ( <> - + {t('Send_invitation_email')} - + {t('Send_invitation_email_info')} ): void => setText(e.currentTarget.value)} /> - diff --git a/apps/meteor/client/views/admin/users/UserForm.js b/apps/meteor/client/views/admin/users/UserForm.js index 696ed87d28dc..283d498b25eb 100644 --- a/apps/meteor/client/views/admin/users/UserForm.js +++ b/apps/meteor/client/views/admin/users/UserForm.js @@ -118,7 +118,7 @@ export default function UserForm({ formValues, formHandlers, availableRoles, app {errors && errors.email && {errors.email}} - + {t('Verified')} diff --git a/apps/meteor/client/views/admin/users/UsersTable/UsersTableRow.tsx b/apps/meteor/client/views/admin/users/UsersTable/UsersTableRow.tsx index e8df21e35b6a..2572b7446c42 100644 --- a/apps/meteor/client/views/admin/users/UsersTable/UsersTableRow.tsx +++ b/apps/meteor/client/views/admin/users/UsersTable/UsersTableRow.tsx @@ -38,7 +38,7 @@ const UsersTableRow = ({ user, onClick, mediaQuery }: UsersTableRowProps): React {username && } - + {name || username} @@ -58,7 +58,7 @@ const UsersTableRow = ({ user, onClick, mediaQuery }: UsersTableRowProps): React {username} {' '} - + )} {emails?.length && emails[0].address} diff --git a/apps/meteor/client/views/admin/viewLogs/ServerLogs.tsx b/apps/meteor/client/views/admin/viewLogs/ServerLogs.tsx index e6b67ee592e5..7c43214e5876 100644 --- a/apps/meteor/client/views/admin/viewLogs/ServerLogs.tsx +++ b/apps/meteor/client/views/admin/viewLogs/ServerLogs.tsx @@ -166,13 +166,13 @@ const ServerLogs = (): ReactElement => { }, [sendToBottomIfNecessary]); return ( - + { = ({ config }) => { inline={inline} actionable={!!config.action} closeable={closable} - icon={icon ? : undefined} + icon={icon ? : undefined} title={typeof title === 'function' ? title() : title} variant={variant} onAction={handleAction} diff --git a/apps/meteor/client/views/banners/UiKitBanner.tsx b/apps/meteor/client/views/banners/UiKitBanner.tsx index ea21130266fd..7cb52dd8d3c9 100644 --- a/apps/meteor/client/views/banners/UiKitBanner.tsx +++ b/apps/meteor/client/views/banners/UiKitBanner.tsx @@ -20,7 +20,7 @@ const UiKitBanner: FC = ({ payload }) => { const icon = useMemo(() => { if (state.icon) { - return ; + return ; } return null; diff --git a/apps/meteor/client/views/composer/AudioMessageRecorder/AudioMessageRecorder.tsx b/apps/meteor/client/views/composer/AudioMessageRecorder/AudioMessageRecorder.tsx index 2923fc100caf..a8da354cbbfb 100644 --- a/apps/meteor/client/views/composer/AudioMessageRecorder/AudioMessageRecorder.tsx +++ b/apps/meteor/client/views/composer/AudioMessageRecorder/AudioMessageRecorder.tsx @@ -113,7 +113,7 @@ const AudioMessageRecorder = ({ rid, chatContext, isMicrophoneDenied }: AudioMes } return ( - + {state === 'recording' && ( <> + { categoriesPosition.current.push({ el: element, top: element?.offsetTop }); diff --git a/apps/meteor/client/views/composer/EmojiPicker/EmojiElement.tsx b/apps/meteor/client/views/composer/EmojiPicker/EmojiElement.tsx index 9dad1e7852d3..9577e3def782 100644 --- a/apps/meteor/client/views/composer/EmojiPicker/EmojiElement.tsx +++ b/apps/meteor/client/views/composer/EmojiPicker/EmojiElement.tsx @@ -21,8 +21,8 @@ const EmojiElement = ({ emoji, image, onClick, small = false, ...props }: EmojiE const emojiSmallClass = css` > .emoji, .emojione { - width: 18px; - height: 18px; + width: 1.125rem; + height: 1.125rem; } `; diff --git a/apps/meteor/client/views/composer/EmojiPicker/EmojiPicker.tsx b/apps/meteor/client/views/composer/EmojiPicker/EmojiPicker.tsx index 47d8ba849201..971005e3fa8e 100644 --- a/apps/meteor/client/views/composer/EmojiPicker/EmojiPicker.tsx +++ b/apps/meteor/client/views/composer/EmojiPicker/EmojiPicker.tsx @@ -206,7 +206,7 @@ const EmojiPicker = ({ reference, onClose, onPickEmoji }: EmojiPickerProps) => { /> ))} - + {searching && } {!searching && ( diff --git a/apps/meteor/client/views/composer/EmojiPicker/EmojiPickerDesktopDropdown.tsx b/apps/meteor/client/views/composer/EmojiPicker/EmojiPickerDesktopDropdown.tsx index 03828d93c403..12e421fe4b0b 100644 --- a/apps/meteor/client/views/composer/EmojiPicker/EmojiPickerDesktopDropdown.tsx +++ b/apps/meteor/client/views/composer/EmojiPicker/EmojiPickerDesktopDropdown.tsx @@ -62,8 +62,8 @@ const EmojiPickerDesktopDropdown = forwardRef(function ToolboxDropdownDesktop( const style = useDropdownPosition(reference, targetRef); return ( - - + + {children} diff --git a/apps/meteor/client/views/composer/EmojiPicker/ToneSelector/ToneSelector.tsx b/apps/meteor/client/views/composer/EmojiPicker/ToneSelector/ToneSelector.tsx index 96df30cea9e1..606e2385aee6 100644 --- a/apps/meteor/client/views/composer/EmojiPicker/ToneSelector/ToneSelector.tsx +++ b/apps/meteor/client/views/composer/EmojiPicker/ToneSelector/ToneSelector.tsx @@ -56,7 +56,7 @@ const ToneSelector = ({ tone, setTone }: { tone: number; setTone: (tone: number) onBlur={hide} onKeyUp={handleKeyUp} onKeyDown={handleKeyDown} - mis='x4' + mis={4} icon={} /> diff --git a/apps/meteor/client/views/composer/VideoMessageRecorder/VideoMessageRecorder.tsx b/apps/meteor/client/views/composer/VideoMessageRecorder/VideoMessageRecorder.tsx index 5d43a07d8b0b..e2b86350aa10 100644 --- a/apps/meteor/client/views/composer/VideoMessageRecorder/VideoMessageRecorder.tsx +++ b/apps/meteor/client/views/composer/VideoMessageRecorder/VideoMessageRecorder.tsx @@ -122,7 +122,7 @@ const VideoMessageRecorder = ({ rid, tmid, chatContext, reference }: VideoMessag diff --git a/apps/meteor/client/views/directory/RoomTags.tsx b/apps/meteor/client/views/directory/RoomTags.tsx index 20a36cf7c5c5..780b554bd8fb 100644 --- a/apps/meteor/client/views/directory/RoomTags.tsx +++ b/apps/meteor/client/views/directory/RoomTags.tsx @@ -8,8 +8,8 @@ const RoomTags = ({ room }: { room: IRoom }): ReactElement => { const t = useTranslation(); return ( - - + + {room.default && {t('default')}} {room.featured && {t('featured')}} diff --git a/apps/meteor/client/views/directory/tabs/channels/ChannelsTable/ChannelsTableRow.tsx b/apps/meteor/client/views/directory/tabs/channels/ChannelsTable/ChannelsTableRow.tsx index 0ab051ee5d20..a3847807c601 100644 --- a/apps/meteor/client/views/directory/tabs/channels/ChannelsTable/ChannelsTableRow.tsx +++ b/apps/meteor/client/views/directory/tabs/channels/ChannelsTable/ChannelsTableRow.tsx @@ -25,10 +25,10 @@ const ChannelsTableRow = ({ onClick, room, mediaQuery }: ChannelsTableRowProps) {avatarUrl && } - + - + {fname || name} diff --git a/apps/meteor/client/views/directory/tabs/teams/TeamsTable/TeamsTableRow.tsx b/apps/meteor/client/views/directory/tabs/teams/TeamsTable/TeamsTableRow.tsx index 672309e351a2..fbfcfa19e960 100644 --- a/apps/meteor/client/views/directory/tabs/teams/TeamsTable/TeamsTableRow.tsx +++ b/apps/meteor/client/views/directory/tabs/teams/TeamsTable/TeamsTableRow.tsx @@ -25,10 +25,10 @@ const TeamsTableRow = ({ onClick, team, mediaQuery }: TeamsTableRowProps) => { {avatarUrl && } - + - + {fname || name} diff --git a/apps/meteor/client/views/directory/tabs/users/UsersTable/UsersTableRow.tsx b/apps/meteor/client/views/directory/tabs/users/UsersTable/UsersTableRow.tsx index b950a694192f..976bb95ba926 100644 --- a/apps/meteor/client/views/directory/tabs/users/UsersTable/UsersTableRow.tsx +++ b/apps/meteor/client/views/directory/tabs/users/UsersTable/UsersTableRow.tsx @@ -30,13 +30,13 @@ const UsersTableRow = ({ {username && } - + {name || username} {nickname && ` (${nickname})`} {' '} - {' '} + {' '} {username} diff --git a/apps/meteor/client/views/e2e/EnterE2EPasswordModal.tsx b/apps/meteor/client/views/e2e/EnterE2EPasswordModal.tsx index 0e764d00b638..76d5f3b61e28 100644 --- a/apps/meteor/client/views/e2e/EnterE2EPasswordModal.tsx +++ b/apps/meteor/client/views/e2e/EnterE2EPasswordModal.tsx @@ -48,7 +48,7 @@ const EnterE2EPasswordModal = ({ onCancel={onCancel} > - + <> - diff --git a/apps/meteor/client/views/home/DefaultHomePage.tsx b/apps/meteor/client/views/home/DefaultHomePage.tsx index 0ae82c46cd3b..2b6db9a7777b 100644 --- a/apps/meteor/client/views/home/DefaultHomePage.tsx +++ b/apps/meteor/client/views/home/DefaultHomePage.tsx @@ -30,10 +30,10 @@ const DefaultHomePage = (): ReactElement => { - + {t('Welcome_to_workspace', { Site_Name: workspaceName || 'Rocket.Chat' })} - + {t('Some_ideas_to_get_you_started')} @@ -61,7 +61,7 @@ const DefaultHomePage = (): ReactElement => { {(isAdmin || (isCustomContentVisible && !isCustomContentBodyEmpty)) && ( - + )} diff --git a/apps/meteor/client/views/home/HomepageGridItem.tsx b/apps/meteor/client/views/home/HomepageGridItem.tsx index 95a28f7903d0..775fc6cb8eac 100644 --- a/apps/meteor/client/views/home/HomepageGridItem.tsx +++ b/apps/meteor/client/views/home/HomepageGridItem.tsx @@ -9,7 +9,7 @@ const HomepageGridItem = ({ children }: { children: ReactNode }): ReactElement = const isMedium = !breakpoints.includes('lg'); return ( - + {children} ); diff --git a/apps/meteor/client/views/home/cards/CustomContentCard.tsx b/apps/meteor/client/views/home/cards/CustomContentCard.tsx index 57ebf4a09bac..118fa659e640 100644 --- a/apps/meteor/client/views/home/cards/CustomContentCard.tsx +++ b/apps/meteor/client/views/home/cards/CustomContentCard.tsx @@ -54,13 +54,13 @@ const CustomContentCard = (): ReactElement | null => { if (isAdmin) { return ( - + - + {willNotShowCustomContent ? t('Not_Visible_To_Workspace') : t('Visible_To_Workspace')} - + {isCustomContentBodyEmpty ? t('Homepage_Custom_Content_Default_Message') : } @@ -95,7 +95,7 @@ const CustomContentCard = (): ReactElement | null => { if (!willNotShowCustomContent && !isCustomContentOnly) { return ( - + diff --git a/apps/meteor/client/views/marketplace/AccordionLoading.tsx b/apps/meteor/client/views/marketplace/AccordionLoading.tsx index 9ce1c55e1e32..5591baf268d8 100644 --- a/apps/meteor/client/views/marketplace/AccordionLoading.tsx +++ b/apps/meteor/client/views/marketplace/AccordionLoading.tsx @@ -4,7 +4,7 @@ import React from 'react'; const AccordionLoading: FC = () => ( - + diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPage.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPage.tsx index 9be183c489dc..00d5d0ee6b37 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPage.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPage.tsx @@ -83,7 +83,7 @@ const AppDetailsPage = ({ id }: { id: App['id'] }): ReactElement => { )} - + {!appData && } {appData && ( diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPageHeader.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPageHeader.tsx index 3f12198a6503..ef0c7259fddd 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPageHeader.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPageHeader.tsx @@ -36,35 +36,35 @@ const AppDetailsPageHeader = ({ app }: { app: App }): ReactElement => { const incompatibleStatus = versionIncompatible ? appIncompatibleStatusProps() : undefined; return ( - - + + - - + + {name} {bundledIn && Boolean(bundledIn.length) && } {shortDescription && ( - + {shortDescription} )} - + {(installed || isSubscribed) && } {author?.name} - + | {t('Version_version', { version: versioni18nKey(app) })} {lastUpdated && ( <> - + | @@ -77,7 +77,7 @@ const AppDetailsPageHeader = ({ app }: { app: App }): ReactElement => { {versionIncompatible && ( <> - + | diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPageLoading.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPageLoading.tsx index d9e66c08aa91..5ea97a9a6112 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPageLoading.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/AppDetailsPageLoading.tsx @@ -3,8 +3,8 @@ import type { FC } from 'react'; import React from 'react'; const AppDetailsPageLoading: FC = () => ( - - + + diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetails.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetails.tsx index 77b0dcdaf712..aa854a470830 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetails.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetails.tsx @@ -44,18 +44,18 @@ const AppDetails = ({ app }: { app: AppInfo }): ReactElement => { )} - + {isCarouselVisible && } - + {t('Description')} - + {t('Categories')} @@ -68,11 +68,11 @@ const AppDetails = ({ app }: { app: AppInfo }): ReactElement => { - + {t('Contact')} - - + + {t('Author_Site')} diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetailsAPIs.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetailsAPIs.tsx index ef5199d15fe5..0480223b525f 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetailsAPIs.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppDetails/AppDetailsAPIs.tsx @@ -18,11 +18,11 @@ const AppDetailsAPIs: FC = ({ apis }) => { return ( <> - + {t('APIs')} {apis.map((api) => ( - + {api.methods.join(' | ').toUpperCase()} {api.path} diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppReleases/AppReleasesItem.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppReleases/AppReleasesItem.tsx index a8bf56d957b3..bc27053ea1d2 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppReleases/AppReleasesItem.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppReleases/AppReleasesItem.tsx @@ -24,10 +24,10 @@ const AppReleasesItem = ({ release, ...props }: ReleaseItemProps): ReactElement const title = ( - + {release.version} - + {formatDate(release.createdDate)} diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppRequests/AppRequestItem.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppRequests/AppRequestItem.tsx index bf9d43223ae9..4cdba9f22360 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppRequests/AppRequestItem.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppRequests/AppRequestItem.tsx @@ -19,16 +19,16 @@ const AppRequestItem = ({ seen, name, createdDate, message, username }: AppReque const isAdminUser = usePermission('manage-apps'); return ( - - - + + + {!seen && isAdminUser && } {username && } - - + + {name} diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppRequests/AppRequests.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppRequests/AppRequests.tsx index 228c625cf2df..a478d37508bd 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppRequests/AppRequests.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppRequests/AppRequests.tsx @@ -50,7 +50,7 @@ const AppRequests = ({ id, isAdminUser }: { id: App['id']; isAdminUser: boolean if (paginatedAppRequests.isLoading) { return ( - + ); @@ -58,7 +58,7 @@ const AppRequests = ({ id, isAdminUser }: { id: App['id']; isAdminUser: boolean return ( - + {paginatedAppRequests.isSuccess && paginatedAppRequests.data.data?.length ? ( paginatedAppRequests.data.data.map((request) => ( { const appRequestsLoading = Array.from({ length: 5 }, (_, i) => ( - - + + - + diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSecurity/AppSecurity.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSecurity/AppSecurity.tsx index 7227b2c42b67..baaf65356a8e 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSecurity/AppSecurity.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSecurity/AppSecurity.tsx @@ -20,7 +20,7 @@ const AppSecurity = ({ privacyPolicySummary, appPermissions, tosLink, privacyLin return ( - + {t('Privacy_summary')} @@ -30,7 +30,7 @@ const AppSecurity = ({ privacyPolicySummary, appPermissions, tosLink, privacyLin {t('Permissions')} - + diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSecurity/AppSecurityLabel.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSecurity/AppSecurityLabel.tsx index 4832ed9999b3..04f30441376f 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSecurity/AppSecurityLabel.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSecurity/AppSecurityLabel.tsx @@ -3,7 +3,7 @@ import type { ReactElement } from 'react'; import React from 'react'; const AppSecurityLabel = ({ children }: { children: string }): ReactElement => ( - + {children} ); diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSettings/AppSettings.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSettings/AppSettings.tsx index da50ebf75257..57e98fe77e86 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSettings/AppSettings.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppSettings/AppSettings.tsx @@ -41,7 +41,7 @@ const AppSettings: FC = ({ settings, setHasUnsavedChanges, set return ( <> - + {t('Settings')} diff --git a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppStatus/AppStatus.tsx b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppStatus/AppStatus.tsx index 8d9c961886f8..6b99cab23283 100644 --- a/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppStatus/AppStatus.tsx +++ b/apps/meteor/client/views/marketplace/AppDetailsPage/tabs/AppStatus/AppStatus.tsx @@ -117,7 +117,7 @@ const AppStatus = ({ app, showStatus = true, isAppDetailsPage, installed, ...pro }; return ( - + {button && isAppDetailsPage && (!installed || canUpdate) && ( {loading && } {!loading && t(button.label.replace(' ', '_') as TranslationKey)} @@ -146,7 +146,7 @@ const AppStatus = ({ app, showStatus = true, isAppDetailsPage, installed, ...pro )} {statuses?.map((status, index) => ( - + {handleAppRequestsNumber(status)} {t(`${status.label}` as TranslationKey)} diff --git a/apps/meteor/client/views/marketplace/AppMenu.js b/apps/meteor/client/views/marketplace/AppMenu.js index 5c5d373ac9dc..ba843321395c 100644 --- a/apps/meteor/client/views/marketplace/AppMenu.js +++ b/apps/meteor/client/views/marketplace/AppMenu.js @@ -284,7 +284,7 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { subscribe: { label: ( <> - + {t('Subscription')} ), @@ -299,7 +299,7 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { acquire: { label: ( <> - {isAdminUser && } + {isAdminUser && } {t(button.label.replace(' ', '_'))} ), @@ -321,7 +321,7 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { viewLogs: { label: ( <> - + {t('View_Logs')} ), @@ -334,7 +334,7 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { update: { label: ( <> - + {t('Update')} ), @@ -347,7 +347,7 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { disable: { label: ( - + {t('Disable')} ), @@ -377,7 +377,7 @@ function AppMenu({ app, isAppDetailsPage, ...props }) { uninstall: { label: ( - + {t('Uninstall')} ), diff --git a/apps/meteor/client/views/marketplace/AppPermissionsReviewModal.tsx b/apps/meteor/client/views/marketplace/AppPermissionsReviewModal.tsx index 743f1006d3f7..3b7be8f1b9c0 100644 --- a/apps/meteor/client/views/marketplace/AppPermissionsReviewModal.tsx +++ b/apps/meteor/client/views/marketplace/AppPermissionsReviewModal.tsx @@ -28,7 +28,7 @@ const AppPermissionsReviewModal: FC = ({ appPerm {t('Apps_Permissions_Review_Modal_Subtitle')} - + diff --git a/apps/meteor/client/views/marketplace/AppsList/AppRow.tsx b/apps/meteor/client/views/marketplace/AppsList/AppRow.tsx index 2b8986678537..a8a664fb148a 100644 --- a/apps/meteor/client/views/marketplace/AppsList/AppRow.tsx +++ b/apps/meteor/client/views/marketplace/AppsList/AppRow.tsx @@ -72,28 +72,28 @@ const AppRow = (props: App): ReactElement => { flexDirection='row' justifyContent='space-between' alignItems='center' - mbe='x8' - pb='x8' - pi='x16' + mbe={8} + pb={8} + pi={16} borderRadius='x4' className={hoverClass} bg='light' > - - + + {name} - + {bundledIn && Boolean(bundledIn.length) && ( )} {shortDescription && !isMobile && ( - + {shortDescription} )} @@ -101,13 +101,13 @@ const AppRow = (props: App): ReactElement => { {canUpdate && ( - + )} - + diff --git a/apps/meteor/client/views/marketplace/AppsList/AppsList.tsx b/apps/meteor/client/views/marketplace/AppsList/AppsList.tsx index c3c530cd837b..7855bbdc8f94 100644 --- a/apps/meteor/client/views/marketplace/AppsList/AppsList.tsx +++ b/apps/meteor/client/views/marketplace/AppsList/AppsList.tsx @@ -12,10 +12,10 @@ type AppsListProps = { const AppsList = ({ apps, title }: AppsListProps): ReactElement => ( <> - + {title} - + {apps.map((app) => ( ))} diff --git a/apps/meteor/client/views/marketplace/AppsPage/AppsFilters.tsx b/apps/meteor/client/views/marketplace/AppsPage/AppsFilters.tsx index 81f9188da047..2fdbffda7d4d 100644 --- a/apps/meteor/client/views/marketplace/AppsPage/AppsFilters.tsx +++ b/apps/meteor/client/views/marketplace/AppsPage/AppsFilters.tsx @@ -59,7 +59,7 @@ const AppsFilters = ({ const fixFiltersSize = breakpoints.includes('lg') ? { maxWidth: 'x200', minWidth: 'x200' } : null; return ( - + setText(text)}> {!isPrivateAppsPage && ( diff --git a/apps/meteor/client/views/marketplace/AppsPage/AppsPageConnectionError.tsx b/apps/meteor/client/views/marketplace/AppsPage/AppsPageConnectionError.tsx index d45585c4f9b2..1f3f27c7fedd 100644 --- a/apps/meteor/client/views/marketplace/AppsPage/AppsPageConnectionError.tsx +++ b/apps/meteor/client/views/marketplace/AppsPage/AppsPageConnectionError.tsx @@ -7,7 +7,7 @@ const AppsPageContentError = ({ onButtonClick }: { onButtonClick: () => void }): const t = useTranslation(); return ( - + {t('Connection_error')} diff --git a/apps/meteor/client/views/marketplace/AppsPage/AppsPageContentBody.tsx b/apps/meteor/client/views/marketplace/AppsPage/AppsPageContentBody.tsx index e70f6d8d093d..d5eb506b11a6 100644 --- a/apps/meteor/client/views/marketplace/AppsPage/AppsPageContentBody.tsx +++ b/apps/meteor/client/views/marketplace/AppsPage/AppsPageContentBody.tsx @@ -38,7 +38,7 @@ const AppsPageContentBody = ({ return ( <> - + {noErrorsOcurred && ( {isMarketplace && !isFiltered && } diff --git a/apps/meteor/client/views/marketplace/AppsPage/AppsPageContentSkeleton.tsx b/apps/meteor/client/views/marketplace/AppsPage/AppsPageContentSkeleton.tsx index d3e945b13b3b..36c831d7bc1e 100644 --- a/apps/meteor/client/views/marketplace/AppsPage/AppsPageContentSkeleton.tsx +++ b/apps/meteor/client/views/marketplace/AppsPage/AppsPageContentSkeleton.tsx @@ -3,18 +3,18 @@ import type { ReactElement } from 'react'; import React from 'react'; const AppsPageContentSkeleton = (): ReactElement => { - const loadingRows = Array.from({ length: 3 }, (_, i) => ); + const loadingRows = Array.from({ length: 3 }, (_, i) => ); return ( - - - + + + {loadingRows} - - + + {loadingRows} - + {loadingRows} ); diff --git a/apps/meteor/client/views/marketplace/AppsPage/NoInstalledAppMatchesEmptyState.tsx b/apps/meteor/client/views/marketplace/AppsPage/NoInstalledAppMatchesEmptyState.tsx index df83b5359ce1..9403a2443733 100644 --- a/apps/meteor/client/views/marketplace/AppsPage/NoInstalledAppMatchesEmptyState.tsx +++ b/apps/meteor/client/views/marketplace/AppsPage/NoInstalledAppMatchesEmptyState.tsx @@ -27,7 +27,7 @@ const NoInstalledAppMatchesEmptyState = ({ const t = useTranslation(); return ( - + {t('No_installed_app_matches')} diff --git a/apps/meteor/client/views/marketplace/AppsPage/NoInstalledAppsEmptyState.tsx b/apps/meteor/client/views/marketplace/AppsPage/NoInstalledAppsEmptyState.tsx index 2a135b956d89..a1bdeb90edce 100644 --- a/apps/meteor/client/views/marketplace/AppsPage/NoInstalledAppsEmptyState.tsx +++ b/apps/meteor/client/views/marketplace/AppsPage/NoInstalledAppsEmptyState.tsx @@ -7,7 +7,7 @@ const NoInstalledAppsEmptyState = ({ onButtonClick }: { onButtonClick: () => voi const t = useTranslation(); return ( - + {t('No_apps_installed')} diff --git a/apps/meteor/client/views/marketplace/AppsPage/NoMarketplaceOrInstalledAppMatchesEmptyState.tsx b/apps/meteor/client/views/marketplace/AppsPage/NoMarketplaceOrInstalledAppMatchesEmptyState.tsx index 0fff2814e129..0dc7e471aee4 100644 --- a/apps/meteor/client/views/marketplace/AppsPage/NoMarketplaceOrInstalledAppMatchesEmptyState.tsx +++ b/apps/meteor/client/views/marketplace/AppsPage/NoMarketplaceOrInstalledAppMatchesEmptyState.tsx @@ -22,7 +22,7 @@ const NoMarketplaceOrInstalledAppMatchesEmptyState = ({ const t = useTranslation(); return ( - + {t('No_app_matches')} diff --git a/apps/meteor/client/views/marketplace/components/BannerEnterpriseTrialEnded.tsx b/apps/meteor/client/views/marketplace/components/BannerEnterpriseTrialEnded.tsx index 6aa9665a9347..93c8114cba1a 100644 --- a/apps/meteor/client/views/marketplace/components/BannerEnterpriseTrialEnded.tsx +++ b/apps/meteor/client/views/marketplace/components/BannerEnterpriseTrialEnded.tsx @@ -23,7 +23,7 @@ const BannerEnterpriseTrialEnded = (): ReactElement => { {showTrialBanner && ( } + icon={} variant='warning' title={t('Apps_disabled_when_Enterprise_trial_ended')} onClose={() => setShowTrialBanner(false)} diff --git a/apps/meteor/client/views/marketplace/components/CategoryFilter/CategoryDropDownAnchor.tsx b/apps/meteor/client/views/marketplace/components/CategoryFilter/CategoryDropDownAnchor.tsx index 3b71eeef937f..91e66683e66f 100644 --- a/apps/meteor/client/views/marketplace/components/CategoryFilter/CategoryDropDownAnchor.tsx +++ b/apps/meteor/client/views/marketplace/components/CategoryFilter/CategoryDropDownAnchor.tsx @@ -31,13 +31,13 @@ const CategoryDropDownAnchor = forwardRef {selectedCategoriesCount > 0 && ( {selectedCategoriesCount > 0 ? t('Categories') : t('All_categories')} - - + + ); diff --git a/apps/meteor/client/views/marketplace/components/CategoryFilter/CategoryDropDownList.tsx b/apps/meteor/client/views/marketplace/components/CategoryFilter/CategoryDropDownList.tsx index eea6576102d7..68025b1a350a 100644 --- a/apps/meteor/client/views/marketplace/components/CategoryFilter/CategoryDropDownList.tsx +++ b/apps/meteor/client/views/marketplace/components/CategoryFilter/CategoryDropDownList.tsx @@ -6,11 +6,11 @@ import type { CategoryDropDownListProps } from '../../definitions/CategoryDropdo const CategoryDropDownList = ({ categories, onSelected }: CategoryDropDownListProps): ReactElement => { return ( - + {categories.map((category, index) => ( {category.label && ( - + {category.label} )} diff --git a/apps/meteor/client/views/marketplace/components/CategoryFilter/TagList.tsx b/apps/meteor/client/views/marketplace/components/CategoryFilter/TagList.tsx index 1e57d4cdefd6..e95dea0806b2 100644 --- a/apps/meteor/client/views/marketplace/components/CategoryFilter/TagList.tsx +++ b/apps/meteor/client/views/marketplace/components/CategoryFilter/TagList.tsx @@ -10,7 +10,7 @@ const TagList: FC<{ }> = ({ categories, onClick }) => ( {categories.map((category) => ( - onClick(category)} disabled={undefined} mbe='x8'> + onClick(category)} disabled={undefined} mbe={8}> {category.label} ))} diff --git a/apps/meteor/client/views/marketplace/components/RadioButtonList.tsx b/apps/meteor/client/views/marketplace/components/RadioButtonList.tsx index a8c117716ab7..a188b5a4bfc9 100644 --- a/apps/meteor/client/views/marketplace/components/RadioButtonList.tsx +++ b/apps/meteor/client/views/marketplace/components/RadioButtonList.tsx @@ -5,9 +5,9 @@ import React from 'react'; import type { RadioDropDownProps } from '../definitions/RadioDropDownDefinitions'; const RadioButtonList = ({ group, onSelected }: RadioDropDownProps): ReactElement => ( - + {group.label && ( - + {group.label} )} diff --git a/apps/meteor/client/views/marketplace/components/ScreenshotCarousel.tsx b/apps/meteor/client/views/marketplace/components/ScreenshotCarousel.tsx index b808e33c33c9..bbf803cad29f 100644 --- a/apps/meteor/client/views/marketplace/components/ScreenshotCarousel.tsx +++ b/apps/meteor/client/views/marketplace/components/ScreenshotCarousel.tsx @@ -80,7 +80,7 @@ const ScreenshotCarousel = ({ justifyContent='center' alignItems='center' zIndex='2' - mi='x38' + mi={38} > {handleScreenshotRender()} diff --git a/apps/meteor/client/views/marketplace/components/ScreenshotCarouselAnchor.tsx b/apps/meteor/client/views/marketplace/components/ScreenshotCarouselAnchor.tsx index 2400633212c4..a812aaddbc40 100644 --- a/apps/meteor/client/views/marketplace/components/ScreenshotCarouselAnchor.tsx +++ b/apps/meteor/client/views/marketplace/components/ScreenshotCarouselAnchor.tsx @@ -105,9 +105,9 @@ const ScreenshotCarouselAnchor = ({ screenshots }: ScreenshotCarouselAnchorProps ]} /> - - {' '} - + + {' '} + {currentPreviewIndex + 1} of {screenshots.length} diff --git a/apps/meteor/client/views/notAuthorized/NotAuthorizedPage.tsx b/apps/meteor/client/views/notAuthorized/NotAuthorizedPage.tsx index c4f38caacb5f..7273c8def80d 100644 --- a/apps/meteor/client/views/notAuthorized/NotAuthorizedPage.tsx +++ b/apps/meteor/client/views/notAuthorized/NotAuthorizedPage.tsx @@ -10,7 +10,7 @@ const NotAuthorizedPage = (): ReactElement => { return ( - + {t('You_are_not_authorized_to_view_this_page')} diff --git a/apps/meteor/client/views/omnichannel/agents/AgentEditWithData.tsx b/apps/meteor/client/views/omnichannel/agents/AgentEditWithData.tsx index e04f82b1109d..543d1d7bab93 100644 --- a/apps/meteor/client/views/omnichannel/agents/AgentEditWithData.tsx +++ b/apps/meteor/client/views/omnichannel/agents/AgentEditWithData.tsx @@ -38,7 +38,7 @@ const AgentEditWithData = ({ uid, reload }: AgentEditWithDataProps): ReactElemen } if (error || userDepartmentsError || availableDepartmentsError || !data || !data.user) { - return {t('User_not_found')}; + return {t('User_not_found')}; } return ; diff --git a/apps/meteor/client/views/omnichannel/agents/AgentInfo.tsx b/apps/meteor/client/views/omnichannel/agents/AgentInfo.tsx index c6697b380947..5daadd3e7c96 100644 --- a/apps/meteor/client/views/omnichannel/agents/AgentInfo.tsx +++ b/apps/meteor/client/views/omnichannel/agents/AgentInfo.tsx @@ -28,14 +28,14 @@ const AgentInfo = memo(function AgentInfo({ uid, children, ...pr } if (result.phase === AsyncStatePhase.REJECTED) { - return {t('User_not_found')}; + return {t('User_not_found')}; } const { user } = result.value; const { username, statusLivechat, status: userStatus } = user; return ( - + {username && ( @@ -46,8 +46,8 @@ const AgentInfo = memo(function AgentInfo({ uid, children, ...pr {children} - - + + } /> diff --git a/apps/meteor/client/views/omnichannel/agents/AgentInfoAction.tsx b/apps/meteor/client/views/omnichannel/agents/AgentInfoAction.tsx index 6618f120888c..67857dec9bd9 100644 --- a/apps/meteor/client/views/omnichannel/agents/AgentInfoAction.tsx +++ b/apps/meteor/client/views/omnichannel/agents/AgentInfoAction.tsx @@ -10,7 +10,7 @@ type AgentInfoActionProps = { } & Omit, 'is'>; const AgentInfoAction: FC = ({ icon, label, ...props }) => ( - ); diff --git a/apps/meteor/client/views/omnichannel/agents/AgentsTable/AddAgent.tsx b/apps/meteor/client/views/omnichannel/agents/AgentsTable/AddAgent.tsx index 0dd293b5f3fb..e030fe3d6305 100644 --- a/apps/meteor/client/views/omnichannel/agents/AgentsTable/AddAgent.tsx +++ b/apps/meteor/client/views/omnichannel/agents/AgentsTable/AddAgent.tsx @@ -41,7 +41,7 @@ const AddAgent = ({ reload }: AddAgentProps): ReactElement => { {t('Username')} - diff --git a/apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTableRow.tsx b/apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTableRow.tsx index f5b34077955b..cf0433666b9d 100644 --- a/apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTableRow.tsx +++ b/apps/meteor/client/views/omnichannel/agents/AgentsTable/AgentsTableRow.tsx @@ -31,7 +31,7 @@ const AgentsTableRow = ({ {username && } - + {name || username} @@ -50,7 +50,7 @@ const AgentsTableRow = ({ {username} - + )} {emails?.length && emails[0].address} diff --git a/apps/meteor/client/views/omnichannel/analytics/AnalyticsPage.tsx b/apps/meteor/client/views/omnichannel/analytics/AnalyticsPage.tsx index e118bb885b21..529d02d01348 100644 --- a/apps/meteor/client/views/omnichannel/analytics/AnalyticsPage.tsx +++ b/apps/meteor/client/views/omnichannel/analytics/AnalyticsPage.tsx @@ -54,25 +54,25 @@ const AnalyticsPage = () => { - + - - + + - - + + - - + + @@ -140,16 +140,16 @@ const FilterByText: FilterByTextType = ({ setFilter, reload, customFields, setCu hasCustomFields={hasCustomFields} /> - - - + + + {EETagsComponent && ( - - - + + + diff --git a/apps/meteor/client/views/omnichannel/currentChats/RemoveAllClosed.tsx b/apps/meteor/client/views/omnichannel/currentChats/RemoveAllClosed.tsx index 0d4c0cf11768..8389503359cb 100644 --- a/apps/meteor/client/views/omnichannel/currentChats/RemoveAllClosed.tsx +++ b/apps/meteor/client/views/omnichannel/currentChats/RemoveAllClosed.tsx @@ -17,7 +17,7 @@ const RemoveAllClosed: FC<{ clearFilters: { label: ( - + {t('Clear_filters')} ), @@ -27,7 +27,7 @@ const RemoveAllClosed: FC<{ removeClosed: { label: ( - + {t('Delete_all_closed_chats')} ), @@ -39,7 +39,7 @@ const RemoveAllClosed: FC<{ customFields: { label: ( - + {t('Custom_Fields')} ), diff --git a/apps/meteor/client/views/omnichannel/customFields/CustomFieldsForm.stories.tsx b/apps/meteor/client/views/omnichannel/customFields/CustomFieldsForm.stories.tsx index 55bd3ee4e255..d7dabfe388a8 100644 --- a/apps/meteor/client/views/omnichannel/customFields/CustomFieldsForm.stories.tsx +++ b/apps/meteor/client/views/omnichannel/customFields/CustomFieldsForm.stories.tsx @@ -10,7 +10,7 @@ export default { component: NewCustomFieldsForm, decorators: [ (fn) => ( - + {fn()} ), diff --git a/apps/meteor/client/views/omnichannel/departments/DepartmentAgentsTable/AddAgent.tsx b/apps/meteor/client/views/omnichannel/departments/DepartmentAgentsTable/AddAgent.tsx index 0186e1438dfd..4b997a56322b 100644 --- a/apps/meteor/client/views/omnichannel/departments/DepartmentAgentsTable/AddAgent.tsx +++ b/apps/meteor/client/views/omnichannel/departments/DepartmentAgentsTable/AddAgent.tsx @@ -38,7 +38,7 @@ function AddAgent({ agentList, onAdd }: { agentList: IDepartmentAgent[]; onAdd: return ( - diff --git a/apps/meteor/client/views/omnichannel/departments/DepartmentAgentsTable/AgentAvatar.tsx b/apps/meteor/client/views/omnichannel/departments/DepartmentAgentsTable/AgentAvatar.tsx index 2893711b9a13..168b7c007ced 100644 --- a/apps/meteor/client/views/omnichannel/departments/DepartmentAgentsTable/AgentAvatar.tsx +++ b/apps/meteor/client/views/omnichannel/departments/DepartmentAgentsTable/AgentAvatar.tsx @@ -10,7 +10,7 @@ const AgentAvatar = ({ name, username, eTag }: { name: string; username: string; return ( - + {name || username} diff --git a/apps/meteor/client/views/omnichannel/departments/DepartmentTags/index.tsx b/apps/meteor/client/views/omnichannel/departments/DepartmentTags/index.tsx index 0607645e1696..b1542f857316 100644 --- a/apps/meteor/client/views/omnichannel/departments/DepartmentTags/index.tsx +++ b/apps/meteor/client/views/omnichannel/departments/DepartmentTags/index.tsx @@ -39,7 +39,7 @@ export const DepartmentTags = ({ error, value: tags, onChange }: DepartmentTagsP diff --git a/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx b/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx index 64f28a4aa23a..6659386df72b 100644 --- a/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx +++ b/apps/meteor/client/views/omnichannel/managers/ManagersTable.tsx @@ -96,7 +96,7 @@ const ManagersTable = () => { - + {user.name || user.username} @@ -109,7 +109,7 @@ const ManagersTable = () => { {user.username} - + {user.emails?.length && user.emails[0].address} diff --git a/apps/meteor/client/views/omnichannel/queueList/QueueListFilter.tsx b/apps/meteor/client/views/omnichannel/queueList/QueueListFilter.tsx index 3efb38e698a6..3eff9b25a910 100644 --- a/apps/meteor/client/views/omnichannel/queueList/QueueListFilter.tsx +++ b/apps/meteor/client/views/omnichannel/queueList/QueueListFilter.tsx @@ -47,18 +47,18 @@ export const QueueListFilter: QueueListFilterPropsType = ({ setFilter, ...props }, [setFilter, servedBy, status, department]); return ( - + - - + + - - + + setReloadFrequency(val))} value={reloadFrequency} /> @@ -91,15 +91,15 @@ const RealTimeMonitoringPage = () => { - - + + - - + + diff --git a/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterItem.tsx b/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterItem.tsx index d1495f8c241f..b625cb8aa6b5 100644 --- a/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterItem.tsx +++ b/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterItem.tsx @@ -9,11 +9,11 @@ const CounterItem = ({ title: string | JSX.Element; count: string; flexShrink?: number; - pb?: string; + pb?: number; flexBasis?: string; }) => ( - + {title} {count} diff --git a/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterRow.js b/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterRow.js index 64a9f67cffd2..74235933caee 100644 --- a/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterRow.js +++ b/apps/meteor/client/views/omnichannel/realTimeMonitoring/counter/CounterRow.js @@ -3,7 +3,7 @@ import React, { Fragment } from 'react'; import flattenChildren from 'react-keyed-flatten-children'; const CounterRow = ({ children, ...props }) => ( - + {children && flattenChildren(children).reduce((acc, child, i) => { acc = diff --git a/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventItem.tsx b/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventItem.tsx index f39ef14bf3f3..c69ce7c43530 100644 --- a/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventItem.tsx +++ b/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventItem.tsx @@ -43,8 +43,8 @@ const OutlookEventItem = ({ subject, description, startTime, meetingUrl }: Seria borderBlockEndWidth={1} borderBlockEndColor='stroke-extra-light' borderBlockEndStyle='solid' - pi='x24' - pb='x16' + pi={24} + pb={16} display='flex' justifyContent='space-between' onClick={handleOpenEvent} diff --git a/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventsList.tsx b/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventsList.tsx index b5d11dfd7155..13728fd9d1f6 100644 --- a/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventsList.tsx +++ b/apps/meteor/client/views/outlookCalendar/OutlookEventsList/OutlookEventsList.tsx @@ -67,7 +67,7 @@ const OutlookEventsList = ({ onClose, changeRoute }: OutlookEventsListProps): Re - + @@ -122,7 +122,7 @@ const OutlookEventsList = ({ onClose, changeRoute }: OutlookEventsListProps): Re )} {hasOutlookMethods && ( - + diff --git a/apps/meteor/client/views/outlookCalendar/OutlookSettingsList/OutlookSettingItem.tsx b/apps/meteor/client/views/outlookCalendar/OutlookSettingsList/OutlookSettingItem.tsx index f2b01622c5df..791841ed3ab5 100644 --- a/apps/meteor/client/views/outlookCalendar/OutlookSettingsList/OutlookSettingItem.tsx +++ b/apps/meteor/client/views/outlookCalendar/OutlookSettingsList/OutlookSettingItem.tsx @@ -30,12 +30,12 @@ const OutlookSettingItem = ({ id, title, subTitle, enabled, handleEnable }: Outl borderBlockEndColor='stroke-extra-light' borderBlockEndStyle='solid' className={hovered} - pi='x24' - pb='x16' + pi={24} + pb={16} display='flex' justifyContent='space-between' > - + {title} {subTitle} diff --git a/apps/meteor/client/views/room/Announcement/AnnouncementComponent.tsx b/apps/meteor/client/views/room/Announcement/AnnouncementComponent.tsx index 6620ed38ea79..88b8b0697b92 100644 --- a/apps/meteor/client/views/room/Announcement/AnnouncementComponent.tsx +++ b/apps/meteor/client/views/room/Announcement/AnnouncementComponent.tsx @@ -30,7 +30,7 @@ const AnnouncementComponent: FC = ({ children, onCl ( <> - + diff --git a/apps/meteor/client/views/room/UserCard/UserCardWithData.tsx b/apps/meteor/client/views/room/UserCard/UserCardWithData.tsx index cf43ff90d163..9dc8edd0f377 100644 --- a/apps/meteor/client/views/room/UserCard/UserCardWithData.tsx +++ b/apps/meteor/client/views/room/UserCard/UserCardWithData.tsx @@ -76,7 +76,7 @@ const UserCardWithData = ({ username, target, rid, open, onClose }: UserCardWith