diff --git a/package-lock.json b/package-lock.json index 3d9028b..0ef91f1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ucentral-client", - "version": "2.10.0(41)", + "version": "2.10.0(42)", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ucentral-client", - "version": "2.10.0(41)", + "version": "2.10.0(42)", "license": "ISC", "dependencies": { "@chakra-ui/icons": "^2.0.18", diff --git a/package.json b/package.json index 29fa54d..2c14f66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ucentral-client", - "version": "2.10.0(41)", + "version": "2.10.0(42)", "description": "", "private": true, "main": "index.tsx", diff --git a/public/locales/de/translation.json b/public/locales/de/translation.json index 52da88e..54ba1ca 100644 --- a/public/locales/de/translation.json +++ b/public/locales/de/translation.json @@ -644,6 +644,7 @@ "notifications": "Gerätebenachrichtigungen", "one": "Gerät", "reassign_already_owned": "Geräte neu zuweisen, die bereits vorhanden sind und einem anderen Unternehmen/Veranstaltungsort/Abonnenten gehören?", + "reboot_logs": "Neustartprotokolle", "restricted": "Beschränkt", "restricted_overriden": "Dies ist ein eingeschränktes Gerät, aber es befindet sich im Entwicklungsmodus. Alle Einschränkungen werden derzeit ignoriert", "restrictions_overriden_title": "Dev-Modus", diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index f15c716..6653eb2 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -644,6 +644,7 @@ "notifications": "Device Notifications", "one": "Device", "reassign_already_owned": "Reassign devices which already exist and are owned by another entity/venue/subscriber?", + "reboot_logs": "Reboot Logs", "restricted": "Restricted", "restricted_overriden": "This is a restricted device, but it is in development mode. All restrictions are currently ignored", "restrictions_overriden_title": "Dev Mode", diff --git a/public/locales/es/translation.json b/public/locales/es/translation.json index 8432bd4..36baede 100644 --- a/public/locales/es/translation.json +++ b/public/locales/es/translation.json @@ -644,6 +644,7 @@ "notifications": "notificaciones de dispositivos", "one": "Dispositivo", "reassign_already_owned": "¿Reasignar dispositivos que ya existen y son propiedad de otra entidad/lugar/suscriptor?", + "reboot_logs": "Reiniciar registros", "restricted": "Restringido", "restricted_overriden": "Este es un dispositivo restringido, pero está en modo de desarrollo. Actualmente se ignoran todas las restricciones.", "restrictions_overriden_title": "MODO DE DESARROLLO", diff --git a/public/locales/fr/translation.json b/public/locales/fr/translation.json index 5f2756b..1ac52a8 100644 --- a/public/locales/fr/translation.json +++ b/public/locales/fr/translation.json @@ -644,6 +644,7 @@ "notifications": "notifications de l'appareil", "one": "Dispositif", "reassign_already_owned": "Réattribuer des appareils qui existent déjà et qui appartiennent à une autre entité/salle/abonné ?", + "reboot_logs": "Journaux de redémarrage", "restricted": "Limité", "restricted_overriden": "Il s'agit d'un appareil restreint, mais il est en mode développement. Toutes les restrictions sont actuellement ignorées", "restrictions_overriden_title": "Mode développement", diff --git a/public/locales/pt/translation.json b/public/locales/pt/translation.json index 0ca15a6..3361eae 100644 --- a/public/locales/pt/translation.json +++ b/public/locales/pt/translation.json @@ -644,6 +644,7 @@ "notifications": "Notificações do dispositivo", "one": "Dispositivo", "reassign_already_owned": "Reatribuir dispositivos que já existem e são de propriedade de outra entidade/local/assinante?", + "reboot_logs": "Registros de reinicialização", "restricted": "Restrito", "restricted_overriden": "Este é um dispositivo restrito, mas está em modo de desenvolvimento. Todas as restrições são atualmente ignoradas", "restrictions_overriden_title": "Modo de desenvolvedor", diff --git a/src/hooks/Network/DeviceLogs.ts b/src/hooks/Network/DeviceLogs.ts index ef1fb3b..1a338e0 100644 --- a/src/hooks/Network/DeviceLogs.ts +++ b/src/hooks/Network/DeviceLogs.ts @@ -11,7 +11,7 @@ export type DeviceLog = { severity: number; }; -const getDeviceLogs = (limit: number, serialNumber?: string, logType?: 0 | 1) => async () => +const getDeviceLogs = (limit: number, serialNumber?: string, logType?: 0 | 1 | 2) => async () => axiosGw .get(`device/${serialNumber}/logs?newest=true&limit=${limit}&logType=${logType}`) .then((response) => response.data) as Promise<{ @@ -28,7 +28,7 @@ export const useGetDeviceLogs = ({ serialNumber?: string; limit: number; onError?: (e: AxiosError) => void; - logType?: 0 | 1; + logType?: 0 | 1 | 2; }) => useQuery(['devicelogs', serialNumber, { limit, logType }], getDeviceLogs(limit, serialNumber, logType ?? 0), { keepPreviousData: true, @@ -44,7 +44,7 @@ const deleteLogs = async ({ }: { serialNumber: string; endDate: number; - logType: 0 | 1; + logType: 0 | 1 | 2; }) => axiosGw.delete(`device/${serialNumber}/logs?endDate=${endDate}&logType=${logType}`); export const useDeleteLogs = () => { const queryClient = useQueryClient(); @@ -62,7 +62,7 @@ const getLogsBatch = ( end?: number, limit?: number, offset?: number, - logType?: 0 | 1, + logType?: 0 | 1 | 2, ) => axiosGw .get( @@ -74,7 +74,7 @@ const getLogsBatch = ( }>; const getDeviceLogsWithTimestamps = - (serialNumber?: string, start?: number, end?: number, logType?: 0 | 1) => async () => { + (serialNumber?: string, start?: number, end?: number, logType?: 0 | 1 | 2) => async () => { let offset = 0; const limit = 100; let logs: DeviceLog[] = []; @@ -104,7 +104,7 @@ export const useGetDeviceLogsWithTimestamps = ({ start?: number; end?: number; onError?: (e: AxiosError) => void; - logType?: 0 | 1; + logType?: 0 | 1 | 2; }) => useQuery( ['devicelogs', serialNumber, { start, end, logType }], diff --git a/src/pages/Device/LogsCard/LogHistory/CrashLogs.tsx b/src/pages/Device/LogsCard/LogHistory/CrashLogs.tsx index c79455f..f2bcfac 100644 --- a/src/pages/Device/LogsCard/LogHistory/CrashLogs.tsx +++ b/src/pages/Device/LogsCard/LogHistory/CrashLogs.tsx @@ -52,7 +52,7 @@ const CrashLogs = ({ serialNumber }: Props) => { setHiddenColumns={setHiddenColumns} preference="gateway.device.logs.hiddenColumns" /> - + diff --git a/src/pages/Device/LogsCard/LogHistory/DeleteModal.tsx b/src/pages/Device/LogsCard/LogHistory/DeleteModal.tsx index 907439f..18fed71 100644 --- a/src/pages/Device/LogsCard/LogHistory/DeleteModal.tsx +++ b/src/pages/Device/LogsCard/LogHistory/DeleteModal.tsx @@ -16,7 +16,7 @@ const CustomInputButton = React.forwardRef( ), ); -type Props = { serialNumber: string; logType: 0 | 1 }; +type Props = { serialNumber: string; logType: 0 | 1 | 2 }; const DeleteLogModal = ({ serialNumber, logType }: Props) => { const { t } = useTranslation(); const toast = useToast(); diff --git a/src/pages/Device/LogsCard/LogHistory/RebootLogs.tsx b/src/pages/Device/LogsCard/LogHistory/RebootLogs.tsx new file mode 100644 index 0000000..b5a9a28 --- /dev/null +++ b/src/pages/Device/LogsCard/LogHistory/RebootLogs.tsx @@ -0,0 +1,94 @@ +import * as React from 'react'; +import { Box, Button, Center, Flex, Heading, HStack, Spacer } from '@chakra-ui/react'; +import { useTranslation } from 'react-i18next'; +import HistoryDatePickers from '../DatePickers'; +import DeleteLogModal from './DeleteModal'; +import useDeviceLogsTable from './useDeviceLogsTable'; +import { RefreshButton } from 'components/Buttons/RefreshButton'; +import { ColumnPicker } from 'components/DataTables/ColumnPicker'; +import { DataTable } from 'components/DataTables/DataTable'; +import { Column } from 'models/Table'; + +type Props = { + serialNumber: string; +}; +const RebootLogs = ({ serialNumber }: Props) => { + const { t } = useTranslation(); + const [limit, setLimit] = React.useState(25); + const [hiddenColumns, setHiddenColumns] = React.useState([]); + const { time, setTime, getCustomLogs, getLogs, columns, modal } = useDeviceLogsTable({ + serialNumber, + limit, + logType: 2, + }); + + const setNewTime = (start: Date, end: Date) => { + setTime({ start, end }); + }; + const onClear = () => { + setTime(undefined); + }; + const raiseLimit = () => { + setLimit(limit + 25); + }; + + const noMoreAvailable = getLogs.data !== undefined && getLogs.data.values.length < limit; + + const data = React.useMemo(() => { + if (getCustomLogs.data) return getCustomLogs.data.values.sort((a, b) => b.recorded - a.recorded); + if (getLogs.data) return getLogs.data.values; + return []; + }, [getLogs.data, getCustomLogs.data]); + + return ( + + + + + + []} + hiddenColumns={hiddenColumns} + setHiddenColumns={setHiddenColumns} + preference="gateway.device.logs.hiddenColumns" + /> + + + + + + + {getLogs.data !== undefined && ( + + )} + + {modal} + + ); +}; + +export default RebootLogs; diff --git a/src/pages/Device/LogsCard/LogHistory/useDeviceLogsTable.tsx b/src/pages/Device/LogsCard/LogHistory/useDeviceLogsTable.tsx index 786e994..380f448 100644 --- a/src/pages/Device/LogsCard/LogHistory/useDeviceLogsTable.tsx +++ b/src/pages/Device/LogsCard/LogHistory/useDeviceLogsTable.tsx @@ -10,7 +10,7 @@ import { Column } from 'models/Table'; type Props = { serialNumber: string; limit: number; - logType: 0 | 1; + logType: 0 | 1 | 2; }; const useDeviceLogsTable = ({ serialNumber, limit, logType }: Props) => { diff --git a/src/pages/Device/LogsCard/index.tsx b/src/pages/Device/LogsCard/index.tsx index abfe7f9..a504d5b 100644 --- a/src/pages/Device/LogsCard/index.tsx +++ b/src/pages/Device/LogsCard/index.tsx @@ -1,10 +1,11 @@ import * as React from 'react'; -import { Box, Tab, TabList, TabPanel, TabPanels, Tabs } from '@chakra-ui/react'; +import { Box, Tab, TabList, TabPanel, TabPanels, Tabs, useBreakpoint } from '@chakra-ui/react'; import { useTranslation } from 'react-i18next'; import CommandHistory from './CommandHistory'; import HealthCheckHistory from './HealthCheckHistory'; import LogHistory from './LogHistory'; import CrashLogs from './LogHistory/CrashLogs'; +import RebootLogs from './LogHistory/RebootLogs'; import { Card } from 'components/Containers/Card'; import { CardBody } from 'components/Containers/Card/CardBody'; @@ -13,12 +14,15 @@ type Props = { }; const DeviceLogsCard = ({ serialNumber }: Props) => { const { t } = useTranslation(); + const breakpoint = useBreakpoint(); const [tabIndex, setTabIndex] = React.useState(0); const handleTabsChange = React.useCallback((index: number) => { setTabIndex(index); }, []); + const isCompact = breakpoint === 'base' || breakpoint === 'sm' || breakpoint === 'md' || breakpoint === 'lg'; + return ( @@ -34,7 +38,10 @@ const DeviceLogsCard = ({ serialNumber }: Props) => { {t('controller.devices.logs')} - {t('devices.crash_logs')} + {isCompact ? 'Crashes' : t('devices.crash_logs')} + + + {isCompact ? 'Reboots' : t('devices.reboot_logs')} @@ -61,6 +68,9 @@ const DeviceLogsCard = ({ serialNumber }: Props) => { + + +