import type { IAuditServerAppActor, IAuditServerSystemActor, IAuditServerUserActor } from '@rocket.chat/core-typings'; import { Box, Button, ButtonGroup, Field, FieldLabel, Margins, Pagination } from '@rocket.chat/fuselage'; import { UserAvatar } from '@rocket.chat/ui-avatar'; import { GenericTable, GenericTableBody, GenericTableCell, GenericTableHeader, GenericTableHeaderCell, GenericTableLoadingRow, GenericTableRow, usePagination, } from '@rocket.chat/ui-client'; import { useEndpoint, useSetModal } from '@rocket.chat/ui-contexts'; import { useQuery } from '@tanstack/react-query'; import { format } from 'date-fns'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import SecurityLogDisplayModal from './SecurityLogDisplayModal'; import { SettingSelect } from './SettingSelect'; import DateRangePicker from './forms/DateRangePicker'; import GenericNoResults from '../../../components/GenericNoResults'; import type { DateRange } from '../utils/dateRange'; import { getTypeTranslation } from '../utils/getAppTypeTranslation'; const SecurityLogsTable = () => { const { t } = useTranslation(); const [setting, setSetting] = useState(''); const setModal = useSetModal(); const [dateRange, setDateRange] = useState(() => ({ start: undefined, end: undefined, })); const [query, setQuery] = useState({ start: new Date(0).toISOString(), end: new Date().toISOString(), settingId: '', }); const { current, itemsPerPage, setItemsPerPage: onSetItemsPerPage, setCurrent: onSetCurrent, ...paginationProps } = usePagination(); const handleClearFilters = () => { setSetting(''); setDateRange({ start: undefined, end: undefined }); setQuery({ start: new Date(0).toISOString(), end: new Date().toISOString(), settingId: '', }); onSetCurrent(0); }; const handleApplyFilters = () => { const { start, end } = dateRange; setQuery({ start: start?.toISOString() ?? new Date(0).toISOString(), end: end?.toISOString() ?? new Date().toISOString(), settingId: setting, }); onSetCurrent(0); }; const handleItemClick = ({ actor, timestamp, setting, changedFrom, changedTo, }: { actor: IAuditServerUserActor | IAuditServerSystemActor | IAuditServerAppActor; timestamp: string; setting: unknown; changedFrom: string; changedTo: string; }) => { setModal( setModal(null)} />, ); }; const getAudits = useEndpoint('GET', '/v1/audit.settings'); const { data, isLoading, isSuccess } = useQuery({ queryKey: ['audit.settings', query, itemsPerPage, current], queryFn: async () => { return getAudits({ ...query, ...(itemsPerPage && { count: itemsPerPage }), ...(current && { offset: current }) }); }, }); return ( <> {t('Date')} {t('Setting')} {isLoading && ( {t('Actor')} {t('Timestamp')} {t('Setting')} {t('Changed_from')} {t('Changed_to')} )} {isSuccess && data.total === 0 && ( )} {isSuccess && data.total > 0 && ( {t('Actor')} {t('Timestamp')} {t('Setting')} {t('Changed_from')} {t('Changed_to')} {data.events.map((item) => { const setting = item.data.find((item) => item.key === 'id')?.value; const previous = item.data.find((item) => item.key === 'previous')?.value || t('Empty'); const current = item.data.find((item) => item.key === 'current')?.value || t('Empty'); return ( handleItemClick({ actor: item.actor, timestamp: item.ts, setting, changedFrom: String(previous), changedTo: String(current), }) } > {item.actor.type === 'user' && ( )} {item.actor.type === 'user' ? item.actor.username : t(getTypeTranslation(item.actor.type))} {format(new Date(item.ts), 'MMMM d yyyy, h:mm:ss a')} {setting && String(setting)} {String(previous)} {String(current)} ); })} )} ); }; export default SecurityLogsTable;