subscribe topics
parent
6f55d2ec5a
commit
d432da1ee1
|
@ -17,7 +17,7 @@ export default function App() {
|
||||||
const [notificationApi, notificationContextHolder] =
|
const [notificationApi, notificationContextHolder] =
|
||||||
notification.useNotification();
|
notification.useNotification();
|
||||||
const { userSession, setUserSession } = UseUserSession();
|
const { userSession, setUserSession } = UseUserSession();
|
||||||
const [isWebSocketReady, setIsWebSocketReady] = useState(true);
|
const [isWebSocketReady, setIsWebSocketReady] = useState(false);
|
||||||
|
|
||||||
if (!userSession) {
|
if (!userSession) {
|
||||||
return <Login />;
|
return <Login />;
|
||||||
|
|
|
@ -48,17 +48,6 @@ function SuspenseFallback({ children }) {
|
||||||
export default function AppRoutes() {
|
export default function AppRoutes() {
|
||||||
const appContext = useAppContext();
|
const appContext = useAppContext();
|
||||||
|
|
||||||
/*
|
|
||||||
<Route
|
|
||||||
path={Constants.ROUTE_PATHS.GROUP_TASKS_VIEW + ":paramGroupTaskId"}
|
|
||||||
element={
|
|
||||||
<SuspenseFallback>
|
|
||||||
<GroupTasks isGroupTasksViewModalOpen={true} />
|
|
||||||
</SuspenseFallback>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
*/
|
|
||||||
|
|
||||||
console.info("appRoutes");
|
console.info("appRoutes");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -169,7 +158,7 @@ export default function AppRoutes() {
|
||||||
Constants.PERMISSIONS.SCANNER.USE_SCANNERS
|
Constants.PERMISSIONS.SCANNER.USE_SCANNERS
|
||||||
) && (
|
) && (
|
||||||
<Route
|
<Route
|
||||||
path="/scanners"
|
path={Constants.ROUTE_PATHS.SCANNERS}
|
||||||
element={
|
element={
|
||||||
<SuspenseFallback>
|
<SuspenseFallback>
|
||||||
<Scanners />
|
<Scanners />
|
||||||
|
@ -179,7 +168,7 @@ export default function AppRoutes() {
|
||||||
)}
|
)}
|
||||||
|
|
||||||
<Route
|
<Route
|
||||||
path="/users"
|
path={Constants.ROUTE_PATHS.USERS}
|
||||||
element={
|
element={
|
||||||
<SuspenseFallback>
|
<SuspenseFallback>
|
||||||
<AllUsers />
|
<AllUsers />
|
||||||
|
@ -188,7 +177,7 @@ export default function AppRoutes() {
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Route
|
<Route
|
||||||
path="/user-profile"
|
path={Constants.ROUTE_PATHS.USER_PROFILE}
|
||||||
element={
|
element={
|
||||||
<SuspenseFallback>
|
<SuspenseFallback>
|
||||||
<UserProfile />
|
<UserProfile />
|
||||||
|
@ -204,7 +193,7 @@ export default function AppRoutes() {
|
||||||
Constants.PERMISSIONS.ADMIN_AREA.ROLES.MOVE_ROLE_UP_DOWN
|
Constants.PERMISSIONS.ADMIN_AREA.ROLES.MOVE_ROLE_UP_DOWN
|
||||||
) && (
|
) && (
|
||||||
<Route
|
<Route
|
||||||
path="/admin-area/roles"
|
path={Constants.ROUTE_PATHS.ADMIN_AREA_ROLES}
|
||||||
element={
|
element={
|
||||||
<SuspenseFallback>
|
<SuspenseFallback>
|
||||||
<AdminAreaRoles />
|
<AdminAreaRoles />
|
||||||
|
@ -218,7 +207,7 @@ export default function AppRoutes() {
|
||||||
Constants.PERMISSIONS.ADMIN_AREA.LOGS
|
Constants.PERMISSIONS.ADMIN_AREA.LOGS
|
||||||
) && (
|
) && (
|
||||||
<Route
|
<Route
|
||||||
path="/admin-area/logs"
|
path={Constants.ROUTE_PATHS.ADMIN_AREA_LOGS}
|
||||||
element={
|
element={
|
||||||
<SuspenseFallback>
|
<SuspenseFallback>
|
||||||
<AdminAreaLogs />
|
<AdminAreaLogs />
|
||||||
|
|
|
@ -11,7 +11,7 @@ import {
|
||||||
} from "@ant-design/icons";
|
} from "@ant-design/icons";
|
||||||
import { Badge, Divider, Menu } from "antd";
|
import { Badge, Divider, Menu } from "antd";
|
||||||
import Sider from "antd/es/layout/Sider";
|
import Sider from "antd/es/layout/Sider";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
import { useLocation, useNavigate } from "react-router-dom";
|
import { useLocation, useNavigate } from "react-router-dom";
|
||||||
import PropTypes from "prop-types";
|
import PropTypes from "prop-types";
|
||||||
import { Constants, hasOnePermission, hasPermission } from "../../utils";
|
import { Constants, hasOnePermission, hasPermission } from "../../utils";
|
||||||
|
@ -19,6 +19,8 @@ import { useTranslation } from "react-i18next";
|
||||||
import { MyUserAvatar } from "../MyAvatar";
|
import { MyUserAvatar } from "../MyAvatar";
|
||||||
import { useSideBarContext } from "../../Contexts/SideBarContext";
|
import { useSideBarContext } from "../../Contexts/SideBarContext";
|
||||||
import { useAppContext } from "../../Contexts/AppContext";
|
import { useAppContext } from "../../Contexts/AppContext";
|
||||||
|
import { useWebSocketContext } from "../../Contexts/WebSocketContext";
|
||||||
|
import { SentMessagesCommands } from "../../Handlers/WebSocketMessageHandler";
|
||||||
|
|
||||||
export default function SideMenu({
|
export default function SideMenu({
|
||||||
userSession,
|
userSession,
|
||||||
|
@ -27,12 +29,12 @@ export default function SideMenu({
|
||||||
setIsSideMenuCollapsed,
|
setIsSideMenuCollapsed,
|
||||||
}) {
|
}) {
|
||||||
const appContext = useAppContext();
|
const appContext = useAppContext();
|
||||||
|
const webSocketContext = useWebSocketContext();
|
||||||
const sideBarContext = useSideBarContext();
|
const sideBarContext = useSideBarContext();
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const [selectedKeys, setSelectedKeys] = useState("/");
|
const [selectedKeys, setSelectedKeys] = useState("/");
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
const lastSubscribedTopic = useRef("");
|
||||||
useEffect(() => setSelectedKeys(location.pathname), [location.pathname]);
|
|
||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
@ -70,7 +72,7 @@ export default function SideMenu({
|
||||||
items.push({
|
items.push({
|
||||||
label: t("sideMenu.equipmentDocumentation"),
|
label: t("sideMenu.equipmentDocumentation"),
|
||||||
icon: <BookOutlined />,
|
icon: <BookOutlined />,
|
||||||
key: "/equipment-documentation",
|
key: Constants.ROUTE_PATHS.EQUIPMENT_DOCUMENTATION,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -148,7 +150,7 @@ export default function SideMenu({
|
||||||
adminArea.children.push({
|
adminArea.children.push({
|
||||||
label: t("sideMenu.adminArea.roles"),
|
label: t("sideMenu.adminArea.roles"),
|
||||||
icon: <UsergroupAddOutlined />,
|
icon: <UsergroupAddOutlined />,
|
||||||
key: "/admin-area/roles",
|
key: Constants.ROUTE_PATHS.ADMIN_AREA_ROLES,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +163,7 @@ export default function SideMenu({
|
||||||
adminArea.children.push({
|
adminArea.children.push({
|
||||||
label: t("sideMenu.adminArea.logs"),
|
label: t("sideMenu.adminArea.logs"),
|
||||||
icon: <FileTextOutlined />,
|
icon: <FileTextOutlined />,
|
||||||
key: "/admin-area/logs",
|
key: Constants.ROUTE_PATHS.ADMIN_AREA_LOGS,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -184,7 +186,7 @@ export default function SideMenu({
|
||||||
items.push({
|
items.push({
|
||||||
icon: <ScanOutlined />,
|
icon: <ScanOutlined />,
|
||||||
label: getCurrentUsedScannerName(),
|
label: getCurrentUsedScannerName(),
|
||||||
key: "/scanners",
|
key: Constants.ROUTE_PATHS.SCANNERS,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,12 +203,12 @@ export default function SideMenu({
|
||||||
}`}
|
}`}
|
||||||
/>
|
/>
|
||||||
),
|
),
|
||||||
key: "/users",
|
key: Constants.ROUTE_PATHS.USERS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: ` ${sideBarContext.username}`,
|
label: ` ${sideBarContext.username}`,
|
||||||
icon: <MyUserAvatar avatar={sideBarContext.avatar} />,
|
icon: <MyUserAvatar avatar={sideBarContext.avatar} />,
|
||||||
key: "/user-profile",
|
key: Constants.ROUTE_PATHS.USER_PROFILE,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
label: t("sideMenu.logout"),
|
label: t("sideMenu.logout"),
|
||||||
|
@ -230,6 +232,22 @@ export default function SideMenu({
|
||||||
return items;
|
return items;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log("useeffect side menu");
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
console.log("useeffect side menu 2");
|
||||||
|
|
||||||
|
setSelectedKeys(location.pathname);
|
||||||
|
|
||||||
|
lastSubscribedTopic.current = location.pathname;
|
||||||
|
|
||||||
|
webSocketContext.SendSocketMessage(SentMessagesCommands.SubscribeToTopic, {
|
||||||
|
topic: location.pathname,
|
||||||
|
});
|
||||||
|
}, [location.pathname]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Sider
|
<Sider
|
||||||
theme="light"
|
theme="light"
|
||||||
|
@ -274,7 +292,6 @@ export default function SideMenu({
|
||||||
theme="light"
|
theme="light"
|
||||||
selectedKeys={[selectedKeys]}
|
selectedKeys={[selectedKeys]}
|
||||||
items={getFirstMenuItems()}
|
items={getFirstMenuItems()}
|
||||||
openKeys={["/admin-area", "/group-tasks"]}
|
|
||||||
defaultOpenKeys={["/admin-area", "/group-tasks"]}
|
defaultOpenKeys={["/admin-area", "/group-tasks"]}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -2,7 +2,6 @@ import { createContext, useContext, useEffect, useRef } from "react";
|
||||||
import { Constants, myFetch } from "../utils";
|
import { Constants, myFetch } from "../utils";
|
||||||
import { useSideBarContext } from "./SideBarContext";
|
import { useSideBarContext } from "./SideBarContext";
|
||||||
import { useAppContext } from "./AppContext";
|
import { useAppContext } from "./AppContext";
|
||||||
import { message } from "antd";
|
|
||||||
import { handleWebSocketMessage } from "../Handlers/WebSocketMessageHandler";
|
import { handleWebSocketMessage } from "../Handlers/WebSocketMessageHandler";
|
||||||
import { useGroupTasksContext } from "./GroupTasksContext";
|
import { useGroupTasksContext } from "./GroupTasksContext";
|
||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
|
@ -23,6 +22,7 @@ export default function WebSocketProvider({
|
||||||
notificationApi,
|
notificationApi,
|
||||||
}) {
|
}) {
|
||||||
const ws = useRef(null);
|
const ws = useRef(null);
|
||||||
|
const wsMessageCache = useRef([]);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const appContext = useAppContext();
|
const appContext = useAppContext();
|
||||||
const sideBarContext = useSideBarContext();
|
const sideBarContext = useSideBarContext();
|
||||||
|
@ -49,6 +49,15 @@ export default function WebSocketProvider({
|
||||||
sideBarContext.setAvatar(data.Avatar);
|
sideBarContext.setAvatar(data.Avatar);
|
||||||
sideBarContext.setAvailableCategoryGroups(data.AvailableCategoryGroups);
|
sideBarContext.setAvailableCategoryGroups(data.AvailableCategoryGroups);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (wsMessageCache.current.length > 0) {
|
||||||
|
// send cached messages
|
||||||
|
wsMessageCache.current.forEach((message) => {
|
||||||
|
ws.current.send(JSON.stringify(message));
|
||||||
|
});
|
||||||
|
|
||||||
|
wsMessageCache.current = [];
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ws.current.onmessage = (event) => {
|
ws.current.onmessage = (event) => {
|
||||||
|
@ -88,7 +97,7 @@ export default function WebSocketProvider({
|
||||||
};
|
};
|
||||||
|
|
||||||
const SendSocketMessage = (cmd, body) => {
|
const SendSocketMessage = (cmd, body) => {
|
||||||
if (isWebSocketReady) {
|
if (isWebSocketReady && ws.current !== null) {
|
||||||
ws.current.send(JSON.stringify({ Cmd: cmd, Body: body }));
|
ws.current.send(JSON.stringify({ Cmd: cmd, Body: body }));
|
||||||
} else {
|
} else {
|
||||||
/*notificationApi["error"]({
|
/*notificationApi["error"]({
|
||||||
|
@ -96,7 +105,9 @@ export default function WebSocketProvider({
|
||||||
description: `Please check your internet connection`,
|
description: `Please check your internet connection`,
|
||||||
}); */
|
}); */
|
||||||
|
|
||||||
message.error(`Websocket is not ready`);
|
wsMessageCache.current.push({ Cmd: cmd, Body: body });
|
||||||
|
|
||||||
|
// message.error(`Websocket is not ready`);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@ export const ReceivedMessagesCommands = {
|
||||||
InstallingGlobalPythonPackages: 36,
|
InstallingGlobalPythonPackages: 36,
|
||||||
InstallingGlobalPythonPackagesFailed: 37,
|
InstallingGlobalPythonPackagesFailed: 37,
|
||||||
InstallingGlobalPythonPackagesFinished: 38,
|
InstallingGlobalPythonPackagesFinished: 38,
|
||||||
|
UpdateUsers: 39,
|
||||||
};
|
};
|
||||||
|
|
||||||
// commands sent to the backend server
|
// commands sent to the backend server
|
||||||
|
@ -69,6 +70,7 @@ export const SentMessagesCommands = {
|
||||||
DeleteUserApiKey: 20,
|
DeleteUserApiKey: 20,
|
||||||
GroupTasksInstallPythonPackages: 21,
|
GroupTasksInstallPythonPackages: 21,
|
||||||
GroupTasksInstallGlobalPythonPackages: 22,
|
GroupTasksInstallGlobalPythonPackages: 22,
|
||||||
|
SubscribeToTopic: 23,
|
||||||
};
|
};
|
||||||
|
|
||||||
export function handleWebSocketMessage(
|
export function handleWebSocketMessage(
|
||||||
|
@ -89,20 +91,7 @@ export function handleWebSocketMessage(
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case ReceivedMessagesCommands.UpdateConnectedUsers:
|
case ReceivedMessagesCommands.UpdateConnectedUsers:
|
||||||
sideBarContext.setConnectedUsers(body.WebSocketUsersCount);
|
sideBarContext.setConnectedUsers(body);
|
||||||
|
|
||||||
usersContext.setUsers((arr) => {
|
|
||||||
const newArr = [...arr];
|
|
||||||
|
|
||||||
const arrIndex = arr.findIndex((arr1) => arr1.Id === body.UserId);
|
|
||||||
|
|
||||||
if (arrIndex !== -1) {
|
|
||||||
newArr[arrIndex].ConnectionStatus = body.ConnectionStatus;
|
|
||||||
newArr[arrIndex].LastOnline = body.LastOnline;
|
|
||||||
}
|
|
||||||
|
|
||||||
return newArr;
|
|
||||||
});
|
|
||||||
break;
|
break;
|
||||||
case ReceivedMessagesCommands.NewGroupTaskStarted:
|
case ReceivedMessagesCommands.NewGroupTaskStarted:
|
||||||
groupTasksContext.setGroupTasks((arr) => [...arr, body]);
|
groupTasksContext.setGroupTasks((arr) => [...arr, body]);
|
||||||
|
@ -955,6 +944,20 @@ export function handleWebSocketMessage(
|
||||||
description: `You can now continue with the work`,
|
description: `You can now continue with the work`,
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
|
case ReceivedMessagesCommands.UpdateUsers:
|
||||||
|
usersContext.setUsers((arr) => {
|
||||||
|
const newArr = [...arr];
|
||||||
|
|
||||||
|
const arrIndex = arr.findIndex((arr1) => arr1.Id === body.UserId);
|
||||||
|
|
||||||
|
if (arrIndex !== -1) {
|
||||||
|
newArr[arrIndex].ConnectionStatus = body.ConnectionStatus;
|
||||||
|
newArr[arrIndex].LastOnline = body.LastOnline;
|
||||||
|
}
|
||||||
|
|
||||||
|
return newArr;
|
||||||
|
});
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
console.error("unknown command", cmd);
|
console.error("unknown command", cmd);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -12,12 +12,7 @@ import {
|
||||||
Typography,
|
Typography,
|
||||||
notification,
|
notification,
|
||||||
} from "antd";
|
} from "antd";
|
||||||
import {
|
import { Constants, hasPermission, myFetch } from "../../../utils";
|
||||||
Constants,
|
|
||||||
SentMessagesCommands,
|
|
||||||
hasPermission,
|
|
||||||
myFetch,
|
|
||||||
} from "../../../utils";
|
|
||||||
import {
|
import {
|
||||||
ArrowDownOutlined,
|
ArrowDownOutlined,
|
||||||
ArrowUpOutlined,
|
ArrowUpOutlined,
|
||||||
|
@ -34,6 +29,7 @@ import { MyAvatar } from "../../../Components/MyAvatar";
|
||||||
import { useAdminAreaRolesContext } from "../../../Contexts/AdminAreaRolesContext";
|
import { useAdminAreaRolesContext } from "../../../Contexts/AdminAreaRolesContext";
|
||||||
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
||||||
import { useAppContext } from "../../../Contexts/AppContext";
|
import { useAppContext } from "../../../Contexts/AppContext";
|
||||||
|
import { SentMessagesCommands } from "../../../Handlers/WebSocketMessageHandler";
|
||||||
|
|
||||||
const { useBreakpoint } = Grid;
|
const { useBreakpoint } = Grid;
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,11 @@
|
||||||
import { Form, Input, Select } from "antd";
|
import { Form, Input, Select } from "antd";
|
||||||
import Modal from "antd/es/modal/Modal";
|
import Modal from "antd/es/modal/Modal";
|
||||||
import {
|
import { Constants, EncodeStringToBase64, isEmailValid } from "../../utils";
|
||||||
Constants,
|
|
||||||
EncodeStringToBase64,
|
|
||||||
SentMessagesCommands,
|
|
||||||
isEmailValid,
|
|
||||||
} from "../../utils";
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useWebSocketContext } from "../../Contexts/WebSocketContext";
|
import { useWebSocketContext } from "../../Contexts/WebSocketContext";
|
||||||
import { useUsersContext } from "../../Contexts/UsersContext";
|
import { useUsersContext } from "../../Contexts/UsersContext";
|
||||||
|
import { SentMessagesCommands } from "../../Handlers/WebSocketMessageHandler";
|
||||||
|
|
||||||
export default function CreateUserModal({ isModalOpen, setIsModalOpen }) {
|
export default function CreateUserModal({ isModalOpen, setIsModalOpen }) {
|
||||||
const webSocketContext = useWebSocketContext();
|
const webSocketContext = useWebSocketContext();
|
||||||
|
|
|
@ -11,7 +11,6 @@ import {
|
||||||
import {
|
import {
|
||||||
Constants,
|
Constants,
|
||||||
FormatDatetime,
|
FormatDatetime,
|
||||||
SentMessagesCommands,
|
|
||||||
getConnectionStatusItem,
|
getConnectionStatusItem,
|
||||||
hasOnePermission,
|
hasOnePermission,
|
||||||
hasPermission,
|
hasPermission,
|
||||||
|
@ -26,6 +25,7 @@ import { MyAvatar } from "../../Components/MyAvatar";
|
||||||
import { useUsersContext } from "../../Contexts/UsersContext";
|
import { useUsersContext } from "../../Contexts/UsersContext";
|
||||||
import { useAppContext } from "../../Contexts/AppContext";
|
import { useAppContext } from "../../Contexts/AppContext";
|
||||||
import { useWebSocketContext } from "../../Contexts/WebSocketContext";
|
import { useWebSocketContext } from "../../Contexts/WebSocketContext";
|
||||||
|
import { SentMessagesCommands } from "../../Handlers/WebSocketMessageHandler";
|
||||||
|
|
||||||
export default function AllUsers() {
|
export default function AllUsers() {
|
||||||
const webSocketContext = useWebSocketContext();
|
const webSocketContext = useWebSocketContext();
|
||||||
|
|
|
@ -19,7 +19,6 @@ import {
|
||||||
Constants,
|
Constants,
|
||||||
FormatDatetime,
|
FormatDatetime,
|
||||||
GetDuration,
|
GetDuration,
|
||||||
SentMessagesCommands,
|
|
||||||
hasOneXYPermission,
|
hasOneXYPermission,
|
||||||
hasXYPermission,
|
hasXYPermission,
|
||||||
} from "../../../utils";
|
} from "../../../utils";
|
||||||
|
@ -27,6 +26,7 @@ import { useTranslation } from "react-i18next";
|
||||||
import { MyAvatar } from "../../../Components/MyAvatar";
|
import { MyAvatar } from "../../../Components/MyAvatar";
|
||||||
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
||||||
import { useAppContext } from "../../../Contexts/AppContext";
|
import { useAppContext } from "../../../Contexts/AppContext";
|
||||||
|
import { SentMessagesCommands } from "../../../Handlers/WebSocketMessageHandler";
|
||||||
|
|
||||||
const { useBreakpoint } = Grid;
|
const { useBreakpoint } = Grid;
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,6 @@ import { useNavigate, useParams } from "react-router-dom";
|
||||||
import {
|
import {
|
||||||
Constants,
|
Constants,
|
||||||
FormatDatetime,
|
FormatDatetime,
|
||||||
SentMessagesCommands,
|
|
||||||
GetDuration,
|
GetDuration,
|
||||||
getUserId,
|
getUserId,
|
||||||
GroupTasksStepsLockedAndUserUpdateInputValueRememberId,
|
GroupTasksStepsLockedAndUserUpdateInputValueRememberId,
|
||||||
|
@ -38,6 +37,7 @@ import MyAttachments from "../../../Components/MyAttachments";
|
||||||
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
||||||
import { useGroupTasksContext } from "../../../Contexts/GroupTasksContext";
|
import { useGroupTasksContext } from "../../../Contexts/GroupTasksContext";
|
||||||
import { useAppContext } from "../../../Contexts/AppContext";
|
import { useAppContext } from "../../../Contexts/AppContext";
|
||||||
|
import { SentMessagesCommands } from "../../../Handlers/WebSocketMessageHandler";
|
||||||
|
|
||||||
export default function GroupTasksViewModal({ isOpen }) {
|
export default function GroupTasksViewModal({ isOpen }) {
|
||||||
const webSocketContext = useWebSocketContext();
|
const webSocketContext = useWebSocketContext();
|
||||||
|
|
|
@ -10,12 +10,13 @@ import {
|
||||||
Tag,
|
Tag,
|
||||||
notification,
|
notification,
|
||||||
} from "antd";
|
} from "antd";
|
||||||
import { SentMessagesCommands, GetUuid } from "../../../utils";
|
import { GetUuid } from "../../../utils";
|
||||||
import { InfoCircleOutlined } from "@ant-design/icons";
|
import { InfoCircleOutlined } from "@ant-design/icons";
|
||||||
import TextArea from "antd/es/input/TextArea";
|
import TextArea from "antd/es/input/TextArea";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
||||||
import { useGroupTasksContext } from "../../../Contexts/GroupTasksContext";
|
import { useGroupTasksContext } from "../../../Contexts/GroupTasksContext";
|
||||||
|
import { SentMessagesCommands } from "../../../Handlers/WebSocketMessageHandler";
|
||||||
|
|
||||||
export default function GroupTypeSelectionModal({
|
export default function GroupTypeSelectionModal({
|
||||||
isOpen,
|
isOpen,
|
||||||
|
|
|
@ -3,12 +3,7 @@ import { useEffect, useRef, useState } from "react";
|
||||||
import GroupTasksViewModal from "./GroupTasksViewModal";
|
import GroupTasksViewModal from "./GroupTasksViewModal";
|
||||||
import GroupTypeSelectionModal from "./GroupTypeSelectionModal";
|
import GroupTypeSelectionModal from "./GroupTypeSelectionModal";
|
||||||
import GroupTaskTableList from "./GroupTasksTableList";
|
import GroupTaskTableList from "./GroupTasksTableList";
|
||||||
import {
|
import { Constants, hasPermission, myFetch } from "../../../utils";
|
||||||
Constants,
|
|
||||||
SentMessagesCommands,
|
|
||||||
hasPermission,
|
|
||||||
myFetch,
|
|
||||||
} from "../../../utils";
|
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { ReloadOutlined } from "@ant-design/icons";
|
import { ReloadOutlined } from "@ant-design/icons";
|
||||||
import { useGroupTasksContext } from "../../../Contexts/GroupTasksContext";
|
import { useGroupTasksContext } from "../../../Contexts/GroupTasksContext";
|
||||||
|
@ -16,6 +11,7 @@ import { useAppContext } from "../../../Contexts/AppContext";
|
||||||
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
import { useWebSocketContext } from "../../../Contexts/WebSocketContext";
|
||||||
import { useParams } from "react-router-dom";
|
import { useParams } from "react-router-dom";
|
||||||
import MyPagination from "../../../Components/MyPagination";
|
import MyPagination from "../../../Components/MyPagination";
|
||||||
|
import { SentMessagesCommands } from "../../../Handlers/WebSocketMessageHandler";
|
||||||
|
|
||||||
export default function GroupTasks({ isGroupTasksViewModalOpen }) {
|
export default function GroupTasks({ isGroupTasksViewModalOpen }) {
|
||||||
const webSocketContext = useWebSocketContext();
|
const webSocketContext = useWebSocketContext();
|
||||||
|
@ -31,6 +27,7 @@ export default function GroupTasks({ isGroupTasksViewModalOpen }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const [paginationPage, setPaginationPage] = useState(1);
|
const [paginationPage, setPaginationPage] = useState(1);
|
||||||
const totalPages = useRef(0);
|
const totalPages = useRef(0);
|
||||||
|
const previousParamCategory = useRef(null);
|
||||||
|
|
||||||
const showGroupTypeSelectionModal = (categoryGroup) => {
|
const showGroupTypeSelectionModal = (categoryGroup) => {
|
||||||
setCurrentCategoryGroup(categoryGroup);
|
setCurrentCategoryGroup(categoryGroup);
|
||||||
|
@ -62,10 +59,24 @@ export default function GroupTasks({ isGroupTasksViewModalOpen }) {
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (paginationPage === 1) {
|
// initially previousParamCategory.current is null on first render
|
||||||
fetchGroupTasks(1);
|
if (previousParamCategory.current === null) {
|
||||||
|
previousParamCategory.current = paramCategory;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (paramCategory !== previousParamCategory.current) {
|
||||||
|
previousParamCategory.current = paramCategory;
|
||||||
|
|
||||||
|
if (paginationPage === 1) {
|
||||||
|
// if we are on page 1, we need to fetch the new category group
|
||||||
|
fetchGroupTasks(1);
|
||||||
|
} else {
|
||||||
|
// if we are not on page 1, we need to reset the page to 1 and this will trigger the useEffect below
|
||||||
|
setPaginationPage(1);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
setPaginationPage(1);
|
fetchGroupTasks(paginationPage);
|
||||||
}
|
}
|
||||||
}, [paramCategory]);
|
}, [paramCategory]);
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,6 @@ import {
|
||||||
Constants,
|
Constants,
|
||||||
EncodeStringToBase64,
|
EncodeStringToBase64,
|
||||||
FormatDatetime,
|
FormatDatetime,
|
||||||
SentMessagesCommands,
|
|
||||||
getConnectionStatusItem,
|
getConnectionStatusItem,
|
||||||
getUserSessionFromLocalStorage,
|
getUserSessionFromLocalStorage,
|
||||||
hasPermission,
|
hasPermission,
|
||||||
|
@ -40,6 +39,7 @@ import { useUserProfileContext } from "../../Contexts/UserProfileContext";
|
||||||
import { useWebSocketContext } from "../../Contexts/WebSocketContext";
|
import { useWebSocketContext } from "../../Contexts/WebSocketContext";
|
||||||
import { useAppContext } from "../../Contexts/AppContext";
|
import { useAppContext } from "../../Contexts/AppContext";
|
||||||
import { useSideBarContext } from "../../Contexts/SideBarContext";
|
import { useSideBarContext } from "../../Contexts/SideBarContext";
|
||||||
|
import { SentMessagesCommands } from "../../Handlers/WebSocketMessageHandler";
|
||||||
|
|
||||||
export default function UserProfile() {
|
export default function UserProfile() {
|
||||||
const webSocketContext = useWebSocketContext();
|
const webSocketContext = useWebSocketContext();
|
||||||
|
|
|
@ -49,6 +49,11 @@ export const Constants = {
|
||||||
EQUIPMENT_DOCUMENTATION_VIEW: "/equipment-documentation/",
|
EQUIPMENT_DOCUMENTATION_VIEW: "/equipment-documentation/",
|
||||||
GROUP_TASKS: "/group-tasks/",
|
GROUP_TASKS: "/group-tasks/",
|
||||||
GROUP_TASKS_HISTORY: "/group-tasks-history",
|
GROUP_TASKS_HISTORY: "/group-tasks-history",
|
||||||
|
USERS: "/users",
|
||||||
|
SCANNERS: "/scanners",
|
||||||
|
USER_PROFILE: "/user-profile",
|
||||||
|
ADMIN_AREA_ROLES: "/admin-area/roles",
|
||||||
|
ADMIN_AREA_LOGS: "/admin-area/logs",
|
||||||
},
|
},
|
||||||
GROUP_TASKS_STATUS: {
|
GROUP_TASKS_STATUS: {
|
||||||
FINISHED: 1,
|
FINISHED: 1,
|
||||||
|
@ -224,6 +229,7 @@ let webSocketContextPreview = {
|
||||||
|
|
||||||
//export const WebSocketContext = createContext(webSocketContextPreview);
|
//export const WebSocketContext = createContext(webSocketContextPreview);
|
||||||
|
|
||||||
|
/*
|
||||||
// commands received from the backend server
|
// commands received from the backend server
|
||||||
export const ReceivedMessagesCommands = {
|
export const ReceivedMessagesCommands = {
|
||||||
InitUserSocketConnection: 1,
|
InitUserSocketConnection: 1,
|
||||||
|
@ -290,7 +296,7 @@ export const SentMessagesCommands = {
|
||||||
DeleteUserApiKey: 20,
|
DeleteUserApiKey: 20,
|
||||||
GroupTasksInstallPythonPackages: 21,
|
GroupTasksInstallPythonPackages: 21,
|
||||||
GroupTasksInstallGlobalPythonPackages: 22,
|
GroupTasksInstallGlobalPythonPackages: 22,
|
||||||
};
|
}; */
|
||||||
/*
|
/*
|
||||||
export function WebSocketProvider({
|
export function WebSocketProvider({
|
||||||
children,
|
children,
|
||||||
|
|
Loading…
Reference in New Issue