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 && (
+
+ {!noMoreAvailable || getLogs.isFetching ? (
+
+ ) : (
+ {t('controller.devices.no_more_available')}!
+ )}
+
+ )}
+
+ {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) => {
+
+
+