diff --git a/apps/meteor/client/components/ABAC/ABACHeaderTag.spec.tsx b/apps/meteor/client/components/ABAC/ABACHeaderTag.spec.tsx deleted file mode 100644 index 212d8ce02341e..0000000000000 --- a/apps/meteor/client/components/ABAC/ABACHeaderTag.spec.tsx +++ /dev/null @@ -1,62 +0,0 @@ -import type { IRoom } from '@rocket.chat/apps-engine/definition/rooms'; -import { mockAppRoot } from '@rocket.chat/mock-providers'; -import { render, screen } from '@testing-library/react'; -import { axe } from 'jest-axe'; - -import ABACHeaderTag from './ABACHeaderTag'; - -const appRoot = mockAppRoot() - .withTranslations('en', 'core', { - ABAC_header_tag_title: 'Only compliant users have access to attribute-based access controlled rooms.', - ABAC_header_tag: 'ABAC', - }) - .build(); - -const createMockRoom = (overrides: Partial = {}) => ({ - _id: 'room-id', - t: 'c' as const, - name: 'test-room', - msgs: 0, - u: { _id: 'user-id', username: 'testuser' }, - usersCount: 1, - _updatedAt: new Date(), - ...overrides, -}); - -describe('ABACHeaderTag', () => { - it('should render the ABAC tag when room has ABAC attributes', () => { - const room = createMockRoom({ - // @ts-expect-error to be implemented - abacAttributes: { someAttribute: 'value' }, - }); - - const { baseElement } = render(, { wrapper: appRoot }); - expect(baseElement).toMatchSnapshot(); - }); - - it('should not render when room has no ABAC attributes', () => { - const room = createMockRoom(); - - render(, { wrapper: appRoot }); - expect(screen.queryByText('ABAC')).not.toBeInTheDocument(); - }); - - it('should have no accessibility violations when rendered', async () => { - const room = createMockRoom({ - // @ts-expect-error to be implemented - abacAttributes: { someAttribute: 'value' }, - }); - - const { container } = render(, { wrapper: appRoot }); - const results = await axe(container); - expect(results).toHaveNoViolations(); - }); - - it('should have no accessibility violations when not rendered', async () => { - const room = createMockRoom(); - - const { container } = render(, { wrapper: appRoot }); - const results = await axe(container); - expect(results).toHaveNoViolations(); - }); -}); diff --git a/apps/meteor/client/components/ABAC/ABACHeaderTag.tsx b/apps/meteor/client/components/ABAC/ABACHeaderTag.tsx deleted file mode 100644 index b24538bf98736..0000000000000 --- a/apps/meteor/client/components/ABAC/ABACHeaderTag.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import type { IRoom } from '@rocket.chat/core-typings'; -import { Box, Palette } from '@rocket.chat/fuselage'; -import { useTranslation } from 'react-i18next'; - -import { HeaderTag } from '../Header'; - -type ABACHeaderTagProps = { - room: IRoom; -}; - -const ABACHeaderTag = ({ room }: ABACHeaderTagProps) => { - const { t } = useTranslation(); - - // @ts-expect-error to be implemented - if (!room.abacAttributes) { - return null; - } - - return ( - - - {t('ABAC_header_tag')} - - - ); -}; - -export default ABACHeaderTag; diff --git a/apps/meteor/client/components/ABAC/__snapshots__/ABACHeaderTag.spec.tsx.snap b/apps/meteor/client/components/ABAC/__snapshots__/ABACHeaderTag.spec.tsx.snap deleted file mode 100644 index 20ce983ee9efd..0000000000000 --- a/apps/meteor/client/components/ABAC/__snapshots__/ABACHeaderTag.spec.tsx.snap +++ /dev/null @@ -1,26 +0,0 @@ -// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing - -exports[`ABACHeaderTag should render the ABAC tag when room has ABAC attributes 1`] = ` - -
-
- - -
- ABAC -
-
-
-
-
- -`; diff --git a/apps/meteor/client/hooks/useRoomIcon.spec.tsx b/apps/meteor/client/hooks/useRoomIcon.spec.tsx new file mode 100644 index 0000000000000..785ded7d19215 --- /dev/null +++ b/apps/meteor/client/hooks/useRoomIcon.spec.tsx @@ -0,0 +1,83 @@ +import { useRoomIcon } from './useRoomIcon'; +import { createFakeRoom } from '../../tests/mocks/data'; + +const mockRooms = { + public: createFakeRoom({ + t: 'c', + name: 'public', + teamMain: false, + // @ts-expect-error TODO: Implement ABAC attributes in rooms + abacAttributes: false, + }), + private: createFakeRoom({ + t: 'p', + name: 'private', + teamMain: false, + // @ts-expect-error TODO: Implement ABAC attributes in rooms + abacAttributes: false, + }), + team: createFakeRoom({ + t: 'c', + name: 'team', + teamMain: true, + // @ts-expect-error TODO: Implement ABAC attributes in rooms + abacAttributes: false, + }), + direct: createFakeRoom({ + t: 'd', + name: 'direct', + teamMain: false, + // @ts-expect-error TODO: Implement ABAC attributes in rooms + abacAttributes: false, + }), + directMultiple: createFakeRoom({ + t: 'd', + name: 'direct-multiple', + teamMain: false, + // @ts-expect-error TODO: Implement ABAC attributes in rooms + abacAttributes: false, + uids: ['user1', 'user2', 'user3'], + }), + federated: createFakeRoom({ + t: 'c', + name: 'federated', + teamMain: false, + // @ts-expect-error TODO: Implement ABAC attributes in rooms + abacAttributes: false, + federated: true, + }), + abacRoom: createFakeRoom({ + t: 'c', + name: 'abac-room', + teamMain: false, + // @ts-expect-error TODO: Implement ABAC attributes in rooms + abacAttributes: true, + }), + abacTeamRoom: createFakeRoom({ + t: 'c', + name: 'abac-team-room', + teamMain: true, + // @ts-expect-error TODO: Implement ABAC attributes in rooms + abacAttributes: true, + }), +}; + +const expectedResults = { + public: { name: 'hash' }, + private: { name: 'hashtag-lock' }, + team: { name: 'team' }, + federated: { name: 'globe' }, + abacRoom: { name: 'hash-shield' }, + abacTeamRoom: { name: 'team-shield' }, + direct: { name: 'at' }, + directMultiple: { name: 'balloon' }, +}; + +describe('useRoomIcon', () => { + it('should return the correct icon for each room', () => { + Object.entries(mockRooms).forEach(([key, room]) => { + const result = useRoomIcon(room); + expect(result).toEqual(expectedResults[key as keyof typeof expectedResults]); + }); + }); +}); diff --git a/apps/meteor/client/hooks/useRoomIcon.tsx b/apps/meteor/client/hooks/useRoomIcon.tsx index cf3b18e88b3d8..54a9b7982e147 100644 --- a/apps/meteor/client/hooks/useRoomIcon.tsx +++ b/apps/meteor/client/hooks/useRoomIcon.tsx @@ -8,6 +8,14 @@ import { ReactiveUserStatus } from '../components/UserStatus'; export const useRoomIcon = ( room: Pick, ): ComponentProps | ReactElement | null => { + // @ts-expect-error TODO: Implement ABAC attributes in rooms + if (room.abacAttributes) { + if (room.teamMain) { + return { name: 'team-shield' }; + } + return { name: 'hash-shield' }; + } + if (isRoomFederated(room)) { return { name: 'globe' }; } diff --git a/apps/meteor/client/lib/rooms/roomTypes/private.ts b/apps/meteor/client/lib/rooms/roomTypes/private.ts index 0121e2ea2bd3d..2948c48abfb6f 100644 --- a/apps/meteor/client/lib/rooms/roomTypes/private.ts +++ b/apps/meteor/client/lib/rooms/roomTypes/private.ts @@ -82,6 +82,14 @@ roomCoordinator.add( }, getIcon(room) { + // @ts-expect-error TODO: Implement ABAC attributes in rooms + if (room.abacAttributes) { + if (room.teamMain) { + return 'team-shield'; + } + return 'hash-shield'; + } + if (room.prid) { return 'discussion'; } diff --git a/apps/meteor/client/views/room/Header/RoomHeader.tsx b/apps/meteor/client/views/room/Header/RoomHeader.tsx index 2ea3dcd30b09a..931aeaac92a41 100644 --- a/apps/meteor/client/views/room/Header/RoomHeader.tsx +++ b/apps/meteor/client/views/room/Header/RoomHeader.tsx @@ -13,7 +13,6 @@ import RoomToolbox from './RoomToolbox'; import Encrypted from './icons/Encrypted'; import Favorite from './icons/Favorite'; import Translate from './icons/Translate'; -import ABACHeaderTag from '../../../components/ABAC/ABACHeaderTag'; import { Header, HeaderAvatar, HeaderContent, HeaderContentRow, HeaderSubtitle, HeaderToolbar } from '../../../components/Header'; import MarkdownText from '../../../components/MarkdownText'; @@ -51,7 +50,6 @@ const RoomHeader = ({ room, topic = '', slots = {}, roomToolbox }: RoomHeaderPro {room.prid && } {room.teamId && !room.teamMain && } - {isRoomFederated(room) && } diff --git a/apps/meteor/client/views/room/HeaderV2/RoomHeader.tsx b/apps/meteor/client/views/room/HeaderV2/RoomHeader.tsx index 3bd6b828eb6c4..3fd1677675216 100644 --- a/apps/meteor/client/views/room/HeaderV2/RoomHeader.tsx +++ b/apps/meteor/client/views/room/HeaderV2/RoomHeader.tsx @@ -12,7 +12,6 @@ import RoomTopic from './RoomTopic'; import Encrypted from './icons/Encrypted'; import Favorite from './icons/Favorite'; import Translate from './icons/Translate'; -import ABACHeaderTag from '../../../components/ABAC/ABACHeaderTag'; import { Header, HeaderContent, HeaderContentRow, HeaderToolbar } from '../../../components/Header'; export type RoomHeaderProps = { @@ -44,7 +43,6 @@ const RoomHeader = ({ room, slots = {}, roomToolbox }: RoomHeaderProps) => { - {isRoomFederated(room) && } diff --git a/apps/meteor/package.json b/apps/meteor/package.json index 3551af17be07f..1717e51ebaa99 100644 --- a/apps/meteor/package.json +++ b/apps/meteor/package.json @@ -264,7 +264,7 @@ "@rocket.chat/gazzodown": "workspace:^", "@rocket.chat/http-router": "workspace:^", "@rocket.chat/i18n": "workspace:^", - "@rocket.chat/icons": "~0.44.0", + "@rocket.chat/icons": "~0.45.0", "@rocket.chat/instance-status": "workspace:^", "@rocket.chat/jwt": "workspace:^", "@rocket.chat/layout": "^0.33.1", diff --git a/packages/i18n/src/locales/en.i18n.json b/packages/i18n/src/locales/en.i18n.json index 77e7920027f7b..31cb799e22568 100644 --- a/packages/i18n/src/locales/en.i18n.json +++ b/packages/i18n/src/locales/en.i18n.json @@ -77,8 +77,6 @@ "A_new_owner_will_be_assigned_automatically_to_those__count__rooms__rooms__": "A new owner will be assigned automatically to those {{count}} rooms:
{{rooms}}.", "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "A secure and highly private self-managed solution for conference calls.", "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "A workspace admin needs to install and configure a conference call app.", - "ABAC_header_tag_title": "Only compliant users have access to attribute-based access controlled rooms.", - "ABAC_header_tag": "ABAC", "Accept": "Accept", "Accept_Call": "Accept Call", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Accept incoming omnichannel requests even if there are no online agents", diff --git a/packages/i18n/src/locales/nb.i18n.json b/packages/i18n/src/locales/nb.i18n.json index fb63a0462f2c0..542c6c291694c 100644 --- a/packages/i18n/src/locales/nb.i18n.json +++ b/packages/i18n/src/locales/nb.i18n.json @@ -77,8 +77,6 @@ "A_new_owner_will_be_assigned_automatically_to_those__count__rooms__rooms__": "En ny eier vil automatisk bli tildelt disse {{count}}-rommene:
{{rooms}}.", "A_secure_and_highly_private_self-managed_solution_for_conference_calls": "En sikker og privat selvstyrt løsning for konferansesamtaler.", "A_workspace_admin_needs_to_install_and_configure_a_conference_call_app": "En arbeidsområdeadministrator må installere og konfigurere en konferansesamtale-app.", - "ABAC_header_tag_title": "Bare brukere som overholder kravene, har tilgang til attributtbaserte rom med tilgangskontroll.", - "ABAC_header_tag": "ABAC", "Accept": "Aksepter", "Accept_Call": "Godta anrop", "Accept_incoming_livechat_requests_even_if_there_are_no_online_agents": "Aksepter innkommende livechat selv om det ikke er noen online", diff --git a/yarn.lock b/yarn.lock index fd8165a381283..18103f4f87566 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8716,6 +8716,13 @@ __metadata: languageName: node linkType: hard +"@rocket.chat/icons@npm:~0.45.0": + version: 0.45.0 + resolution: "@rocket.chat/icons@npm:0.45.0" + checksum: 10/9e0967eba17cbef1c482616bb94cf871dfac20e92ac5fad6164cbe60bab95882d9675bf9de2c611928da6d37806a1279d671b0a3463dda0a3148cdade9291147 + languageName: node + linkType: hard + "@rocket.chat/instance-status@workspace:^, @rocket.chat/instance-status@workspace:packages/instance-status": version: 0.0.0-use.local resolution: "@rocket.chat/instance-status@workspace:packages/instance-status" @@ -9083,7 +9090,7 @@ __metadata: "@rocket.chat/gazzodown": "workspace:^" "@rocket.chat/http-router": "workspace:^" "@rocket.chat/i18n": "workspace:^" - "@rocket.chat/icons": "npm:~0.44.0" + "@rocket.chat/icons": "npm:~0.45.0" "@rocket.chat/instance-status": "workspace:^" "@rocket.chat/jest-presets": "workspace:~" "@rocket.chat/jwt": "workspace:^"