diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributeMenu.tsx b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributeMenu.tsx similarity index 51% rename from apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributeMenu.tsx rename to apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributeMenu.tsx index e522647ca1cc6..84376fa860858 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributeMenu.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributeMenu.tsx @@ -1,16 +1,16 @@ import { GenericMenu } from '@rocket.chat/ui-client'; import { useTranslation } from 'react-i18next'; -import { useRoomAttributeItems } from './useRoomAttributeOptions'; +import { useAttributeOptions } from '../hooks/useAttributeOptions'; -type AdminABACRoomAttributeMenuProps = { +type AttributeMenuProps = { attribute: { _id: string; key: string }; }; -const AdminABACRoomAttributeMenu = ({ attribute }: AdminABACRoomAttributeMenuProps) => { +const AttributeMenu = ({ attribute }: AttributeMenuProps) => { const { t } = useTranslation(); - const items = useRoomAttributeItems(attribute); + const items = useAttributeOptions(attribute); return ( void; }; -const RoomAttributesContextualBar = ({ attributeData, onClose }: RoomAttributesContextualBarProps) => { +const AttributesContextualBar = ({ attributeData, onClose }: AttributesContextualBarProps) => { const { t } = useTranslation(); const queryClient = useQueryClient(); @@ -52,7 +52,7 @@ const RoomAttributesContextualBar = ({ attributeData, onClose }: RoomAttributesC const dispatchToastMessage = useToastMessageDispatch(); const saveMutation = useMutation({ - mutationFn: async (data: AdminABACRoomAttributesFormFormData) => { + mutationFn: async (data: AttributesFormFormData) => { const payload = { key: data.name, values: [...data.lockedAttributes.map((attribute) => attribute.value), ...data.attributeValues.map((attribute) => attribute.value)], @@ -86,7 +86,7 @@ const RoomAttributesContextualBar = ({ attributeData, onClose }: RoomAttributesC - saveMutation.mutateAsync(values)} onCancel={onClose} description={t(attributeId ? 'ABAC_Edit_attribute_description' : 'ABAC_New_attribute_description')} @@ -96,4 +96,4 @@ const RoomAttributesContextualBar = ({ attributeData, onClose }: RoomAttributesC ); }; -export default RoomAttributesContextualBar; +export default AttributesContextualBar; diff --git a/apps/meteor/client/views/admin/ABAC/RoomAttributesContextualBarWithData.tsx b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesContextualBarWithData.tsx similarity index 56% rename from apps/meteor/client/views/admin/ABAC/RoomAttributesContextualBarWithData.tsx rename to apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesContextualBarWithData.tsx index 5513e0819a4e0..1efb5599bb86e 100644 --- a/apps/meteor/client/views/admin/ABAC/RoomAttributesContextualBarWithData.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesContextualBarWithData.tsx @@ -2,15 +2,15 @@ import { ContextualbarSkeletonBody } from '@rocket.chat/ui-client'; import { useEndpoint } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; -import RoomAttributesContextualBar from './RoomAttributesContextualBar'; -import { ABACQueryKeys } from '../../../lib/queryKeys'; +import AttributesContextualBar from './AttributesContextualBar'; +import { ABACQueryKeys } from '../../../../lib/queryKeys'; -type RoomAttributesContextualBarWithDataProps = { +type AttributesContextualBarWithDataProps = { id: string; onClose: () => void; }; -const RoomAttributesContextualBarWithData = ({ id, onClose }: RoomAttributesContextualBarWithDataProps) => { +const AttributesContextualBarWithData = ({ id, onClose }: AttributesContextualBarWithDataProps) => { const getAttributes = useEndpoint('GET', '/v1/abac/attributes/:_id', { _id: id }); const { data, isLoading, isFetching } = useQuery({ queryKey: ABACQueryKeys.roomAttributes.attribute(id), @@ -22,7 +22,7 @@ const RoomAttributesContextualBarWithData = ({ id, onClose }: RoomAttributesCont return ; } - return ; + return ; }; -export default RoomAttributesContextualBarWithData; +export default AttributesContextualBarWithData; diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributesForm.spec.tsx b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.spec.tsx similarity index 87% rename from apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributesForm.spec.tsx rename to apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.spec.tsx index bfde0331c6bae..cb7ef05ad0eac 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributesForm.spec.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.spec.tsx @@ -7,8 +7,8 @@ import { axe } from 'jest-axe'; import type { ReactNode } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; -import AdminABACRoomAttributesForm, { type AdminABACRoomAttributesFormFormData } from './AdminABACRoomAttributesForm'; -import * as stories from './AdminABACRoomAttributesForm.stories'; +import AttributesForm, { type AttributesFormFormData } from './AttributesForm'; +import * as stories from './AttributesForm.stories'; const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]); @@ -23,14 +23,8 @@ const appRoot = mockAppRoot() }) .build(); -const FormProviderWrapper = ({ - children, - defaultValues, -}: { - children: ReactNode; - defaultValues?: Partial; -}) => { - const methods = useForm({ +const FormProviderWrapper = ({ children, defaultValues }: { children: ReactNode; defaultValues?: Partial }) => { + const methods = useForm({ defaultValues: { name: '', attributeValues: [{ value: '' }], @@ -43,7 +37,7 @@ const FormProviderWrapper = ({ return {children}; }; -describe('AdminABACRoomAttributesForm', () => { +describe('AttributesForm', () => { const defaultProps = { onSave: jest.fn(), onCancel: jest.fn(), @@ -70,7 +64,7 @@ describe('AdminABACRoomAttributesForm', () => { it('should show validation errors for required fields', async () => { render( - + , { wrapper: appRoot }, ); @@ -86,7 +80,7 @@ describe('AdminABACRoomAttributesForm', () => { it('should show validation error for empty attribute values', async () => { render( - + , { wrapper: appRoot }, ); @@ -110,7 +104,7 @@ describe('AdminABACRoomAttributesForm', () => { render( - + , { wrapper: appRoot }, ); @@ -130,7 +124,7 @@ describe('AdminABACRoomAttributesForm', () => { render( - + , { wrapper: appRoot }, ); @@ -153,7 +147,7 @@ describe('AdminABACRoomAttributesForm', () => { render( - + , { wrapper: appRoot }, ); @@ -172,7 +166,7 @@ describe('AdminABACRoomAttributesForm', () => { it('should disable Add Value button when there are empty values', async () => { render( - + , { wrapper: appRoot }, ); @@ -189,7 +183,7 @@ describe('AdminABACRoomAttributesForm', () => { render( - + , { wrapper: appRoot }, ); @@ -206,7 +200,7 @@ describe('AdminABACRoomAttributesForm', () => { render( - + , { wrapper: appRoot }, ); @@ -225,7 +219,7 @@ describe('AdminABACRoomAttributesForm', () => { it('should call onCancel when Cancel button is clicked', async () => { render( - + , { wrapper: appRoot }, ); @@ -245,7 +239,7 @@ describe('AdminABACRoomAttributesForm', () => { render( - + , { wrapper: appRoot }, ); diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributesForm.stories.tsx b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.stories.tsx similarity index 77% rename from apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributesForm.stories.tsx rename to apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.stories.tsx index 4750204f1678a..2b34b06af71e2 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributesForm.stories.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.stories.tsx @@ -3,10 +3,10 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import type { Meta, StoryFn } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import AdminABACRoomAttributesForm, { type AdminABACRoomAttributesFormFormData } from './AdminABACRoomAttributesForm'; +import AttributesForm, { type AttributesFormFormData } from './AttributesForm'; export default { - component: AdminABACRoomAttributesForm, + component: AttributesForm, parameters: { layout: 'padded', }, @@ -25,15 +25,15 @@ export default { }) .buildStoryDecorator(), ], -} satisfies Meta; +} satisfies Meta; -const Template: StoryFn = (args) => ; +const Template: StoryFn = (args) => ; export const NewAttribute = Template.bind({}); NewAttribute.decorators = [ (fn) => { - const methods = useForm({ + const methods = useForm({ defaultValues: { name: '', attributeValues: [{ value: '' }], @@ -60,7 +60,7 @@ WithLockedAttributes.args = { WithLockedAttributes.decorators = [ (fn) => { - const methods = useForm({ + const methods = useForm({ defaultValues: { name: 'Room Type', lockedAttributes: [{ value: 'Locked Value 1' }, { value: 'Locked Value 2' }, { value: 'Locked Value 3' }], diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributesForm.tsx b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.tsx similarity index 91% rename from apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributesForm.tsx rename to apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.tsx index 5c043a8cda341..33e5a9eedad28 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributesForm.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesForm.tsx @@ -15,25 +15,25 @@ import { useCallback, useId, useMemo } from 'react'; import { useFieldArray, useFormContext } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; -export type AdminABACRoomAttributesFormFormData = { +export type AttributesFormFormData = { name: string; attributeValues: { value: string }[]; lockedAttributes: { value: string }[]; }; -type AdminABACRoomAttributesFormProps = { - onSave: (data: AdminABACRoomAttributesFormFormData) => void; +type AttributesFormProps = { + onSave: (data: AttributesFormFormData) => void; onCancel: () => void; description: string; }; -const AdminABACRoomAttributesForm = ({ onSave, onCancel, description }: AdminABACRoomAttributesFormProps) => { +const AttributesForm = ({ onSave, onCancel, description }: AttributesFormProps) => { const { handleSubmit, register, formState: { errors }, watch, - } = useFormContext(); + } = useFormContext(); const { fields: lockedAttributesFields, remove: removeLockedAttribute } = useFieldArray({ name: 'lockedAttributes', @@ -138,4 +138,4 @@ const AdminABACRoomAttributesForm = ({ onSave, onCancel, description }: AdminABA ); }; -export default AdminABACRoomAttributesForm; +export default AttributesForm; diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributes.tsx b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesPage.tsx similarity index 85% rename from apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributes.tsx rename to apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesPage.tsx index 96c68cd0afcfe..24e3967fbb42e 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACRoomAttributes.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/AttributesPage.tsx @@ -5,9 +5,8 @@ import { useQuery } from '@tanstack/react-query'; import { useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import AdminABACRoomAttributeMenu from './AdminABACRoomAttributeMenu'; -import { useIsABACAvailable } from './hooks/useIsABACAvailable'; -import GenericNoResults from '../../../components/GenericNoResults'; +import AttributeMenu from './AttributeMenu'; +import GenericNoResults from '../../../../components/GenericNoResults'; import { GenericTable, GenericTableBody, @@ -15,11 +14,12 @@ import { GenericTableHeader, GenericTableHeaderCell, GenericTableRow, -} from '../../../components/GenericTable'; -import { usePagination } from '../../../components/GenericTable/hooks/usePagination'; -import { ABACQueryKeys } from '../../../lib/queryKeys'; +} from '../../../../components/GenericTable'; +import { usePagination } from '../../../../components/GenericTable/hooks/usePagination'; +import { ABACQueryKeys } from '../../../../lib/queryKeys'; +import { useIsABACAvailable } from '../hooks/useIsABACAvailable'; -const AdminABACRoomAttributes = () => { +const AttributesPage = () => { const { t } = useTranslation(); const [text, setText] = useState(''); @@ -86,7 +86,7 @@ const AdminABACRoomAttributes = () => { {attribute.key} {attribute.values.join(', ')} - + ))} @@ -107,4 +107,4 @@ const AdminABACRoomAttributes = () => { ); }; -export default AdminABACRoomAttributes; +export default AttributesPage; diff --git a/apps/meteor/client/views/admin/ABAC/__snapshots__/AdminABACRoomAttributesForm.spec.tsx.snap b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/__snapshots__/AttributesForm.spec.tsx.snap similarity index 98% rename from apps/meteor/client/views/admin/ABAC/__snapshots__/AdminABACRoomAttributesForm.spec.tsx.snap rename to apps/meteor/client/views/admin/ABAC/ABACAttributesTab/__snapshots__/AttributesForm.spec.tsx.snap index 83c3c4434d048..ef0ce316ebcae 100644 --- a/apps/meteor/client/views/admin/ABAC/__snapshots__/AdminABACRoomAttributesForm.spec.tsx.snap +++ b/apps/meteor/client/views/admin/ABAC/ABACAttributesTab/__snapshots__/AttributesForm.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing -exports[`AdminABACRoomAttributesForm renders NewAttribute without crashing 1`] = ` +exports[`AttributesForm renders NewAttribute without crashing 1`] = `
`; -exports[`AdminABACRoomAttributesForm renders WithLockedAttributes without crashing 1`] = ` +exports[`AttributesForm renders WithLockedAttributes without crashing 1`] = `
{ +const LogsPage = () => { const { t } = useTranslation(); const [startDate, setStartDate] = useState(new Date().toISOString().split('T')[0]); @@ -177,4 +177,4 @@ const AdminABACLogs = () => { ); }; -export default AdminABACLogs; +export default LogsPage; diff --git a/apps/meteor/client/views/admin/ABAC/ABACDeleteRoomModal.spec.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/DeleteRoomModal.spec.tsx similarity index 84% rename from apps/meteor/client/views/admin/ABAC/ABACDeleteRoomModal.spec.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/DeleteRoomModal.spec.tsx index 518031b8fb2d7..9ff834dcc634c 100644 --- a/apps/meteor/client/views/admin/ABAC/ABACDeleteRoomModal.spec.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/DeleteRoomModal.spec.tsx @@ -3,7 +3,7 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import ABACDeleteRoomModal from './ABACDeleteRoomModal'; +import DeleteRoomModal from './DeleteRoomModal'; const mockDispatchToastMessage = jest.fn(); @@ -22,7 +22,7 @@ const baseAppRoot = mockAppRoot().withTranslations('en', 'core', { Cancel: 'Cancel', }); -describe('ABACDeleteRoomModal', () => { +describe('DeleteRoomModal', () => { beforeEach(() => { jest.clearAllMocks(); }); @@ -31,7 +31,7 @@ describe('ABACDeleteRoomModal', () => { const roomName = 'Test Room'; it('should render without crashing', () => { - const { baseElement } = render(, { + const { baseElement } = render(, { wrapper: baseAppRoot.build(), }); @@ -41,7 +41,7 @@ describe('ABACDeleteRoomModal', () => { it('should call delete endpoint when delete is confirmed', async () => { const deleteEndpointMock = jest.fn().mockResolvedValue(null); - render(, { + render(, { wrapper: baseAppRoot.withEndpoint('DELETE', '/v1/abac/rooms/:rid/attributes', deleteEndpointMock).build(), }); @@ -55,7 +55,7 @@ describe('ABACDeleteRoomModal', () => { it('should show success toast when delete succeeds', async () => { const deleteEndpointMock = jest.fn().mockResolvedValue(null); - render(, { + render(, { wrapper: baseAppRoot.withEndpoint('DELETE', '/v1/abac/rooms/:rid/attributes', deleteEndpointMock).build(), }); diff --git a/apps/meteor/client/views/admin/ABAC/ABACDeleteRoomModal.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/DeleteRoomModal.tsx similarity index 81% rename from apps/meteor/client/views/admin/ABAC/ABACDeleteRoomModal.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/DeleteRoomModal.tsx index 81d999b3daee2..653a2d8191abf 100644 --- a/apps/meteor/client/views/admin/ABAC/ABACDeleteRoomModal.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/DeleteRoomModal.tsx @@ -5,16 +5,16 @@ import { useToastMessageDispatch } from '@rocket.chat/ui-contexts'; import { useQueryClient } from '@tanstack/react-query'; import { Trans, useTranslation } from 'react-i18next'; -import { useEndpointMutation } from '../../../hooks/useEndpointMutation'; -import { ABACQueryKeys } from '../../../lib/queryKeys'; +import { useEndpointMutation } from '../../../../hooks/useEndpointMutation'; +import { ABACQueryKeys } from '../../../../lib/queryKeys'; -type ABACDeleteRoomModalProps = { +type DeleteRoomModalProps = { rid: IRoom['_id']; roomName: string; onClose: () => void; }; -const ABACDeleteRoomModal = ({ rid, roomName, onClose }: ABACDeleteRoomModalProps) => { +const DeleteRoomModal = ({ rid, roomName, onClose }: DeleteRoomModalProps) => { const { t } = useTranslation(); const queryClient = useQueryClient(); @@ -45,4 +45,4 @@ const ABACDeleteRoomModal = ({ rid, roomName, onClose }: ABACDeleteRoomModalProp ); }; -export default ABACDeleteRoomModal; +export default DeleteRoomModal; diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACRoomForm.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomForm.tsx similarity index 85% rename from apps/meteor/client/views/admin/ABAC/AdminABACRoomForm.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomForm.tsx index 02825a285f2dd..0a98056683cbe 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACRoomForm.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomForm.tsx @@ -7,28 +7,28 @@ import { useId } from 'react'; import { Controller, useFieldArray, useFormContext } from 'react-hook-form'; import { Trans, useTranslation } from 'react-i18next'; -import ABACAttributeField from './ABACAttributeField'; -import ABACRoomAutocomplete from './ABACRoomAutocomplete'; -import ABACRoomAutocompleteDummy from './ABACRoomAutocompleteDummy'; +import RoomFormAttributeField from './RoomFormAttributeField'; +import RoomFormAutocomplete from './RoomFormAutocomplete'; +import RoomFormAutocompleteDummy from './RoomFormAutocompleteDummy'; -type AdminABACRoomFormProps = { +type RoomFormProps = { onClose: () => void; - onSave: (data: AdminABACRoomFormData) => void; + onSave: (data: RoomFormData) => void; roomInfo?: { rid: string; name: string }; setSelectedRoomLabel: Dispatch>; }; -export type AdminABACRoomFormData = { +export type RoomFormData = { room: string; attributes: { key: string; values: string[] }[]; }; -const AdminABACRoomForm = ({ onClose, onSave, roomInfo, setSelectedRoomLabel }: AdminABACRoomFormProps) => { +const RoomForm = ({ onClose, onSave, roomInfo, setSelectedRoomLabel }: RoomFormProps) => { const { control, handleSubmit, formState: { isValid, errors }, - } = useFormContext(); + } = useFormContext(); const { t } = useTranslation(); const formId = useId(); @@ -82,14 +82,14 @@ const AdminABACRoomForm = ({ onClose, onSave, roomInfo, setSelectedRoomLabel }: {roomInfo ? ( - + ) : ( ( - {t('Attribute')} - { remove(index); }} @@ -140,4 +140,4 @@ const AdminABACRoomForm = ({ onClose, onSave, roomInfo, setSelectedRoomLabel }: ); }; -export default AdminABACRoomForm; +export default RoomForm; diff --git a/apps/meteor/client/views/admin/ABAC/ABACAttributeField.spec.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAttributeField.spec.tsx similarity index 84% rename from apps/meteor/client/views/admin/ABAC/ABACAttributeField.spec.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAttributeField.spec.tsx index fc9d2884ef65a..55695ef031f75 100644 --- a/apps/meteor/client/views/admin/ABAC/ABACAttributeField.spec.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAttributeField.spec.tsx @@ -1,7 +1,7 @@ import { composeStories } from '@storybook/react'; import { render } from '@testing-library/react'; -import * as stories from './ABACAttributeField.stories'; +import * as stories from './RoomFormAttributeField.stories'; const mockAttribute1 = { _id: 'attr1', @@ -24,15 +24,15 @@ const mockAttribute3 = { values: ['US', 'EU', 'APAC'], }; -jest.mock('./hooks/useABACAttributeList', () => ({ - useABACAttributeList: jest.fn(() => ({ +jest.mock('../hooks/useAttributeList', () => ({ + useAttributeList: jest.fn(() => ({ data: [mockAttribute1, mockAttribute2, mockAttribute3], fetchNextPage: jest.fn(), isLoading: false, })), })); -describe('ABACAttributeField', () => { +describe('RoomFormAttributeField', () => { // TODO: Once the autocomplete components are a11y compliant, and testable, add more tests const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]); diff --git a/apps/meteor/client/views/admin/ABAC/ABACAttributeField.stories.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAttributeField.stories.tsx similarity index 82% rename from apps/meteor/client/views/admin/ABAC/ABACAttributeField.stories.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAttributeField.stories.tsx index d43f06801b3c8..ad1f9cda7dc71 100644 --- a/apps/meteor/client/views/admin/ABAC/ABACAttributeField.stories.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAttributeField.stories.tsx @@ -4,8 +4,8 @@ import { action } from '@storybook/addon-actions'; import type { Meta, StoryObj } from '@storybook/react'; import { FormProvider, useForm } from 'react-hook-form'; -import ABACAttributeField from './ABACAttributeField'; -import type { AdminABACRoomFormData } from './AdminABACRoomForm'; +import type { RoomFormData } from './RoomForm'; +import RoomFormAttributeField from './RoomFormAttributeField'; const mockAttribute1 = { _id: 'attr1', @@ -28,8 +28,8 @@ const mockAttribute3 = { values: ['US', 'EU', 'APAC'], }; -const meta: Meta = { - component: ABACAttributeField, +const meta: Meta = { + component: RoomFormAttributeField, parameters: { layout: 'padded', }, @@ -44,7 +44,7 @@ const meta: Meta = { })) .build(); - const methods = useForm({ + const methods = useForm({ defaultValues: { room: '', attributes: [{ key: '', values: [] }], @@ -70,6 +70,6 @@ const meta: Meta = { }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Default: Story = {}; diff --git a/apps/meteor/client/views/admin/ABAC/ABACAttributeField.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAttributeField.tsx similarity index 86% rename from apps/meteor/client/views/admin/ABAC/ABACAttributeField.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAttributeField.tsx index da5eeee9dc34e..e85c56aad5df5 100644 --- a/apps/meteor/client/views/admin/ABAC/ABACAttributeField.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAttributeField.tsx @@ -4,22 +4,22 @@ import { useCallback, useMemo, useState } from 'react'; import { useController, useFormContext } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; -import type { AdminABACRoomFormData } from './AdminABACRoomForm'; -import { useABACAttributeList } from './hooks/useABACAttributeList'; +import type { RoomFormData } from './RoomForm'; +import { useAttributeList } from '../hooks/useAttributeList'; type ABACAttributeAutocompleteProps = { onRemove: () => void; index: number; }; -const ABACAttributeField = ({ onRemove, index }: ABACAttributeAutocompleteProps) => { +const RoomFormAttributeField = ({ onRemove, index }: ABACAttributeAutocompleteProps) => { const { t } = useTranslation(); const [filter, setFilter] = useState(); const filterDebounced = useDebouncedValue(filter, 300); - const { control, getValues, resetField } = useFormContext(); + const { control, getValues, resetField } = useFormContext(); - const { data: options, fetchNextPage, isLoading } = useABACAttributeList(filterDebounced || undefined); + const { data: options, fetchNextPage, isLoading } = useAttributeList(filterDebounced || undefined); const validateRepeatedAttributes = useCallback( (value: string) => { @@ -96,4 +96,4 @@ const ABACAttributeField = ({ onRemove, index }: ABACAttributeAutocompleteProps) ); }; -export default ABACAttributeField; +export default RoomFormAttributeField; diff --git a/apps/meteor/client/views/admin/ABAC/ABACRoomAutocomplete.spec.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocomplete.spec.tsx similarity index 85% rename from apps/meteor/client/views/admin/ABAC/ABACRoomAutocomplete.spec.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocomplete.spec.tsx index ee9f3d6e4e43c..dc67379e7224d 100644 --- a/apps/meteor/client/views/admin/ABAC/ABACRoomAutocomplete.spec.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocomplete.spec.tsx @@ -4,9 +4,9 @@ import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { axe } from 'jest-axe'; -import ABACRoomAutocomplete from './ABACRoomAutocomplete'; -import * as stories from './ABACRoomAutocomplete.stories'; -import { createFakeRoom } from '../../../../tests/mocks/data'; +import RoomFormAutocomplete from './RoomFormAutocomplete'; +import * as stories from './RoomFormAutocomplete.stories'; +import { createFakeRoom } from '../../../../../tests/mocks/data'; const mockRoom1 = createFakeRoom({ t: 'p', name: 'Room 1', fname: 'Room 1' }); const mockRoom2 = createFakeRoom({ t: 'p', name: 'Room 2', fname: 'Room 2' }); @@ -21,7 +21,7 @@ const appRoot = mockAppRoot() })) .build(); -describe('ABACRoomAutocomplete', () => { +describe('RoomFormAutocomplete', () => { const testCases = Object.values(composeStories(stories)).map((Story) => [Story.storyName || 'Story', Story]); test.each(testCases)(`renders %s without crashing`, async (_storyname, Story) => { @@ -38,7 +38,7 @@ describe('ABACRoomAutocomplete', () => { }); it('should populate select options correctly', async () => { - render(, { + render(, { wrapper: appRoot, }); diff --git a/apps/meteor/client/views/admin/ABAC/ABACRoomAutocomplete.stories.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocomplete.stories.tsx similarity index 74% rename from apps/meteor/client/views/admin/ABAC/ABACRoomAutocomplete.stories.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocomplete.stories.tsx index e78ec4194514b..4345892d3cb34 100644 --- a/apps/meteor/client/views/admin/ABAC/ABACRoomAutocomplete.stories.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocomplete.stories.tsx @@ -2,14 +2,14 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import { action } from '@storybook/addon-actions'; import type { Meta, StoryObj } from '@storybook/react'; -import ABACRoomAutocomplete from './ABACRoomAutocomplete'; -import { createFakeRoom } from '../../../../tests/mocks/data'; +import RoomFormAutocomplete from './RoomFormAutocomplete'; +import { createFakeRoom } from '../../../../../tests/mocks/data'; const mockRoom1 = createFakeRoom({ t: 'p', name: 'Room 1' }); const mockRoom2 = createFakeRoom({ t: 'p', name: 'Room 2' }); -const meta: Meta = { - component: ABACRoomAutocomplete, +const meta: Meta = { + component: RoomFormAutocomplete, parameters: { layout: 'padded', }, @@ -37,6 +37,6 @@ const meta: Meta = { }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Default: Story = {}; diff --git a/apps/meteor/client/views/admin/ABAC/ABACRoomAutocomplete.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocomplete.tsx similarity index 86% rename from apps/meteor/client/views/admin/ABAC/ABACRoomAutocomplete.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocomplete.tsx index a621f376fcd0a..41e4fd7ca2f3c 100644 --- a/apps/meteor/client/views/admin/ABAC/ABACRoomAutocomplete.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocomplete.tsx @@ -5,7 +5,7 @@ import { keepPreviousData, useQuery } from '@tanstack/react-query'; import type { ComponentProps } from 'react'; import { memo, useState } from 'react'; -import { ABACQueryKeys } from '../../../lib/queryKeys'; +import { ABACQueryKeys } from '../../../../lib/queryKeys'; const generateQuery = ( term = '', @@ -14,11 +14,11 @@ const generateQuery = ( types: string[]; } => ({ filter: term, types: ['p'] }); -type ABACRoomAutocompleteProps = Omit, 'filter' | 'onChange'> & { +type RoomFormAutocompleteProps = Omit, 'filter' | 'onChange'> & { onSelectedRoom: (value: string, label: string) => void; }; -const ABACRoomAutocomplete = ({ value, onSelectedRoom, ...props }: ABACRoomAutocompleteProps) => { +const RoomFormAutocomplete = ({ value, onSelectedRoom, ...props }: RoomFormAutocompleteProps) => { const [filter, setFilter] = useState(''); const filterDebounced = useDebouncedValue(filter, 300); const roomsAutoCompleteEndpoint = useEndpoint('GET', '/v1/rooms.adminRooms'); @@ -56,4 +56,4 @@ const ABACRoomAutocomplete = ({ value, onSelectedRoom, ...props }: ABACRoomAutoc ); }; -export default memo(ABACRoomAutocomplete); +export default memo(RoomFormAutocomplete); diff --git a/apps/meteor/client/views/admin/ABAC/ABACRoomAutocompleteDummy.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocompleteDummy.tsx similarity index 53% rename from apps/meteor/client/views/admin/ABAC/ABACRoomAutocompleteDummy.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocompleteDummy.tsx index 53ff7564a59c6..ef4c133ec0faa 100644 --- a/apps/meteor/client/views/admin/ABAC/ABACRoomAutocompleteDummy.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomFormAutocompleteDummy.tsx @@ -1,11 +1,11 @@ import { Input } from '@rocket.chat/fuselage'; -type ABACRoomAutocompleteDummyProps = { +type RoomFormAutocompleteDummyProps = { roomInfo: { rid: string; name: string }; }; -const ABACRoomAutocompleteDummy = ({ roomInfo }: ABACRoomAutocompleteDummyProps) => { +const RoomFormAutocompleteDummy = ({ roomInfo }: RoomFormAutocompleteDummyProps) => { return ; }; -export default ABACRoomAutocompleteDummy; +export default RoomFormAutocompleteDummy; diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACRoomMenu.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomMenu.tsx similarity index 64% rename from apps/meteor/client/views/admin/ABAC/AdminABACRoomMenu.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomMenu.tsx index c4bc1841b1c2f..fcac598f62a70 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACRoomMenu.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomMenu.tsx @@ -1,13 +1,13 @@ import { GenericMenu } from '@rocket.chat/ui-client'; import { useTranslation } from 'react-i18next'; -import { useRoomItems } from './hooks/useRoomItems'; +import { useRoomItems } from '../hooks/useRoomItems'; -type AdminABACRoomMenuProps = { +type RoomMenuProps = { room: { rid: string; name: string }; }; -const AdminABACRoomMenu = ({ room }: AdminABACRoomMenuProps) => { +const RoomMenu = ({ room }: RoomMenuProps) => { const { t } = useTranslation(); const items = useRoomItems(room); @@ -25,4 +25,4 @@ const AdminABACRoomMenu = ({ room }: AdminABACRoomMenuProps) => { ); }; -export default AdminABACRoomMenu; +export default RoomMenu; diff --git a/apps/meteor/client/views/admin/ABAC/RoomsContextualBar.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomsContextualBar.tsx similarity index 95% rename from apps/meteor/client/views/admin/ABAC/RoomsContextualBar.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomsContextualBar.tsx index e4691eb21f15e..8f6edb6605cda 100644 --- a/apps/meteor/client/views/admin/ABAC/RoomsContextualBar.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomsContextualBar.tsx @@ -6,8 +6,8 @@ import { useState } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useTranslation } from 'react-i18next'; -import AdminABACRoomForm from './AdminABACRoomForm'; -import { ABACQueryKeys } from '../../../lib/queryKeys'; +import RoomForm from './RoomForm'; +import { ABACQueryKeys } from '../../../../lib/queryKeys'; type RoomsContextualBarProps = { attributeId?: string; @@ -75,7 +75,7 @@ const RoomsContextualBar = ({ roomInfo, attributesData, onClose }: RoomsContextu - saveMutation.mutateAsync(values)} onClose={onClose} diff --git a/apps/meteor/client/views/admin/ABAC/RoomsContextualBarWithData.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomsContextualBarWithData.tsx similarity index 94% rename from apps/meteor/client/views/admin/ABAC/RoomsContextualBarWithData.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomsContextualBarWithData.tsx index 2483341be2753..e0c22404108b9 100644 --- a/apps/meteor/client/views/admin/ABAC/RoomsContextualBarWithData.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomsContextualBarWithData.tsx @@ -3,7 +3,7 @@ import { useEndpoint } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; import RoomsContextualBar from './RoomsContextualBar'; -import { ABACQueryKeys } from '../../../lib/queryKeys'; +import { ABACQueryKeys } from '../../../../lib/queryKeys'; type RoomsContextualBarWithDataProps = { id: string; diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACRooms.tsx b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomsPage.tsx similarity index 88% rename from apps/meteor/client/views/admin/ABAC/AdminABACRooms.tsx rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomsPage.tsx index a12fb9d01373c..c7a93d5d600e9 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACRooms.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/RoomsPage.tsx @@ -5,9 +5,8 @@ import { useQuery } from '@tanstack/react-query'; import { useMemo, useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; -import AdminABACRoomMenu from './AdminABACRoomMenu'; -import { useIsABACAvailable } from './hooks/useIsABACAvailable'; -import GenericNoResults from '../../../components/GenericNoResults'; +import RoomMenu from './RoomMenu'; +import GenericNoResults from '../../../../components/GenericNoResults'; import { GenericTable, GenericTableBody, @@ -15,11 +14,12 @@ import { GenericTableHeader, GenericTableHeaderCell, GenericTableRow, -} from '../../../components/GenericTable'; -import { usePagination } from '../../../components/GenericTable/hooks/usePagination'; -import { ABACQueryKeys } from '../../../lib/queryKeys'; +} from '../../../../components/GenericTable'; +import { usePagination } from '../../../../components/GenericTable/hooks/usePagination'; +import { ABACQueryKeys } from '../../../../lib/queryKeys'; +import { useIsABACAvailable } from '../hooks/useIsABACAvailable'; -const AdminABACRooms = () => { +const RoomsPage = () => { const { t } = useTranslation(); const [text, setText] = useState(''); @@ -109,7 +109,7 @@ const AdminABACRooms = () => { {room.abacAttributes?.flatMap((attribute) => attribute.key ?? []).join(', ')} {room.abacAttributes?.flatMap((attribute) => attribute.values ?? []).join(', ')} - + ))} @@ -130,4 +130,4 @@ const AdminABACRooms = () => { ); }; -export default AdminABACRooms; +export default RoomsPage; diff --git a/apps/meteor/client/views/admin/ABAC/__snapshots__/ABACDeleteRoomModal.spec.tsx.snap b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/__snapshots__/DeleteRoomModal.spec.tsx.snap similarity index 97% rename from apps/meteor/client/views/admin/ABAC/__snapshots__/ABACDeleteRoomModal.spec.tsx.snap rename to apps/meteor/client/views/admin/ABAC/ABACRoomsTab/__snapshots__/DeleteRoomModal.spec.tsx.snap index 7551cb9adc8a7..aadb94947da12 100644 --- a/apps/meteor/client/views/admin/ABAC/__snapshots__/ABACDeleteRoomModal.spec.tsx.snap +++ b/apps/meteor/client/views/admin/ABAC/ABACRoomsTab/__snapshots__/DeleteRoomModal.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing -exports[`ABACDeleteRoomModal should render without crashing 1`] = ` +exports[`DeleteRoomModal should render without crashing 1`] = `
{ +describe('SettingToggle', () => { it('should render the setting toggle when setting exists', () => { - const { baseElement } = render(, { + const { baseElement } = render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', true, settingStructure).build(), }); expect(baseElement).toMatchSnapshot(); @@ -36,7 +36,7 @@ describe('AdminABACSettingToggle', () => { it('should show warning modal when disabling ABAC', async () => { const user = userEvent.setup(); - render(, { + render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', true, settingStructure).build(), }); @@ -57,7 +57,7 @@ describe('AdminABACSettingToggle', () => { it('should not show warning modal when enabling ABAC', async () => { const user = userEvent.setup(); - render(, { + render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', false, settingStructure).build(), }); @@ -70,7 +70,7 @@ describe('AdminABACSettingToggle', () => { it('should show warning modal when resetting setting', async () => { const user = userEvent.setup(); - render(, { + render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', true, settingStructure).build(), }); @@ -87,7 +87,7 @@ describe('AdminABACSettingToggle', () => { }); it('should have no accessibility violations', async () => { - const { container } = render(, { + const { container } = render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', true, settingStructure).build(), }); const results = await axe(container); @@ -96,7 +96,7 @@ describe('AdminABACSettingToggle', () => { it('should handle setting change correctly', async () => { const user = userEvent.setup(); - render(, { + render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', false, settingStructure).build(), }); @@ -108,7 +108,7 @@ describe('AdminABACSettingToggle', () => { }); it('should be disabled when abac license is not installed', () => { - const { baseElement } = render(, { + const { baseElement } = render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', true, settingStructure).build(), }); @@ -118,14 +118,14 @@ describe('AdminABACSettingToggle', () => { }); it('should show skeleton when loading', () => { - const { baseElement } = render(, { + const { baseElement } = render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', true, settingStructure).build(), }); expect(baseElement).toMatchSnapshot(); }); it('should show reset button when value differs from package value', () => { - render(, { + render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', true, settingStructure).build(), }); @@ -133,7 +133,7 @@ describe('AdminABACSettingToggle', () => { }); it('should not show reset button when value matches package value', () => { - render(, { + render(, { wrapper: baseAppRoot.withSetting('ABAC_Enabled', false, settingStructure).build(), }); diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACSettingToggle.stories.tsx b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingToggle.stories.tsx similarity index 77% rename from apps/meteor/client/views/admin/ABAC/AdminABACSettingToggle.stories.tsx rename to apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingToggle.stories.tsx index 6c5626baa0dc1..3fcc703b5085a 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACSettingToggle.stories.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingToggle.stories.tsx @@ -1,12 +1,12 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import type { Meta, StoryObj } from '@storybook/react'; -import AdminABACSettingToggle from './AdminABACSettingToggle'; -import EditableSettingsProvider from '../settings/EditableSettingsProvider'; +import SettingToggle from './SettingToggle'; +import EditableSettingsProvider from '../../settings/EditableSettingsProvider'; -const meta: Meta = { - title: 'Admin/ABAC/AdminABACSettingToggle', - component: AdminABACSettingToggle, +const meta: Meta = { + title: 'Admin/ABAC/SettingToggle', + component: SettingToggle, parameters: { layout: 'padded', }, @@ -44,7 +44,7 @@ const meta: Meta = { }; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const Default: Story = { args: { diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACSettingToggle.tsx b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingToggle.tsx similarity index 78% rename from apps/meteor/client/views/admin/ABAC/AdminABACSettingToggle.tsx rename to apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingToggle.tsx index 7d7077e08364c..b7020e9023994 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACSettingToggle.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingToggle.tsx @@ -3,17 +3,17 @@ import { useSetModal, useSettingsDispatch } from '@rocket.chat/ui-contexts'; import { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import type { EditableSetting } from '../EditableSettingsContext'; -import { useEditableSetting } from '../EditableSettingsContext'; -import AdminABACWarningModal from './AdminABACWarningModal'; -import MemoizedSetting from '../settings/Setting/MemoizedSetting'; -import SettingSkeleton from '../settings/Setting/SettingSkeleton'; +import WarningModal from './WarningModal'; +import type { EditableSetting } from '../../EditableSettingsContext'; +import { useEditableSetting } from '../../EditableSettingsContext'; +import MemoizedSetting from '../../settings/Setting/MemoizedSetting'; +import SettingSkeleton from '../../settings/Setting/SettingSkeleton'; -type AdminABACSettingToggleProps = { +type SettingToggleProps = { hasABAC: 'loading' | boolean; }; -const AdminABACSettingToggle = ({ hasABAC }: AdminABACSettingToggleProps) => { +const SettingToggle = ({ hasABAC }: SettingToggleProps) => { const setting = useEditableSetting('ABAC_Enabled'); const setModal = useSetModal(); const dispatch = useSettingsDispatch(); @@ -38,7 +38,7 @@ const AdminABACSettingToggle = ({ hasABAC }: AdminABACSettingToggleProps) => { if (value === false) { return setModal( - { handleChange(value, setting); setModal(); @@ -58,7 +58,7 @@ const AdminABACSettingToggle = ({ hasABAC }: AdminABACSettingToggleProps) => { } const value = setting.packageValue as boolean; setModal( - { setValue(value); dispatch([{ _id: setting._id, value }]); @@ -92,4 +92,4 @@ const AdminABACSettingToggle = ({ hasABAC }: AdminABACSettingToggleProps) => { /> ); }; -export default AdminABACSettingToggle; +export default SettingToggle; diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACSettings.tsx b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingsPage.tsx similarity index 65% rename from apps/meteor/client/views/admin/ABAC/AdminABACSettings.tsx rename to apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingsPage.tsx index 3b3505c0dd595..15e90c4def3a8 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACSettings.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/SettingsPage.tsx @@ -1,17 +1,17 @@ import { Box, Callout, Margins } from '@rocket.chat/fuselage'; import { Trans } from 'react-i18next'; -import AdminABACSettingToggle from './AdminABACSettingToggle'; -import { useHasLicenseModule } from '../../../hooks/useHasLicenseModule'; -import { links } from '../../../lib/links'; +import SettingToggle from './SettingToggle'; +import { useHasLicenseModule } from '../../../../hooks/useHasLicenseModule'; +import { links } from '../../../../lib/links'; -const AdminABACSettings = () => { +const SettingsPage = () => { const { data: hasABAC = false } = useHasLicenseModule('abac'); return ( - + @@ -27,4 +27,4 @@ const AdminABACSettings = () => { ); }; -export default AdminABACSettings; +export default SettingsPage; diff --git a/apps/meteor/client/views/admin/ABAC/AdminABACWarningModal.tsx b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/WarningModal.tsx similarity index 87% rename from apps/meteor/client/views/admin/ABAC/AdminABACWarningModal.tsx rename to apps/meteor/client/views/admin/ABAC/ABACSettingTab/WarningModal.tsx index a6be0c83dcbcc..887c5fb4fb7db 100644 --- a/apps/meteor/client/views/admin/ABAC/AdminABACWarningModal.tsx +++ b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/WarningModal.tsx @@ -3,12 +3,12 @@ import { GenericModal } from '@rocket.chat/ui-client'; import { useRouter } from '@rocket.chat/ui-contexts'; import { Trans, useTranslation } from 'react-i18next'; -type AdminABACWarningModalProps = { +type WarningModalProps = { onConfirm: () => void; onCancel: () => void; }; -const AdminABACWarningModal = ({ onConfirm, onCancel }: AdminABACWarningModalProps) => { +const WarningModal = ({ onConfirm, onCancel }: WarningModalProps) => { const { t } = useTranslation(); const router = useRouter(); const handleNavigate = () => { @@ -45,4 +45,4 @@ const AdminABACWarningModal = ({ onConfirm, onCancel }: AdminABACWarningModalPro ); }; -export default AdminABACWarningModal; +export default WarningModal; diff --git a/apps/meteor/client/views/admin/ABAC/__snapshots__/AdminABACSettingToggle.spec.tsx.snap b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/__snapshots__/SettingToggle.spec.tsx.snap similarity index 94% rename from apps/meteor/client/views/admin/ABAC/__snapshots__/AdminABACSettingToggle.spec.tsx.snap rename to apps/meteor/client/views/admin/ABAC/ABACSettingTab/__snapshots__/SettingToggle.spec.tsx.snap index 39af2d46aa2f0..ef05ad349663b 100644 --- a/apps/meteor/client/views/admin/ABAC/__snapshots__/AdminABACSettingToggle.spec.tsx.snap +++ b/apps/meteor/client/views/admin/ABAC/ABACSettingTab/__snapshots__/SettingToggle.spec.tsx.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing -exports[`AdminABACSettingToggle should be disabled when abac license is not installed 1`] = ` +exports[`SettingToggle should be disabled when abac license is not installed 1`] = `
`; -exports[`AdminABACSettingToggle should render the setting toggle when setting exists 1`] = ` +exports[`SettingToggle should render the setting toggle when setting exists 1`] = `
`; -exports[`AdminABACSettingToggle should show skeleton when loading 1`] = ` +exports[`SettingToggle should show skeleton when loading 1`] = `
{ )} - {tab === 'settings' && } - {tab === 'room-attributes' && } - {tab === 'rooms' && } - {tab === 'logs' && } + {tab === 'settings' && } + {tab === 'room-attributes' && } + {tab === 'rooms' && } + {tab === 'logs' && } {tab !== undefined && context !== undefined && ( handleCloseContextualbar()}> {tab === 'room-attributes' && ( <> - {context === 'new' && isABACAvailable === true && handleCloseContextualbar()} />} + {context === 'new' && isABACAvailable === true && handleCloseContextualbar()} />} {context === 'edit' && _id && isABACAvailable === true && ( - handleCloseContextualbar()} /> + handleCloseContextualbar()} /> )} )} diff --git a/apps/meteor/client/views/admin/ABAC/hooks/useABACDeleteRoomModal.tsx b/apps/meteor/client/views/admin/ABAC/hooks/useABACDeleteRoomModal.tsx deleted file mode 100644 index 199e3d10b3977..0000000000000 --- a/apps/meteor/client/views/admin/ABAC/hooks/useABACDeleteRoomModal.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { useSetModal } from '@rocket.chat/ui-contexts'; - -import ABACDeleteRoomModal from '../ABACDeleteRoomModal'; - -export const useABACDeleteRoomModal = (room: { rid: string; name: string }) => { - const setModal = useSetModal(); - - return () => { - setModal( setModal(null)} />); - }; -}; diff --git a/apps/meteor/client/views/admin/ABAC/hooks/useABACAttributeList.ts b/apps/meteor/client/views/admin/ABAC/hooks/useAttributeList.ts similarity index 95% rename from apps/meteor/client/views/admin/ABAC/hooks/useABACAttributeList.ts rename to apps/meteor/client/views/admin/ABAC/hooks/useAttributeList.ts index f81b149930317..10d2221c73846 100644 --- a/apps/meteor/client/views/admin/ABAC/hooks/useABACAttributeList.ts +++ b/apps/meteor/client/views/admin/ABAC/hooks/useAttributeList.ts @@ -4,7 +4,7 @@ import { useInfiniteQuery } from '@tanstack/react-query'; import { useIsABACAvailable } from './useIsABACAvailable'; import { ABACQueryKeys } from '../../../../lib/queryKeys'; -export const useABACAttributeList = (filter?: string) => { +export const useAttributeList = (filter?: string) => { const attributesAutoCompleteEndpoint = useEndpoint('GET', '/v1/abac/attributes'); const isABACAvailable = useIsABACAvailable(); diff --git a/apps/meteor/client/views/admin/ABAC/useRoomAttributeOptions.spec.tsx b/apps/meteor/client/views/admin/ABAC/hooks/useAttributeOptions.spec.tsx similarity index 89% rename from apps/meteor/client/views/admin/ABAC/useRoomAttributeOptions.spec.tsx rename to apps/meteor/client/views/admin/ABAC/hooks/useAttributeOptions.spec.tsx index d59f577157a7c..acaddac0e2d6d 100644 --- a/apps/meteor/client/views/admin/ABAC/useRoomAttributeOptions.spec.tsx +++ b/apps/meteor/client/views/admin/ABAC/hooks/useAttributeOptions.spec.tsx @@ -1,15 +1,15 @@ import { mockAppRoot } from '@rocket.chat/mock-providers'; import { renderHook, waitFor } from '@testing-library/react'; -import { useRoomAttributeItems } from './useRoomAttributeOptions'; -import { createFakeLicenseInfo } from '../../../../tests/mocks/data'; +import { useAttributeOptions } from './useAttributeOptions'; +import { createFakeLicenseInfo } from '../../../../../tests/mocks/data'; const mockNavigate = jest.fn(); const mockSetModal = jest.fn(); const mockDispatchToastMessage = jest.fn(); const useIsABACAvailableMock = jest.fn(() => true); -jest.mock('./hooks/useIsABACAvailable', () => ({ +jest.mock('./useIsABACAvailable', () => ({ useIsABACAvailable: () => useIsABACAvailableMock(), })); @@ -53,7 +53,7 @@ const baseAppRoot = mockAppRoot() license: createFakeLicenseInfo({ activeModules: ['abac'] }), })); -describe('useRoomAttributeItems', () => { +describe('useAttributeOptions', () => { beforeEach(() => { jest.clearAllMocks(); mockNavigate.mockClear(); @@ -62,7 +62,7 @@ describe('useRoomAttributeItems', () => { }); it('should return menu items with correct structure', () => { - const { result } = renderHook(() => useRoomAttributeItems(mockAttribute), { + const { result } = renderHook(() => useAttributeOptions(mockAttribute), { wrapper: baseAppRoot .withEndpoint('DELETE', '/v1/abac/attributes/:_id', async () => null) .withEndpoint('GET', '/v1/abac/attributes/:key/is-in-use', async () => ({ inUse: false })) @@ -83,7 +83,7 @@ describe('useRoomAttributeItems', () => { }); it('should enable edit when ABAC is available', async () => { - const { result } = renderHook(() => useRoomAttributeItems(mockAttribute), { + const { result } = renderHook(() => useAttributeOptions(mockAttribute), { wrapper: baseAppRoot .withEndpoint('DELETE', '/v1/abac/attributes/:_id', async () => null) .withEndpoint('GET', '/v1/abac/attributes/:key/is-in-use', async () => ({ inUse: false })) @@ -96,7 +96,7 @@ describe('useRoomAttributeItems', () => { }); it('should navigate to edit page when edit action is clicked', async () => { - const { result } = renderHook(() => useRoomAttributeItems(mockAttribute), { + const { result } = renderHook(() => useAttributeOptions(mockAttribute), { wrapper: baseAppRoot .withEndpoint('DELETE', '/v1/abac/attributes/:_id', async () => null) .withEndpoint('GET', '/v1/abac/attributes/:key/is-in-use', async () => ({ inUse: false })) @@ -123,7 +123,7 @@ describe('useRoomAttributeItems', () => { it('should disable edit when ABAC is not available', () => { useIsABACAvailableMock.mockReturnValue(false); - const { result } = renderHook(() => useRoomAttributeItems(mockAttribute), { + const { result } = renderHook(() => useAttributeOptions(mockAttribute), { wrapper: baseAppRoot .withSetting('ABAC_Enabled', false, { packageValue: false, @@ -145,7 +145,7 @@ describe('useRoomAttributeItems', () => { }); it('should show warning modal when delete is clicked and attribute is in use', async () => { - const { result } = renderHook(() => useRoomAttributeItems(mockAttribute), { + const { result } = renderHook(() => useAttributeOptions(mockAttribute), { wrapper: baseAppRoot .withEndpoint('DELETE', '/v1/abac/attributes/:_id', async () => null) .withEndpoint('GET', '/v1/abac/attributes/:key/is-in-use', async () => ({ inUse: true })) @@ -168,7 +168,7 @@ describe('useRoomAttributeItems', () => { it('should show delete confirmation modal when delete is clicked and attribute is not in use', async () => { const deleteEndpointMock = jest.fn().mockResolvedValue(null); - const { result } = renderHook(() => useRoomAttributeItems(mockAttribute), { + const { result } = renderHook(() => useAttributeOptions(mockAttribute), { wrapper: baseAppRoot .withEndpoint('DELETE', '/v1/abac/attributes/:_id', deleteEndpointMock) .withEndpoint('GET', '/v1/abac/attributes/:key/is-in-use', async () => ({ inUse: false })) @@ -201,7 +201,7 @@ describe('useRoomAttributeItems', () => { } }); - const { result } = renderHook(() => useRoomAttributeItems(mockAttribute), { + const { result } = renderHook(() => useAttributeOptions(mockAttribute), { wrapper: baseAppRoot .withEndpoint('DELETE', '/v1/abac/attributes/:_id', deleteEndpointMock) .withEndpoint('GET', '/v1/abac/attributes/:key/is-in-use', async () => ({ inUse: false })) @@ -237,7 +237,7 @@ describe('useRoomAttributeItems', () => { } }); - const { result } = renderHook(() => useRoomAttributeItems(mockAttribute), { + const { result } = renderHook(() => useAttributeOptions(mockAttribute), { wrapper: baseAppRoot .withEndpoint('DELETE', '/v1/abac/attributes/:_id', deleteEndpointMock) .withEndpoint('GET', '/v1/abac/attributes/:key/is-in-use', async () => ({ inUse: false })) diff --git a/apps/meteor/client/views/admin/ABAC/useRoomAttributeOptions.tsx b/apps/meteor/client/views/admin/ABAC/hooks/useAttributeOptions.tsx similarity index 92% rename from apps/meteor/client/views/admin/ABAC/useRoomAttributeOptions.tsx rename to apps/meteor/client/views/admin/ABAC/hooks/useAttributeOptions.tsx index cd1e79a1cbdb4..94f6c46e4fc17 100644 --- a/apps/meteor/client/views/admin/ABAC/useRoomAttributeOptions.tsx +++ b/apps/meteor/client/views/admin/ABAC/hooks/useAttributeOptions.tsx @@ -6,10 +6,10 @@ import { useRouter, useSetModal, useEndpoint, useToastMessageDispatch } from '@r import { useMutation, useQueryClient } from '@tanstack/react-query'; import { Trans, useTranslation } from 'react-i18next'; -import { useIsABACAvailable } from './hooks/useIsABACAvailable'; -import { ABACQueryKeys } from '../../../lib/queryKeys'; +import { useIsABACAvailable } from './useIsABACAvailable'; +import { ABACQueryKeys } from '../../../../lib/queryKeys'; -export const useRoomAttributeItems = (attribute: { _id: string; key: string }): GenericMenuItemProps[] => { +export const useAttributeOptions = (attribute: { _id: string; key: string }): GenericMenuItemProps[] => { const { t } = useTranslation(); const router = useRouter(); const setModal = useSetModal(); diff --git a/apps/meteor/client/views/admin/ABAC/hooks/useABACDeleteRoomModal.spec.tsx b/apps/meteor/client/views/admin/ABAC/hooks/useDeleteRoomModal.spec.tsx similarity index 90% rename from apps/meteor/client/views/admin/ABAC/hooks/useABACDeleteRoomModal.spec.tsx rename to apps/meteor/client/views/admin/ABAC/hooks/useDeleteRoomModal.spec.tsx index 7d5732d4781f0..cba54bbc81679 100644 --- a/apps/meteor/client/views/admin/ABAC/hooks/useABACDeleteRoomModal.spec.tsx +++ b/apps/meteor/client/views/admin/ABAC/hooks/useDeleteRoomModal.spec.tsx @@ -2,7 +2,7 @@ import { faker } from '@faker-js/faker'; import { mockAppRoot } from '@rocket.chat/mock-providers'; import { renderHook, waitFor } from '@testing-library/react'; -import { useABACDeleteRoomModal } from './useABACDeleteRoomModal'; +import { useDeleteRoomModal } from './useDeleteRoomModal'; const mockSetModal = jest.fn(); @@ -14,7 +14,7 @@ jest.mock('@rocket.chat/ui-contexts', () => { }; }); -describe('useABACDeleteRoomModal', () => { +describe('useDeleteRoomModal', () => { beforeEach(() => { jest.clearAllMocks(); mockSetModal.mockClear(); @@ -23,7 +23,7 @@ describe('useABACDeleteRoomModal', () => { it('should show delete confirmation modal when hook is called', async () => { const { result } = renderHook( () => - useABACDeleteRoomModal({ + useDeleteRoomModal({ rid: faker.database.mongodbObjectId(), name: faker.lorem.words(3), }), diff --git a/apps/meteor/client/views/admin/ABAC/hooks/useDeleteRoomModal.tsx b/apps/meteor/client/views/admin/ABAC/hooks/useDeleteRoomModal.tsx new file mode 100644 index 0000000000000..e7d542e1ca4e8 --- /dev/null +++ b/apps/meteor/client/views/admin/ABAC/hooks/useDeleteRoomModal.tsx @@ -0,0 +1,11 @@ +import { useSetModal } from '@rocket.chat/ui-contexts'; + +import DeleteRoomModal from '../ABACRoomsTab/DeleteRoomModal'; + +export const useDeleteRoomModal = (room: { rid: string; name: string }) => { + const setModal = useSetModal(); + + return () => { + setModal( setModal(null)} />); + }; +}; diff --git a/apps/meteor/client/views/admin/ABAC/hooks/useRoomItems.spec.tsx b/apps/meteor/client/views/admin/ABAC/hooks/useRoomItems.spec.tsx index 4261e3bc786ac..a0c2a5da18d39 100644 --- a/apps/meteor/client/views/admin/ABAC/hooks/useRoomItems.spec.tsx +++ b/apps/meteor/client/views/admin/ABAC/hooks/useRoomItems.spec.tsx @@ -5,14 +5,14 @@ import { renderHook, waitFor } from '@testing-library/react'; import { useRoomItems } from './useRoomItems'; const navigateMock = jest.fn(); -const setABACDeleteRoomModalMock = jest.fn(); +const setDeleteRoomModalMock = jest.fn(); const useIsABACAvailableMock = jest.fn(() => true); jest.mock('./useIsABACAvailable', () => ({ useIsABACAvailable: () => useIsABACAvailableMock(), })); -jest.mock('./useABACDeleteRoomModal', () => ({ - useABACDeleteRoomModal: () => setABACDeleteRoomModalMock, +jest.mock('./useDeleteRoomModal', () => ({ + useDeleteRoomModal: () => setDeleteRoomModalMock, })); jest.mock('@rocket.chat/ui-contexts', () => ({ ...jest.requireActual('@rocket.chat/ui-contexts'), @@ -118,7 +118,7 @@ describe('useRoomItems', () => { } await waitFor(() => { - expect(setABACDeleteRoomModalMock).toHaveBeenCalled(); + expect(setDeleteRoomModalMock).toHaveBeenCalled(); }); }); }); diff --git a/apps/meteor/client/views/admin/ABAC/hooks/useRoomItems.tsx b/apps/meteor/client/views/admin/ABAC/hooks/useRoomItems.tsx index ea7a320c83de6..da0a91fe390de 100644 --- a/apps/meteor/client/views/admin/ABAC/hooks/useRoomItems.tsx +++ b/apps/meteor/client/views/admin/ABAC/hooks/useRoomItems.tsx @@ -4,13 +4,13 @@ import type { GenericMenuItemProps } from '@rocket.chat/ui-client'; import { useRouter } from '@rocket.chat/ui-contexts'; import { useTranslation } from 'react-i18next'; -import { useABACDeleteRoomModal } from './useABACDeleteRoomModal'; +import { useDeleteRoomModal } from './useDeleteRoomModal'; import { useIsABACAvailable } from './useIsABACAvailable'; export const useRoomItems = (room: { rid: string; name: string }): GenericMenuItemProps[] => { const { t } = useTranslation(); const router = useRouter(); - const setABACDeleteRoomModal = useABACDeleteRoomModal(room); + const setDeleteRoomModal = useDeleteRoomModal(room); const isABACAvailable = useIsABACAvailable(); const editAction = useEffectEvent(() => { @@ -34,7 +34,7 @@ export const useRoomItems = (room: { rid: string; name: string }): GenericMenuIt iconColor: 'danger', icon: 'cross' as const, content: {t('Remove')}, - onClick: setABACDeleteRoomModal, + onClick: setDeleteRoomModal, }, ]; };