From d7fc67fc5a3e875675f48c7a6770d047fb471286 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Thu, 10 Oct 2024 10:26:19 -0600 Subject: [PATCH 01/27] Adding useAppDispatch --- webapp/src/App.tsx | 10 ++--- webapp/src/Dashboard.tsx | 8 ++-- webapp/src/components/Header.tsx | 7 ++- webapp/src/components/RsuFirmwareMenu.tsx | 7 ++- webapp/src/components/RsuRebootMenu.tsx | 5 ++- webapp/src/components/SnmpsetMenu.tsx | 7 ++- webapp/src/components/SnmpwalkMenu.tsx | 7 ++- webapp/src/components/VerticalTabs.tsx | 7 +-- .../intersections/DataSelectorPage.tsx | 9 ++-- .../intersections/map/BaseMapPage.tsx | 6 +-- .../intersections/map/NotificationMapPage.tsx | 13 +----- .../AdminAddNotification.tsx | 7 ++- .../AdminAddOrganization.tsx | 6 +-- .../src/features/adminAddRsu/AdminAddRsu.tsx | 7 ++- .../features/adminAddUser/AdminAddUser.tsx | 7 ++- .../AdminEditNotification.tsx | 7 ++- .../AdminEditOrganization.tsx | 7 ++- .../features/adminEditRsu/AdminEditRsu.tsx | 8 ++-- .../features/adminEditUser/AdminEditUser.tsx | 8 ++-- .../AdminNotificationTab.tsx | 7 ++- .../AdminOrganizationTab.tsx | 9 ++-- .../AdminOrganizationTabRsu.tsx | 7 ++- .../AdminOrganizationTabUser.tsx | 7 ++- .../src/features/adminRsuTab/AdminRsuTab.tsx | 7 ++- .../features/adminUserTab/AdminUserTab.tsx | 9 ++-- .../data-selector/data-selector-edit-form.tsx | 9 ++-- .../intersection-selection-map.tsx | 9 ++-- .../intersections/map/control-panel.tsx | 7 ++- .../intersections/map/map-component.tsx | 3 +- .../features/intersections/map/side-panel.tsx | 7 ++- webapp/src/features/menu/ConfigureRSU.tsx | 7 ++- webapp/src/features/menu/DisplayCounts.tsx | 7 ++- webapp/src/features/menu/Menu.tsx | 9 ++-- webapp/src/hooks.ts | 7 +++ .../imports/J2735/J2735BsmCoreData.d.ts | 2 +- webapp/src/pages/404.tsx | 7 +-- webapp/src/pages/Admin.tsx | 6 +-- webapp/src/pages/IntersectionDashboard.tsx | 7 ++- webapp/src/pages/IntersectionMapView.tsx | 19 +------- webapp/src/pages/Map.tsx | 43 +++++++++---------- webapp/src/store.tsx | 4 ++ webapp/yarn.lock | 9 +++- 42 files changed, 149 insertions(+), 202 deletions(-) create mode 100644 webapp/src/hooks.ts diff --git a/webapp/src/App.tsx b/webapp/src/App.tsx index 462f7eb4e..08e480820 100644 --- a/webapp/src/App.tsx +++ b/webapp/src/App.tsx @@ -1,25 +1,23 @@ import React, { useEffect } from 'react' import './App.css' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import { // Actions getRsuData, } from './generalSlices/rsuSlice' import { selectAuthLoginData, selectRouteNotFound } from './generalSlices/userSlice' import keycloak from './keycloak-config' -import { ThunkDispatch } from 'redux-thunk' -import { RootState } from './store' -import { AnyAction } from '@reduxjs/toolkit' import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom' import Dashboard from './Dashboard' import { NotFound } from './pages/404' import { theme } from './styles' import { getIntersections } from './generalSlices/intersectionSlice' -import { Toaster, ToastOptions } from 'react-hot-toast' +import { Toaster } from 'react-hot-toast' import { ThemeProvider, StyledEngineProvider } from '@mui/material' +import { useAppDispatch } from './hooks' const App = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const authLoginData = useSelector(selectAuthLoginData) const routeNotFound = useSelector(selectRouteNotFound) diff --git a/webapp/src/Dashboard.tsx b/webapp/src/Dashboard.tsx index b6729d69d..0eb196387 100644 --- a/webapp/src/Dashboard.tsx +++ b/webapp/src/Dashboard.tsx @@ -9,7 +9,7 @@ import Grid from '@mui/material/Grid' import Tabs, { TabItem } from './components/Tabs' import Map from './pages/Map' import './App.css' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import { // Actions getRsuData, @@ -19,19 +19,17 @@ import { SecureStorageManager } from './managers' import { ReactKeycloakProvider } from '@react-keycloak/web' import keycloak from './keycloak-config' import { keycloakLogin } from './generalSlices/userSlice' -import { ThunkDispatch } from 'redux-thunk' -import { RootState } from './store' -import { AnyAction } from '@reduxjs/toolkit' import { Routes, Route, Navigate } from 'react-router-dom' import IntersectionMapView from './pages/IntersectionMapView' import IntersectionDashboard from './pages/IntersectionDashboard' import { NotFound } from './pages/404' import AdminNotificationTab from './features/adminNotificationTab/AdminNotificationTab' +import { useAppDispatch } from './hooks' let loginDispatched = false const Dashboard = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const authLoginData = useSelector(selectAuthLoginData) const loadingGlobal = useSelector(selectLoadingGlobal) const organizationName = useSelector(selectOrganizationName) diff --git a/webapp/src/components/Header.tsx b/webapp/src/components/Header.tsx index dc78cbadb..88201c1c9 100644 --- a/webapp/src/components/Header.tsx +++ b/webapp/src/components/Header.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react' import Grid from '@mui/material/Grid' import logo from '../icons/logo.png' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import EnvironmentVars from '../EnvironmentVars' import { selectOrganizationName, @@ -22,11 +22,10 @@ import { useKeycloak } from '@react-keycloak/web' import './css/Header.css' import ContactSupportMenu from './ContactSupportMenu' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../store' +import { useAppDispatch } from '../hooks' const Header = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const { keycloak } = useKeycloak() const authLoginData = useSelector(selectAuthLoginData) diff --git a/webapp/src/components/RsuFirmwareMenu.tsx b/webapp/src/components/RsuFirmwareMenu.tsx index 4dab22487..3b2d50322 100644 --- a/webapp/src/components/RsuFirmwareMenu.tsx +++ b/webapp/src/components/RsuFirmwareMenu.tsx @@ -1,7 +1,7 @@ import React from 'react' import { confirmAlert } from 'react-confirm-alert' import 'react-confirm-alert/src/react-confirm-alert.css' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import { selectFirmwareUpgradeAvailable, @@ -15,8 +15,7 @@ import { } from '../generalSlices/configSlice' import './css/SnmpwalkMenu.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../store' +import { useAppDispatch } from '../hooks' interface RsuFirmwareMenuProps { type: string @@ -24,7 +23,7 @@ interface RsuFirmwareMenuProps { } const RsuFirmwareMenu = (props: RsuFirmwareMenuProps) => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const firmwareUpgradeAvailable = useSelector(selectFirmwareUpgradeAvailable) const firmwareUpgradeName = useSelector(selectFirmwareUpgradeName) const firmwareUpgradeMsg = useSelector(selectFirmwareUpgradeMsg) diff --git a/webapp/src/components/RsuRebootMenu.tsx b/webapp/src/components/RsuRebootMenu.tsx index e2a8eba5f..b742621ff 100644 --- a/webapp/src/components/RsuRebootMenu.tsx +++ b/webapp/src/components/RsuRebootMenu.tsx @@ -2,7 +2,7 @@ import { ThunkDispatch, AnyAction } from '@reduxjs/toolkit' import React from 'react' import { confirmAlert } from 'react-confirm-alert' import 'react-confirm-alert/src/react-confirm-alert.css' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import { RootState } from '../store' import { @@ -15,9 +15,10 @@ import { import { selectRsuIpv4 } from '../generalSlices/rsuSlice' import './css/SnmpwalkMenu.css' +import { useAppDispatch } from '../hooks' const RsuRebootMenu = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const changeSuccess = useSelector(selectRebootChangeSuccess) const rsuIp = useSelector(selectRsuIpv4) diff --git a/webapp/src/components/SnmpsetMenu.tsx b/webapp/src/components/SnmpsetMenu.tsx index b5dc7365d..9221ed612 100644 --- a/webapp/src/components/SnmpsetMenu.tsx +++ b/webapp/src/components/SnmpsetMenu.tsx @@ -1,6 +1,5 @@ -import { ThunkDispatch, AnyAction } from '@reduxjs/toolkit' import React from 'react' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import { selectDestIp, @@ -15,10 +14,10 @@ import { } from '../generalSlices/configSlice' import { selectRsuIpv4, selectRsuManufacturer } from '../generalSlices/rsuSlice' -import { RootState } from '../store' import './css/SnmpwalkMenu.css' import toast from 'react-hot-toast' +import { useAppDispatch } from '../hooks' export type SnmpsetMenuProps = { type: string @@ -27,7 +26,7 @@ export type SnmpsetMenuProps = { const SnmpsetMenu = (props: SnmpsetMenuProps) => { const { type, rsuIpList } = props - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const destIp = useSelector(selectDestIp) const snmpMsgType = useSelector(selectSnmpMsgType) diff --git a/webapp/src/components/SnmpwalkMenu.tsx b/webapp/src/components/SnmpwalkMenu.tsx index 525e38452..4bdab4e33 100644 --- a/webapp/src/components/SnmpwalkMenu.tsx +++ b/webapp/src/components/SnmpwalkMenu.tsx @@ -1,6 +1,7 @@ import React, { useEffect } from 'react' import SnmpwalkItem from './SnmpwalkItem' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' +import { useAppDispatch } from '../hooks' import { confirmAlert } from 'react-confirm-alert' import { Options } from './AdminDeletionOptions' import { selectRsuManufacturer, selectRsuIpv4 } from '../generalSlices/rsuSlice' @@ -19,13 +20,11 @@ import { deleteSnmpSet, } from '../generalSlices/configSlice' import { IconButton, ThemeProvider, StyledEngineProvider, Tooltip } from '@mui/material' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../store' import toast from 'react-hot-toast' import { snmpWalkMenuTheme } from '../styles' const SnmpwalkMenu = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const msgFwdConfig = useSelector(selectMsgFwdConfig) diff --git a/webapp/src/components/VerticalTabs.tsx b/webapp/src/components/VerticalTabs.tsx index efb1e17a5..4aed100a2 100644 --- a/webapp/src/components/VerticalTabs.tsx +++ b/webapp/src/components/VerticalTabs.tsx @@ -1,14 +1,11 @@ import React, { useEffect, useState } from 'react' -import { useDispatch } from 'react-redux' import { updateTableData as updateRsuTableData } from '../features/adminRsuTab/adminRsuTabSlice' import { getAvailableUsers } from '../features/adminUserTab/adminUserTabSlice' import '../features/adminRsuTab/Admin.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../store' import { Box, Tab, Tabs, Typography } from '@mui/material' import { Link, Navigate, Route, Routes, useLocation } from 'react-router-dom' -import { NotFound } from '../pages/404' +import { useAppDispatch } from '../hooks' interface TabPanelProps { children?: React.ReactNode @@ -47,7 +44,7 @@ interface VerticalTabProps { function VerticalTabs(props: VerticalTabProps) { const { notFoundRoute, defaultTabIndex, tabs } = props - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const location = useLocation() const defaultTabKey = tabs[defaultTabIndex ?? 0]?.path diff --git a/webapp/src/components/intersections/DataSelectorPage.tsx b/webapp/src/components/intersections/DataSelectorPage.tsx index 92e0e7e5d..6d260eda4 100644 --- a/webapp/src/components/intersections/DataSelectorPage.tsx +++ b/webapp/src/components/intersections/DataSelectorPage.tsx @@ -1,4 +1,4 @@ -import React, { useState, useCallback, useEffect } from 'react' +import React, { useEffect } from 'react' import { Box, Container, Typography } from '@mui/material' import EventsApi from '../../apis/intersections/events-api' import AssessmentsApi from '../../apis/intersections/assessments-api' @@ -14,7 +14,7 @@ import JSZip from 'jszip' import FileSaver from 'file-saver' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../generalSlices/intersectionSlice' import { selectToken } from '../../generalSlices/userSlice' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import { selectType, selectEvents, @@ -29,8 +29,7 @@ import { setOpenMapDialog, setRoadRegulatorIntersectionIds, } from '../../features/intersections/data-selector/dataSelectorSlice' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' +import { useAppDispatch } from '../../hooks' // TODO: Support additional event types // - "intersection_reference_alignment" @@ -49,7 +48,7 @@ const valid_counts_event_types: string[] = [ ] const DataSelectorPage = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const intersectionId = useSelector(selectSelectedIntersectionId) const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) diff --git a/webapp/src/components/intersections/map/BaseMapPage.tsx b/webapp/src/components/intersections/map/BaseMapPage.tsx index 7f95d0b68..f5f3c0e07 100644 --- a/webapp/src/components/intersections/map/BaseMapPage.tsx +++ b/webapp/src/components/intersections/map/BaseMapPage.tsx @@ -1,14 +1,10 @@ import React from 'react' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import { Box, Container } from '@mui/material' import IntersectionMap from '../../../features/intersections/map/map-component' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../../store' function BaseMapPage() { - const dispatch: ThunkDispatch = useDispatch() - const intersectionId = useSelector(selectSelectedIntersectionId) const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) diff --git a/webapp/src/components/intersections/map/NotificationMapPage.tsx b/webapp/src/components/intersections/map/NotificationMapPage.tsx index b595296f8..4ef549023 100644 --- a/webapp/src/components/intersections/map/NotificationMapPage.tsx +++ b/webapp/src/components/intersections/map/NotificationMapPage.tsx @@ -1,22 +1,13 @@ import React, { useEffect, useState } from 'react' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import { Box, Container } from '@mui/material' import IntersectionMap from '../../../features/intersections/map/map-component' -import { - selectSelectedIntersectionId, - selectSelectedRoadRegulatorId, - setSelectedIntersectionId, - setSelectedRoadRegulatorId, -} from '../../../generalSlices/intersectionSlice' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../../store' +import { setSelectedIntersectionId, setSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' import NotificationApi from '../../../apis/intersections/notification-api' import { useParams } from 'react-router-dom' import { selectToken } from '../../../generalSlices/userSlice' function NotificationMapPage() { - const dispatch: ThunkDispatch = useDispatch() - const { intersectionId, roadRegulatorId, notificationId } = useParams<{ intersectionId: string roadRegulatorId: string diff --git a/webapp/src/features/adminAddNotification/AdminAddNotification.tsx b/webapp/src/features/adminAddNotification/AdminAddNotification.tsx index dac2eaef7..e626bfc0e 100644 --- a/webapp/src/features/adminAddNotification/AdminAddNotification.tsx +++ b/webapp/src/features/adminAddNotification/AdminAddNotification.tsx @@ -19,15 +19,14 @@ import { getNotificationData, } from './adminAddNotificationSlice' import { selectEmail } from '../../generalSlices/userSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' +import { useAppDispatch } from '../../hooks' const AdminAddNotification = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const successMsg = useSelector(selectSuccessMsg) const apiData = useSelector(selectApiData) const errorState = useSelector(selectErrorState) diff --git a/webapp/src/features/adminAddOrganization/AdminAddOrganization.tsx b/webapp/src/features/adminAddOrganization/AdminAddOrganization.tsx index d0d5bee75..8dd49d7f7 100644 --- a/webapp/src/features/adminAddOrganization/AdminAddOrganization.tsx +++ b/webapp/src/features/adminAddOrganization/AdminAddOrganization.tsx @@ -5,17 +5,15 @@ import { // actions addOrg, } from './adminAddOrganizationSlice' -import { useSelector, useDispatch } from 'react-redux' import toast from 'react-hot-toast' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import Dialog from '@mui/material/Dialog' import { DialogActions, DialogContent, DialogTitle } from '@mui/material' import { useNavigate } from 'react-router-dom' +import { useAppDispatch } from '../../hooks' export type AdminAddOrgForm = { name: string @@ -23,7 +21,7 @@ export type AdminAddOrgForm = { } const AdminAddOrganization = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const notifySuccess = (message: string) => toast.success(message) const notifyError = (message: string) => toast.error(message) const [open, setOpen] = useState(true) diff --git a/webapp/src/features/adminAddRsu/AdminAddRsu.tsx b/webapp/src/features/adminAddRsu/AdminAddRsu.tsx index 0f1bc3d15..b663ce821 100644 --- a/webapp/src/features/adminAddRsu/AdminAddRsu.tsx +++ b/webapp/src/features/adminAddRsu/AdminAddRsu.tsx @@ -28,15 +28,14 @@ import { updateSelectedSnmpVersion, updateSelectedOrganizations, } from './adminAddRsuSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import toast from 'react-hot-toast' import { useNavigate } from 'react-router-dom' import Dialog from '@mui/material/Dialog' import { DialogActions, DialogContent, DialogTitle } from '@mui/material' +import { useAppDispatch } from '../../hooks' export type AdminAddRsuForm = { ip: string @@ -54,7 +53,7 @@ export type AdminAddRsuForm = { } const AdminAddRsu = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const primaryRoutes = useSelector(selectPrimaryRoutes) const selectedRoute = useSelector(selectSelectedRoute) diff --git a/webapp/src/features/adminAddUser/AdminAddUser.tsx b/webapp/src/features/adminAddUser/AdminAddUser.tsx index 1987d0775..dbfba8b76 100644 --- a/webapp/src/features/adminAddUser/AdminAddUser.tsx +++ b/webapp/src/features/adminAddUser/AdminAddUser.tsx @@ -19,19 +19,18 @@ import { submitForm, AdminUserForm, } from './adminAddUserSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import toast from 'react-hot-toast' import { useNavigate } from 'react-router-dom' import Dialog from '@mui/material/Dialog' import { DialogActions, DialogContent, DialogTitle } from '@mui/material' +import { useAppDispatch } from '../../hooks' const AdminAddUser = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const selectedOrganizationNames = useSelector(selectSelectedOrganizationNames) const selectedOrganizations = useSelector(selectSelectedOrganizations) const organizationNames = useSelector(selectOrganizationNames) diff --git a/webapp/src/features/adminEditNotification/AdminEditNotification.tsx b/webapp/src/features/adminEditNotification/AdminEditNotification.tsx index e50f592d0..7137776b3 100644 --- a/webapp/src/features/adminEditNotification/AdminEditNotification.tsx +++ b/webapp/src/features/adminEditNotification/AdminEditNotification.tsx @@ -17,19 +17,18 @@ import { selectSelectedType, selectAvailableTypes, } from './adminEditNotificationSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' -import { ThunkDispatch, AnyAction } from '@reduxjs/toolkit' -import { RootState } from '../../store' import { Link, useParams } from 'react-router-dom' import { selectEditNotificationRowData, selectTableData } from '../adminNotificationTab/adminNotificationTabSlice' import { AdminNotificationForm } from '../adminAddNotification/adminAddNotificationSlice' import { selectEmail } from '../../generalSlices/userSlice' +import { useAppDispatch } from '../../hooks' const AdminEditNotification = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const successMsg = useSelector(selectSuccessMsg) const apiData = useSelector(selectApiData) const errorState = useSelector(selectErrorState) diff --git a/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx b/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx index 73f87bc42..3234b2449 100644 --- a/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx +++ b/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx @@ -9,13 +9,11 @@ import { editOrganization, setSuccessMsg, } from './adminEditOrganizationSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import toast from 'react-hot-toast' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import { AdminOrgSummary, adminOrgPatch, @@ -28,9 +26,10 @@ import { Link, useParams, useNavigate } from 'react-router-dom' import { DialogActions, DialogContent, DialogTitle, Typography } from '@mui/material' import Dialog from '@mui/material/Dialog' import { theme } from '../../styles' +import { useAppDispatch } from '../../hooks' const AdminEditOrganization = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const [open, setOpen] = useState(true) const successMsg = useSelector(selectSuccessMsg) diff --git a/webapp/src/features/adminEditRsu/AdminEditRsu.tsx b/webapp/src/features/adminEditRsu/AdminEditRsu.tsx index aa6eba22b..a9a38a76c 100644 --- a/webapp/src/features/adminEditRsu/AdminEditRsu.tsx +++ b/webapp/src/features/adminEditRsu/AdminEditRsu.tsx @@ -31,17 +31,15 @@ import { setSelectedSnmpVersion, setSelectedOrganizations, } from './adminEditRsuSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import { AdminRsu } from '../../models/Rsu' import { Link, useNavigate, useParams } from 'react-router-dom' import { selectTableData, updateTableData } from '../adminRsuTab/adminRsuTabSlice' import { Dialog, DialogActions, DialogContent, DialogTitle, Typography } from '@mui/material' -import { theme } from '../../styles' import toast from 'react-hot-toast' +import { useAppDispatch } from '../../hooks' export type AdminEditRsuFormType = { orig_ip: string @@ -64,7 +62,7 @@ export type AdminEditRsuFormType = { } const AdminEditRsu = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const apiData = useSelector(selectApiData) const primaryRoutes = useSelector(selectPrimaryRoutes) const selectedRoute = useSelector(selectSelectedRoute) diff --git a/webapp/src/features/adminEditUser/AdminEditUser.tsx b/webapp/src/features/adminEditUser/AdminEditUser.tsx index adc61a5d5..f02a9110b 100644 --- a/webapp/src/features/adminEditUser/AdminEditUser.tsx +++ b/webapp/src/features/adminEditUser/AdminEditUser.tsx @@ -17,21 +17,19 @@ import { updateOrganizations, UserApiDataOrgs, } from './adminEditUserSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' -import { ThunkDispatch, AnyAction } from '@reduxjs/toolkit' -import { RootState } from '../../store' import { Link, useNavigate, useParams } from 'react-router-dom' import { getAvailableUsers, selectTableData } from '../adminUserTab/adminUserTabSlice' import { DialogActions, DialogContent, DialogTitle, Typography } from '@mui/material' import Dialog from '@mui/material/Dialog' -import { theme } from '../../styles' import toast from 'react-hot-toast' +import { useAppDispatch } from '../../hooks' const AdminEditUser = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const selectedOrganizationNames = useSelector(selectSelectedOrganizationNames) const selectedOrganizations = useSelector(selectSelectedOrganizations) const organizationNames = useSelector(selectOrganizationNames) diff --git a/webapp/src/features/adminNotificationTab/AdminNotificationTab.tsx b/webapp/src/features/adminNotificationTab/AdminNotificationTab.tsx index dfd081d62..1e11c4512 100644 --- a/webapp/src/features/adminNotificationTab/AdminNotificationTab.tsx +++ b/webapp/src/features/adminNotificationTab/AdminNotificationTab.tsx @@ -13,11 +13,9 @@ import { setActiveDiv, setEditNotificationRowData, } from './adminNotificationTabSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import { Action } from '@material-table/core' import { Route, Routes, useLocation, useNavigate } from 'react-router-dom' import { NotFound } from '../../pages/404' @@ -25,6 +23,7 @@ import AdminEditNotification from '../adminEditNotification/AdminEditNotificatio import AdminAddNotification from '../adminAddNotification/AdminAddNotification' import { AdminEmailNotification } from '../../models/Notifications' import { selectEmail } from '../../generalSlices/userSlice' +import { useAppDispatch } from '../../hooks' const getTitle = (activeTab: string) => { if (activeTab === undefined) { @@ -38,7 +37,7 @@ const getTitle = (activeTab: string) => { } const AdminNotificationTab = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const navigate = useNavigate() const location = useLocation() diff --git a/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx b/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx index 75dd7bcb8..973c8fb0c 100644 --- a/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx +++ b/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx @@ -4,7 +4,7 @@ import AdminOrganizationTabRsu from '../adminOrganizationTabRsu/AdminOrganizatio import AdminOrganizationTabUser from '../adminOrganizationTabUser/AdminOrganizationTabUser' import AdminEditOrganization from '../adminEditOrganization/AdminEditOrganization' import AdminOrganizationDeleteMenu from '../../components/AdminOrganizationDeleteMenu' -import { IoChevronBackCircleOutline, IoRefresh } from 'react-icons/io5' +import { IoRefresh } from 'react-icons/io5' import { AiOutlinePlusCircle } from 'react-icons/ai' import Grid from '@mui/material/Grid' import EditIcon from '@mui/icons-material/Edit' @@ -24,15 +24,14 @@ import { setSelectedOrg, AdminOrgSummary, } from './adminOrganizationTabSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' -import { RootState } from '../../store' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' import { Route, Routes, useLocation, useNavigate } from 'react-router-dom' import { NotFound } from '../../pages/404' import toast from 'react-hot-toast' import { changeOrganization, selectOrganizationName, setOrganizationList } from '../../generalSlices/userSlice' +import { useAppDispatch } from '../../hooks' const getTitle = (activeTab: string) => { if (activeTab === undefined) { @@ -46,7 +45,7 @@ const getTitle = (activeTab: string) => { } const AdminOrganizationTab = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const navigate = useNavigate() const location = useLocation() diff --git a/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx b/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx index 45d6493a0..98e3bb63a 100644 --- a/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx +++ b/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx @@ -22,16 +22,15 @@ import { rsuAddMultiple, } from './adminOrganizationTabRsuSlice' import { selectLoadingGlobal } from '../../generalSlices/userSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import { Action, Column } from '@material-table/core' import { AdminOrgRsu } from '../adminOrganizationTab/adminOrganizationTabSlice' import toast from 'react-hot-toast' import { accordionTheme, outerAccordionTheme } from '../../styles' +import { useAppDispatch } from '../../hooks' interface AdminOrganizationTabRsuProps { selectedOrg: string @@ -42,7 +41,7 @@ interface AdminOrganizationTabRsuProps { const AdminOrganizationTabRsu = (props: AdminOrganizationTabRsuProps) => { const { selectedOrg, selectedOrgEmail, updateTableData } = props - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const availableRsuList = useSelector(selectAvailableRsuList) const selectedRsuList = useSelector(selectSelectedRsuList) diff --git a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx index 1144c9a6e..990469b96 100644 --- a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx +++ b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx @@ -31,16 +31,15 @@ import { selectLoadingGlobal, setOrganizationList, } from '../../generalSlices/userSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' -import { RootState } from '../../store' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' import { Action, Column } from '@material-table/core' import { AdminOrgUser } from '../adminOrganizationTab/adminOrganizationTabSlice' import toast from 'react-hot-toast' import { accordionTheme, outerAccordionTheme } from '../../styles' +import { useAppDispatch } from '../../hooks' interface AdminOrganizationTabUserProps { selectedOrg: string @@ -50,7 +49,7 @@ interface AdminOrganizationTabUserProps { } const AdminOrganizationTabUser = (props: AdminOrganizationTabUserProps) => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const { selectedOrg, selectedOrgEmail } = props const availableUserList = useSelector(selectAvailableUserList) const selectedUserList = useSelector(selectSelectedUserList) diff --git a/webapp/src/features/adminRsuTab/AdminRsuTab.tsx b/webapp/src/features/adminRsuTab/AdminRsuTab.tsx index d3b08cc68..9daffe6f8 100644 --- a/webapp/src/features/adminRsuTab/AdminRsuTab.tsx +++ b/webapp/src/features/adminRsuTab/AdminRsuTab.tsx @@ -17,15 +17,14 @@ import { deleteRsu, setEditRsuRowData, } from './adminRsuTabSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import './Admin.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import { Action } from '@material-table/core' import { Route, Routes, useLocation, useNavigate } from 'react-router-dom' import { NotFound } from '../../pages/404' import toast from 'react-hot-toast' +import { useAppDispatch } from '../../hooks' const getTitle = (activeTab: string) => { if (activeTab === undefined) { @@ -39,7 +38,7 @@ const getTitle = (activeTab: string) => { } const AdminRsuTab = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const navigate = useNavigate() const location = useLocation() diff --git a/webapp/src/features/adminUserTab/AdminUserTab.tsx b/webapp/src/features/adminUserTab/AdminUserTab.tsx index 700dd8e75..969603df3 100644 --- a/webapp/src/features/adminUserTab/AdminUserTab.tsx +++ b/webapp/src/features/adminUserTab/AdminUserTab.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react' import AdminAddUser from '../adminAddUser/AdminAddUser' import AdminEditUser from '../adminEditUser/AdminEditUser' import AdminTable from '../../components/AdminTable' -import { IoChevronBackCircleOutline, IoRefresh } from 'react-icons/io5' +import { IoRefresh } from 'react-icons/io5' import { AiOutlinePlusCircle } from 'react-icons/ai' import { confirmAlert } from 'react-confirm-alert' import { Options } from '../../components/AdminDeletionOptions' @@ -17,15 +17,14 @@ import { setActiveDiv, setEditUserRowData, } from './adminUserTabSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import { Action } from '@material-table/core' import { Route, Routes, useLocation, useNavigate } from 'react-router-dom' import { NotFound } from '../../pages/404' import toast from 'react-hot-toast' +import { useAppDispatch } from '../../hooks' const getTitle = (activeTab: string) => { if (activeTab === undefined) { @@ -39,7 +38,7 @@ const getTitle = (activeTab: string) => { } const AdminUserTab = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const navigate = useNavigate() const location = useLocation() diff --git a/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx b/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx index c99f2a83e..4b2139a29 100644 --- a/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx +++ b/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx @@ -22,10 +22,9 @@ import { FormControl, } from '@mui/material' import { FormikCheckboxList } from './formik-checkbox-list' -import { selectDataSelectorForm, selectRoadRegulatorIntersectionIds, setDataSelectorForm } from './dataSelectorSlice' -import { useDispatch, useSelector } from 'react-redux' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../../store' +import { selectDataSelectorForm, setDataSelectorForm } from './dataSelectorSlice' +import { useSelector } from 'react-redux' +import { useAppDispatch } from '../../../hooks' interface Item { label: string @@ -63,7 +62,7 @@ export const DataSelectorEditForm = (props: { dbIntersectionId: number | undefined roadRegulatorIntersectionIds: { [roadRegulatorId: number]: number[] } }) => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const { onQuery, onVisualize, dbIntersectionId, roadRegulatorIntersectionIds, ...other } = props const [visualize, setVisualize] = useState(false) diff --git a/webapp/src/features/intersections/intersection-selector/intersection-selection-map.tsx b/webapp/src/features/intersections/intersection-selector/intersection-selection-map.tsx index 1edcbdba9..5594bf2e9 100644 --- a/webapp/src/features/intersections/intersection-selector/intersection-selection-map.tsx +++ b/webapp/src/features/intersections/intersection-selector/intersection-selection-map.tsx @@ -2,16 +2,15 @@ import React, { useState, useEffect } from 'react' import Map, { Layer, MapRef, Marker, Popup, Source, SymbolLayer } from 'react-map-gl' import mbStyle from '../../../styles/intersectionMapStyle.json' -import { Container, Col } from 'reactstrap' +import { Container } from 'reactstrap' import EnvironmentVars from '../../../EnvironmentVars' import { selectIntersections, selectSelectedIntersection, setSelectedIntersection, } from '../../../generalSlices/intersectionSlice' -import { useDispatch, useSelector } from 'react-redux' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../../store' +import { useSelector } from 'react-redux' +import { useAppDispatch } from '../../../hooks' const getBoundsForIntersections = ( selectedIntersection: IntersectionReferenceData | undefined, @@ -106,7 +105,7 @@ const intersectionLabelsLayer: SymbolLayer = { } const IntersectionMap = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const intersections = useSelector(selectIntersections) const selectedIntersection = useSelector(selectSelectedIntersection) diff --git a/webapp/src/features/intersections/map/control-panel.tsx b/webapp/src/features/intersections/map/control-panel.tsx index a3e7c1d9c..9bd910693 100644 --- a/webapp/src/features/intersections/map/control-panel.tsx +++ b/webapp/src/features/intersections/map/control-panel.tsx @@ -24,9 +24,7 @@ import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp' import { styled } from '@mui/material/styles' import { format } from 'date-fns' import JSZip from 'jszip' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../../store' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import { downloadMapData, handleImportedMapMessageData, @@ -63,6 +61,7 @@ import { import pauseIcon from '../../../icons/pause.png' import playIcon from '../../../icons/play.png' import { BarChart, XAxis, Bar, ResponsiveContainer, Tooltip } from 'recharts' +import { useAppDispatch } from '../../../hooks' const Accordion = styled((props: AccordionProps) => )( ({ theme }) => ({}) @@ -87,7 +86,7 @@ const AccordionSummary = styled((props: AccordionSummaryProps) => ( const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({})) function ControlPanel() { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const signalStateLayerStyle = useSelector(selectSignalStateLayerStyle) diff --git a/webapp/src/features/intersections/map/map-component.tsx b/webapp/src/features/intersections/map/map-component.tsx index 4e08ada79..cb746f5be 100644 --- a/webapp/src/features/intersections/map/map-component.tsx +++ b/webapp/src/features/intersections/map/map-component.tsx @@ -76,6 +76,7 @@ import { RootState } from '../../../store' import { MapLegend } from './map-legend' import { selectSelectedSrm } from '../../../generalSlices/rsuSlice' import mbStyle from '../../../styles/intersectionMapStyle.json' +import { useAppDispatch } from '../../../hooks' export const getTimestamp = (dt: any): number => { try { @@ -100,7 +101,7 @@ type timestamp = { } const IntersectionMap = (props: MAP_PROPS) => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() // userSlice const authToken = useSelector(selectToken) diff --git a/webapp/src/features/intersections/map/side-panel.tsx b/webapp/src/features/intersections/map/side-panel.tsx index 412179822..c84d45d8e 100644 --- a/webapp/src/features/intersections/map/side-panel.tsx +++ b/webapp/src/features/intersections/map/side-panel.tsx @@ -15,11 +15,10 @@ import { MAP_PROPS, selectSrmCount, selectSrmMsgList, selectSrmSsmCount } from ' import { RsuInfo } from '../../../apis/rsu-api-types' import SsmSrmItem from '../../../components/SsmSrmItem' import { setSelectedSrm } from '../../../generalSlices/rsuSlice' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { useDispatch, useSelector } from 'react-redux' -import { RootState } from '../../../store' +import { useSelector } from 'react-redux' import { selectSelectedIntersection } from '../../../generalSlices/intersectionSlice' import '../../../components/css/RsuMapView.css' +import { useAppDispatch } from '../../../hooks' const Accordion = styled((props: AccordionProps) => )( ({ theme }) => ({}) @@ -56,7 +55,7 @@ interface SidePanelProps { export const SidePanel = (props: SidePanelProps) => { const { laneInfo, signalGroups, bsms, events, notifications, sourceData, sourceDataType } = props - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const srmCount = useSelector(selectSrmCount) const srmSsmCount = useSelector(selectSrmSsmCount) diff --git a/webapp/src/features/menu/ConfigureRSU.tsx b/webapp/src/features/menu/ConfigureRSU.tsx index 802a46710..110d19850 100644 --- a/webapp/src/features/menu/ConfigureRSU.tsx +++ b/webapp/src/features/menu/ConfigureRSU.tsx @@ -6,7 +6,7 @@ import RsuFirmwareMenu from '../../components/RsuFirmwareMenu' import Accordion from '@mui/material/Accordion' import AccordionDetails from '@mui/material/AccordionDetails' import AccordionSummary from '@mui/material/AccordionSummary' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import { ThemeProvider, StyledEngineProvider } from '@mui/material' import ExpandMoreIcon from '@mui/icons-material/ExpandMore' import Typography from '@mui/material/Typography' @@ -14,13 +14,12 @@ import { selectSelectedRsu, selectRsu } from '../../generalSlices/rsuSlice' import { clearConfig, selectConfigList } from '../../generalSlices/configSlice' import '../../components/css/SnmpwalkMenu.css' -import { RootState } from '../../store' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' import { accordionTheme } from '../../styles' +import { useAppDispatch } from '../../hooks' const ConfigureRSU = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const [expanded, setExpanded] = useState(undefined) const handleChange = (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => { diff --git a/webapp/src/features/menu/DisplayCounts.tsx b/webapp/src/features/menu/DisplayCounts.tsx index 35677f4e7..690313512 100644 --- a/webapp/src/features/menu/DisplayCounts.tsx +++ b/webapp/src/features/menu/DisplayCounts.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import dayjs from 'dayjs' import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider' import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns' @@ -22,17 +22,16 @@ import { import { selectCurrentSort, selectSortedCountList, sortCountList, changeDate } from './menuSlice' import '../../components/css/SnmpwalkMenu.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' import { CountsListElement } from '../../models/Rsu' import { MessageType } from '../../models/MessageTypes' +import { useAppDispatch } from '../../hooks' const messageTypeOptions = EnvironmentVars.getMessageTypes().map((type) => { return { value: type, label: type } }) const DisplayCounts = () => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const countsMsgType = useSelector(selectMsgType) const startDate = useSelector(selectStartDate) const endDate = useSelector(selectEndDate) diff --git a/webapp/src/features/menu/Menu.tsx b/webapp/src/features/menu/Menu.tsx index 8e6a1339e..c1451e5a9 100644 --- a/webapp/src/features/menu/Menu.tsx +++ b/webapp/src/features/menu/Menu.tsx @@ -1,16 +1,14 @@ import React from 'react' import './Menu.css' import { useEffect } from 'react' -import { useSelector, useDispatch } from 'react-redux' -import { selectRole } from '../../generalSlices/userSlice' +import { useSelector } from 'react-redux' import { selectCountList, selectSelectedRsu } from '../../generalSlices/rsuSlice' import { selectConfigList } from '../../generalSlices/configSlice' import { selectDisplayCounts, selectView, setDisplay, setSortedCountList } from './menuSlice' import { SecureStorageManager } from '../../managers' import DisplayCounts from './DisplayCounts' import ConfigureRSU from './ConfigureRSU' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../../store' +import { useAppDispatch } from '../../hooks' const menuStyle: React.CSSProperties = { background: '#0e2052', @@ -25,8 +23,7 @@ const menuStyle: React.CSSProperties = { } const Menu = () => { - const dispatch: ThunkDispatch = useDispatch() - const userRole = useSelector(selectRole) + const dispatch = useAppDispatch() const countList = useSelector(selectCountList) const selectedRsu = useSelector(selectSelectedRsu) const selectedRsuList = useSelector(selectConfigList) diff --git a/webapp/src/hooks.ts b/webapp/src/hooks.ts new file mode 100644 index 000000000..ebf425025 --- /dev/null +++ b/webapp/src/hooks.ts @@ -0,0 +1,7 @@ +// This file serves as a central hub for re-exporting pre-typed Redux hooks. +import { useDispatch, useSelector } from 'react-redux' +import type { AppDispatch, RootState } from './store' + +// Use throughout your app instead of plain `useDispatch` and `useSelector` +export const useAppDispatch: () => AppDispatch = useDispatch +export const useAppSelector: (selector: (state: RootState) => TSelected) => TSelected = useSelector diff --git a/webapp/src/models/imports/J2735/J2735BsmCoreData.d.ts b/webapp/src/models/imports/J2735/J2735BsmCoreData.d.ts index bb1abf466..4625b7087 100644 --- a/webapp/src/models/imports/J2735/J2735BsmCoreData.d.ts +++ b/webapp/src/models/imports/J2735/J2735BsmCoreData.d.ts @@ -39,7 +39,7 @@ type J2735TransmissionState = | 'UNAVAILABLE' type J2735BrakeSystemStatus = { - wheelBrakes: J2735BitString + wheelBrakes: J2735WheelBrakes traction: string abs: string scs: string diff --git a/webapp/src/pages/404.tsx b/webapp/src/pages/404.tsx index 9b5140a3c..33d53b1d8 100644 --- a/webapp/src/pages/404.tsx +++ b/webapp/src/pages/404.tsx @@ -1,11 +1,8 @@ -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' import React, { useEffect } from 'react' -import { useDispatch } from 'react-redux' -import { Link } from 'react-router-dom' -import { RootState } from '../store' import { setRouteNotFound } from '../generalSlices/userSlice' import { useNavigate } from 'react-router-dom' import { Button, Typography } from '@mui/material' +import { useAppDispatch } from '../hooks' type NotFoundProps = { redirectRoute?: string @@ -21,7 +18,7 @@ export const NotFound = ({ shouldRedirect = false, offsetHeight = 135, }: NotFoundProps) => { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const navigate = useNavigate() useEffect(() => { diff --git a/webapp/src/pages/Admin.tsx b/webapp/src/pages/Admin.tsx index e0a6335da..8d0de64c7 100644 --- a/webapp/src/pages/Admin.tsx +++ b/webapp/src/pages/Admin.tsx @@ -1,10 +1,7 @@ import React, { useEffect } from 'react' -import { useDispatch } from 'react-redux' import { updateTableData as updateRsuTableData } from '../features/adminRsuTab/adminRsuTabSlice' import { getAvailableUsers } from '../features/adminUserTab/adminUserTabSlice' import '../features/adminRsuTab/Admin.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../store' import AdminOrganizationTab from '../features/adminOrganizationTab/AdminOrganizationTab' import AdminRsuTab from '../features/adminRsuTab/AdminRsuTab' import AdminUserTab from '../features/adminUserTab/AdminUserTab' @@ -12,9 +9,10 @@ import { NotFound } from './404' import { SecureStorageManager } from '../managers' import { getUserNotifications } from '../features/adminNotificationTab/adminNotificationTabSlice' import VerticalTabs from '../components/VerticalTabs' +import { useAppDispatch } from '../hooks' function Admin() { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() useEffect(() => { dispatch(updateRsuTableData()) diff --git a/webapp/src/pages/IntersectionDashboard.tsx b/webapp/src/pages/IntersectionDashboard.tsx index 3169aa9b8..2f9f60556 100644 --- a/webapp/src/pages/IntersectionDashboard.tsx +++ b/webapp/src/pages/IntersectionDashboard.tsx @@ -1,12 +1,10 @@ import React, { useEffect, useState } from 'react' -import { useDispatch, useSelector } from 'react-redux' +import { useSelector } from 'react-redux' import { updateTableData as updateRsuTableData } from '../features/adminRsuTab/adminRsuTabSlice' import { getAvailableUsers } from '../features/adminUserTab/adminUserTabSlice' import './css/IntersectionDashboard.css' import './css/NoTableWidth.css' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../store' import { NotFound } from './404' import VerticalTabs from '../components/VerticalTabs' import DashboardPage from '../components/intersections/DashboardPage' @@ -21,9 +19,10 @@ import { } from '../generalSlices/intersectionSlice' import MapIconRounded from '@mui/icons-material/Map' import MapDialog from '../features/intersections/intersection-selector/intersection-selector-dialog' +import { useAppDispatch } from '../hooks' function IntersectionDashboard() { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const intersectionId = useSelector(selectSelectedIntersectionId) const intersections = useSelector(selectIntersections) const [openMapDialog, setOpenMapDialog] = useState(false) diff --git a/webapp/src/pages/IntersectionMapView.tsx b/webapp/src/pages/IntersectionMapView.tsx index 0f1e0bd55..de63efb31 100644 --- a/webapp/src/pages/IntersectionMapView.tsx +++ b/webapp/src/pages/IntersectionMapView.tsx @@ -1,27 +1,12 @@ -import React, { useEffect } from 'react' -import { useDispatch, useSelector } from 'react-redux' -import { Box, Container } from '@mui/material' -import IntersectionMap from '../features/intersections/map/map-component' +import React from 'react' import './css/NoTableWidth.css' -import { - getIntersections, - selectSelectedIntersectionId, - selectSelectedRoadRegulatorId, -} from '../generalSlices/intersectionSlice' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../store' -import { Route, Routes, useLocation, useNavigate } from 'react-router-dom' +import { Route, Routes } from 'react-router-dom' import { NotFound } from './404' import BaseMapPage from '../components/intersections/map/BaseMapPage' import NotificationMapPage from '../components/intersections/map/NotificationMapPage' import IntersectionTsMapPage from '../components/intersections/map/IntersectionTsMapPage' function IntersectionMapView() { - const dispatch: ThunkDispatch = useDispatch() - - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) - return ( } /> diff --git a/webapp/src/pages/Map.tsx b/webapp/src/pages/Map.tsx index 0b4702814..174ae48c1 100644 --- a/webapp/src/pages/Map.tsx +++ b/webapp/src/pages/Map.tsx @@ -61,7 +61,7 @@ import { clearConfig, clearFirmware, } from '../generalSlices/configSlice' -import { useSelector, useDispatch } from 'react-redux' +import { useSelector } from 'react-redux' import ClearIcon from '@mui/icons-material/Clear' import { Button, @@ -80,8 +80,6 @@ import 'rc-slider/assets/index.css' import './css/MsgMap.css' import './css/Map.css' import { WZDxFeature, WZDxWorkZoneFeed } from '../models/wzdx/WzdxWorkZoneFeed42' -import { AnyAction, ThunkDispatch } from '@reduxjs/toolkit' -import { RootState } from '../store' import { intersectionMapLabelsLayer, selectIntersections, @@ -89,6 +87,8 @@ import { setSelectedIntersectionId, } from '../generalSlices/intersectionSlice' import { mapTheme } from '../styles' +import { selectLiveBsmData, startBsmSamples } from '../features/intersections/live/live-intersection-slice' +import { useAppDispatch } from '../hooks' // @ts-ignore: workerClass does not exist in typed mapboxgl // eslint-disable-next-line import/no-webpack-loader-syntax @@ -101,7 +101,7 @@ interface MapPageProps { } function MapPage(props: MapPageProps) { - const dispatch: ThunkDispatch = useDispatch() + const dispatch = useAppDispatch() const organization = useSelector(selectOrganizationName) const rsuData = useSelector(selectRsuData) @@ -133,6 +133,8 @@ function MapPage(props: MapPageProps) { const intersectionsList = useSelector(selectIntersections) const selectedIntersection = useSelector(selectSelectedIntersection) + const liveBsmData = useSelector(selectLiveBsmData) + // Mapbox local state variables const [viewState, setViewState] = useState(EnvironmentVars.getMapboxInitViewState()) @@ -188,7 +190,6 @@ function MapPage(props: MapPageProps) { } // WZDx layer local state variables - const [selectedWZDxMarkerIndex, setSelectedWZDxMarkerIndex] = useState(null) const [selectedWZDxMarker, setSelectedWZDxMarker] = useState(null) const [wzdxMarkers, setWzdxMarkers] = useState([]) const [pageOpen, setPageOpen] = useState(true) @@ -202,13 +203,17 @@ function MapPage(props: MapPageProps) { setSelectedVendor(newVal) } + if (!wzdxMarkers) { + setSelectedWZDxMarker(null) + } + // useEffects for Mapbox useEffect(() => { const listener = (e: KeyboardEvent) => { if (e.key === 'Escape') { dispatch(selectRsu(null)) dispatch(clearFirmware()) - setSelectedWZDxMarkerIndex(null) + setSelectedWZDxMarker(null) } } window.addEventListener('keydown', listener) @@ -216,7 +221,7 @@ function MapPage(props: MapPageProps) { return () => { window.removeEventListener('keydown', listener) } - }, [selectedRsu, dispatch, setSelectedWZDxMarkerIndex]) + }, [selectedRsu, dispatch, setSelectedWZDxMarker]) // useEffects for RSU layer useEffect(() => { @@ -242,7 +247,10 @@ function MapPage(props: MapPageProps) { if (!endGeoMsgDate) { dateChanged(new Date(), 'end') } - }, []) + if (wzdxData?.features?.length === 0) { + dispatch(getWzdxData()) + } + }, [dispatch]) useEffect(() => { if (activeLayers.includes('msg-viewer-layer')) { @@ -362,12 +370,6 @@ function MapPage(props: MapPageProps) { } } - // useEffects for WZDx layers - useEffect(() => { - if (selectedWZDxMarkerIndex !== null) setSelectedWZDxMarker(wzdxMarkers[selectedWZDxMarkerIndex]) - else setSelectedWZDxMarker(null) - }, [selectedWZDxMarkerIndex, wzdxMarkers]) - useEffect(() => { function createPopupTable(data: Array>) { let rows = [] @@ -418,7 +420,7 @@ function MapPage(props: MapPageProps) { } function openPopup(index: number) { - setSelectedWZDxMarkerIndex(index) + setSelectedWZDxMarker(wzdxMarkers[index]) dispatch(selectRsu(null)) dispatch(clearFirmware()) } @@ -491,7 +493,7 @@ function MapPage(props: MapPageProps) { } function closePopup() { - setSelectedWZDxMarkerIndex(null) + setSelectedWZDxMarker(null) } function getStops() { @@ -574,13 +576,10 @@ function MapPage(props: MapPageProps) { dispatch(clearFirmware()) setSelectedRsuCount(null) } else if (id === 'wzdx-layer') { - setSelectedWZDxMarkerIndex(null) + setSelectedWZDxMarker(null) } setActiveLayers(activeLayers.filter((layerId) => layerId !== id)) } else { - if (id === 'wzdx-layer' && wzdxData?.features?.length === 0) { - dispatch(getWzdxData()) - } setActiveLayers([...activeLayers, id]) } } @@ -798,7 +797,7 @@ function MapPage(props: MapPageProps) { onClick={(e) => { e.originalEvent.stopPropagation() dispatch(selectRsu(rsu)) - setSelectedWZDxMarkerIndex(null) + setSelectedWZDxMarker(null) dispatch(clearFirmware()) // TODO: Should remove?? dispatch(getRsuLastOnline(rsu.properties.ipv4_address)) dispatch(getIssScmsStatus()) @@ -813,7 +812,7 @@ function MapPage(props: MapPageProps) { e.stopPropagation() dispatch(selectRsu(rsu)) dispatch(clearFirmware()) // TODO: Should remove?? - setSelectedWZDxMarkerIndex(null) + setSelectedWZDxMarker(null) dispatch(getRsuLastOnline(rsu.properties.ipv4_address)) dispatch(getIssScmsStatus()) if (rsuCounts.hasOwnProperty(rsu.properties.ipv4_address)) diff --git a/webapp/src/store.tsx b/webapp/src/store.tsx index 4bfd8f59f..0e8a33b9f 100644 --- a/webapp/src/store.tsx +++ b/webapp/src/store.tsx @@ -22,6 +22,7 @@ import menuReducer from './features/menu/menuSlice' import intersectionMapReducer from './features/intersections/map/map-slice' import intersectionMapLayerStyleReducer from './features/intersections/map/map-layer-style-slice' import dataSelectorReducer from './features/intersections/data-selector/dataSelectorSlice' +import liveIntersectionReducer from './features/intersections/live/live-intersection-slice' export const setupStore = (preloadedState: any) => { return configureStore({ @@ -49,6 +50,7 @@ export const setupStore = (preloadedState: any) => { intersectionMap: intersectionMapReducer, intersectionMapLayerStyle: intersectionMapLayerStyleReducer, dataSelector: dataSelectorReducer, + liveIntersection: liveIntersectionReducer, }, preloadedState, middleware: (getDefaultMiddleware) => @@ -64,4 +66,6 @@ type AppStore = ReturnType export type AppState = ReturnType type AppThunk = ThunkAction +export type AppDispatch = ReturnType['dispatch'] + export type RootState = ReturnType['getState']> diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 2a3a024d8..ffe69d97c 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -12774,6 +12774,13 @@ rw@^1.3.3: resolved "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" integrity sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q= +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + safe-array-concat@^1.0.0, safe-array-concat@^1.0.1: version "1.1.0" resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz" @@ -13945,7 +13952,7 @@ tslib@^1.8.1: resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.0.3, tslib@^2.4.0: +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: version "2.5.0" resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== From 66e96e6279910506e7297d1ee83e3aaf3bbff82a Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Tue, 15 Oct 2024 09:05:31 -0600 Subject: [PATCH 02/27] Adding useAppSelector --- webapp/src/App.tsx | 7 +- webapp/src/Dashboard.tsx | 9 +-- webapp/src/components/Header.tsx | 17 ++-- webapp/src/components/RsuFirmwareMenu.tsx | 11 ++- webapp/src/components/RsuRebootMenu.tsx | 7 +- webapp/src/components/SnmpsetMenu.tsx | 11 ++- webapp/src/components/SnmpwalkMenu.tsx | 9 +-- .../intersections/ConfigurationPage.tsx | 8 +- .../intersections/DashboardPage.tsx | 9 +-- .../intersections/DataSelectorPage.tsx | 21 +++-- .../components/intersections/DecoderPage.tsx | 8 +- .../src/components/intersections/MapPage.tsx | 9 +-- .../components/intersections/ReportsPage.tsx | 8 +- .../intersections/configuration/create.tsx | 8 +- .../intersections/configuration/edit.tsx | 8 +- .../intersections/configuration/remove.tsx | 10 +-- .../intersections/map/BaseMapPage.tsx | 6 +- .../intersections/map/NotificationMapPage.tsx | 4 +- .../AdminAddNotification.tsx | 19 +++-- .../src/features/adminAddRsu/AdminAddRsu.tsx | 31 ++++---- .../features/adminAddUser/AdminAddUser.tsx | 15 ++-- .../AdminEditNotification.tsx | 21 +++-- .../AdminEditOrganization.tsx | 9 +-- .../features/adminEditRsu/AdminEditRsu.tsx | 35 ++++----- .../features/adminEditUser/AdminEditUser.tsx | 17 ++-- .../AdminNotificationTab.tsx | 9 +-- .../AdminOrganizationTab.tsx | 17 ++-- .../AdminOrganizationTabRsu.tsx | 9 +-- .../AdminOrganizationTabUser.tsx | 15 ++-- .../src/features/adminRsuTab/AdminRsuTab.tsx | 12 ++- .../features/adminUserTab/AdminUserTab.tsx | 7 +- .../configuration-create-form.tsx | 8 +- .../configuration/configuration-edit-form.tsx | 4 +- .../configuration-remove-form.tsx | 6 +- .../data-selector/data-selector-edit-form.tsx | 5 +- .../intersection-selection-map.tsx | 7 +- .../intersections/map/control-panel.tsx | 37 +++++---- .../intersections/map/map-component.tsx | 77 +++++++++--------- .../features/intersections/map/map-legend.tsx | 18 +---- .../features/intersections/map/side-panel.tsx | 11 ++- .../notifications-table-results.tsx | 6 +- .../notifications/notifications-table.tsx | 8 +- .../reports/report-generation-dialog.tsx | 6 +- .../reports/report-list-table.tsx | 4 +- webapp/src/features/menu/ConfigureRSU.tsx | 7 +- webapp/src/features/menu/DisplayCounts.tsx | 21 +++-- webapp/src/features/menu/Menu.tsx | 13 ++-- webapp/src/hooks.ts | 2 +- webapp/src/pages/IntersectionDashboard.tsx | 7 +- webapp/src/pages/Map.tsx | 78 ++++++++++--------- 50 files changed, 335 insertions(+), 376 deletions(-) diff --git a/webapp/src/App.tsx b/webapp/src/App.tsx index 08e480820..aad1621fa 100644 --- a/webapp/src/App.tsx +++ b/webapp/src/App.tsx @@ -1,6 +1,5 @@ import React, { useEffect } from 'react' import './App.css' -import { useSelector } from 'react-redux' import { // Actions getRsuData, @@ -14,12 +13,12 @@ import { theme } from './styles' import { getIntersections } from './generalSlices/intersectionSlice' import { Toaster } from 'react-hot-toast' import { ThemeProvider, StyledEngineProvider } from '@mui/material' -import { useAppDispatch } from './hooks' +import { useAppDispatch, useAppSelector } from './hooks' const App = () => { const dispatch = useAppDispatch() - const authLoginData = useSelector(selectAuthLoginData) - const routeNotFound = useSelector(selectRouteNotFound) + const authLoginData = useAppSelector(selectAuthLoginData) + const routeNotFound = useAppSelector(selectRouteNotFound) useEffect(() => { keycloak diff --git a/webapp/src/Dashboard.tsx b/webapp/src/Dashboard.tsx index 0eb196387..b696e56d8 100644 --- a/webapp/src/Dashboard.tsx +++ b/webapp/src/Dashboard.tsx @@ -9,7 +9,6 @@ import Grid from '@mui/material/Grid' import Tabs, { TabItem } from './components/Tabs' import Map from './pages/Map' import './App.css' -import { useSelector } from 'react-redux' import { // Actions getRsuData, @@ -24,15 +23,15 @@ import IntersectionMapView from './pages/IntersectionMapView' import IntersectionDashboard from './pages/IntersectionDashboard' import { NotFound } from './pages/404' import AdminNotificationTab from './features/adminNotificationTab/AdminNotificationTab' -import { useAppDispatch } from './hooks' +import { useAppDispatch, useAppSelector } from './hooks' let loginDispatched = false const Dashboard = () => { const dispatch = useAppDispatch() - const authLoginData = useSelector(selectAuthLoginData) - const loadingGlobal = useSelector(selectLoadingGlobal) - const organizationName = useSelector(selectOrganizationName) + const authLoginData = useAppSelector(selectAuthLoginData) + const loadingGlobal = useAppSelector(selectLoadingGlobal) + const organizationName = useAppSelector(selectOrganizationName) useEffect(() => { keycloak diff --git a/webapp/src/components/Header.tsx b/webapp/src/components/Header.tsx index 88201c1c9..54981b197 100644 --- a/webapp/src/components/Header.tsx +++ b/webapp/src/components/Header.tsx @@ -1,7 +1,6 @@ import React, { useEffect } from 'react' import Grid from '@mui/material/Grid' import logo from '../icons/logo.png' -import { useSelector } from 'react-redux' import EnvironmentVars from '../EnvironmentVars' import { selectOrganizationName, @@ -22,19 +21,19 @@ import { useKeycloak } from '@react-keycloak/web' import './css/Header.css' import ContactSupportMenu from './ContactSupportMenu' -import { useAppDispatch } from '../hooks' +import { useAppDispatch, useAppSelector } from '../hooks' const Header = () => { const dispatch = useAppDispatch() const { keycloak } = useKeycloak() - const authLoginData = useSelector(selectAuthLoginData) - const organizationName = useSelector(selectOrganizationName) - const userName = useSelector(selectName) - const userEmail = useSelector(selectEmail) - const loginFailure = useSelector(selectLoginFailure) - const kcFailure = useSelector(selectKcFailure) - const loginMessage = useSelector(selectLoginMessage) + const authLoginData = useAppSelector(selectAuthLoginData) + const organizationName = useAppSelector(selectOrganizationName) + const userName = useAppSelector(selectName) + const userEmail = useAppSelector(selectEmail) + const loginFailure = useAppSelector(selectLoginFailure) + const kcFailure = useAppSelector(selectKcFailure) + const loginMessage = useAppSelector(selectLoginMessage) useEffect(() => { const kcFailureDelay = 500000 diff --git a/webapp/src/components/RsuFirmwareMenu.tsx b/webapp/src/components/RsuFirmwareMenu.tsx index 3b2d50322..c236c7f76 100644 --- a/webapp/src/components/RsuFirmwareMenu.tsx +++ b/webapp/src/components/RsuFirmwareMenu.tsx @@ -1,7 +1,6 @@ import React from 'react' import { confirmAlert } from 'react-confirm-alert' import 'react-confirm-alert/src/react-confirm-alert.css' -import { useSelector } from 'react-redux' import { selectFirmwareUpgradeAvailable, @@ -15,7 +14,7 @@ import { } from '../generalSlices/configSlice' import './css/SnmpwalkMenu.css' -import { useAppDispatch } from '../hooks' +import { useAppDispatch, useAppSelector } from '../hooks' interface RsuFirmwareMenuProps { type: string @@ -24,10 +23,10 @@ interface RsuFirmwareMenuProps { const RsuFirmwareMenu = (props: RsuFirmwareMenuProps) => { const dispatch = useAppDispatch() - const firmwareUpgradeAvailable = useSelector(selectFirmwareUpgradeAvailable) - const firmwareUpgradeName = useSelector(selectFirmwareUpgradeName) - const firmwareUpgradeMsg = useSelector(selectFirmwareUpgradeMsg) - const firmwareUpgradeErr = useSelector(selectFirmwareUpgradeErr) + const firmwareUpgradeAvailable = useAppSelector(selectFirmwareUpgradeAvailable) + const firmwareUpgradeName = useAppSelector(selectFirmwareUpgradeName) + const firmwareUpgradeMsg = useAppSelector(selectFirmwareUpgradeMsg) + const firmwareUpgradeErr = useAppSelector(selectFirmwareUpgradeErr) const options = { title: 'RSU Firmware Upgrade', diff --git a/webapp/src/components/RsuRebootMenu.tsx b/webapp/src/components/RsuRebootMenu.tsx index b742621ff..9602f6a56 100644 --- a/webapp/src/components/RsuRebootMenu.tsx +++ b/webapp/src/components/RsuRebootMenu.tsx @@ -2,7 +2,6 @@ import { ThunkDispatch, AnyAction } from '@reduxjs/toolkit' import React from 'react' import { confirmAlert } from 'react-confirm-alert' import 'react-confirm-alert/src/react-confirm-alert.css' -import { useSelector } from 'react-redux' import { RootState } from '../store' import { @@ -15,13 +14,13 @@ import { import { selectRsuIpv4 } from '../generalSlices/rsuSlice' import './css/SnmpwalkMenu.css' -import { useAppDispatch } from '../hooks' +import { useAppDispatch, useAppSelector } from '../hooks' const RsuRebootMenu = () => { const dispatch = useAppDispatch() - const changeSuccess = useSelector(selectRebootChangeSuccess) + const changeSuccess = useAppSelector(selectRebootChangeSuccess) - const rsuIp = useSelector(selectRsuIpv4) + const rsuIp = useAppSelector(selectRsuIpv4) const options = { title: 'RSU Reboot', diff --git a/webapp/src/components/SnmpsetMenu.tsx b/webapp/src/components/SnmpsetMenu.tsx index 9221ed612..9d67e4143 100644 --- a/webapp/src/components/SnmpsetMenu.tsx +++ b/webapp/src/components/SnmpsetMenu.tsx @@ -1,5 +1,4 @@ import React from 'react' -import { useSelector } from 'react-redux' import { selectDestIp, @@ -17,7 +16,7 @@ import { selectRsuIpv4, selectRsuManufacturer } from '../generalSlices/rsuSlice' import './css/SnmpwalkMenu.css' import toast from 'react-hot-toast' -import { useAppDispatch } from '../hooks' +import { useAppDispatch, useAppSelector } from '../hooks' export type SnmpsetMenuProps = { type: string @@ -28,11 +27,11 @@ const SnmpsetMenu = (props: SnmpsetMenuProps) => { const { type, rsuIpList } = props const dispatch = useAppDispatch() - const destIp = useSelector(selectDestIp) - const snmpMsgType = useSelector(selectSnmpMsgType) + const destIp = useAppSelector(selectDestIp) + const snmpMsgType = useAppSelector(selectSnmpMsgType) - const rsuIp = useSelector(selectRsuIpv4) - const rsuManufacturer = useSelector(selectRsuManufacturer) + const rsuIp = useAppSelector(selectRsuIpv4) + const rsuManufacturer = useAppSelector(selectRsuManufacturer) return (
diff --git a/webapp/src/components/SnmpwalkMenu.tsx b/webapp/src/components/SnmpwalkMenu.tsx index 4bdab4e33..57f02e63b 100644 --- a/webapp/src/components/SnmpwalkMenu.tsx +++ b/webapp/src/components/SnmpwalkMenu.tsx @@ -1,7 +1,6 @@ import React, { useEffect } from 'react' import SnmpwalkItem from './SnmpwalkItem' -import { useSelector } from 'react-redux' -import { useAppDispatch } from '../hooks' +import { useAppDispatch, useAppSelector } from '../hooks' import { confirmAlert } from 'react-confirm-alert' import { Options } from './AdminDeletionOptions' import { selectRsuManufacturer, selectRsuIpv4 } from '../generalSlices/rsuSlice' @@ -26,10 +25,10 @@ import { snmpWalkMenuTheme } from '../styles' const SnmpwalkMenu = () => { const dispatch = useAppDispatch() - const msgFwdConfig = useSelector(selectMsgFwdConfig) + const msgFwdConfig = useAppSelector(selectMsgFwdConfig) - const rsuIp = useSelector(selectRsuIpv4) - const rsuManufacturer = useSelector(selectRsuManufacturer) + const rsuIp = useAppSelector(selectRsuIpv4) + const rsuManufacturer = useAppSelector(selectRsuManufacturer) useEffect(() => { // Refresh Data diff --git a/webapp/src/components/intersections/ConfigurationPage.tsx b/webapp/src/components/intersections/ConfigurationPage.tsx index 17f1d4d7d..417f73ad0 100644 --- a/webapp/src/components/intersections/ConfigurationPage.tsx +++ b/webapp/src/components/intersections/ConfigurationPage.tsx @@ -20,7 +20,7 @@ import RefreshIcon from '@mui/icons-material/Refresh' import SearchIcon from '@mui/icons-material/Search' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../generalSlices/intersectionSlice' import { selectToken } from '../../generalSlices/userSlice' -import { useSelector } from 'react-redux' +import { useAppSelector } from '../../hooks' const tabs = [ { @@ -98,9 +98,9 @@ const Page = () => { const [page, setPage] = useState(0) const [rowsPerPage, setRowsPerPage] = useState(10) const [currentDescription, setCurrentDescription] = useState('') - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) - const token = useSelector(selectToken) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) + const token = useAppSelector(selectToken) const [filter, setFilter] = useState({ query: '', tab: currentTab, diff --git a/webapp/src/components/intersections/DashboardPage.tsx b/webapp/src/components/intersections/DashboardPage.tsx index 0b766b0c0..00c4b0308 100644 --- a/webapp/src/components/intersections/DashboardPage.tsx +++ b/webapp/src/components/intersections/DashboardPage.tsx @@ -8,13 +8,12 @@ import React, { useEffect, useState } from 'react' import AssessmentsApi from '../../apis/intersections/assessments-api' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../generalSlices/intersectionSlice' import { selectToken } from '../../generalSlices/userSlice' -import { useSelector } from 'react-redux' +import { useAppSelector } from '../../hooks' const Page = () => { - const [assessment, setAssessments] = useState([]) - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) - const token = useSelector(selectToken) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) + const token = useAppSelector(selectToken) // create hooks, and methods for each assessment type: const [stopLineStopAssessment, setStopLineStopAssessment] = useState(undefined) diff --git a/webapp/src/components/intersections/DataSelectorPage.tsx b/webapp/src/components/intersections/DataSelectorPage.tsx index 6d260eda4..ccd19b892 100644 --- a/webapp/src/components/intersections/DataSelectorPage.tsx +++ b/webapp/src/components/intersections/DataSelectorPage.tsx @@ -14,7 +14,6 @@ import JSZip from 'jszip' import FileSaver from 'file-saver' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../generalSlices/intersectionSlice' import { selectToken } from '../../generalSlices/userSlice' -import { useSelector } from 'react-redux' import { selectType, selectEvents, @@ -29,7 +28,7 @@ import { setOpenMapDialog, setRoadRegulatorIntersectionIds, } from '../../features/intersections/data-selector/dataSelectorSlice' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' // TODO: Support additional event types // - "intersection_reference_alignment" @@ -50,15 +49,15 @@ const valid_counts_event_types: string[] = [ const DataSelectorPage = () => { const dispatch = useAppDispatch() - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) - const token = useSelector(selectToken) - const type = useSelector(selectType) - const events = useSelector(selectEvents) - const assessments = useSelector(selectAssessments) - const graphData = useSelector(selectGraphData) - const openMapDialog = useSelector(selectOpenMapDialog) - const roadRegulatorIntersectionIds = useSelector(selectRoadRegulatorIntersectionIds) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) + const token = useAppSelector(selectToken) + const type = useAppSelector(selectType) + const events = useAppSelector(selectEvents) + const assessments = useAppSelector(selectAssessments) + const graphData = useAppSelector(selectGraphData) + const openMapDialog = useAppSelector(selectOpenMapDialog) + const roadRegulatorIntersectionIds = useAppSelector(selectRoadRegulatorIntersectionIds) const getPaddedTimestamp = () => { const date = new Date() diff --git a/webapp/src/components/intersections/DecoderPage.tsx b/webapp/src/components/intersections/DecoderPage.tsx index cebdba951..227edecba 100644 --- a/webapp/src/components/intersections/DecoderPage.tsx +++ b/webapp/src/components/intersections/DecoderPage.tsx @@ -1,17 +1,15 @@ import React, { useEffect, useState } from 'react' -import { Box, Button, Container, Grid, Typography } from '@mui/material' +import { Box, Container, Grid, Typography } from '@mui/material' import DecoderApi from '../../apis/intersections/decoder-api' import { DecoderTables } from '../../features/intersections/decoder/decoder-tables' import { v4 as uuidv4 } from 'uuid' -import MapIcon from '@mui/icons-material/Map' import MapTab, { getTimestamp } from '../../features/intersections/map/map-component' import { selectToken } from '../../generalSlices/userSlice' -import { useSelector } from 'react-redux' +import { useAppSelector } from '../../hooks' const DecoderPage = () => { - const token = useSelector(selectToken) + const token = useAppSelector(selectToken) - const [openMapDialog, setOpenMapDialog] = useState(false) const [data, setData] = useState({} as { [id: string]: DecoderDataEntry }) const [selectedMapMessage, setSelectedMapMessage] = useState( undefined as undefined | { id: string; intersectionId: number; rsuIp: string } diff --git a/webapp/src/components/intersections/MapPage.tsx b/webapp/src/components/intersections/MapPage.tsx index 296256a6e..c807a6738 100644 --- a/webapp/src/components/intersections/MapPage.tsx +++ b/webapp/src/components/intersections/MapPage.tsx @@ -1,13 +1,12 @@ -import { Box, Container, Grid } from '@mui/material' +import { Box, Container } from '@mui/material' import React from 'react' import MapTab from '../../features/intersections/map/map-component' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../generalSlices/intersectionSlice' -import { useSelector } from 'react-redux' +import { useAppSelector } from '../../hooks' const Map = () => { - const currentDate = new Date() - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) return ( <> logs.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage) @@ -38,9 +38,9 @@ const LogsListInner = styled('div', { shouldForwardProp: (prop) => prop !== 'ope const Page = () => { const rootRef = useRef(null) - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) - const token = useSelector(selectToken) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) + const token = useAppSelector(selectToken) const [group, setGroup] = useState(true) const [logs, setLogs] = useState([]) diff --git a/webapp/src/components/intersections/configuration/create.tsx b/webapp/src/components/intersections/configuration/create.tsx index ab08591e1..db0d08b65 100644 --- a/webapp/src/components/intersections/configuration/create.tsx +++ b/webapp/src/components/intersections/configuration/create.tsx @@ -4,14 +4,14 @@ import { configParamApi } from '../../../apis/intersections/configuration-param- import { ConfigParamCreateForm } from '../../../features/intersections/configuration/configuration-create-form' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' import { selectToken } from '../../../generalSlices/userSlice' -import { useSelector } from 'react-redux' import { useParams } from 'react-router-dom' +import { useAppSelector } from '../../../hooks' const ConfigParamCreate = () => { const [parameter, setParameter] = useState(undefined) - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) - const token = useSelector(selectToken) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) + const token = useAppSelector(selectToken) const { key } = useParams<{ key: string }>() diff --git a/webapp/src/components/intersections/configuration/edit.tsx b/webapp/src/components/intersections/configuration/edit.tsx index e0556099e..47dc4a201 100644 --- a/webapp/src/components/intersections/configuration/edit.tsx +++ b/webapp/src/components/intersections/configuration/edit.tsx @@ -4,14 +4,14 @@ import { configParamApi } from '../../../apis/intersections/configuration-param- import { ConfigParamEditForm } from '../../../features/intersections/configuration/configuration-edit-form' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' import { selectToken } from '../../../generalSlices/userSlice' -import { useSelector } from 'react-redux' import { useParams } from 'react-router-dom' +import { useAppSelector } from '../../../hooks' const ConfigParamEdit = () => { const [parameter, setParameter] = useState(undefined) - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) - const token = useSelector(selectToken) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) + const token = useAppSelector(selectToken) const { key } = useParams<{ key: string }>() diff --git a/webapp/src/components/intersections/configuration/remove.tsx b/webapp/src/components/intersections/configuration/remove.tsx index a210a9e12..aa0863abd 100644 --- a/webapp/src/components/intersections/configuration/remove.tsx +++ b/webapp/src/components/intersections/configuration/remove.tsx @@ -1,17 +1,17 @@ -import React, { useState, useCallback, useEffect } from 'react' +import React, { useState, useEffect } from 'react' import { Box, Container, Typography } from '@mui/material' import { configParamApi } from '../../../apis/intersections/configuration-param-api' import { ConfigParamRemoveForm } from '../../../features/intersections/configuration/configuration-remove-form' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' import { selectToken } from '../../../generalSlices/userSlice' -import { useSelector } from 'react-redux' import { useParams } from 'react-router-dom' +import { useAppSelector } from '../../../hooks' const ConfigParamRemove = () => { const [parameter, setParameter] = useState(undefined) - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) - const token = useSelector(selectToken) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) + const token = useAppSelector(selectToken) const { key } = useParams<{ key: string }>() diff --git a/webapp/src/components/intersections/map/BaseMapPage.tsx b/webapp/src/components/intersections/map/BaseMapPage.tsx index f5f3c0e07..89cf249a6 100644 --- a/webapp/src/components/intersections/map/BaseMapPage.tsx +++ b/webapp/src/components/intersections/map/BaseMapPage.tsx @@ -1,12 +1,12 @@ import React from 'react' -import { useSelector } from 'react-redux' import { Box, Container } from '@mui/material' import IntersectionMap from '../../../features/intersections/map/map-component' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' +import { useAppSelector } from '../../../hooks' function BaseMapPage() { - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) return (
diff --git a/webapp/src/components/intersections/map/NotificationMapPage.tsx b/webapp/src/components/intersections/map/NotificationMapPage.tsx index 4ef549023..197591656 100644 --- a/webapp/src/components/intersections/map/NotificationMapPage.tsx +++ b/webapp/src/components/intersections/map/NotificationMapPage.tsx @@ -1,11 +1,11 @@ import React, { useEffect, useState } from 'react' -import { useSelector } from 'react-redux' import { Box, Container } from '@mui/material' import IntersectionMap from '../../../features/intersections/map/map-component' import { setSelectedIntersectionId, setSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' import NotificationApi from '../../../apis/intersections/notification-api' import { useParams } from 'react-router-dom' import { selectToken } from '../../../generalSlices/userSlice' +import { useAppSelector } from '../../../hooks' function NotificationMapPage() { const { intersectionId, roadRegulatorId, notificationId } = useParams<{ @@ -14,7 +14,7 @@ function NotificationMapPage() { notificationId: string }>() const [notification, setNotification] = useState() - const token = useSelector(selectToken) + const token = useAppSelector(selectToken) const intersectionIdInt = parseInt(intersectionId) ?? -1 const roadRegulatorIdInt = parseInt(roadRegulatorId) ?? -1 diff --git a/webapp/src/features/adminAddNotification/AdminAddNotification.tsx b/webapp/src/features/adminAddNotification/AdminAddNotification.tsx index e626bfc0e..d8336a264 100644 --- a/webapp/src/features/adminAddNotification/AdminAddNotification.tsx +++ b/webapp/src/features/adminAddNotification/AdminAddNotification.tsx @@ -19,22 +19,21 @@ import { getNotificationData, } from './adminAddNotificationSlice' import { selectEmail } from '../../generalSlices/userSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const AdminAddNotification = () => { const dispatch = useAppDispatch() - const successMsg = useSelector(selectSuccessMsg) - const apiData = useSelector(selectApiData) - const errorState = useSelector(selectErrorState) - const errorMsg = useSelector(selectErrorMsg) - const submitAttempt = useSelector(selectSubmitAttempt) - const selectedType = useSelector(selectSelectedType) - const availableTypes = useSelector(selectAvailableTypes) - const userEmail = useSelector(selectEmail) + const successMsg = useAppSelector(selectSuccessMsg) + const apiData = useAppSelector(selectApiData) + const errorState = useAppSelector(selectErrorState) + const errorMsg = useAppSelector(selectErrorMsg) + const submitAttempt = useAppSelector(selectSubmitAttempt) + const selectedType = useAppSelector(selectSelectedType) + const availableTypes = useAppSelector(selectAvailableTypes) + const userEmail = useAppSelector(selectEmail) const { register, handleSubmit, diff --git a/webapp/src/features/adminAddRsu/AdminAddRsu.tsx b/webapp/src/features/adminAddRsu/AdminAddRsu.tsx index b663ce821..262326289 100644 --- a/webapp/src/features/adminAddRsu/AdminAddRsu.tsx +++ b/webapp/src/features/adminAddRsu/AdminAddRsu.tsx @@ -28,14 +28,13 @@ import { updateSelectedSnmpVersion, updateSelectedOrganizations, } from './adminAddRsuSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import toast from 'react-hot-toast' import { useNavigate } from 'react-router-dom' import Dialog from '@mui/material/Dialog' import { DialogActions, DialogContent, DialogTitle } from '@mui/material' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' export type AdminAddRsuForm = { ip: string @@ -55,20 +54,20 @@ export type AdminAddRsuForm = { const AdminAddRsu = () => { const dispatch = useAppDispatch() - const primaryRoutes = useSelector(selectPrimaryRoutes) - const selectedRoute = useSelector(selectSelectedRoute) - const otherRouteDisabled = useSelector(selectOtherRouteDisabled) - const rsuModels = useSelector(selectRsuModels) - const selectedModel = useSelector(selectSelectedModel) - const sshCredentialGroups = useSelector(selectSshCredentialGroups) - const selectedSshGroup = useSelector(selectSelectedSshGroup) - const snmpCredentialGroups = useSelector(selectSnmpCredentialGroups) - const selectedSnmpGroup = useSelector(selectSelectedSnmpGroup) - const snmpVersions = useSelector(selectSnmpVersions) - const selectedSnmpVersion = useSelector(selectSelectedSnmpVersion) - const organizations = useSelector(selectOrganizations) - const selectedOrganizations = useSelector(selectSelectedOrganizations) - const submitAttempt = useSelector(selectSubmitAttempt) + const primaryRoutes = useAppSelector(selectPrimaryRoutes) + const selectedRoute = useAppSelector(selectSelectedRoute) + const otherRouteDisabled = useAppSelector(selectOtherRouteDisabled) + const rsuModels = useAppSelector(selectRsuModels) + const selectedModel = useAppSelector(selectSelectedModel) + const sshCredentialGroups = useAppSelector(selectSshCredentialGroups) + const selectedSshGroup = useAppSelector(selectSelectedSshGroup) + const snmpCredentialGroups = useAppSelector(selectSnmpCredentialGroups) + const selectedSnmpGroup = useAppSelector(selectSelectedSnmpGroup) + const snmpVersions = useAppSelector(selectSnmpVersions) + const selectedSnmpVersion = useAppSelector(selectSelectedSnmpVersion) + const organizations = useAppSelector(selectOrganizations) + const selectedOrganizations = useAppSelector(selectSelectedOrganizations) + const submitAttempt = useAppSelector(selectSubmitAttempt) const [open, setOpen] = useState(true) const navigate = useNavigate() diff --git a/webapp/src/features/adminAddUser/AdminAddUser.tsx b/webapp/src/features/adminAddUser/AdminAddUser.tsx index dbfba8b76..c4cc10484 100644 --- a/webapp/src/features/adminAddUser/AdminAddUser.tsx +++ b/webapp/src/features/adminAddUser/AdminAddUser.tsx @@ -19,7 +19,6 @@ import { submitForm, AdminUserForm, } from './adminAddUserSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' @@ -27,16 +26,16 @@ import toast from 'react-hot-toast' import { useNavigate } from 'react-router-dom' import Dialog from '@mui/material/Dialog' import { DialogActions, DialogContent, DialogTitle } from '@mui/material' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const AdminAddUser = () => { const dispatch = useAppDispatch() - const selectedOrganizationNames = useSelector(selectSelectedOrganizationNames) - const selectedOrganizations = useSelector(selectSelectedOrganizations) - const organizationNames = useSelector(selectOrganizationNames) - const availableRoles = useSelector(selectAvailableRoles) - const apiData = useSelector(selectApiData) - const submitAttempt = useSelector(selectSubmitAttempt) + const selectedOrganizationNames = useAppSelector(selectSelectedOrganizationNames) + const selectedOrganizations = useAppSelector(selectSelectedOrganizations) + const organizationNames = useAppSelector(selectOrganizationNames) + const availableRoles = useAppSelector(selectAvailableRoles) + const apiData = useAppSelector(selectApiData) + const submitAttempt = useAppSelector(selectSubmitAttempt) const [open, setOpen] = useState(true) const navigate = useNavigate() const { diff --git a/webapp/src/features/adminEditNotification/AdminEditNotification.tsx b/webapp/src/features/adminEditNotification/AdminEditNotification.tsx index 7137776b3..7e21f1033 100644 --- a/webapp/src/features/adminEditNotification/AdminEditNotification.tsx +++ b/webapp/src/features/adminEditNotification/AdminEditNotification.tsx @@ -17,7 +17,6 @@ import { selectSelectedType, selectAvailableTypes, } from './adminEditNotificationSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' @@ -25,19 +24,19 @@ import { Link, useParams } from 'react-router-dom' import { selectEditNotificationRowData, selectTableData } from '../adminNotificationTab/adminNotificationTabSlice' import { AdminNotificationForm } from '../adminAddNotification/adminAddNotificationSlice' import { selectEmail } from '../../generalSlices/userSlice' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const AdminEditNotification = () => { const dispatch = useAppDispatch() - const successMsg = useSelector(selectSuccessMsg) - const apiData = useSelector(selectApiData) - const errorState = useSelector(selectErrorState) - const errorMsg = useSelector(selectErrorMsg) - const submitAttempt = useSelector(selectSubmitAttempt) - const selectedType = useSelector(selectSelectedType) - const availableTypes = useSelector(selectAvailableTypes) - const notificationEditTableData = useSelector(selectEditNotificationRowData) - const userEmail = useSelector(selectEmail) + const successMsg = useAppSelector(selectSuccessMsg) + const apiData = useAppSelector(selectApiData) + const errorState = useAppSelector(selectErrorState) + const errorMsg = useAppSelector(selectErrorMsg) + const submitAttempt = useAppSelector(selectSubmitAttempt) + const selectedType = useAppSelector(selectSelectedType) + const availableTypes = useAppSelector(selectAvailableTypes) + const notificationEditTableData = useAppSelector(selectEditNotificationRowData) + const userEmail = useAppSelector(selectEmail) const { register, handleSubmit, diff --git a/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx b/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx index 3234b2449..546bca315 100644 --- a/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx +++ b/webapp/src/features/adminEditOrganization/AdminEditOrganization.tsx @@ -9,7 +9,6 @@ import { editOrganization, setSuccessMsg, } from './adminEditOrganizationSlice' -import { useSelector } from 'react-redux' import toast from 'react-hot-toast' import '../adminRsuTab/Admin.css' @@ -26,15 +25,15 @@ import { Link, useParams, useNavigate } from 'react-router-dom' import { DialogActions, DialogContent, DialogTitle, Typography } from '@mui/material' import Dialog from '@mui/material/Dialog' import { theme } from '../../styles' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const AdminEditOrganization = () => { const dispatch = useAppDispatch() const [open, setOpen] = useState(true) - const successMsg = useSelector(selectSuccessMsg) - const selectedOrg = useSelector(selectSelectedOrg) - const orgData = useSelector(selectOrgData) + const successMsg = useAppSelector(selectSuccessMsg) + const selectedOrg = useAppSelector(selectSelectedOrg) + const orgData = useAppSelector(selectOrgData) const { register, handleSubmit, diff --git a/webapp/src/features/adminEditRsu/AdminEditRsu.tsx b/webapp/src/features/adminEditRsu/AdminEditRsu.tsx index a9a38a76c..d37e5c734 100644 --- a/webapp/src/features/adminEditRsu/AdminEditRsu.tsx +++ b/webapp/src/features/adminEditRsu/AdminEditRsu.tsx @@ -31,7 +31,6 @@ import { setSelectedSnmpVersion, setSelectedOrganizations, } from './adminEditRsuSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import { AdminRsu } from '../../models/Rsu' @@ -39,7 +38,7 @@ import { Link, useNavigate, useParams } from 'react-router-dom' import { selectTableData, updateTableData } from '../adminRsuTab/adminRsuTabSlice' import { Dialog, DialogActions, DialogContent, DialogTitle, Typography } from '@mui/material' import toast from 'react-hot-toast' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' export type AdminEditRsuFormType = { orig_ip: string @@ -63,22 +62,22 @@ export type AdminEditRsuFormType = { const AdminEditRsu = () => { const dispatch = useAppDispatch() - const apiData = useSelector(selectApiData) - const primaryRoutes = useSelector(selectPrimaryRoutes) - const selectedRoute = useSelector(selectSelectedRoute) - const otherRouteDisabled = useSelector(selectOtherRouteDisabled) - const rsuModels = useSelector(selectRsuModels) - const selectedModel = useSelector(selectSelectedModel) - const sshCredentialGroups = useSelector(selectSshCredentialGroups) - const selectedSshGroup = useSelector(selectSelectedSshGroup) - const snmpCredentialGroups = useSelector(selectSnmpCredentialGroups) - const selectedSnmpGroup = useSelector(selectSelectedSnmpGroup) - const snmpVersions = useSelector(selectSnmpVersions) - const selectedSnmpVersion = useSelector(selectSelectedSnmpVersion) - const organizations = useSelector(selectOrganizations) - const selectedOrganizations = useSelector(selectSelectedOrganizations) - const submitAttempt = useSelector(selectSubmitAttempt) - const rsuTableData = useSelector(selectTableData) + const apiData = useAppSelector(selectApiData) + const primaryRoutes = useAppSelector(selectPrimaryRoutes) + const selectedRoute = useAppSelector(selectSelectedRoute) + const otherRouteDisabled = useAppSelector(selectOtherRouteDisabled) + const rsuModels = useAppSelector(selectRsuModels) + const selectedModel = useAppSelector(selectSelectedModel) + const sshCredentialGroups = useAppSelector(selectSshCredentialGroups) + const selectedSshGroup = useAppSelector(selectSelectedSshGroup) + const snmpCredentialGroups = useAppSelector(selectSnmpCredentialGroups) + const selectedSnmpGroup = useAppSelector(selectSelectedSnmpGroup) + const snmpVersions = useAppSelector(selectSnmpVersions) + const selectedSnmpVersion = useAppSelector(selectSelectedSnmpVersion) + const organizations = useAppSelector(selectOrganizations) + const selectedOrganizations = useAppSelector(selectSelectedOrganizations) + const submitAttempt = useAppSelector(selectSubmitAttempt) + const rsuTableData = useAppSelector(selectTableData) const [open, setOpen] = useState(true) const navigate = useNavigate() diff --git a/webapp/src/features/adminEditUser/AdminEditUser.tsx b/webapp/src/features/adminEditUser/AdminEditUser.tsx index f02a9110b..a7f71afa7 100644 --- a/webapp/src/features/adminEditUser/AdminEditUser.tsx +++ b/webapp/src/features/adminEditUser/AdminEditUser.tsx @@ -17,7 +17,6 @@ import { updateOrganizations, UserApiDataOrgs, } from './adminEditUserSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import 'react-widgets/styles.css' @@ -26,17 +25,17 @@ import { getAvailableUsers, selectTableData } from '../adminUserTab/adminUserTab import { DialogActions, DialogContent, DialogTitle, Typography } from '@mui/material' import Dialog from '@mui/material/Dialog' import toast from 'react-hot-toast' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const AdminEditUser = () => { const dispatch = useAppDispatch() - const selectedOrganizationNames = useSelector(selectSelectedOrganizationNames) - const selectedOrganizations = useSelector(selectSelectedOrganizations) - const organizationNames = useSelector(selectOrganizationNames) - const availableRoles = useSelector(selectAvailableRoles) - const apiData = useSelector(selectApiData) - const submitAttempt = useSelector(selectSubmitAttempt) - const userTableData = useSelector(selectTableData) + const selectedOrganizationNames = useAppSelector(selectSelectedOrganizationNames) + const selectedOrganizations = useAppSelector(selectSelectedOrganizations) + const organizationNames = useAppSelector(selectOrganizationNames) + const availableRoles = useAppSelector(selectAvailableRoles) + const apiData = useAppSelector(selectApiData) + const submitAttempt = useAppSelector(selectSubmitAttempt) + const userTableData = useAppSelector(selectTableData) const [open, setOpen] = useState(true) const navigate = useNavigate() const { diff --git a/webapp/src/features/adminNotificationTab/AdminNotificationTab.tsx b/webapp/src/features/adminNotificationTab/AdminNotificationTab.tsx index 1e11c4512..856f9e413 100644 --- a/webapp/src/features/adminNotificationTab/AdminNotificationTab.tsx +++ b/webapp/src/features/adminNotificationTab/AdminNotificationTab.tsx @@ -13,7 +13,6 @@ import { setActiveDiv, setEditNotificationRowData, } from './adminNotificationTabSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import { Action } from '@material-table/core' @@ -23,7 +22,7 @@ import AdminEditNotification from '../adminEditNotification/AdminEditNotificatio import AdminAddNotification from '../adminAddNotification/AdminAddNotification' import { AdminEmailNotification } from '../../models/Notifications' import { selectEmail } from '../../generalSlices/userSlice' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const getTitle = (activeTab: string) => { if (activeTab === undefined) { @@ -44,11 +43,11 @@ const AdminNotificationTab = () => { const activeTab = location.pathname.split('/')[3] const title = getTitle(activeTab) - const userEmail = useSelector(selectEmail) + const userEmail = useAppSelector(selectEmail) - const tableData = useSelector(selectTableData) + const tableData = useAppSelector(selectTableData) const [columns] = useState([{ title: 'Email Notification Type', field: 'email_type', id: 3 }]) - const loading = useSelector(selectLoading) + const loading = useAppSelector(selectLoading) let tableActions: Action[] = [ { diff --git a/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx b/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx index 973c8fb0c..0a3060b6d 100644 --- a/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx +++ b/webapp/src/features/adminOrganizationTab/AdminOrganizationTab.tsx @@ -24,14 +24,13 @@ import { setSelectedOrg, AdminOrgSummary, } from './adminOrganizationTabSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import { Route, Routes, useLocation, useNavigate } from 'react-router-dom' import { NotFound } from '../../pages/404' import toast from 'react-hot-toast' import { changeOrganization, selectOrganizationName, setOrganizationList } from '../../generalSlices/userSlice' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const getTitle = (activeTab: string) => { if (activeTab === undefined) { @@ -52,16 +51,16 @@ const AdminOrganizationTab = () => { const activeTab = location.pathname.split('/')[4] const title = getTitle(activeTab) - const orgData = useSelector(selectOrgData) - const selectedOrg = useSelector(selectSelectedOrg) - const selectedOrgName = useSelector(selectSelectedOrgName) - const selectedOrgEmail = useSelector(selectSelectedOrgEmail) - const rsuTableData = useSelector(selectRsuTableData) - const userTableData = useSelector(selectUserTableData) + const orgData = useAppSelector(selectOrgData) + const selectedOrg = useAppSelector(selectSelectedOrg) + const selectedOrgName = useAppSelector(selectSelectedOrgName) + const selectedOrgEmail = useAppSelector(selectSelectedOrgEmail) + const rsuTableData = useAppSelector(selectRsuTableData) + const userTableData = useAppSelector(selectUserTableData) const notifySuccess = (message: string) => toast.success(message) const notifyError = (message: string) => toast.error(message) - const defaultOrgName = useSelector(selectOrganizationName) + const defaultOrgName = useAppSelector(selectOrganizationName) var defaultOrgData = orgData.find((org) => org.name === defaultOrgName) useEffect(() => { diff --git a/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx b/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx index 98e3bb63a..b69f16488 100644 --- a/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx +++ b/webapp/src/features/adminOrganizationTabRsu/AdminOrganizationTabRsu.tsx @@ -22,7 +22,6 @@ import { rsuAddMultiple, } from './adminOrganizationTabRsuSlice' import { selectLoadingGlobal } from '../../generalSlices/userSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import { Action, Column } from '@material-table/core' @@ -30,7 +29,7 @@ import { AdminOrgRsu } from '../adminOrganizationTab/adminOrganizationTabSlice' import toast from 'react-hot-toast' import { accordionTheme, outerAccordionTheme } from '../../styles' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' interface AdminOrganizationTabRsuProps { selectedOrg: string @@ -43,9 +42,9 @@ const AdminOrganizationTabRsu = (props: AdminOrganizationTabRsuProps) => { const { selectedOrg, selectedOrgEmail, updateTableData } = props const dispatch = useAppDispatch() - const availableRsuList = useSelector(selectAvailableRsuList) - const selectedRsuList = useSelector(selectSelectedRsuList) - const loadingGlobal = useSelector(selectLoadingGlobal) + const availableRsuList = useAppSelector(selectAvailableRsuList) + const selectedRsuList = useAppSelector(selectSelectedRsuList) + const loadingGlobal = useAppSelector(selectLoadingGlobal) const [rsuColumns] = useState[]>([ { title: 'IP Address', field: 'ip', id: 0, width: '31%' }, { title: 'Primary Route', field: 'primary_route', id: 1, width: '31%' }, diff --git a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx index 990469b96..c03d1c1a3 100644 --- a/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx +++ b/webapp/src/features/adminOrganizationTabUser/AdminOrganizationTabUser.tsx @@ -31,7 +31,6 @@ import { selectLoadingGlobal, setOrganizationList, } from '../../generalSlices/userSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import { Action, Column } from '@material-table/core' @@ -39,7 +38,7 @@ import { AdminOrgUser } from '../adminOrganizationTab/adminOrganizationTabSlice' import toast from 'react-hot-toast' import { accordionTheme, outerAccordionTheme } from '../../styles' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' interface AdminOrganizationTabUserProps { selectedOrg: string @@ -51,12 +50,12 @@ interface AdminOrganizationTabUserProps { const AdminOrganizationTabUser = (props: AdminOrganizationTabUserProps) => { const dispatch = useAppDispatch() const { selectedOrg, selectedOrgEmail } = props - const availableUserList = useSelector(selectAvailableUserList) - const selectedUserList = useSelector(selectSelectedUserList) - const availableRoles = useSelector(selectAvailableRoles) - const loadingGlobal = useSelector(selectLoadingGlobal) - const authLoginData = useSelector(selectAuthLoginData) - const userEmail = useSelector(selectEmail) + const availableUserList = useAppSelector(selectAvailableUserList) + const selectedUserList = useAppSelector(selectSelectedUserList) + const availableRoles = useAppSelector(selectAvailableRoles) + const loadingGlobal = useAppSelector(selectLoadingGlobal) + const authLoginData = useAppSelector(selectAuthLoginData) + const userEmail = useAppSelector(selectEmail) const [userColumns] = useState[]>([ { title: 'First Name', diff --git a/webapp/src/features/adminRsuTab/AdminRsuTab.tsx b/webapp/src/features/adminRsuTab/AdminRsuTab.tsx index 9daffe6f8..54a6f5be3 100644 --- a/webapp/src/features/adminRsuTab/AdminRsuTab.tsx +++ b/webapp/src/features/adminRsuTab/AdminRsuTab.tsx @@ -1,15 +1,14 @@ -import React, { useEffect, useState } from 'react' +import React, { useState } from 'react' import AdminAddRsu from '../adminAddRsu/AdminAddRsu' import AdminEditRsu, { AdminEditRsuFormType } from '../adminEditRsu/AdminEditRsu' import AdminTable from '../../components/AdminTable' -import { IoChevronBackCircleOutline, IoRefresh } from 'react-icons/io5' +import { IoRefresh } from 'react-icons/io5' import { AiOutlinePlusCircle } from 'react-icons/ai' import { confirmAlert } from 'react-confirm-alert' import { Options } from '../../components/AdminDeletionOptions' import { selectLoading, selectTableData, - selectEditRsuRowData, // actions updateTableData, @@ -17,14 +16,13 @@ import { deleteRsu, setEditRsuRowData, } from './adminRsuTabSlice' -import { useSelector } from 'react-redux' import './Admin.css' import { Action } from '@material-table/core' import { Route, Routes, useLocation, useNavigate } from 'react-router-dom' import { NotFound } from '../../pages/404' import toast from 'react-hot-toast' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const getTitle = (activeTab: string) => { if (activeTab === undefined) { @@ -45,7 +43,7 @@ const AdminRsuTab = () => { const activeTab = location.pathname.split('/')[4] const title = getTitle(activeTab) - const tableData = useSelector(selectTableData) + const tableData = useAppSelector(selectTableData) const [columns] = useState([ { title: 'Milepost', field: 'milepost', id: 0 }, { title: 'IP Address', field: 'ip', id: 1 }, @@ -54,7 +52,7 @@ const AdminRsuTab = () => { { title: 'Serial Number', field: 'serial_number', id: 4 }, ]) - const loading = useSelector(selectLoading) + const loading = useAppSelector(selectLoading) const tableActions: Action[] = [ { diff --git a/webapp/src/features/adminUserTab/AdminUserTab.tsx b/webapp/src/features/adminUserTab/AdminUserTab.tsx index 969603df3..f5fd6947b 100644 --- a/webapp/src/features/adminUserTab/AdminUserTab.tsx +++ b/webapp/src/features/adminUserTab/AdminUserTab.tsx @@ -17,14 +17,13 @@ import { setActiveDiv, setEditUserRowData, } from './adminUserTabSlice' -import { useSelector } from 'react-redux' import '../adminRsuTab/Admin.css' import { Action } from '@material-table/core' import { Route, Routes, useLocation, useNavigate } from 'react-router-dom' import { NotFound } from '../../pages/404' import toast from 'react-hot-toast' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const getTitle = (activeTab: string) => { if (activeTab === undefined) { @@ -45,7 +44,7 @@ const AdminUserTab = () => { const activeTab = location.pathname.split('/')[4] const title = getTitle(activeTab) - const tableData = useSelector(selectTableData) + const tableData = useAppSelector(selectTableData) const [columns] = useState([ { title: 'First Name', field: 'first_name', id: 0 }, { title: 'Last Name', field: 'last_name', id: 1 }, @@ -57,7 +56,7 @@ const AdminUserTab = () => { render: (rowData: AdminUserWithId) => (rowData.super_user ? 'Yes' : 'No'), }, ]) - const loading = useSelector(selectLoading) + const loading = useAppSelector(selectLoading) let tableActions: Action[] = [ { diff --git a/webapp/src/features/intersections/configuration/configuration-create-form.tsx b/webapp/src/features/intersections/configuration/configuration-create-form.tsx index 15d330cf0..6e7408eb9 100644 --- a/webapp/src/features/intersections/configuration/configuration-create-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-create-form.tsx @@ -8,14 +8,14 @@ import { configParamApi } from '../../../apis/intersections/configuration-param- import { useNavigate } from 'react-router-dom' import { selectToken } from '../../../generalSlices/userSlice' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' -import { useSelector } from 'react-redux' +import { useAppSelector } from '../../../hooks' export const ConfigParamCreateForm = (props) => { const navigate = useNavigate() const { parameter }: { parameter: Config } = props - const token = useSelector(selectToken) - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) + const token = useAppSelector(selectToken) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) const formik = useFormik({ initialValues: { name: parameter.key, diff --git a/webapp/src/features/intersections/configuration/configuration-edit-form.tsx b/webapp/src/features/intersections/configuration/configuration-edit-form.tsx index 6e4534ff8..fead1ffac 100644 --- a/webapp/src/features/intersections/configuration/configuration-edit-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-edit-form.tsx @@ -6,12 +6,12 @@ import { useFormik } from 'formik' import { Button, Card, CardActions, CardContent, CardHeader, Divider, Grid, TextField } from '@mui/material' import { configParamApi } from '../../../apis/intersections/configuration-param-api' import { selectToken } from '../../../generalSlices/userSlice' -import { useSelector } from 'react-redux' import { useNavigate } from 'react-router-dom' +import { useAppSelector } from '../../../hooks' export const ConfigParamEditForm = (props) => { const { parameter }: { parameter: DefaultConfig | IntersectionConfig } = props - const token = useSelector(selectToken) + const token = useAppSelector(selectToken) const navigate = useNavigate() const formik = useFormik({ initialValues: { diff --git a/webapp/src/features/intersections/configuration/configuration-remove-form.tsx b/webapp/src/features/intersections/configuration/configuration-remove-form.tsx index 0c8e2b76a..d8079260a 100644 --- a/webapp/src/features/intersections/configuration/configuration-remove-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-remove-form.tsx @@ -5,16 +5,16 @@ import * as Yup from 'yup' import { useFormik } from 'formik' import { Button, Card, CardActions, CardContent, CardHeader, Divider, Grid, TextField } from '@mui/material' import { configParamApi } from '../../../apis/intersections/configuration-param-api' -import { useSelector } from 'react-redux' import { useNavigate } from 'react-router-dom' import { selectToken } from '../../../generalSlices/userSlice' import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' +import { useAppSelector } from '../../../hooks' export const ConfigParamRemoveForm = (props) => { const { parameter, defaultParameter, ...other } = props const navigate = useNavigate() - const token = useSelector(selectToken) - const intersectionId = useSelector(selectSelectedIntersectionId) + const token = useAppSelector(selectToken) + const intersectionId = useAppSelector(selectSelectedIntersectionId) const formik = useFormik({ initialValues: { name: parameter.key, diff --git a/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx b/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx index 4b2139a29..7645c90ca 100644 --- a/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx +++ b/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx @@ -23,8 +23,7 @@ import { } from '@mui/material' import { FormikCheckboxList } from './formik-checkbox-list' import { selectDataSelectorForm, setDataSelectorForm } from './dataSelectorSlice' -import { useSelector } from 'react-redux' -import { useAppDispatch } from '../../../hooks' +import { useAppDispatch, useAppSelector } from '../../../hooks' interface Item { label: string @@ -67,7 +66,7 @@ export const DataSelectorEditForm = (props: { const { onQuery, onVisualize, dbIntersectionId, roadRegulatorIntersectionIds, ...other } = props const [visualize, setVisualize] = useState(false) - const dataSelectorForm = useSelector(selectDataSelectorForm) + const dataSelectorForm = useAppSelector(selectDataSelectorForm) const formik = useFormik({ initialValues: { diff --git a/webapp/src/features/intersections/intersection-selector/intersection-selection-map.tsx b/webapp/src/features/intersections/intersection-selector/intersection-selection-map.tsx index 5594bf2e9..825d9343b 100644 --- a/webapp/src/features/intersections/intersection-selector/intersection-selection-map.tsx +++ b/webapp/src/features/intersections/intersection-selector/intersection-selection-map.tsx @@ -9,8 +9,7 @@ import { selectSelectedIntersection, setSelectedIntersection, } from '../../../generalSlices/intersectionSlice' -import { useSelector } from 'react-redux' -import { useAppDispatch } from '../../../hooks' +import { useAppDispatch, useAppSelector } from '../../../hooks' const getBoundsForIntersections = ( selectedIntersection: IntersectionReferenceData | undefined, @@ -107,8 +106,8 @@ const intersectionLabelsLayer: SymbolLayer = { const IntersectionMap = () => { const dispatch = useAppDispatch() - const intersections = useSelector(selectIntersections) - const selectedIntersection = useSelector(selectSelectedIntersection) + const intersections = useAppSelector(selectIntersections) + const selectedIntersection = useAppSelector(selectSelectedIntersection) const [viewState, setViewState] = useState({ latitude: selectedIntersection?.latitude ?? 39.587905, diff --git a/webapp/src/features/intersections/map/control-panel.tsx b/webapp/src/features/intersections/map/control-panel.tsx index 9bd910693..b163e5e71 100644 --- a/webapp/src/features/intersections/map/control-panel.tsx +++ b/webapp/src/features/intersections/map/control-panel.tsx @@ -24,7 +24,6 @@ import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp' import { styled } from '@mui/material/styles' import { format } from 'date-fns' import JSZip from 'jszip' -import { useSelector } from 'react-redux' import { downloadMapData, handleImportedMapMessageData, @@ -61,7 +60,7 @@ import { import pauseIcon from '../../../icons/pause.png' import playIcon from '../../../icons/play.png' import { BarChart, XAxis, Bar, ResponsiveContainer, Tooltip } from 'recharts' -import { useAppDispatch } from '../../../hooks' +import { useAppDispatch, useAppSelector } from '../../../hooks' const Accordion = styled((props: AccordionProps) => )( ({ theme }) => ({}) @@ -88,23 +87,23 @@ const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({})) function ControlPanel() { const dispatch = useAppDispatch() - const signalStateLayerStyle = useSelector(selectSignalStateLayerStyle) - - const queryParams = useSelector(selectQueryParams) - const timeWindowSeconds = useSelector(selectTimeWindowSeconds) - const sliderValue = useSelector(selectSliderValue) - const mapSpatTimes = useSelector(selectMapSpatTimes) - const sigGroupLabelsVisible = useSelector(selectSigGroupLabelsVisible) - const laneLabelsVisible = useSelector(selectLaneLabelsVisible) - const showPopupOnHover = useSelector(selectShowPopupOnHover) - const liveDataActive = useSelector(selectLiveDataActive) - const sliderTimeValue = useSelector(selectSliderTimeValue) - const bsmTrailLength = useSelector(selectBsmTrailLength) - const selectedIntersectionId = useSelector(selectSelectedIntersectionId) - const intersectionsList = useSelector(selectIntersections) - - const bsmEventsByMinute = useSelector(selectBsmEventsByMinute) - const playbackModeActive = useSelector(selectPlaybackModeActive) + const signalStateLayerStyle = useAppSelector(selectSignalStateLayerStyle) + + const queryParams = useAppSelector(selectQueryParams) + const timeWindowSeconds = useAppSelector(selectTimeWindowSeconds) + const sliderValue = useAppSelector(selectSliderValue) + const mapSpatTimes = useAppSelector(selectMapSpatTimes) + const sigGroupLabelsVisible = useAppSelector(selectSigGroupLabelsVisible) + const laneLabelsVisible = useAppSelector(selectLaneLabelsVisible) + const showPopupOnHover = useAppSelector(selectShowPopupOnHover) + const liveDataActive = useAppSelector(selectLiveDataActive) + const sliderTimeValue = useAppSelector(selectSliderTimeValue) + const bsmTrailLength = useAppSelector(selectBsmTrailLength) + const selectedIntersectionId = useAppSelector(selectSelectedIntersectionId) + const intersectionsList = useAppSelector(selectIntersections) + + const bsmEventsByMinute = useAppSelector(selectBsmEventsByMinute) + const playbackModeActive = useAppSelector(selectPlaybackModeActive) const getQueryParams = ({ startDate, diff --git a/webapp/src/features/intersections/map/map-component.tsx b/webapp/src/features/intersections/map/map-component.tsx index cb746f5be..dcdb1a2b8 100644 --- a/webapp/src/features/intersections/map/map-component.tsx +++ b/webapp/src/features/intersections/map/map-component.tsx @@ -8,7 +8,6 @@ import { Paper, Box } from '@mui/material' import ControlPanel from './control-panel' import { SidePanel } from './side-panel' import { CustomPopup } from './popup' -import { useDispatch, useSelector } from 'react-redux' import { selectToken } from '../../../generalSlices/userSlice' import { selectBsmLayerStyle, @@ -76,7 +75,7 @@ import { RootState } from '../../../store' import { MapLegend } from './map-legend' import { selectSelectedSrm } from '../../../generalSlices/rsuSlice' import mbStyle from '../../../styles/intersectionMapStyle.json' -import { useAppDispatch } from '../../../hooks' +import { useAppDispatch, useAppSelector } from '../../../hooks' export const getTimestamp = (dt: any): number => { try { @@ -104,46 +103,46 @@ const IntersectionMap = (props: MAP_PROPS) => { const dispatch = useAppDispatch() // userSlice - const authToken = useSelector(selectToken) + const authToken = useAppSelector(selectToken) - const mapMessageLayerStyle = useSelector(selectMapMessageLayerStyle) - const mapMessageLabelsLayerStyle = useSelector(selectMapMessageLabelsLayerStyle) - const connectingLanesLayerStyle = useSelector(selectConnectingLanesLayerStyle) - const connectingLanesLabelsLayerStyle = useSelector(selectConnectingLanesLabelsLayerStyle) - const markerLayerStyle = useSelector(selectMarkerLayerStyle) - const srmLayerStyle = useSelector(selectSrmLayerStyle) - const bsmLayerStyle = useSelector(selectBsmLayerStyle) - const signalStateLayerStyle = useSelector(selectSignalStateLayerStyle) + const mapMessageLayerStyle = useAppSelector(selectMapMessageLayerStyle) + const mapMessageLabelsLayerStyle = useAppSelector(selectMapMessageLabelsLayerStyle) + const connectingLanesLayerStyle = useAppSelector(selectConnectingLanesLayerStyle) + const connectingLanesLabelsLayerStyle = useAppSelector(selectConnectingLanesLabelsLayerStyle) + const markerLayerStyle = useAppSelector(selectMarkerLayerStyle) + const srmLayerStyle = useAppSelector(selectSrmLayerStyle) + const bsmLayerStyle = useAppSelector(selectBsmLayerStyle) + const signalStateLayerStyle = useAppSelector(selectSignalStateLayerStyle) - const selectedSrm = useSelector(selectSelectedSrm) + const selectedSrm = useAppSelector(selectSelectedSrm) - const allInteractiveLayerIds = useSelector(selectAllInteractiveLayerIds) - const queryParams = useSelector(selectQueryParams) - const mapData = useSelector(selectMapData) - const bsmData = useSelector(selectBsmData) - const mapSignalGroups = useSelector(selectMapSignalGroups) - const signalStateData = useSelector(selectSignalStateData) - const spatSignalGroups = useSelector(selectSpatSignalGroups) - const currentSignalGroups = useSelector(selectCurrentSignalGroups) - const currentBsms = useSelector(selectCurrentBsms) - const connectingLanes = useSelector(selectConnectingLanes) - const filteredSurroundingEvents = useSelector(selectFilteredSurroundingEvents) - const filteredSurroundingNotifications = useSelector(selectFilteredSurroundingNotifications) - const viewState = useSelector(selectViewState) - const timeWindowSeconds = useSelector(selectTimeWindowSeconds) - const sliderValue = useSelector(selectSliderValue) - const renderTimeInterval = useSelector(selectRenderTimeInterval) - const hoveredFeature = useSelector(selectHoveredFeature) - const selectedFeature = useSelector(selectSelectedFeature) - const sigGroupLabelsVisible = useSelector(selectSigGroupLabelsVisible) - const laneLabelsVisible = useSelector(selectLaneLabelsVisible) - const showPopupOnHover = useSelector(selectShowPopupOnHover) - const cursor = useSelector(selectCursor) - const loadInitialDataTimeoutId = useSelector(selectLoadInitialDataTimeoutId) - const liveDataActive = useSelector(selectLiveDataActive) - const playbackModeActive = useSelector(selectPlaybackModeActive) - const liveDataRestartTimeoutId = useSelector(selectLiveDataRestartTimeoutId) - const liveDataRestart = useSelector(selectLiveDataRestart) + const allInteractiveLayerIds = useAppSelector(selectAllInteractiveLayerIds) + const queryParams = useAppSelector(selectQueryParams) + const mapData = useAppSelector(selectMapData) + const bsmData = useAppSelector(selectBsmData) + const mapSignalGroups = useAppSelector(selectMapSignalGroups) + const signalStateData = useAppSelector(selectSignalStateData) + const spatSignalGroups = useAppSelector(selectSpatSignalGroups) + const currentSignalGroups = useAppSelector(selectCurrentSignalGroups) + const currentBsms = useAppSelector(selectCurrentBsms) + const connectingLanes = useAppSelector(selectConnectingLanes) + const filteredSurroundingEvents = useAppSelector(selectFilteredSurroundingEvents) + const filteredSurroundingNotifications = useAppSelector(selectFilteredSurroundingNotifications) + const viewState = useAppSelector(selectViewState) + const timeWindowSeconds = useAppSelector(selectTimeWindowSeconds) + const sliderValue = useAppSelector(selectSliderValue) + const renderTimeInterval = useAppSelector(selectRenderTimeInterval) + const hoveredFeature = useAppSelector(selectHoveredFeature) + const selectedFeature = useAppSelector(selectSelectedFeature) + const sigGroupLabelsVisible = useAppSelector(selectSigGroupLabelsVisible) + const laneLabelsVisible = useAppSelector(selectLaneLabelsVisible) + const showPopupOnHover = useAppSelector(selectShowPopupOnHover) + const cursor = useAppSelector(selectCursor) + const loadInitialDataTimeoutId = useAppSelector(selectLoadInitialDataTimeoutId) + const liveDataActive = useAppSelector(selectLiveDataActive) + const playbackModeActive = useAppSelector(selectPlaybackModeActive) + const liveDataRestartTimeoutId = useAppSelector(selectLiveDataRestartTimeoutId) + const liveDataRestart = useAppSelector(selectLiveDataRestart) const mapRef = React.useRef(null) const [bsmTrailLength, setBsmTrailLength] = useState(5) diff --git a/webapp/src/features/intersections/map/map-legend.tsx b/webapp/src/features/intersections/map/map-legend.tsx index 5ef04301b..9a62f4f02 100644 --- a/webapp/src/features/intersections/map/map-legend.tsx +++ b/webapp/src/features/intersections/map/map-legend.tsx @@ -1,16 +1,4 @@ -import { - Paper, - Box, - IconButton, - Typography, - TableContainer, - Table, - TableHead, - TableRow, - TableBody, - TableCell, - Divider, -} from '@mui/material' +import { Paper, Typography, Divider } from '@mui/material' import React from 'react' import MuiAccordion, { AccordionProps } from '@mui/material/Accordion' import MuiAccordionSummary, { AccordionSummaryProps } from '@mui/material/AccordionSummary' @@ -18,7 +6,7 @@ import MuiAccordionDetails from '@mui/material/AccordionDetails' import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp' import { styled } from '@mui/material/styles' import { selectMapLegendColors } from './map-layer-style-slice' -import { useSelector } from 'react-redux' +import { useAppSelector } from '../../../hooks' const Accordion = styled((props: AccordionProps) => )( ({ theme }) => ({}) @@ -43,7 +31,7 @@ const AccordionSummary = styled((props: AccordionSummaryProps) => ( const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({})) export const MapLegend = () => { - const mapLegendColors = useSelector(selectMapLegendColors) + const mapLegendColors = useAppSelector(selectMapLegendColors) const { bsmColors, travelConnectionColors, laneColors, signalHeadIcons } = mapLegendColors diff --git a/webapp/src/features/intersections/map/side-panel.tsx b/webapp/src/features/intersections/map/side-panel.tsx index c84d45d8e..0a45e167b 100644 --- a/webapp/src/features/intersections/map/side-panel.tsx +++ b/webapp/src/features/intersections/map/side-panel.tsx @@ -15,10 +15,9 @@ import { MAP_PROPS, selectSrmCount, selectSrmMsgList, selectSrmSsmCount } from ' import { RsuInfo } from '../../../apis/rsu-api-types' import SsmSrmItem from '../../../components/SsmSrmItem' import { setSelectedSrm } from '../../../generalSlices/rsuSlice' -import { useSelector } from 'react-redux' import { selectSelectedIntersection } from '../../../generalSlices/intersectionSlice' import '../../../components/css/RsuMapView.css' -import { useAppDispatch } from '../../../hooks' +import { useAppDispatch, useAppSelector } from '../../../hooks' const Accordion = styled((props: AccordionProps) => )( ({ theme }) => ({}) @@ -57,10 +56,10 @@ export const SidePanel = (props: SidePanelProps) => { const dispatch = useAppDispatch() - const srmCount = useSelector(selectSrmCount) - const srmSsmCount = useSelector(selectSrmSsmCount) - const srmMsgList = useSelector(selectSrmMsgList) - const selectedIntersection = useSelector(selectSelectedIntersection) + const srmCount = useAppSelector(selectSrmCount) + const srmSsmCount = useAppSelector(selectSrmSsmCount) + const srmMsgList = useAppSelector(selectSrmMsgList) + const selectedIntersection = useAppSelector(selectSelectedIntersection) const [open, setOpen] = useState(false) diff --git a/webapp/src/features/intersections/notifications/notifications-table-results.tsx b/webapp/src/features/intersections/notifications/notifications-table-results.tsx index a1f4fb217..2a2c9371c 100644 --- a/webapp/src/features/intersections/notifications/notifications-table-results.tsx +++ b/webapp/src/features/intersections/notifications/notifications-table-results.tsx @@ -21,8 +21,8 @@ import MapRoundedIcon from '@mui/icons-material/MapRounded' import KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown' import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp' import { useNavigate } from 'react-router-dom' -import { useSelector } from 'react-redux' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' +import { useAppSelector } from '../../../hooks' export const NotificationsTableResults = ({ customers, @@ -37,8 +37,8 @@ export const NotificationsTableResults = ({ page, rowsPerPage, }) => { - const intersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) const navigate = useNavigate() const handleSelectAll = (event) => { diff --git a/webapp/src/features/intersections/notifications/notifications-table.tsx b/webapp/src/features/intersections/notifications/notifications-table.tsx index a519fa1fd..09e3b8698 100644 --- a/webapp/src/features/intersections/notifications/notifications-table.tsx +++ b/webapp/src/features/intersections/notifications/notifications-table.tsx @@ -21,7 +21,7 @@ import NotificationApi from '../../../apis/intersections/notification-api' import React, { useEffect, useState, useRef } from 'react' import { selectToken } from '../../../generalSlices/userSlice' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' -import { useSelector } from 'react-redux' +import { useAppSelector } from '../../../hooks' const tabs = [ { @@ -76,9 +76,9 @@ export const NotificationsTable = (props: { simple: Boolean }) => { query: '', tab: currentTab, }) - const token = useSelector(selectToken) - const dbIntersectionId = useSelector(selectSelectedIntersectionId) - const roadRegulatorId = useSelector(selectSelectedRoadRegulatorId) + const token = useAppSelector(selectToken) + const dbIntersectionId = useAppSelector(selectSelectedIntersectionId) + const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) const updateNotifications = () => { if (dbIntersectionId) { diff --git a/webapp/src/features/intersections/reports/report-generation-dialog.tsx b/webapp/src/features/intersections/reports/report-generation-dialog.tsx index e46c88892..317770f9b 100644 --- a/webapp/src/features/intersections/reports/report-generation-dialog.tsx +++ b/webapp/src/features/intersections/reports/report-generation-dialog.tsx @@ -6,7 +6,7 @@ import ReportsApi from '../../../apis/intersections/reports-api' import toast from 'react-hot-toast' import { selectToken } from '../../../generalSlices/userSlice' import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' -import { useSelector } from 'react-redux' +import { useAppSelector } from '../../../hooks' type ReportGenerationDialogProps = { onClose: () => void @@ -14,8 +14,8 @@ type ReportGenerationDialogProps = { } export const ReportGenerationDialog = (props: ReportGenerationDialogProps) => { - const token = useSelector(selectToken) - const intersectionId = useSelector(selectSelectedIntersectionId) + const token = useAppSelector(selectToken) + const intersectionId = useAppSelector(selectSelectedIntersectionId) const { onClose, open } = props diff --git a/webapp/src/features/intersections/reports/report-list-table.tsx b/webapp/src/features/intersections/reports/report-list-table.tsx index e68ba0ed8..2950ee6c7 100644 --- a/webapp/src/features/intersections/reports/report-list-table.tsx +++ b/webapp/src/features/intersections/reports/report-list-table.tsx @@ -16,9 +16,9 @@ import PerfectScrollbar from 'react-perfect-scrollbar' import { ArrowDownward } from '@mui/icons-material' import toast from 'react-hot-toast' import ReportsApi, { ReportMetadata } from '../../../apis/intersections/reports-api' -import { useSelector } from 'react-redux' import { useNavigate } from 'react-router-dom' import { selectToken } from '../../../generalSlices/userSlice' +import { useAppSelector } from '../../../hooks' interface ReportRowProps { report: ReportMetadata @@ -26,7 +26,7 @@ interface ReportRowProps { const ReportRow = (props: ReportRowProps) => { const navigate = useNavigate() - const token = useSelector(selectToken) + const token = useAppSelector(selectToken) const { report } = props const downloadReport = async (reportName: string) => { diff --git a/webapp/src/features/menu/ConfigureRSU.tsx b/webapp/src/features/menu/ConfigureRSU.tsx index 110d19850..e94bb3967 100644 --- a/webapp/src/features/menu/ConfigureRSU.tsx +++ b/webapp/src/features/menu/ConfigureRSU.tsx @@ -6,7 +6,6 @@ import RsuFirmwareMenu from '../../components/RsuFirmwareMenu' import Accordion from '@mui/material/Accordion' import AccordionDetails from '@mui/material/AccordionDetails' import AccordionSummary from '@mui/material/AccordionSummary' -import { useSelector } from 'react-redux' import { ThemeProvider, StyledEngineProvider } from '@mui/material' import ExpandMoreIcon from '@mui/icons-material/ExpandMore' import Typography from '@mui/material/Typography' @@ -16,7 +15,7 @@ import { clearConfig, selectConfigList } from '../../generalSlices/configSlice' import '../../components/css/SnmpwalkMenu.css' import { accordionTheme } from '../../styles' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const ConfigureRSU = () => { const dispatch = useAppDispatch() @@ -25,8 +24,8 @@ const ConfigureRSU = () => { const handleChange = (panel: string) => (event: React.SyntheticEvent, isExpanded: boolean) => { setExpanded(isExpanded ? panel : undefined) } - const selectedRsu = useSelector(selectSelectedRsu) - const selectedConfigList = useSelector(selectConfigList) + const selectedRsu = useAppSelector(selectSelectedRsu) + const selectedConfigList = useAppSelector(selectConfigList) return (
diff --git a/webapp/src/features/menu/DisplayCounts.tsx b/webapp/src/features/menu/DisplayCounts.tsx index 690313512..7fd07598f 100644 --- a/webapp/src/features/menu/DisplayCounts.tsx +++ b/webapp/src/features/menu/DisplayCounts.tsx @@ -1,5 +1,4 @@ import React from 'react' -import { useSelector } from 'react-redux' import dayjs from 'dayjs' import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider' import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns' @@ -24,7 +23,7 @@ import { selectCurrentSort, selectSortedCountList, sortCountList, changeDate } f import '../../components/css/SnmpwalkMenu.css' import { CountsListElement } from '../../models/Rsu' import { MessageType } from '../../models/MessageTypes' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const messageTypeOptions = EnvironmentVars.getMessageTypes().map((type) => { return { value: type, label: type } @@ -32,15 +31,15 @@ const messageTypeOptions = EnvironmentVars.getMessageTypes().map((type) => { const DisplayCounts = () => { const dispatch = useAppDispatch() - const countsMsgType = useSelector(selectMsgType) - const startDate = useSelector(selectStartDate) - const endDate = useSelector(selectEndDate) - const requestOut = useSelector(selectRequestOut) - const warning = useSelector(selectWarningMessage) - const messageLoading = useSelector(selectMessageLoading) - const countList = useSelector(selectCountList) - const currentSort = useSelector(selectCurrentSort) - const sortedCountList = useSelector(selectSortedCountList) + const countsMsgType = useAppSelector(selectMsgType) + const startDate = useAppSelector(selectStartDate) + const endDate = useAppSelector(selectEndDate) + const requestOut = useAppSelector(selectRequestOut) + const warning = useAppSelector(selectWarningMessage) + const messageLoading = useAppSelector(selectMessageLoading) + const countList = useAppSelector(selectCountList) + const currentSort = useAppSelector(selectCurrentSort) + const sortedCountList = useAppSelector(selectSortedCountList) const dateChanged = (e: Date, type: 'start' | 'end') => { if (!Number.isNaN(Date.parse(e.toString()))) { diff --git a/webapp/src/features/menu/Menu.tsx b/webapp/src/features/menu/Menu.tsx index c1451e5a9..1557b1f95 100644 --- a/webapp/src/features/menu/Menu.tsx +++ b/webapp/src/features/menu/Menu.tsx @@ -1,14 +1,13 @@ import React from 'react' import './Menu.css' import { useEffect } from 'react' -import { useSelector } from 'react-redux' import { selectCountList, selectSelectedRsu } from '../../generalSlices/rsuSlice' import { selectConfigList } from '../../generalSlices/configSlice' import { selectDisplayCounts, selectView, setDisplay, setSortedCountList } from './menuSlice' import { SecureStorageManager } from '../../managers' import DisplayCounts from './DisplayCounts' import ConfigureRSU from './ConfigureRSU' -import { useAppDispatch } from '../../hooks' +import { useAppDispatch, useAppSelector } from '../../hooks' const menuStyle: React.CSSProperties = { background: '#0e2052', @@ -24,11 +23,11 @@ const menuStyle: React.CSSProperties = { const Menu = () => { const dispatch = useAppDispatch() - const countList = useSelector(selectCountList) - const selectedRsu = useSelector(selectSelectedRsu) - const selectedRsuList = useSelector(selectConfigList) - const displayCounts = useSelector(selectDisplayCounts) - const view = useSelector(selectView) + const countList = useAppSelector(selectCountList) + const selectedRsu = useAppSelector(selectSelectedRsu) + const selectedRsuList = useAppSelector(selectConfigList) + const displayCounts = useAppSelector(selectDisplayCounts) + const view = useAppSelector(selectView) useEffect(() => { dispatch(setSortedCountList(countList)) diff --git a/webapp/src/hooks.ts b/webapp/src/hooks.ts index ebf425025..c84e476f0 100644 --- a/webapp/src/hooks.ts +++ b/webapp/src/hooks.ts @@ -2,6 +2,6 @@ import { useDispatch, useSelector } from 'react-redux' import type { AppDispatch, RootState } from './store' -// Use throughout your app instead of plain `useDispatch` and `useSelector` +// Use throughout the app instead of plain `useDispatch` and `useSelector` export const useAppDispatch: () => AppDispatch = useDispatch export const useAppSelector: (selector: (state: RootState) => TSelected) => TSelected = useSelector diff --git a/webapp/src/pages/IntersectionDashboard.tsx b/webapp/src/pages/IntersectionDashboard.tsx index 2f9f60556..411c83721 100644 --- a/webapp/src/pages/IntersectionDashboard.tsx +++ b/webapp/src/pages/IntersectionDashboard.tsx @@ -1,5 +1,4 @@ import React, { useEffect, useState } from 'react' -import { useSelector } from 'react-redux' import { updateTableData as updateRsuTableData } from '../features/adminRsuTab/adminRsuTabSlice' import { getAvailableUsers } from '../features/adminUserTab/adminUserTabSlice' @@ -19,12 +18,12 @@ import { } from '../generalSlices/intersectionSlice' import MapIconRounded from '@mui/icons-material/Map' import MapDialog from '../features/intersections/intersection-selector/intersection-selector-dialog' -import { useAppDispatch } from '../hooks' +import { useAppDispatch, useAppSelector } from '../hooks' function IntersectionDashboard() { const dispatch = useAppDispatch() - const intersectionId = useSelector(selectSelectedIntersectionId) - const intersections = useSelector(selectIntersections) + const intersectionId = useAppSelector(selectSelectedIntersectionId) + const intersections = useAppSelector(selectIntersections) const [openMapDialog, setOpenMapDialog] = useState(false) useEffect(() => { diff --git a/webapp/src/pages/Map.tsx b/webapp/src/pages/Map.tsx index 174ae48c1..dff744ae8 100644 --- a/webapp/src/pages/Map.tsx +++ b/webapp/src/pages/Map.tsx @@ -21,12 +21,10 @@ import { selectSelectedRsu, selectMsgType, selectRsuIpv4, - selectDisplayMap, selectHeatMapData, selectAddGeoMsgPoint, selectGeoMsgStart, selectGeoMsgEnd, - selectGeoMsgDateError, selectGeoMsgData, selectGeoMsgCoordinates, selectGeoMsgFilter, @@ -36,7 +34,6 @@ import { // actions selectRsu, getRsuData, - toggleMapDisplay, getIssScmsStatus, getRsuLastOnline, toggleGeoMsgPointSelect, @@ -61,7 +58,6 @@ import { clearConfig, clearFirmware, } from '../generalSlices/configSlice' -import { useSelector } from 'react-redux' import ClearIcon from '@mui/icons-material/Clear' import { Button, @@ -87,8 +83,7 @@ import { setSelectedIntersectionId, } from '../generalSlices/intersectionSlice' import { mapTheme } from '../styles' -import { selectLiveBsmData, startBsmSamples } from '../features/intersections/live/live-intersection-slice' -import { useAppDispatch } from '../hooks' +import { useAppDispatch, useAppSelector } from '../hooks' // @ts-ignore: workerClass does not exist in typed mapboxgl // eslint-disable-next-line import/no-webpack-loader-syntax @@ -103,37 +98,33 @@ interface MapPageProps { function MapPage(props: MapPageProps) { const dispatch = useAppDispatch() - const organization = useSelector(selectOrganizationName) - const rsuData = useSelector(selectRsuData) - const rsuCounts = useSelector(selectRsuCounts) - const selectedRsu = useSelector(selectSelectedRsu) - const countsMsgType = useSelector(selectMsgType) - const issScmsStatusData = useSelector(selectIssScmsStatusData) - const rsuOnlineStatus = useSelector(selectRsuOnlineStatus) - const rsuIpv4 = useSelector(selectRsuIpv4) - const displayMap = useSelector(selectDisplayMap) - const addConfigPoint = useSelector(selectAddConfigPoint) - const configCoordinates = useSelector(selectConfigCoordinates) + const organization = useAppSelector(selectOrganizationName) + const rsuData = useAppSelector(selectRsuData) + const rsuCounts = useAppSelector(selectRsuCounts) + const selectedRsu = useAppSelector(selectSelectedRsu) + const countsMsgType = useAppSelector(selectMsgType) + const issScmsStatusData = useAppSelector(selectIssScmsStatusData) + const rsuOnlineStatus = useAppSelector(selectRsuOnlineStatus) + const rsuIpv4 = useAppSelector(selectRsuIpv4) + const addConfigPoint = useAppSelector(selectAddConfigPoint) + const configCoordinates = useAppSelector(selectConfigCoordinates) - const heatMapData = useSelector(selectHeatMapData) + const heatMapData = useAppSelector(selectHeatMapData) - const geoMsgData = useSelector(selectGeoMsgData) - const geoMsgCoordinates = useSelector(selectGeoMsgCoordinates) - const addGeoMsgPoint = useSelector(selectAddGeoMsgPoint) - const startGeoMsgDate = useSelector(selectGeoMsgStart) - const endGeoMsgDate = useSelector(selectGeoMsgEnd) - const msgViewerDateError = useSelector(selectGeoMsgDateError) + const geoMsgData = useAppSelector(selectGeoMsgData) + const geoMsgCoordinates = useAppSelector(selectGeoMsgCoordinates) + const addGeoMsgPoint = useAppSelector(selectAddGeoMsgPoint) + const startGeoMsgDate = useAppSelector(selectGeoMsgStart) + const endGeoMsgDate = useAppSelector(selectGeoMsgEnd) - const filter = useSelector(selectGeoMsgFilter) - const filterStep = useSelector(selectGeoMsgFilterStep) - const filterOffset = useSelector(selectGeoMsgFilterOffset) + const filter = useAppSelector(selectGeoMsgFilter) + const filterStep = useAppSelector(selectGeoMsgFilterStep) + const filterOffset = useAppSelector(selectGeoMsgFilterOffset) - const wzdxData = useSelector(selectWzdxData) + const wzdxData = useAppSelector(selectWzdxData) - const intersectionsList = useSelector(selectIntersections) - const selectedIntersection = useSelector(selectSelectedIntersection) - - const liveBsmData = useSelector(selectLiveBsmData) + const intersectionsList = useAppSelector(selectIntersections) + const selectedIntersection = useAppSelector(selectSelectedIntersection) // Mapbox local state variables const [viewState, setViewState] = useState(EnvironmentVars.getMapboxInitViewState()) @@ -179,7 +170,6 @@ function MapPage(props: MapPageProps) { { value: 30, label: '30 minutes' }, { value: 60, label: '60 minutes' }, ] - const [selectedOption, setSelectedOption] = useState({ value: 60, label: '60 minutes' }) function stepValueToOption(val: number) { for (var i = 0; i < stepOptions.length; i++) { @@ -190,6 +180,8 @@ function MapPage(props: MapPageProps) { } // WZDx layer local state variables + // The marker index is necessary because the marker callback becomes disconnected from the curernt state + const [selectedWZDxMarkerIndex, setSelectedWZDxMarkerIndex] = useState(null) const [selectedWZDxMarker, setSelectedWZDxMarker] = useState(null) const [wzdxMarkers, setWzdxMarkers] = useState([]) const [pageOpen, setPageOpen] = useState(true) @@ -204,6 +196,7 @@ function MapPage(props: MapPageProps) { } if (!wzdxMarkers) { + setSelectedWZDxMarkerIndex(null) setSelectedWZDxMarker(null) } @@ -213,6 +206,7 @@ function MapPage(props: MapPageProps) { if (e.key === 'Escape') { dispatch(selectRsu(null)) dispatch(clearFirmware()) + setSelectedWZDxMarkerIndex(null) setSelectedWZDxMarker(null) } } @@ -221,7 +215,7 @@ function MapPage(props: MapPageProps) { return () => { window.removeEventListener('keydown', listener) } - }, [selectedRsu, dispatch, setSelectedWZDxMarker]) + }, [selectedRsu, dispatch, setSelectedWZDxMarkerIndex, setSelectedWZDxMarker]) // useEffects for RSU layer useEffect(() => { @@ -370,6 +364,12 @@ function MapPage(props: MapPageProps) { } } + // useEffects for WZDx layers + useEffect(() => { + // This is to handle the fact that the marker callback is disconnected from the current state + if (selectedWZDxMarkerIndex !== null) setSelectedWZDxMarker(wzdxMarkers[selectedWZDxMarkerIndex]) + }, [selectedWZDxMarkerIndex, wzdxMarkers]) + useEffect(() => { function createPopupTable(data: Array>) { let rows = [] @@ -420,7 +420,8 @@ function MapPage(props: MapPageProps) { } function openPopup(index: number) { - setSelectedWZDxMarker(wzdxMarkers[index]) + console.log('WZDx openPopup', index, wzdxMarkers) + setSelectedWZDxMarkerIndex(index) dispatch(selectRsu(null)) dispatch(clearFirmware()) } @@ -469,6 +470,7 @@ function MapPage(props: MapPageProps) { } } + console.log('Generating Markers', wzdxData, getAllMarkers(wzdxData)) setWzdxMarkers(getAllMarkers(wzdxData)) }, [dispatch, wzdxData]) @@ -494,6 +496,7 @@ function MapPage(props: MapPageProps) { function closePopup() { setSelectedWZDxMarker(null) + setSelectedWZDxMarkerIndex(null) } function getStops() { @@ -576,6 +579,7 @@ function MapPage(props: MapPageProps) { dispatch(clearFirmware()) setSelectedRsuCount(null) } else if (id === 'wzdx-layer') { + setSelectedWZDxMarkerIndex(null) setSelectedWZDxMarker(null) } setActiveLayers(activeLayers.filter((layerId) => layerId !== id)) @@ -797,6 +801,7 @@ function MapPage(props: MapPageProps) { onClick={(e) => { e.originalEvent.stopPropagation() dispatch(selectRsu(rsu)) + setSelectedWZDxMarkerIndex(null) setSelectedWZDxMarker(null) dispatch(clearFirmware()) // TODO: Should remove?? dispatch(getRsuLastOnline(rsu.properties.ipv4_address)) @@ -812,6 +817,7 @@ function MapPage(props: MapPageProps) { e.stopPropagation() dispatch(selectRsu(rsu)) dispatch(clearFirmware()) // TODO: Should remove?? + setSelectedWZDxMarkerIndex(null) setSelectedWZDxMarker(null) dispatch(getRsuLastOnline(rsu.properties.ipv4_address)) dispatch(getIssScmsStatus()) @@ -858,10 +864,10 @@ function MapPage(props: MapPageProps) { )} {activeLayers.includes('wzdx-layer') && (
- {wzdxMarkers} + {wzdxMarkers}
)} {selectedWZDxMarker ? ( From 9708c7853830607010048df874e2c1cf5408120c Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Tue, 15 Oct 2024 19:16:21 -0600 Subject: [PATCH 03/27] upgrading mui package version --- webapp/package-lock.json | 1058 ++++++++++------- webapp/package.json | 16 +- .../data-selector/data-selector-edit-form.tsx | 8 - .../intersections/map/control-panel.tsx | 5 +- .../reports/report-list-filters.tsx | 16 +- .../reports/report-request-edit-form.tsx | 16 - webapp/src/features/menu/DisplayCounts.tsx | 14 - webapp/src/pages/Map.tsx | 14 - webapp/yarn.lock | 625 +++++----- 9 files changed, 930 insertions(+), 842 deletions(-) diff --git a/webapp/package-lock.json b/webapp/package-lock.json index d95fa94df..aaed11050 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -9,16 +9,14 @@ "version": "1.2.0-SNAPSHOT", "dependencies": { "@date-io/date-fns": "^2.15.0", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.13.0", "@hookform/error-message": "^2.0.1", - "@material-table/core": "^6.1.6", - "@material-ui/core": "^4.12.3", - "@mui/icons-material": "^5.15.19", - "@mui/material": "^5.15.19", - "@mui/styled-engine-sc": "^5.11.9", - "@mui/styles": "^5.15.19", - "@mui/x-date-pickers": "^5.0.15", + "@material-table/core": "^6.1.4", + "@mui/icons-material": "^6.1.4", + "@mui/material": "^6.1.4", + "@mui/styles": "^6.1.4", + "@mui/x-date-pickers": "^7.20.0", "@react-keycloak/web": "3.4.0", "@react-oauth/google": "^0.2.8", "@reduxjs/toolkit": "^1.9.1", @@ -1959,9 +1957,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2333,11 +2331,11 @@ } }, "node_modules/@date-io/dayjs": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz", - "integrity": "sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.17.0.tgz", + "integrity": "sha512-Iq1wjY5XzBh0lheFA0it6Dsyv94e8mTiNR8vuTai+KopxDkreL3YjwTmZHxkgB7/vd0RMIACStzVgWvPATnDCA==", "dependencies": { - "@date-io/core": "^2.16.0" + "@date-io/core": "^2.17.0" }, "peerDependencies": { "dayjs": "^1.8.17" @@ -2349,11 +2347,11 @@ } }, "node_modules/@date-io/luxon": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz", - "integrity": "sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.17.0.tgz", + "integrity": "sha512-l712Vdm/uTddD2XWt9TlQloZUiTiRQtY5TCOG45MQ/8u0tu8M17BD6QYHar/3OrnkGybALAMPzCy1r5D7+0HBg==", "dependencies": { - "@date-io/core": "^2.16.0" + "@date-io/core": "^2.17.0" }, "peerDependencies": { "luxon": "^1.21.3 || ^2.x || ^3.x" @@ -2365,11 +2363,11 @@ } }, "node_modules/@date-io/moment": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz", - "integrity": "sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ==", + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.17.0.tgz", + "integrity": "sha512-e4nb4CDZU4k0WRVhz1Wvl7d+hFsedObSauDHKtZwU9kt7gdYEAzKgnrSCTHsEaXrDumdrkCYTeZ0Tmyk7uV4tw==", "dependencies": { - "@date-io/core": "^2.16.0" + "@date-io/core": "^2.17.0" }, "peerDependencies": { "moment": "^2.24.0" @@ -2381,15 +2379,15 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", - "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", + "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.2.0", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -2398,11 +2396,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2415,14 +2408,14 @@ } }, "node_modules/@emotion/cache": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", - "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", + "version": "11.13.1", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", + "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } }, @@ -2432,84 +2425,82 @@ "integrity": "sha512-w4sE3AmHmyG6RDKf6mIbtHpgJUSJ2uGvPQb8VXFL7hFjMPibE8IiehG8cMX3Ztm4svfCQV6KqusQbeIOkurBcA==" }, "node_modules/@emotion/hash": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", - "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==" + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", "dependencies": { - "@emotion/memoize": "^0.8.1" + "@emotion/memoize": "^0.9.0" } }, "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" }, "node_modules/@emotion/react": { - "version": "11.11.4", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", - "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", + "version": "11.9.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz", + "integrity": "sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@emotion/babel-plugin": "^11.7.1", + "@emotion/cache": "^11.7.1", + "@emotion/serialize": "^1.0.3", + "@emotion/utils": "^1.1.0", + "@emotion/weak-memoize": "^0.2.5", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { + "@babel/core": "^7.0.0", "react": ">=16.8.0" }, "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, "@types/react": { "optional": true } } }, + "node_modules/@emotion/react/node_modules/@emotion/weak-memoize": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz", + "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==" + }, "node_modules/@emotion/serialize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", - "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", + "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.1", "csstype": "^3.0.2" } }, - "node_modules/@emotion/serialize/node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" - }, - "node_modules/@emotion/serialize/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, "node_modules/@emotion/sheet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", - "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" }, "node_modules/@emotion/styled": { - "version": "11.11.5", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", - "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "version": "11.13.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", + "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.2", - "@emotion/serialize": "^1.1.4", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1" + "@emotion/babel-plugin": "^11.12.0", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.0", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -2527,27 +2518,27 @@ "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" }, "node_modules/@emotion/unitless": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", - "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz", + "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", - "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", + "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==" }, "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", - "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -2634,40 +2625,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@floating-ui/core": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", - "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", - "dependencies": { - "@floating-ui/utils": "^0.2.0" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", - "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" - } - }, - "node_modules/@floating-ui/react-dom": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", - "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", - "dependencies": { - "@floating-ui/dom": "^1.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", - "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" - }, "node_modules/@hello-pangea/dnd": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-16.2.0.tgz", @@ -5003,9 +4960,9 @@ } }, "node_modules/@material-table/core": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/@material-table/core/-/core-6.1.6.tgz", - "integrity": "sha512-fbxDj+kqCsdU0MBhJai/5RBgLCnV7R4WboZjYUtOzX5TQcGBCYk/BAae67rwG++0IUSdmKENVawPMNbV0qWROw==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@material-table/core/-/core-6.1.4.tgz", + "integrity": "sha512-PCbVyf1ULWBDbZx1tukJg8rPjlRdORo/mjtLHO4+ZgtXvFyVZ3qtd+5E7ouWuga0JQka0v3Gv4c+oaI8RmsW7w==", "dependencies": { "@babel/runtime": "^7.19.0", "@date-io/core": "^2.16.0", @@ -5033,6 +4990,148 @@ "react-dom": ">=16.8.0" } }, + "node_modules/@material-table/core/node_modules/@emotion/react": { + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.12.0", + "@emotion/cache": "^11.13.0", + "@emotion/serialize": "^1.3.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", + "@emotion/utils": "^1.4.0", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-table/core/node_modules/@mui/core-downloads-tracker": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz", + "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@material-table/core/node_modules/@mui/material": { + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz", + "integrity": "sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/core-downloads-tracker": "^5.16.7", + "@mui/system": "^5.16.7", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@material-table/core/node_modules/@mui/material/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@material-table/core/node_modules/@mui/x-date-pickers": { + "version": "5.0.20", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz", + "integrity": "sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==", + "dependencies": { + "@babel/runtime": "^7.18.9", + "@date-io/core": "^2.15.0", + "@date-io/date-fns": "^2.15.0", + "@date-io/dayjs": "^2.15.0", + "@date-io/luxon": "^2.15.0", + "@date-io/moment": "^2.15.0", + "@mui/utils": "^5.10.3", + "@types/react-transition-group": "^4.4.5", + "clsx": "^1.2.1", + "prop-types": "^15.7.2", + "react-transition-group": "^4.4.5", + "rifm": "^0.12.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.4.1", + "@mui/system": "^5.4.1", + "date-fns": "^2.25.0", + "dayjs": "^1.10.7", + "luxon": "^1.28.0 || ^2.0.0 || ^3.0.0", + "moment": "^2.29.1", + "react": "^17.0.2 || ^18.0.0", + "react-dom": "^17.0.2 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + } + } + }, "node_modules/@material-table/core/node_modules/date-fns": { "version": "2.29.3", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", @@ -5050,6 +5149,11 @@ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" }, + "node_modules/@material-table/core/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/@material-table/core/node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -5058,36 +5162,33 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/@material-ui/core": { - "version": "4.12.4", - "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz", - "integrity": "sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", + "node_modules/@mui/core-downloads-tracker": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.4.tgz", + "integrity": "sha512-jCRsB9NDJJatVCHvwWSTfYUzuTQ7E0Km6tAQWz2Md1SLHIbVj5visC9yHbf/Cv2IDcG6XdHRv3e7Bt1rIburNw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.4.tgz", + "integrity": "sha512-nhXBNSP3WkY0pz8dg25VIYIXJkhdRLRKZtD50f9OuHVQ1eh8b+enmvaZQF0o5M8cs1sR6wQHwZYwG34qDZeG0g==", "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/styles": "^4.11.5", - "@material-ui/system": "^4.12.2", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "@types/react-transition-group": "^4.2.0", - "clsx": "^1.0.4", - "hoist-non-react-statics": "^3.3.2", - "popper.js": "1.16.1-lts", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0", - "react-transition-group": "^4.4.0" + "@babel/runtime": "^7.25.7" }, "engines": { - "node": ">=8.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@mui/material": "^6.1.4", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -5095,68 +5196,73 @@ } } }, - "node_modules/@material-ui/styles": { - "version": "4.11.5", - "resolved": "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz", - "integrity": "sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA==", - "deprecated": "Material UI v4 doesn't receive active development since September 2021. See the guide https://mui.com/material-ui/migration/migration-v4/ to upgrade to v5.", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@emotion/hash": "^0.8.0", - "@material-ui/types": "5.1.0", - "@material-ui/utils": "^4.11.3", - "clsx": "^1.0.4", - "csstype": "^2.5.2", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.5.1", - "jss-plugin-camel-case": "^10.5.1", - "jss-plugin-default-unit": "^10.5.1", - "jss-plugin-global": "^10.5.1", - "jss-plugin-nested": "^10.5.1", - "jss-plugin-props-sort": "^10.5.1", - "jss-plugin-rule-value-function": "^10.5.1", - "jss-plugin-vendor-prefixer": "^10.5.1", - "prop-types": "^15.7.2" + "node_modules/@mui/material": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.4.tgz", + "integrity": "sha512-mIVdjzDYU4U/XYzf8pPEz3zDZFS4Wbyr0cjfgeGiT/s60EvtEresXXQy8XUA0bpJDJjgic1Hl5AIRcqWDyi2eg==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/core-downloads-tracker": "^6.1.4", + "@mui/system": "^6.1.4", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.4", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^18.3.1", + "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=8.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^6.1.4", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@material-ui/system": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz", - "integrity": "sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw==", + "node_modules/@mui/material/node_modules/@mui/private-theming": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.4.tgz", + "integrity": "sha512-FPa+W5BSrRM/1QI5Gf/GwJinJ2WsrKPpJB6xMmmXMXSUIp31YioIVT04i28DQUXFFB3yZY12ukcZi51iLvPljw==", "dependencies": { - "@babel/runtime": "^7.4.4", - "@material-ui/utils": "^4.11.3", - "csstype": "^2.5.2", - "prop-types": "^15.7.2" + "@babel/runtime": "^7.25.7", + "@mui/utils": "^6.1.4", + "prop-types": "^15.8.1" }, "engines": { - "node": ">=8.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/material-ui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^16.8.6 || ^17.0.0", - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -5164,148 +5270,102 @@ } } }, - "node_modules/@material-ui/types": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz", - "integrity": "sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A==", - "peerDependencies": { - "@types/react": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@material-ui/utils": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz", - "integrity": "sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "prop-types": "^15.7.2", - "react-is": "^16.8.0 || ^17.0.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0", - "react-dom": "^16.8.0 || ^17.0.0" - } - }, - "node_modules/@mui/base": { - "version": "5.0.0-beta.40", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", - "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "node_modules/@mui/material/node_modules/@mui/styled-engine": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.4.tgz", + "integrity": "sha512-D+aiIDtJsU9OVJ7dgayhCDABJHT7jTlnz1FKyxa5mNVHsxjjeG1M4OpLsRQvx4dcvJfDywnU2cE+nFm4Ln2aFQ==", "dependencies": { - "@babel/runtime": "^7.23.9", - "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@popperjs/core": "^2.11.8", - "clsx": "^2.1.0", + "@babel/runtime": "^7.25.7", + "@emotion/cache": "^11.13.1", + "@emotion/serialize": "^1.3.2", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { - "@types/react": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { "optional": true } } }, - "node_modules/@mui/base/node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.19", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.19.tgz", - "integrity": "sha512-tCHSi/Tomez9ERynFhZRvFO6n9ATyrPs+2N80DMDzp6xDVirbBjEwhPcE+x7Lj+nwYw0SqFkOxyvMP0irnm55w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - } - }, - "node_modules/@mui/icons-material": { - "version": "5.15.19", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.19.tgz", - "integrity": "sha512-RsEiRxA5azN9b8gI7JRqekkgvxQUlitoBOtZglflb8cUDyP12/cP4gRwhb44Ea1/zwwGGjAj66ZJpGHhKfibNA==", + "node_modules/@mui/material/node_modules/@mui/system": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.4.tgz", + "integrity": "sha512-lCveY/UtDhYwMg1WnLc3wEEuGymLi6YI79VOwFV9zfZT5Et+XEw/e1It26fiKwUZ+mB1+v1iTYMpJnwnsrn2aQ==", "dependencies": { - "@babel/runtime": "^7.23.9" + "@babel/runtime": "^7.25.7", + "@mui/private-theming": "^6.1.4", + "@mui/styled-engine": "^6.1.4", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.4", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^5.0.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0" + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, "@types/react": { "optional": true } } }, - "node_modules/@mui/material": { - "version": "5.15.19", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.19.tgz", - "integrity": "sha512-lp5xQBbcRuxNtjpWU0BWZgIrv2XLUz4RJ0RqFXBdESIsKoGCQZ6P3wwU5ZPuj5TjssNiKv9AlM+vHopRxZhvVQ==", + "node_modules/@mui/material/node_modules/@mui/utils": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.4.tgz", + "integrity": "sha512-v0wXkyh3/Hpw48ivlNvgs4ZT6M8BIEAMdLgvct59rQBggYFhoAVKyliKDzdj37CnIlYau3DYIn7x5bHlRYFBow==", "dependencies": { - "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.40", - "@mui/core-downloads-tracker": "^5.15.19", - "@mui/system": "^5.15.15", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "@types/react-transition-group": "^4.4.10", - "clsx": "^2.1.0", - "csstype": "^3.1.3", + "@babel/runtime": "^7.25.7", + "@mui/types": "^7.2.18", + "@types/prop-types": "^15.7.13", + "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^18.2.0", - "react-transition-group": "^4.4.5" + "react-is": "^18.3.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@emotion/react": "^11.5.0", - "@emotion/styled": "^11.3.0", - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - }, "@types/react": { "optional": true } @@ -5319,23 +5379,18 @@ "node": ">=6" } }, - "node_modules/@mui/material/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, "node_modules/@mui/material/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@mui/private-theming": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", - "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz", + "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.14", + "@mui/utils": "^5.16.6", "prop-types": "^15.8.1" }, "engines": { @@ -5356,9 +5411,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", - "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz", + "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==", "dependencies": { "@babel/runtime": "^7.23.9", "@emotion/cache": "^11.11.0", @@ -5386,69 +5441,65 @@ } } }, - "node_modules/@mui/styled-engine-sc": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/styled-engine-sc/-/styled-engine-sc-5.11.11.tgz", - "integrity": "sha512-6+HsfcKHlhjQklDoEup7Itl+Xgn+BCsqEpIdIIhlxED4YlOZ38xghxIKrx78XFZznTorbhAspUgDDKIaB5vDMg==", - "dependencies": { - "@babel/runtime": "^7.21.0", + "node_modules/@mui/styles": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-6.1.4.tgz", + "integrity": "sha512-tgXuSqt983KC7Nmv1QtSFF/cC8Tlzfx7CqE0pGHCygihIZ9qZi0zlRavdOAyusZBju9gPBDo7xhtc99rGzlhMg==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@emotion/hash": "^0.9.2", + "@mui/private-theming": "^6.1.4", + "@mui/types": "^7.2.18", + "@mui/utils": "^6.1.4", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.10.0", + "jss-plugin-camel-case": "^10.10.0", + "jss-plugin-default-unit": "^10.10.0", + "jss-plugin-global": "^10.10.0", + "jss-plugin-nested": "^10.10.0", + "jss-plugin-props-sort": "^10.10.0", + "jss-plugin-rule-value-function": "^10.10.0", + "jss-plugin-vendor-prefixer": "^10.10.0", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/styled-components": "^5.1.14", - "styled-components": "^5.3.1" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { - "@types/styled-components": { + "@types/react": { "optional": true } } }, - "node_modules/@mui/styled-engine/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/@mui/styles": { - "version": "5.15.19", - "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.15.19.tgz", - "integrity": "sha512-WOYjZT6DL/StJv/vFR/tJPJuHC98lwWza7Gzj2RWZk123eCcSJ+3ruc62/ZyXaCx4PKCbE849mVl+CWhA2ecmw==", + "node_modules/@mui/styles/node_modules/@mui/private-theming": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.4.tgz", + "integrity": "sha512-FPa+W5BSrRM/1QI5Gf/GwJinJ2WsrKPpJB6xMmmXMXSUIp31YioIVT04i28DQUXFFB3yZY12ukcZi51iLvPljw==", "dependencies": { - "@babel/runtime": "^7.23.9", - "@emotion/hash": "^0.9.1", - "@mui/private-theming": "^5.15.14", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", - "clsx": "^2.1.0", - "csstype": "^3.1.3", - "hoist-non-react-statics": "^3.3.2", - "jss": "^10.10.0", - "jss-plugin-camel-case": "^10.10.0", - "jss-plugin-default-unit": "^10.10.0", - "jss-plugin-global": "^10.10.0", - "jss-plugin-nested": "^10.10.0", - "jss-plugin-props-sort": "^10.10.0", - "jss-plugin-rule-value-function": "^10.10.0", - "jss-plugin-vendor-prefixer": "^10.10.0", + "@babel/runtime": "^7.25.7", + "@mui/utils": "^6.1.4", "prop-types": "^15.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0", - "react": "^17.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -5456,10 +5507,34 @@ } } }, - "node_modules/@mui/styles/node_modules/@emotion/hash": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", - "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + "node_modules/@mui/styles/node_modules/@mui/utils": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.4.tgz", + "integrity": "sha512-v0wXkyh3/Hpw48ivlNvgs4ZT6M8BIEAMdLgvct59rQBggYFhoAVKyliKDzdj37CnIlYau3DYIn7x5bHlRYFBow==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/types": "^7.2.18", + "@types/prop-types": "^15.7.13", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } }, "node_modules/@mui/styles/node_modules/clsx": { "version": "2.1.1", @@ -5469,21 +5544,21 @@ "node": ">=6" } }, - "node_modules/@mui/styles/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + "node_modules/@mui/styles/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@mui/system": { - "version": "5.15.15", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", - "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "version": "5.16.7", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz", + "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==", "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.14", - "@mui/styled-engine": "^5.15.14", - "@mui/types": "^7.2.14", - "@mui/utils": "^5.15.14", + "@mui/private-theming": "^5.16.6", + "@mui/styled-engine": "^5.16.6", + "@mui/types": "^7.2.15", + "@mui/utils": "^5.16.6", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -5521,17 +5596,12 @@ "node": ">=6" } }, - "node_modules/@mui/system/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, "node_modules/@mui/types": { - "version": "7.2.14", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", - "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", + "version": "7.2.18", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.18.tgz", + "integrity": "sha512-uvK9dWeyCJl/3ocVnTOS6nlji/Knj8/tVqVX03UVTpdmTJYu/s4jtDd9Kvv0nRGE0CUSNW1UYAci7PYypjealg==", "peerDependencies": { - "@types/react": "^17.0.0 || ^18.0.0" + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -5540,14 +5610,16 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.14", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", - "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", + "version": "5.16.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz", + "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==", "dependencies": { "@babel/runtime": "^7.23.9", - "@types/prop-types": "^15.7.11", + "@mui/types": "^7.2.15", + "@types/prop-types": "^15.7.12", + "clsx": "^2.1.1", "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "react-is": "^18.3.1" }, "engines": { "node": ">=12.0.0" @@ -5566,47 +5638,53 @@ } } }, + "node_modules/@mui/utils/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, "node_modules/@mui/utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" }, "node_modules/@mui/x-date-pickers": { - "version": "5.0.20", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz", - "integrity": "sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==", - "dependencies": { - "@babel/runtime": "^7.18.9", - "@date-io/core": "^2.15.0", - "@date-io/date-fns": "^2.15.0", - "@date-io/dayjs": "^2.15.0", - "@date-io/luxon": "^2.15.0", - "@date-io/moment": "^2.15.0", - "@mui/utils": "^5.10.3", - "@types/react-transition-group": "^4.4.5", - "clsx": "^1.2.1", - "prop-types": "^15.7.2", - "react-transition-group": "^4.4.5", - "rifm": "^0.12.1" + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.20.0.tgz", + "integrity": "sha512-LnijrF8IF3r7c7sAVXRX4pDurozJSMUGAJdd5xuTT7ZPQIOp5ry0kDKqx79WAjXA/ZgjropLNt/nk15GE+6ZNw==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0", + "@mui/x-internals": "7.20.0", + "@types/react-transition-group": "^4.4.11", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/material": "^5.4.1", - "@mui/system": "^5.4.1", - "date-fns": "^2.25.0", + "@mui/material": "^5.15.14 || ^6.0.0", + "@mui/system": "^5.15.14 || ^6.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0", "dayjs": "^1.10.7", - "luxon": "^1.28.0 || ^2.0.0 || ^3.0.0", - "moment": "^2.29.1", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -5618,6 +5696,9 @@ "date-fns": { "optional": true }, + "date-fns-jalali": { + "optional": true + }, "dayjs": { "optional": true }, @@ -5626,9 +5707,118 @@ }, "moment": { "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers/node_modules/@mui/utils": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.4.tgz", + "integrity": "sha512-v0wXkyh3/Hpw48ivlNvgs4ZT6M8BIEAMdLgvct59rQBggYFhoAVKyliKDzdj37CnIlYau3DYIn7x5bHlRYFBow==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/types": "^7.2.18", + "@types/prop-types": "^15.7.13", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true } } }, + "node_modules/@mui/x-date-pickers/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/x-date-pickers/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, + "node_modules/@mui/x-internals": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.20.0.tgz", + "integrity": "sha512-ScXdEwtnxmBEq9umeusnotfeVQnnhjOZcM2ddXyIupmzeGmgDDtEcXGyTgrS/GOc91J74g81s6eJ4UCrlYZ2sg==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/utils": "^5.16.6 || ^6.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/x-internals/node_modules/@mui/utils": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.4.tgz", + "integrity": "sha512-v0wXkyh3/Hpw48ivlNvgs4ZT6M8BIEAMdLgvct59rQBggYFhoAVKyliKDzdj37CnIlYau3DYIn7x5bHlRYFBow==", + "dependencies": { + "@babel/runtime": "^7.25.7", + "@mui/types": "^7.2.18", + "@types/prop-types": "^15.7.13", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^18.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/x-internals/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" + }, "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { "version": "5.1.1-v1", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", @@ -8413,9 +8603,9 @@ "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" }, "node_modules/@types/q": { "version": "1.5.8", @@ -8461,18 +8651,13 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", "dependencies": { "@types/react": "*" } }, - "node_modules/@types/react/node_modules/csstype": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" - }, "node_modules/@types/resolve": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", @@ -11328,9 +11513,9 @@ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, "node_modules/csstype": { - "version": "2.6.21", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz", - "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "node_modules/cv-manager": { "resolved": "", @@ -11826,11 +12011,6 @@ "csstype": "^3.0.2" } }, - "node_modules/dom-helpers/node_modules/csstype": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", - "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==" - }, "node_modules/dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -20019,11 +20199,6 @@ "jss": "10.10.0" } }, - "node_modules/jss/node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", @@ -21634,11 +21809,6 @@ "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, - "node_modules/popper.js": { - "version": "1.16.1-lts", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz", - "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" - }, "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -23443,12 +23613,6 @@ "react-dom": ">=16" } }, - "node_modules/react-hot-toast/node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "peer": true - }, "node_modules/react-hot-toast/node_modules/goober": { "version": "2.1.14", "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.14.tgz", diff --git a/webapp/package.json b/webapp/package.json index f617515a8..7d3ec5874 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -4,16 +4,14 @@ "private": true, "dependencies": { "@date-io/date-fns": "^2.15.0", - "@emotion/react": "^11.11.4", - "@emotion/styled": "^11.11.5", + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.13.0", "@hookform/error-message": "^2.0.1", - "@material-table/core": "^6.1.6", - "@material-ui/core": "^4.12.3", - "@mui/icons-material": "^5.15.19", - "@mui/material": "^5.15.19", - "@mui/styled-engine-sc": "^5.11.9", - "@mui/styles": "^5.15.19", - "@mui/x-date-pickers": "^5.0.15", + "@material-table/core": "^6.1.4", + "@mui/icons-material": "^6.1.4", + "@mui/material": "^6.1.4", + "@mui/styles": "^6.1.4", + "@mui/x-date-pickers": "^7.20.0", "@react-keycloak/web": "3.4.0", "@react-oauth/google": "^0.2.8", "@reduxjs/toolkit": "^1.9.1", diff --git a/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx b/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx index 7645c90ca..7b11a8f52 100644 --- a/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx +++ b/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx @@ -238,14 +238,6 @@ export const DataSelectorEditForm = (props: { ( - - )} value={formik.values.startDate} onChange={(e) => formik.setFieldValue('startDate', e as Date | null, true)} /> diff --git a/webapp/src/features/intersections/map/control-panel.tsx b/webapp/src/features/intersections/map/control-panel.tsx index b163e5e71..d70e918ae 100644 --- a/webapp/src/features/intersections/map/control-panel.tsx +++ b/webapp/src/features/intersections/map/control-panel.tsx @@ -2,7 +2,7 @@ import React, { useState, useEffect, ChangeEvent, useMemo } from 'react' import Slider from '@mui/material/Slider' import dayjs from 'dayjs' import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider' -import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns' +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs' import { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker' import { Box, @@ -438,7 +438,7 @@ function ControlPanel() { value={timeBefore} />
- + { setEventTime(e) }} - renderInput={(params) => } />
diff --git a/webapp/src/features/intersections/reports/report-list-filters.tsx b/webapp/src/features/intersections/reports/report-list-filters.tsx index 7f4ba4b83..4bd8ff2e8 100644 --- a/webapp/src/features/intersections/reports/report-list-filters.tsx +++ b/webapp/src/features/intersections/reports/report-list-filters.tsx @@ -103,20 +103,8 @@ export const ReportListFilters = (props: ReportListFiltersProps) => { - } - value={currentFilters.startDate} - disabled={loading} - /> - } - value={currentFilters.endDate} - disabled={loading} - /> + + {!filtersValid[0] && ( diff --git a/webapp/src/features/intersections/reports/report-request-edit-form.tsx b/webapp/src/features/intersections/reports/report-request-edit-form.tsx index 4466aa6a3..12ef0c14c 100644 --- a/webapp/src/features/intersections/reports/report-request-edit-form.tsx +++ b/webapp/src/features/intersections/reports/report-request-edit-form.tsx @@ -79,14 +79,6 @@ export const ReportRequestEditForm = (props: Props) => { ( - - )} value={formik.values.startDate} onChange={(e) => formik.setFieldValue('startDate', e as Date | null, true)} disableFuture @@ -96,14 +88,6 @@ export const ReportRequestEditForm = (props: Props) => { ( - - )} value={formik.values.endDate} onChange={(e) => formik.setFieldValue('endDate', e as Date | null, true)} disableFuture diff --git a/webapp/src/features/menu/DisplayCounts.tsx b/webapp/src/features/menu/DisplayCounts.tsx index 7fd07598f..874dfb946 100644 --- a/webapp/src/features/menu/DisplayCounts.tsx +++ b/webapp/src/features/menu/DisplayCounts.tsx @@ -100,13 +100,6 @@ const DisplayCounts = () => { if (e === null) return dateChanged(e.toDate(), 'start') }} - renderInput={(params) => ( - - )} />
@@ -121,13 +114,6 @@ const DisplayCounts = () => { if (e === null) return dateChanged(e.toDate(), 'end') }} - renderInput={(params) => ( - - )} />
diff --git a/webapp/src/pages/Map.tsx b/webapp/src/pages/Map.tsx index dff744ae8..c99e5f9cf 100644 --- a/webapp/src/pages/Map.tsx +++ b/webapp/src/pages/Map.tsx @@ -1061,13 +1061,6 @@ function MapPage(props: MapPageProps) { dateChanged(e.toDate(), 'start') } }} - renderInput={(params) => ( - - )} />
@@ -1083,13 +1076,6 @@ function MapPage(props: MapPageProps) { dateChanged(e.toDate(), 'end') } }} - renderInput={(params) => ( - - )} /> diff --git a/webapp/yarn.lock b/webapp/yarn.lock index dbe012c2c..cac3cd9fb 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -1064,10 +1064,10 @@ resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== -"@babel/runtime@^7.10.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.19.4", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.4", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.0", "@babel/runtime@^7.9.2": - version "7.24.7" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz" - integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== +"@babel/runtime@^7.10.1", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.18.3", "@babel/runtime@^7.18.9", "@babel/runtime@^7.19.0", "@babel/runtime@^7.19.4", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.25.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.0", "@babel/runtime@^7.9.2": + version "7.25.7" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== dependencies: regenerator-runtime "^0.14.0" @@ -1242,36 +1242,36 @@ "@date-io/core" "^2.17.0" "@date-io/dayjs@^2.15.0": - version "2.16.0" - resolved "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz" - integrity sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw== + version "2.17.0" + resolved "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.17.0.tgz" + integrity sha512-Iq1wjY5XzBh0lheFA0it6Dsyv94e8mTiNR8vuTai+KopxDkreL3YjwTmZHxkgB7/vd0RMIACStzVgWvPATnDCA== dependencies: - "@date-io/core" "^2.16.0" + "@date-io/core" "^2.17.0" "@date-io/luxon@^2.15.0": - version "2.16.1" - resolved "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz" - integrity sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ== + version "2.17.0" + resolved "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.17.0.tgz" + integrity sha512-l712Vdm/uTddD2XWt9TlQloZUiTiRQtY5TCOG45MQ/8u0tu8M17BD6QYHar/3OrnkGybALAMPzCy1r5D7+0HBg== dependencies: - "@date-io/core" "^2.16.0" + "@date-io/core" "^2.17.0" "@date-io/moment@^2.15.0": - version "2.16.1" - resolved "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz" - integrity sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ== + version "2.17.0" + resolved "https://registry.npmjs.org/@date-io/moment/-/moment-2.17.0.tgz" + integrity sha512-e4nb4CDZU4k0WRVhz1Wvl7d+hFsedObSauDHKtZwU9kt7gdYEAzKgnrSCTHsEaXrDumdrkCYTeZ0Tmyk7uV4tw== dependencies: - "@date-io/core" "^2.16.0" + "@date-io/core" "^2.17.0" -"@emotion/babel-plugin@^11.11.0": - version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" - integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== +"@emotion/babel-plugin@^11.12.0", "@emotion/babel-plugin@^11.7.1": + version "11.12.0" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz" + integrity sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/serialize" "^1.1.2" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/serialize" "^1.2.0" babel-plugin-macros "^3.1.0" convert-source-map "^1.5.0" escape-string-regexp "^4.0.0" @@ -1279,15 +1279,15 @@ source-map "^0.5.7" stylis "4.2.0" -"@emotion/cache@^11.11.0", "@emotion/cache@^11.4.0": - version "11.11.0" - resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" - integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== +"@emotion/cache@^11.11.0", "@emotion/cache@^11.13.0", "@emotion/cache@^11.13.1", "@emotion/cache@^11.4.0", "@emotion/cache@^11.7.1": + version "11.13.1" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz" + integrity sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw== dependencies: - "@emotion/memoize" "^0.8.1" - "@emotion/sheet" "^1.2.2" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" + "@emotion/memoize" "^0.9.0" + "@emotion/sheet" "^1.4.0" + "@emotion/utils" "^1.4.0" + "@emotion/weak-memoize" "^0.4.0" stylis "4.2.0" "@emotion/core@^11.0.0": @@ -1295,99 +1295,112 @@ resolved "https://registry.npmjs.org/@emotion/core/-/core-11.0.0.tgz" integrity sha512-w4sE3AmHmyG6RDKf6mIbtHpgJUSJ2uGvPQb8VXFL7hFjMPibE8IiehG8cMX3Ztm4svfCQV6KqusQbeIOkurBcA== -"@emotion/hash@^0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz" - integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== - -"@emotion/hash@^0.9.1": - version "0.9.1" - resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" - integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== +"@emotion/hash@^0.9.2": + version "0.9.2" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz" + integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== -"@emotion/is-prop-valid@^1.1.0", "@emotion/is-prop-valid@^1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz" - integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== +"@emotion/is-prop-valid@^1.1.0", "@emotion/is-prop-valid@^1.3.0": + version "1.3.1" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz" + integrity sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw== dependencies: - "@emotion/memoize" "^0.8.1" + "@emotion/memoize" "^0.9.0" -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== +"@emotion/memoize@^0.9.0": + version "0.9.0" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz" + integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== + +"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.1.4", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.8.1", "@emotion/react@^11.9.0": + version "11.9.0" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.9.0.tgz" + integrity sha512-lBVSF5d0ceKtfKCDQJveNAtkC7ayxpVlgOohLgXqRwqWr9bOf4TZAFFyIcNngnV6xK6X4x2ZeXq7vliHkoVkxQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@emotion/babel-plugin" "^11.7.1" + "@emotion/cache" "^11.7.1" + "@emotion/serialize" "^1.0.3" + "@emotion/utils" "^1.1.0" + "@emotion/weak-memoize" "^0.2.5" + hoist-non-react-statics "^3.3.1" -"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.1.4", "@emotion/react@^11.10.4", "@emotion/react@^11.11.4", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.8.1", "@emotion/react@^11.9.0": - version "11.11.4" - resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz" - integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== +"@emotion/react@^11.10.4": + version "11.13.3" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz" + integrity sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/cache" "^11.11.0" - "@emotion/serialize" "^1.1.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" - "@emotion/weak-memoize" "^0.3.1" + "@emotion/babel-plugin" "^11.12.0" + "@emotion/cache" "^11.13.0" + "@emotion/serialize" "^1.3.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.1.0" + "@emotion/utils" "^1.4.0" + "@emotion/weak-memoize" "^0.4.0" hoist-non-react-statics "^3.3.1" -"@emotion/serialize@^1.1.2", "@emotion/serialize@^1.1.3", "@emotion/serialize@^1.1.4": - version "1.1.4" - resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz" - integrity sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ== +"@emotion/serialize@^1.0.3", "@emotion/serialize@^1.2.0", "@emotion/serialize@^1.3.0", "@emotion/serialize@^1.3.1", "@emotion/serialize@^1.3.2": + version "1.3.2" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz" + integrity sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA== dependencies: - "@emotion/hash" "^0.9.1" - "@emotion/memoize" "^0.8.1" - "@emotion/unitless" "^0.8.1" - "@emotion/utils" "^1.2.1" + "@emotion/hash" "^0.9.2" + "@emotion/memoize" "^0.9.0" + "@emotion/unitless" "^0.10.0" + "@emotion/utils" "^1.4.1" csstype "^3.0.2" -"@emotion/sheet@^1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" - integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== +"@emotion/sheet@^1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz" + integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== -"@emotion/styled@^11.10.4", "@emotion/styled@^11.11.5", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": - version "11.11.5" - resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz" - integrity sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ== +"@emotion/styled@^11.10.4", "@emotion/styled@^11.13.0", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": + version "11.13.0" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz" + integrity sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA== dependencies: "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.11.0" - "@emotion/is-prop-valid" "^1.2.2" - "@emotion/serialize" "^1.1.4" - "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" - "@emotion/utils" "^1.2.1" + "@emotion/babel-plugin" "^11.12.0" + "@emotion/is-prop-valid" "^1.3.0" + "@emotion/serialize" "^1.3.0" + "@emotion/use-insertion-effect-with-fallbacks" "^1.1.0" + "@emotion/utils" "^1.4.0" "@emotion/stylis@^0.8.4": version "0.8.5" resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== +"@emotion/unitless@^0.10.0": + version "0.10.0" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz" + integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== + "@emotion/unitless@^0.7.4": version "0.7.5" resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== -"@emotion/unitless@^0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" - integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== +"@emotion/use-insertion-effect-with-fallbacks@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz" + integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw== -"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" - integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== +"@emotion/utils@^1.1.0", "@emotion/utils@^1.4.0", "@emotion/utils@^1.4.1": + version "1.4.1" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz" + integrity sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA== -"@emotion/utils@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" - integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== +"@emotion/weak-memoize@^0.2.5": + version "0.2.5" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz" + integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@emotion/weak-memoize@^0.3.1": - version "0.3.1" - resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" - integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== +"@emotion/weak-memoize@^0.4.0": + version "0.4.0" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz" + integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" @@ -1416,33 +1429,6 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@floating-ui/core@^1.0.0": - version "1.6.2" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz" - integrity sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg== - dependencies: - "@floating-ui/utils" "^0.2.0" - -"@floating-ui/dom@^1.0.0": - version "1.6.5" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz" - integrity sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw== - dependencies: - "@floating-ui/core" "^1.0.0" - "@floating-ui/utils" "^0.2.0" - -"@floating-ui/react-dom@^2.0.8": - version "2.1.0" - resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz" - integrity sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA== - dependencies: - "@floating-ui/dom" "^1.0.0" - -"@floating-ui/utils@^0.2.0": - version "0.2.2" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz" - integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== - "@hello-pangea/dnd@^16.0.0": version "16.2.0" resolved "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-16.2.0.tgz" @@ -2048,10 +2034,10 @@ resolved "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz" integrity sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q== -"@material-table/core@^6.1.6": - version "6.1.6" - resolved "https://registry.npmjs.org/@material-table/core/-/core-6.1.6.tgz" - integrity sha512-fbxDj+kqCsdU0MBhJai/5RBgLCnV7R4WboZjYUtOzX5TQcGBCYk/BAae67rwG++0IUSdmKENVawPMNbV0qWROw== +"@material-table/core@^6.1.4": + version "6.1.4" + resolved "https://registry.npmjs.org/@material-table/core/-/core-6.1.4.tgz" + integrity sha512-PCbVyf1ULWBDbZx1tukJg8rPjlRdORo/mjtLHO4+ZgtXvFyVZ3qtd+5E7ouWuga0JQka0v3Gv4c+oaI8RmsW7w== dependencies: "@babel/runtime" "^7.19.0" "@date-io/core" "^2.16.0" @@ -2073,151 +2059,110 @@ uuid "^9.0.0" zustand "^4.1.1" -"@material-ui/core@^4.12.3": - version "4.12.4" - resolved "https://registry.npmjs.org/@material-ui/core/-/core-4.12.4.tgz" - integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ== - dependencies: - "@babel/runtime" "^7.4.4" - "@material-ui/styles" "^4.11.5" - "@material-ui/system" "^4.12.2" - "@material-ui/types" "5.1.0" - "@material-ui/utils" "^4.11.3" - "@types/react-transition-group" "^4.2.0" - clsx "^1.0.4" - hoist-non-react-statics "^3.3.2" - popper.js "1.16.1-lts" - prop-types "^15.7.2" - react-is "^16.8.0 || ^17.0.0" - react-transition-group "^4.4.0" - -"@material-ui/styles@^4.11.5": - version "4.11.5" - resolved "https://registry.npmjs.org/@material-ui/styles/-/styles-4.11.5.tgz" - integrity sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA== - dependencies: - "@babel/runtime" "^7.4.4" - "@emotion/hash" "^0.8.0" - "@material-ui/types" "5.1.0" - "@material-ui/utils" "^4.11.3" - clsx "^1.0.4" - csstype "^2.5.2" - hoist-non-react-statics "^3.3.2" - jss "^10.5.1" - jss-plugin-camel-case "^10.5.1" - jss-plugin-default-unit "^10.5.1" - jss-plugin-global "^10.5.1" - jss-plugin-nested "^10.5.1" - jss-plugin-props-sort "^10.5.1" - jss-plugin-rule-value-function "^10.5.1" - jss-plugin-vendor-prefixer "^10.5.1" - prop-types "^15.7.2" - -"@material-ui/system@^4.12.2": - version "4.12.2" - resolved "https://registry.npmjs.org/@material-ui/system/-/system-4.12.2.tgz" - integrity sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw== - dependencies: - "@babel/runtime" "^7.4.4" - "@material-ui/utils" "^4.11.3" - csstype "^2.5.2" - prop-types "^15.7.2" - -"@material-ui/types@5.1.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@material-ui/types/-/types-5.1.0.tgz" - integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== - -"@material-ui/utils@^4.11.3": - version "4.11.3" - resolved "https://registry.npmjs.org/@material-ui/utils/-/utils-4.11.3.tgz" - integrity sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg== - dependencies: - "@babel/runtime" "^7.4.4" - prop-types "^15.7.2" - react-is "^16.8.0 || ^17.0.0" - -"@mui/base@5.0.0-beta.40": - version "5.0.0-beta.40" - resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz" - integrity sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ== - dependencies: - "@babel/runtime" "^7.23.9" - "@floating-ui/react-dom" "^2.0.8" - "@mui/types" "^7.2.14" - "@mui/utils" "^5.15.14" +"@mui/core-downloads-tracker@^5.16.7": + version "5.16.7" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz" + integrity sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ== + +"@mui/core-downloads-tracker@^6.1.4": + version "6.1.4" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.4.tgz" + integrity sha512-jCRsB9NDJJatVCHvwWSTfYUzuTQ7E0Km6tAQWz2Md1SLHIbVj5visC9yHbf/Cv2IDcG6XdHRv3e7Bt1rIburNw== + +"@mui/icons-material@^6.1.4", "@mui/icons-material@>=5.10.6": + version "6.1.4" + resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.4.tgz" + integrity sha512-nhXBNSP3WkY0pz8dg25VIYIXJkhdRLRKZtD50f9OuHVQ1eh8b+enmvaZQF0o5M8cs1sR6wQHwZYwG34qDZeG0g== + dependencies: + "@babel/runtime" "^7.25.7" + +"@mui/material@^5.15.14 || ^6.0.0", "@mui/material@^6.1.4": + version "6.1.4" + resolved "https://registry.npmjs.org/@mui/material/-/material-6.1.4.tgz" + integrity sha512-mIVdjzDYU4U/XYzf8pPEz3zDZFS4Wbyr0cjfgeGiT/s60EvtEresXXQy8XUA0bpJDJjgic1Hl5AIRcqWDyi2eg== + dependencies: + "@babel/runtime" "^7.25.7" + "@mui/core-downloads-tracker" "^6.1.4" + "@mui/system" "^6.1.4" + "@mui/types" "^7.2.18" + "@mui/utils" "^6.1.4" "@popperjs/core" "^2.11.8" - clsx "^2.1.0" + "@types/react-transition-group" "^4.4.11" + clsx "^2.1.1" + csstype "^3.1.3" prop-types "^15.8.1" + react-is "^18.3.1" + react-transition-group "^4.4.5" -"@mui/core-downloads-tracker@^5.15.19": - version "5.15.19" - resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.19.tgz" - integrity sha512-tCHSi/Tomez9ERynFhZRvFO6n9ATyrPs+2N80DMDzp6xDVirbBjEwhPcE+x7Lj+nwYw0SqFkOxyvMP0irnm55w== - -"@mui/icons-material@^5.15.19", "@mui/icons-material@>=5.10.6": - version "5.15.19" - resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.19.tgz" - integrity sha512-RsEiRxA5azN9b8gI7JRqekkgvxQUlitoBOtZglflb8cUDyP12/cP4gRwhb44Ea1/zwwGGjAj66ZJpGHhKfibNA== - dependencies: - "@babel/runtime" "^7.23.9" - -"@mui/material@^5.0.0", "@mui/material@^5.15.19", "@mui/material@^5.4.1", "@mui/material@>=5.10.7": - version "5.15.19" - resolved "https://registry.npmjs.org/@mui/material/-/material-5.15.19.tgz" - integrity sha512-lp5xQBbcRuxNtjpWU0BWZgIrv2XLUz4RJ0RqFXBdESIsKoGCQZ6P3wwU5ZPuj5TjssNiKv9AlM+vHopRxZhvVQ== +"@mui/material@^5.4.1", "@mui/material@>=5.10.7": + version "5.16.7" + resolved "https://registry.npmjs.org/@mui/material/-/material-5.16.7.tgz" + integrity sha512-cwwVQxBhK60OIOqZOVLFt55t01zmarKJiJUWbk0+8s/Ix5IaUzAShqlJchxsIQ4mSrWqgcKCCXKtIlG5H+/Jmg== dependencies: "@babel/runtime" "^7.23.9" - "@mui/base" "5.0.0-beta.40" - "@mui/core-downloads-tracker" "^5.15.19" - "@mui/system" "^5.15.15" - "@mui/types" "^7.2.14" - "@mui/utils" "^5.15.14" + "@mui/core-downloads-tracker" "^5.16.7" + "@mui/system" "^5.16.7" + "@mui/types" "^7.2.15" + "@mui/utils" "^5.16.6" + "@popperjs/core" "^2.11.8" "@types/react-transition-group" "^4.4.10" clsx "^2.1.0" csstype "^3.1.3" prop-types "^15.8.1" - react-is "^18.2.0" + react-is "^18.3.1" react-transition-group "^4.4.5" -"@mui/private-theming@^5.15.14": - version "5.15.14" - resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz" - integrity sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw== +"@mui/private-theming@^5.16.6": + version "5.16.6" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz" + integrity sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw== dependencies: "@babel/runtime" "^7.23.9" - "@mui/utils" "^5.15.14" + "@mui/utils" "^5.16.6" prop-types "^15.8.1" -"@mui/styled-engine-sc@^5.11.9": - version "5.11.11" - resolved "https://registry.npmjs.org/@mui/styled-engine-sc/-/styled-engine-sc-5.11.11.tgz" - integrity sha512-6+HsfcKHlhjQklDoEup7Itl+Xgn+BCsqEpIdIIhlxED4YlOZ38xghxIKrx78XFZznTorbhAspUgDDKIaB5vDMg== +"@mui/private-theming@^6.1.4": + version "6.1.4" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.4.tgz" + integrity sha512-FPa+W5BSrRM/1QI5Gf/GwJinJ2WsrKPpJB6xMmmXMXSUIp31YioIVT04i28DQUXFFB3yZY12ukcZi51iLvPljw== dependencies: - "@babel/runtime" "^7.21.0" + "@babel/runtime" "^7.25.7" + "@mui/utils" "^6.1.4" prop-types "^15.8.1" -"@mui/styled-engine@^5.15.14": - version "5.15.14" - resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz" - integrity sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw== +"@mui/styled-engine@^5.16.6": + version "5.16.6" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz" + integrity sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g== dependencies: "@babel/runtime" "^7.23.9" "@emotion/cache" "^11.11.0" csstype "^3.1.3" prop-types "^15.8.1" -"@mui/styles@^5.15.19": - version "5.15.19" - resolved "https://registry.npmjs.org/@mui/styles/-/styles-5.15.19.tgz" - integrity sha512-WOYjZT6DL/StJv/vFR/tJPJuHC98lwWza7Gzj2RWZk123eCcSJ+3ruc62/ZyXaCx4PKCbE849mVl+CWhA2ecmw== +"@mui/styled-engine@^6.1.4": + version "6.1.4" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.4.tgz" + integrity sha512-D+aiIDtJsU9OVJ7dgayhCDABJHT7jTlnz1FKyxa5mNVHsxjjeG1M4OpLsRQvx4dcvJfDywnU2cE+nFm4Ln2aFQ== dependencies: - "@babel/runtime" "^7.23.9" - "@emotion/hash" "^0.9.1" - "@mui/private-theming" "^5.15.14" - "@mui/types" "^7.2.14" - "@mui/utils" "^5.15.14" - clsx "^2.1.0" + "@babel/runtime" "^7.25.7" + "@emotion/cache" "^11.13.1" + "@emotion/serialize" "^1.3.2" + "@emotion/sheet" "^1.4.0" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/styles@^6.1.4": + version "6.1.4" + resolved "https://registry.npmjs.org/@mui/styles/-/styles-6.1.4.tgz" + integrity sha512-tgXuSqt983KC7Nmv1QtSFF/cC8Tlzfx7CqE0pGHCygihIZ9qZi0zlRavdOAyusZBju9gPBDo7xhtc99rGzlhMg== + dependencies: + "@babel/runtime" "^7.25.7" + "@emotion/hash" "^0.9.2" + "@mui/private-theming" "^6.1.4" + "@mui/types" "^7.2.18" + "@mui/utils" "^6.1.4" + clsx "^2.1.1" csstype "^3.1.3" hoist-non-react-statics "^3.3.2" jss "^10.10.0" @@ -2230,36 +2175,76 @@ jss-plugin-vendor-prefixer "^10.10.0" prop-types "^15.8.1" -"@mui/system@^5.15.15", "@mui/system@^5.4.1", "@mui/system@>=5.10.7": - version "5.15.15" - resolved "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz" - integrity sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ== +"@mui/system@^5.15.14 || ^6.0.0", "@mui/system@^5.16.7", "@mui/system@^5.4.1", "@mui/system@>=5.10.7": + version "5.16.7" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz" + integrity sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA== dependencies: "@babel/runtime" "^7.23.9" - "@mui/private-theming" "^5.15.14" - "@mui/styled-engine" "^5.15.14" - "@mui/types" "^7.2.14" - "@mui/utils" "^5.15.14" + "@mui/private-theming" "^5.16.6" + "@mui/styled-engine" "^5.16.6" + "@mui/types" "^7.2.15" + "@mui/utils" "^5.16.6" clsx "^2.1.0" csstype "^3.1.3" prop-types "^15.8.1" -"@mui/types@^7.2.14": - version "7.2.14" - resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz" - integrity sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ== +"@mui/system@^6.1.4": + version "6.1.4" + resolved "https://registry.npmjs.org/@mui/system/-/system-6.1.4.tgz" + integrity sha512-lCveY/UtDhYwMg1WnLc3wEEuGymLi6YI79VOwFV9zfZT5Et+XEw/e1It26fiKwUZ+mB1+v1iTYMpJnwnsrn2aQ== + dependencies: + "@babel/runtime" "^7.25.7" + "@mui/private-theming" "^6.1.4" + "@mui/styled-engine" "^6.1.4" + "@mui/types" "^7.2.18" + "@mui/utils" "^6.1.4" + clsx "^2.1.1" + csstype "^3.1.3" + prop-types "^15.8.1" + +"@mui/types@^7.2.15", "@mui/types@^7.2.18": + version "7.2.18" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.18.tgz" + integrity sha512-uvK9dWeyCJl/3ocVnTOS6nlji/Knj8/tVqVX03UVTpdmTJYu/s4jtDd9Kvv0nRGE0CUSNW1UYAci7PYypjealg== -"@mui/utils@^5.10.3", "@mui/utils@^5.15.14": - version "5.15.14" - resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz" - integrity sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA== +"@mui/utils@^5.10.3", "@mui/utils@^5.16.6": + version "5.16.6" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz" + integrity sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA== dependencies: "@babel/runtime" "^7.23.9" - "@types/prop-types" "^15.7.11" + "@mui/types" "^7.2.15" + "@types/prop-types" "^15.7.12" + clsx "^2.1.1" + prop-types "^15.8.1" + react-is "^18.3.1" + +"@mui/utils@^5.16.6 || ^6.0.0": + version "6.1.4" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-6.1.4.tgz" + integrity sha512-v0wXkyh3/Hpw48ivlNvgs4ZT6M8BIEAMdLgvct59rQBggYFhoAVKyliKDzdj37CnIlYau3DYIn7x5bHlRYFBow== + dependencies: + "@babel/runtime" "^7.25.7" + "@mui/types" "^7.2.18" + "@types/prop-types" "^15.7.13" + clsx "^2.1.1" + prop-types "^15.8.1" + react-is "^18.3.1" + +"@mui/utils@^6.1.4": + version "6.1.4" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-6.1.4.tgz" + integrity sha512-v0wXkyh3/Hpw48ivlNvgs4ZT6M8BIEAMdLgvct59rQBggYFhoAVKyliKDzdj37CnIlYau3DYIn7x5bHlRYFBow== + dependencies: + "@babel/runtime" "^7.25.7" + "@mui/types" "^7.2.18" + "@types/prop-types" "^15.7.13" + clsx "^2.1.1" prop-types "^15.8.1" - react-is "^18.2.0" + react-is "^18.3.1" -"@mui/x-date-pickers@^5.0.15", "@mui/x-date-pickers@^5.0.3": +"@mui/x-date-pickers@^5.0.3": version "5.0.20" resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz" integrity sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA== @@ -2277,6 +2262,27 @@ react-transition-group "^4.4.5" rifm "^0.12.1" +"@mui/x-date-pickers@^7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.20.0.tgz" + integrity sha512-LnijrF8IF3r7c7sAVXRX4pDurozJSMUGAJdd5xuTT7ZPQIOp5ry0kDKqx79WAjXA/ZgjropLNt/nk15GE+6ZNw== + dependencies: + "@babel/runtime" "^7.25.7" + "@mui/utils" "^5.16.6 || ^6.0.0" + "@mui/x-internals" "7.20.0" + "@types/react-transition-group" "^4.4.11" + clsx "^2.1.1" + prop-types "^15.8.1" + react-transition-group "^4.4.5" + +"@mui/x-internals@7.20.0": + version "7.20.0" + resolved "https://registry.npmjs.org/@mui/x-internals/-/x-internals-7.20.0.tgz" + integrity sha512-ScXdEwtnxmBEq9umeusnotfeVQnnhjOZcM2ddXyIupmzeGmgDDtEcXGyTgrS/GOc91J74g81s6eJ4UCrlYZ2sg== + dependencies: + "@babel/runtime" "^7.25.7" + "@mui/utils" "^5.16.6 || ^6.0.0" + "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" @@ -4156,10 +4162,10 @@ resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz" integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== -"@types/prop-types@*", "@types/prop-types@^15.7.11": - version "15.7.12" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz" - integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== +"@types/prop-types@*", "@types/prop-types@^15.7.12", "@types/prop-types@^15.7.13": + version "15.7.13" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz" + integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== "@types/q@^1.5.1": version "1.5.8" @@ -4197,14 +4203,14 @@ dependencies: react-tabs "*" -"@types/react-transition-group@^4.2.0", "@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.10", "@types/react-transition-group@^4.4.4", "@types/react-transition-group@^4.4.5": - version "4.4.10" - resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz" - integrity sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== +"@types/react-transition-group@^4.4.0", "@types/react-transition-group@^4.4.10", "@types/react-transition-group@^4.4.11", "@types/react-transition-group@^4.4.4", "@types/react-transition-group@^4.4.5": + version "4.4.11" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz" + integrity sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA== dependencies: "@types/react" "*" -"@types/react@*", "@types/react@^16.8 || ^17.0 || ^18.0", "@types/react@^16.8.6 || ^17.0.0", "@types/react@^17", "@types/react@^17.0.0", "@types/react@^17.0.0 || ^18.0.0", "@types/react@>=16.14.8", "@types/react@>=16.9.11": +"@types/react@*", "@types/react@^16.8 || ^17.0 || ^18.0", "@types/react@^17", "@types/react@^17.0.0", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^17.0.0 || ^18.0.0 || ^19.0.0", "@types/react@>=16.14.8", "@types/react@>=16.9.11": version "17.0.65" resolved "https://registry.npmjs.org/@types/react/-/react-17.0.65.tgz" integrity sha512-oxur785xZYHvnI7TRS61dXbkIhDPnGfsXKv0cNXR/0ml4SipRIFpSMzA7HMEfOywFwJ5AOnPrXYTEiTRUQeGlQ== @@ -5626,7 +5632,7 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" -clsx@^1.0.4, clsx@^1.1.0, clsx@^1.2.1: +clsx@^1.1.0, clsx@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== @@ -5641,6 +5647,11 @@ clsx@^2.1.0: resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== +clsx@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" + integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== + co@^4.6.0: version "4.6.0" resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" @@ -6182,22 +6193,7 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" -csstype@^2.5.2: - version "2.6.21" - resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz" - integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== - -csstype@^3.0.10: - version "3.1.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -csstype@^3.0.2: - version "3.1.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -csstype@^3.1.3: +csstype@^3.0.10, csstype@^3.0.2, csstype@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== @@ -6388,12 +6384,12 @@ date-arithmetic@^4.0.1: resolved "https://registry.npmjs.org/date-arithmetic/-/date-arithmetic-4.1.0.tgz" integrity sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg== -date-fns@^2.0.0, date-fns@^2.25.0: +date-fns@^2.0.0, "date-fns@^2.25.0 || ^3.2.0 || ^4.0.0": version "2.28.0" resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.28.0.tgz" integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== -date-fns@^2.29.3: +date-fns@^2.25.0, date-fns@^2.29.3: version "2.29.3" resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz" integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== @@ -10075,7 +10071,7 @@ jsonpointer@^5.0.0: resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== -jss-plugin-camel-case@^10.10.0, jss-plugin-camel-case@^10.5.1: +jss-plugin-camel-case@^10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz" integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== @@ -10084,7 +10080,7 @@ jss-plugin-camel-case@^10.10.0, jss-plugin-camel-case@^10.5.1: hyphenate-style-name "^1.0.3" jss "10.10.0" -jss-plugin-default-unit@^10.10.0, jss-plugin-default-unit@^10.5.1: +jss-plugin-default-unit@^10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz" integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== @@ -10092,7 +10088,7 @@ jss-plugin-default-unit@^10.10.0, jss-plugin-default-unit@^10.5.1: "@babel/runtime" "^7.3.1" jss "10.10.0" -jss-plugin-global@^10.10.0, jss-plugin-global@^10.5.1: +jss-plugin-global@^10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz" integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== @@ -10100,7 +10096,7 @@ jss-plugin-global@^10.10.0, jss-plugin-global@^10.5.1: "@babel/runtime" "^7.3.1" jss "10.10.0" -jss-plugin-nested@^10.10.0, jss-plugin-nested@^10.5.1: +jss-plugin-nested@^10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz" integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== @@ -10109,7 +10105,7 @@ jss-plugin-nested@^10.10.0, jss-plugin-nested@^10.5.1: jss "10.10.0" tiny-warning "^1.0.2" -jss-plugin-props-sort@^10.10.0, jss-plugin-props-sort@^10.5.1: +jss-plugin-props-sort@^10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz" integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== @@ -10117,7 +10113,7 @@ jss-plugin-props-sort@^10.10.0, jss-plugin-props-sort@^10.5.1: "@babel/runtime" "^7.3.1" jss "10.10.0" -jss-plugin-rule-value-function@^10.10.0, jss-plugin-rule-value-function@^10.5.1: +jss-plugin-rule-value-function@^10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz" integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== @@ -10126,7 +10122,7 @@ jss-plugin-rule-value-function@^10.10.0, jss-plugin-rule-value-function@^10.5.1: jss "10.10.0" tiny-warning "^1.0.2" -jss-plugin-vendor-prefixer@^10.10.0, jss-plugin-vendor-prefixer@^10.5.1: +jss-plugin-vendor-prefixer@^10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz" integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== @@ -10135,7 +10131,7 @@ jss-plugin-vendor-prefixer@^10.10.0, jss-plugin-vendor-prefixer@^10.5.1: css-vendor "^2.0.8" jss "10.10.0" -jss@^10.10.0, jss@^10.5.1, jss@10.10.0: +jss@^10.10.0, jss@10.10.0: version "10.10.0" resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== @@ -10398,7 +10394,7 @@ lru-cache@^6.0.0: resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz" integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== -"luxon@^1.21.3 || ^2.x || ^3.x", "luxon@^1.28.0 || ^2.0.0 || ^3.0.0", luxon@^2.3.2: +"luxon@^1.21.3 || ^2.x || ^3.x", "luxon@^1.28.0 || ^2.0.0 || ^3.0.0", luxon@^2.3.2, luxon@^3.0.2: version "2.5.2" resolved "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz" integrity sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA== @@ -11255,11 +11251,6 @@ polygon-clipping@^0.15.3: robust-predicates "^3.0.2" splaytree "^3.1.0" -popper.js@1.16.1-lts: - version "1.16.1-lts" - resolved "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1-lts.tgz" - integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== - posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" @@ -12146,7 +12137,7 @@ react-dev-utils@^12.0.0: strip-ansi "^6.0.1" text-table "^0.2.0" -"react-dom@^16.0.0 || ^17.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8.0 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^17.0.2, "react-dom@^17.0.2 || ^18.0.0", react-dom@<18.0.0, "react-dom@>= 16.8.0", react-dom@>=0.16.0, react-dom@>=16, react-dom@>=16.0.0, react-dom@>=16.14.0, react-dom@>=16.3.3, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=16.9.0: +"react-dom@^16.0.0 || ^17.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8.0 || ^17 || ^18", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8.5 || ^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", react-dom@^17.0.2, "react-dom@^17.0.2 || ^18.0.0", react-dom@<18.0.0, "react-dom@>= 16.8.0", react-dom@>=0.16.0, react-dom@>=16, react-dom@>=16.0.0, react-dom@>=16.14.0, react-dom@>=16.3.3, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=16.9.0: version "17.0.2" resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -12192,7 +12183,7 @@ react-icons@^4.3.1: resolved "https://registry.npmjs.org/react-icons/-/react-icons-4.3.1.tgz" integrity sha512-cB10MXLTs3gVuXimblAdI71jrJx8njrJZmNMEMC+sQu5B/BIOmlsAjskdqpn81y8UBVEGuHODd7/ci5DvoSzTQ== -react-is@^16.10.2, react-is@^16.12.0, "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, "react-is@^16.8.0 || ^17.0.0", "react-is@>= 16.8.0": +react-is@^16.10.2, react-is@^16.12.0, "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0, "react-is@>= 16.8.0": version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== @@ -12212,10 +12203,10 @@ react-is@^18.0.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-is@^18.2.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-is@^18.3.1: + version "18.3.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" + integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== react-lifecycles-compat@^3.0.4: version "3.0.4" @@ -12400,7 +12391,7 @@ react-test-renderer@^17.0.2: react-shallow-renderer "^16.13.1" scheduler "^0.20.2" -react-transition-group@^4.3.0, react-transition-group@^4.4.0, react-transition-group@^4.4.2, react-transition-group@^4.4.5: +react-transition-group@^4.3.0, react-transition-group@^4.4.2, react-transition-group@^4.4.5: version "4.4.5" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== @@ -12426,7 +12417,7 @@ react-widgets@5.8.4: tiny-warning "^1.0.3" uncontrollable "^7.2.1" -react@*, "react@^16.0.0 || ^17.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react@^16.8.3 || ^17.0.0-0 || ^18.0.0", "react@^16.8.5 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", react@^17.0.0, "react@^17.0.0 || ^18.0.0", react@^17.0.2, "react@^17.0.2 || ^18.0.0", react@<18.0.0, "react@>= 0.14.7", "react@>= 16", "react@>= 16.8.0", react@>=0.14.0, react@>=0.16.0, react@>=15.0.0, react@>=16, react@>=16.0.0, react@>=16.14.0, react@>=16.3.0, react@>=16.3.3, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0, react@17.0.2: +react@*, "react@^16.0.0 || ^17.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-0 || ^18.0.0", "react@^16.8.0 || ^17.0.0-rc.1 || ^18.0.0", "react@^16.8.3 || ^17.0.0-0 || ^18.0.0", "react@^16.8.5 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", "react@^17.0.0 || ^18.0.0", "react@^17.0.0 || ^18.0.0 || ^19.0.0", react@^17.0.2, "react@^17.0.2 || ^18.0.0", react@<18.0.0, "react@>= 0.14.7", "react@>= 16", "react@>= 16.8.0", react@>=0.14.0, react@>=0.16.0, react@>=15.0.0, react@>=16, react@>=16.0.0, react@>=16.14.0, react@>=16.3.0, react@>=16.3.3, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0, react@17.0.2: version "17.0.2" resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -13632,7 +13623,7 @@ style-loader@^3.3.1: resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz" integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== -styled-components@^5.3.1, styled-components@^5.3.6, "styled-components@>= 2": +styled-components@^5.3.6, "styled-components@>= 2": version "5.3.8" resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.8.tgz" integrity sha512-6jQrlvaJQ16uWVVO0rBfApaTPItkqaG32l3746enNZzpMDxMvzmHzj8rHUg39bvVtom0Y8o8ZzWuchEXKGjVsg== From a82c307eb7bd87c6a0cdc16614cd8138afe93505 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Tue, 15 Oct 2024 19:26:57 -0600 Subject: [PATCH 04/27] Adding RTK config queries and updating theme --- conflictmonitor/connect/Dockerfile | 6 + conflictmonitor/connect/connect_start.sh | 269 ++++++++++++++++++ docker-compose-full-cm.yml | 12 +- docker-compose.yml | 2 +- webapp/src/App.css | 4 + webapp/src/EnvironmentVars.tsx | 1 + .../intersections/ConfigurationPage.tsx | 256 +++++++++-------- .../intersections/configuration/create.tsx | 59 ++-- .../intersections/configuration/edit.tsx | 61 ++-- .../intersections/configuration/remove.tsx | 66 +++-- .../api/intersectionConfigParamApiSlice.ts | 106 +++++++ .../configuration-create-form.tsx | 10 +- .../configuration/configuration-edit-form.tsx | 20 +- .../configuration-list-table.tsx | 11 +- .../configuration-remove-form.tsx | 13 +- webapp/src/pages/IntersectionDashboard.tsx | 13 +- webapp/src/store.tsx | 6 +- webapp/src/styles/index.ts | 33 +-- 18 files changed, 683 insertions(+), 265 deletions(-) create mode 100644 conflictmonitor/connect/Dockerfile create mode 100644 conflictmonitor/connect/connect_start.sh create mode 100644 webapp/src/features/api/intersectionConfigParamApiSlice.ts diff --git a/conflictmonitor/connect/Dockerfile b/conflictmonitor/connect/Dockerfile new file mode 100644 index 000000000..e2cc9c69e --- /dev/null +++ b/conflictmonitor/connect/Dockerfile @@ -0,0 +1,6 @@ +FROM confluentinc/cp-kafka-connect:6.1.9 + +COPY connect_start.sh /scripts/connect_start.sh + +RUN confluent-hub install --no-prompt mongodb/kafka-connect-mongodb:1.8.0 +RUN confluent-hub install --no-prompt confluentinc/connect-transforms:1.4.3 \ No newline at end of file diff --git a/conflictmonitor/connect/connect_start.sh b/conflictmonitor/connect/connect_start.sh new file mode 100644 index 000000000..03428ed1a --- /dev/null +++ b/conflictmonitor/connect/connect_start.sh @@ -0,0 +1,269 @@ +# bin/bash +DB_HOST_IP = $1 + +echo "------------------------------------------" +echo "Kafka connector creation started." +echo "Provided Docker Host IP: $DOCKER_HOST_IP" +echo "------------------------------------------" + + + + + + +# Record BSM JSON Data +declare -A OdeRawEncodedBSMJson=([name]="topic.OdeRawEncodedBSMJson" [collection]="OdeRawEncodedBSMJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A OdeBsmJson=([name]="topic.OdeBsmJson" [collection]="OdeBsmJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) + +# Record Map Data +declare -A OdeMapJson=([name]="topic.DeduplicatedOdeMapJson" [collection]="OdeMapJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A ProcessedMap=([name]="topic.DeduplicatedProcessedMap" [collection]="ProcessedMap" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A OdeRawEncodedMAPJson=([name]="topic.OdeRawEncodedMAPJson" [collection]="OdeRawEncodedMAPJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) + +# Record Spat Data +declare -A OdeRawEncodedSPATJson=([name]="topic.OdeRawEncodedSPATJson" [collection]="OdeRawEncodedSPATJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A OdeSpatJson=([name]="topic.OdeSpatJson" [collection]="OdeSpatJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A ProcessedSpat=([name]="topic.ProcessedSpat" [collection]="ProcessedSpat" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A OdeSpatRxJson=([name]="topic.OdeSpatRxJson" [collection]="OdeSpatRxJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) + +# Record Driver Alert Data +declare -A OdeDriverAlertJson=([name]="topic.OdeDriverAlertJson" [collection]="OdeDriverAlertJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) + +# Record SRM Data +declare -A OdeSrmJson=([name]="topic.OdeSrmJson" [collection]="OdeSrmJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A OdeRawEncodedSRMJson=([name]="topic.OdeRawEncodedSRMJson" [collection]="OdeRawEncodedSRMJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) + +# Record SSM Data +declare -A OdeSsmJson=([name]="topic.OdeSsmJson" [collection]="OdeSsmJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A OdeRawEncodedSSMJson=([name]="topic.OdeRawEncodedSSMJson" [collection]="OdeRawEncodedSSMJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) + + +# Record TIM JSON Data +declare -A OdeTimJson=([name]="topic.DeduplicatedOdeTimJson" [collection]="OdeTimJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A OdeTimBroadcastJson=([name]="topic.OdeTimBroadcastJson" [collection]="OdeTimBroadcastJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A OdeTIMCertExpirationTimeJson=([name]="topic.OdeTIMCertExpirationTimeJson" [collection]="OdeTIMCertExpirationTimeJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) +declare -A OdeRawEncodedTIMJson=([name]="topic.OdeRawEncodedTIMJson" [collection]="OdeRawEncodedTIMJson" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) + +############################################################################################### + +# Record Events +declare -A CmStopLinePassageEvent=([name]="topic.CmStopLinePassageEvent" [collection]="CmStopLinePassageEvent" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmStopLineStopEvent=([name]="topic.CmStopLineStopEvent" [collection]="CmStopLineStopEvent" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmSignalStateConflictEvents=([name]="topic.CmSignalStateConflictEvents" [collection]="CmSignalStateConflictEvents" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmIntersectionReferenceAlignmentEvents=([name]="topic.CmIntersectionReferenceAlignmentEvents" [collection]="CmIntersectionReferenceAlignmentEvents" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmSignalGroupAlignmentEvents=([name]="topic.CmSignalGroupAlignmentEvents" [collection]="CmSignalGroupAlignmentEvents" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmConnectionOfTravelEvent=([name]="topic.CmConnectionOfTravelEvent" [collection]="CmConnectionOfTravelEvent" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmLaneDirectionOfTravelEvent=([name]="topic.CmLaneDirectionOfTravelEvent" [collection]="CmLaneDirectionOfTravelEvent" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmSpatTimeChangeDetailsEvent=([name]="topic.CmSpatTimeChangeDetailsEvent" [collection]="CmSpatTimeChangeDetailsEvent" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmSpatMinimumDataEvents=([name]="topic.CmSpatMinimumDataEvents" [collection]="CmSpatMinimumDataEvents" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmMapBroadcastRateEvents=([name]="topic.CmMapBroadcastRateEvents" [collection]="CmMapBroadcastRateEvents" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmMapMinimumDataEvents=([name]="topic.CmMapMinimumDataEvents" [collection]="CmMapMinimumDataEvents" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmSpatBroadcastRateEvents=([name]="topic.CmSpatBroadcastRateEvents" [collection]="CmSpatBroadcastRateEvents" + [convert_timestamp]=true [timefield]="eventGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) + +# Record BSM Events +declare -A CmBsmEvents=([name]="topic.CmBsmEvents" [collection]="CmBsmEvents" + [convert_timestamp]=false [timefield]="" [use_key]=false [key]="" [add_timestamp]=true) + + +# Record Assessments +declare -A CmLaneDirectionOfTravelAssessment=([name]="topic.CmLaneDirectionOfTravelAssessment" [collection]="CmLaneDirectionOfTravelAssessment" + [convert_timestamp]=true [timefield]="assessmentGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmConnectionOfTravelAssessment=([name]="topic.CmConnectionOfTravelAssessment" [collection]="CmConnectionOfTravelAssessment" + [convert_timestamp]=true [timefield]="assessmentGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmSignalStateEventAssessment=([name]="topic.CmSignalStateEventAssessment" [collection]="CmSignalStateEventAssessment" + [convert_timestamp]=true [timefield]="assessmentGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmStopLineStopAssessment=([name]="topic.CmStopLineStopAssessment" [collection]="CmStopLineStopAssessment" + [convert_timestamp]=true [timefield]="assessmentGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) + + +# Record Notifications +declare -A CmSpatTimeChangeDetailsNotification=([name]="topic.CmSpatTimeChangeDetailsNotification" [collection]="CmSpatTimeChangeDetailsNotification" + [convert_timestamp]=true [timefield]="notificationGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmLaneDirectionOfTravelNotification=([name]="topic.CmLaneDirectionOfTravelNotification" [collection]="CmLaneDirectionOfTravelNotification" + [convert_timestamp]=true [timefield]="notificationGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmConnectionOfTravelNotification=([name]="topic.CmConnectionOfTravelNotification" [collection]="CmConnectionOfTravelNotification" + [convert_timestamp]=true [timefield]="notificationGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmAppHealthNotifications=([name]="topic.CmAppHealthNotifications" [collection]="CmAppHealthNotifications" + [convert_timestamp]=true [timefield]="notificationGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmSignalStateConflictNotification=([name]="topic.CmSignalStateConflictNotification" [collection]="CmSignalStateConflictNotification" + [convert_timestamp]=true [timefield]="notificationGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmSignalGroupAlignmentNotification=([name]="topic.CmSignalGroupAlignmentNotification" [collection]="CmSignalGroupAlignmentNotification" + [convert_timestamp]=true [timefield]="notificationGeneratedAt" [use_key]=false [key]="" [add_timestamp]=false) +declare -A CmNotification=([name]="topic.CmNotification" [collection]="CmNotification" + [convert_timestamp]=true [timefield]="notificationGeneratedAt" [use_key]=true [key]="key" [add_timestamp]=false) +declare -A CmStopLineStopNotification=([name]="topic.CmStopLineStopNotification" [collection]="CmStopLineStopNotification" + [convert_timestamp]=true [timefield]="notificationGeneratedAt" [use_key]=true [key]="key" [add_timestamp]=false) +declare -A CmStopLinePassageNotification=([name]="topic.CmStopLinePassageNotification" [collection]="CmStopLinePassageNotification" + [convert_timestamp]=true [timefield]="notificationGeneratedAt" [use_key]=true [key]="key" [add_timestamp]=false) + +function createSink() { + local -n topic=$1 + echo "Creating sink connector for:" + for val in "${topic[@]}"; do echo $val; done + + local name=${topic[name]} + local collection=${topic[collection]} + local timefield=${topic[timefield]} + local convert_timestamp=${topic[convert_timestamp]} + local use_key=${topic[use_key]} + local key=${topic[key]} + local add_timestamp=${topic[add_timestamp]} + + echo "name=$name" + echo "collection=$collection" + echo "timefield=$timefield" + echo "convert_timestamp=$convert_timestamp" + echo "add_timestamp=$add_timestamp" + + local connectConfig=' { + "group.id":"connector-consumer", + "connector.class":"com.mongodb.kafka.connect.MongoSinkConnector", + "tasks.max":3, + "topics":"'$name'", + "connection.uri":"mongodb://'$CM_MONGO_CONNECTOR_USERNAME':'$CM_MONGO_CONNECTOR_PASSWORD'@'$DB_HOST_IP':27017/database?authSource=ConflictMonitor", + "database":"ConflictMonitor", + "collection":"'$collection'", + "key.converter":"org.apache.kafka.connect.storage.StringConverter", + "key.converter.schemas.enable":false, + "value.converter":"org.apache.kafka.connect.json.JsonConverter", + "value.converter.schemas.enable":false, + "errors.tolerance": "all", + "mongo.errors.tolerance": "all", + "errors.deadletterqueue.topic.name": "", + "errors.log.enable": false, + "errors.log.include.messages": false, + "errors.deadletterqueue.topic.replication.factor": 0' + + #"errors.deadletterqueue.context.headers.enable": true, + #"errors.log.enable": false, + #"errors.log.include.messages": false, + #"errors.deadletterqueue.topic.replication.factor": 1' + #"errors.deadletterqueue.topic.name": "dlq.'$collection'.sink", + + + if [ "$convert_timestamp" == true ] + then + local connectConfig=''$connectConfig', + "transforms": "TimestampConverter", + "transforms.TimestampConverter.field": "'$timefield'", + "transforms.TimestampConverter.type": "org.apache.kafka.connect.transforms.TimestampConverter$Value", + "transforms.TimestampConverter.target.type": "Timestamp"' + fi + + if [ "$add_timestamp" == true ] + then + local connectConfig=''$connectConfig', + "transforms": "AddTimestamp,AddedTimestampConverter", + "transforms.AddTimestamp.type": "org.apache.kafka.connect.transforms.InsertField$Value", + "transforms.AddTimestamp.timestamp.field": "recordGeneratedAt", + "transforms.AddedTimestampConverter.field": "recordGeneratedAt", + "transforms.AddedTimestampConverter.type": "org.apache.kafka.connect.transforms.TimestampConverter$Value", + "transforms.AddedTimestampConverter.target.type": "Timestamp"' + fi + + if [ "$use_key" == true ] + then + local connectConfig=''$connectConfig', + "document.id.strategy": "com.mongodb.kafka.connect.sink.processor.id.strategy.PartialValueStrategy", + "document.id.strategy.partial.value.projection.list": "'$key'", + "document.id.strategy.partial.value.projection.type": "AllowList", + "document.id.strategy.overwrite.existing": true' + fi + + local connectConfig=''$connectConfig' }' + + echo " Creating connector with Config : $connectConfig" + + curl -X PUT http://localhost:8083/connectors/MongoSink.${name}/config -H "Content-Type: application/json" -d "$connectConfig" +} + +createSink OdeRawEncodedBSMJson +createSink OdeBsmJson + +createSink OdeMapJson +createSink ProcessedMap +createSink OdeRawEncodedMAPJson + +createSink OdeRawEncodedSPATJson +createSink OdeSpatJson +createSink ProcessedSpat +createSink OdeSpatRxJson + +createSink OdeDriverAlertJson + +createSink OdeSrmJson +createSink OdeRawEncodedSRMJson + +createSink OdeSsmJson +createSink OdeRawEncodedSSMJson + +createSink OdeTimJson +createSink OdeTimBroadcastJson +createSink OdeTIMCertExpirationTimeJson +createSink OdeRawEncodedTIMJson + +createSink CmStopLinePassageEvent +createSink CmStopLineStopEvent +createSink CmSignalStateConflictEvents +createSink CmIntersectionReferenceAlignmentEvents +createSink CmSignalGroupAlignmentEvents +createSink CmConnectionOfTravelEvent +createSink CmLaneDirectionOfTravelEvent +createSink CmSignalStateEvent +createSink CmSpatTimeChangeDetailsEvent +createSink CmSpatMinimumDataEvents +createSink CmMapBroadcastRateEvents +createSink CmMapMinimumDataEvents +createSink CmSpatBroadcastRateEvents + +createSink CmBsmEvents + +createSink CmLaneDirectionOfTravelAssessment +createSink CmConnectionOfTravelAssessment +createSink CmSignalStateEventAssessment +createSink CmStopLineStopAssessment + +createSink CmSpatTimeChangeDetailsNotification +createSink CmLaneDirectionOfTravelNotification +createSink CmConnectionOfTravelNotification +createSink CmAppHealthNotifications +createSink CmSignalStateConflictNotification +createSink CmSignalGroupAlignmentNotification +createSink CmNotification +createSink CmStopLineStopNotification +createSink CmStopLinePassageNotification + + +echo "----------------------------------" +echo "Kafka connector creation complete!" +echo "----------------------------------" diff --git a/docker-compose-full-cm.yml b/docker-compose-full-cm.yml index 7a0a68bd3..0ce8202c6 100644 --- a/docker-compose-full-cm.yml +++ b/docker-compose-full-cm.yml @@ -255,7 +255,7 @@ services: DB_HOST_IP: ${DB_HOST_IP} DB_HOST_PORT: ${DB_HOST_PORT} SPRING_KAFKA_BOOTSTRAPSERVERS: ${KAFKA_BROKER_IP}:${KAFKA_BROKER_PORT} - CM_SERVER_URL: 'NONE' + CM_SERVER_URL: ${CM_SERVER_URL} load: 'false' KAFKA_TYPE: 'ON-PREM' ACM_CONFIG_FILE: adm.properties @@ -268,7 +268,7 @@ services: - sh - -c - | - sleep 60 + sleep ${CM_STARTUP_DELAY_SECONDS:-90} java -Djava.rmi.server.hostname=$DOCKER_HOST_IP -Dcom.sun.management.jmxremote.port=9090 -Dcom.sun.management.jmxremote.rmi.port=9090 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.local.only=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dlogback.configurationFile=/home/logback.xml -jar /home/jpo-conflictvisualizer-api.jar logging: options: @@ -359,11 +359,7 @@ services: chmod 400 /data/keyfile.txt chown 999:999 /data/keyfile.txt - exec docker-entrypoint.sh $$@ & - - sleep 30 - mongorestore /dump --username ${MONGO_INITDB_ROOT_USERNAME} --password ${MONGO_INITDB_ROOT_PASSWORD} - wait + exec docker-entrypoint.sh $$@ command: ['mongod', '--replSet', 'rs0', '--bind_ip_all', '--keyFile', '/data/keyfile.txt'] logging: @@ -378,7 +374,7 @@ services: connect: image: cp-kafka-connect:6.1.9 build: - context: ./conflictmonitor/docker/connect + context: ./conflictmonitor/connect dockerfile: Dockerfile container_name: jpo-conflictmonitor-kafka-connect restart: always diff --git a/docker-compose.yml b/docker-compose.yml index d9362828e..a3b24bb13 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -188,7 +188,7 @@ services: DB_HOST_IP: ${DB_HOST_IP} DB_HOST_PORT: ${DB_HOST_PORT} SPRING_KAFKA_BOOTSTRAPSERVERS: ${KAFKA_BROKER_IP}:${KAFKA_BROKER_PORT} - CM_SERVER_URL: 'NONE' + CM_SERVER_URL: ${CM_SERVER_URL} load: 'false' KAFKA_TYPE: 'ON-PREM' ACM_CONFIG_FILE: adm.properties diff --git a/webapp/src/App.css b/webapp/src/App.css index 15fe185ee..8eb33fca1 100644 --- a/webapp/src/App.css +++ b/webapp/src/App.css @@ -3,6 +3,10 @@ padding: 0; } +body { + overflow-y: hidden; +} + #masterdiv { background-color: #333; width: 100%; diff --git a/webapp/src/EnvironmentVars.tsx b/webapp/src/EnvironmentVars.tsx index a46090e58..059e5352f 100644 --- a/webapp/src/EnvironmentVars.tsx +++ b/webapp/src/EnvironmentVars.tsx @@ -42,6 +42,7 @@ class EnvironmentVars { static KEYCLOAK_REALM = process.env.REACT_APP_KEYCLOAK_REALM static DOT_NAME = process.env.REACT_APP_DOT_NAME + static cvmanagerBaseEndpoint = `${this.getBaseApiUrl()}` static rsuInfoEndpoint = `${this.getBaseApiUrl()}/rsuinfo` static rsuOnlineEndpoint = `${this.getBaseApiUrl()}/rsu-online-status` static rsuCountsEndpoint = `${this.getBaseApiUrl()}/rsucounts` diff --git a/webapp/src/components/intersections/ConfigurationPage.tsx b/webapp/src/components/intersections/ConfigurationPage.tsx index 417f73ad0..f27963bad 100644 --- a/webapp/src/components/intersections/ConfigurationPage.tsx +++ b/webapp/src/components/intersections/ConfigurationPage.tsx @@ -14,13 +14,17 @@ import { TextFieldProps, Typography, } from '@mui/material' -import { configParamApi } from '../../apis/intersections/configuration-param-api' import { ConfigParamListTable } from '../../features/intersections/configuration/configuration-list-table' import RefreshIcon from '@mui/icons-material/Refresh' import SearchIcon from '@mui/icons-material/Search' -import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../generalSlices/intersectionSlice' -import { selectToken } from '../../generalSlices/userSlice' +import { selectSelectedIntersectionId } from '../../generalSlices/intersectionSlice' import { useAppSelector } from '../../hooks' +import { useGetIntersectionParametersQuery } from '../../features/api/intersectionConfigParamApiSlice' +import { Route, Routes } from 'react-router-dom' +import ConfigParamEdit from './configuration/edit' +import ConfigParamCreate from './configuration/create' +import ConfigParamRemove from './configuration/remove' +import { NotFound } from '../../pages/404' const tabs = [ { @@ -93,37 +97,22 @@ const applyPagination = (parameters, page, rowsPerPage) => const Page = () => { const queryRef = useRef(null) - const [parameters, setParameters] = useState([]) const [currentTab, setCurrentTab] = useState('GENERAL') const [page, setPage] = useState(0) const [rowsPerPage, setRowsPerPage] = useState(10) const [currentDescription, setCurrentDescription] = useState('') const intersectionId = useAppSelector(selectSelectedIntersectionId) - const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) - const token = useAppSelector(selectToken) const [filter, setFilter] = useState({ query: '', tab: currentTab, }) + const { data: parameters, refetch } = useGetIntersectionParametersQuery(intersectionId) + useEffect(() => { updateDescription() }, [currentTab]) - const getParameters = async () => { - try { - const data = await configParamApi.getAllParameters(token, intersectionId, roadRegulatorId) - - setParameters(data) - } catch (err) { - console.error(err) - } - } - - useEffect(() => { - getParameters() - }, [intersectionId]) - const handleTabsChange = (event, value) => { const updatedFilter = { ...filter, tab: value } setCurrentTab(value) @@ -157,123 +146,144 @@ const Page = () => { } // Usually query is done on backend with indexing solutions - const filteredParameters = applyFilters(parameters, filter) + const filteredParameters = applyFilters(parameters ?? [], filter) const paginatedParameters = applyPagination(filteredParameters, page, rowsPerPage) return ( - <> - - - - - - - Configuration Parameters - - - - - - - - - - - {tabs.map((tab) => ( - - ))} - - + + - + - - - - ), + + + + Configuration Parameters + + + + + > - {currentDescription} - - + + + + + + {tabs.map((tab) => ( + + ))} + + + + + + + + + ), + }} + placeholder="Search parameters" + /> + + {currentDescription} + + - - - - - + + + + + + } + /> + } /> + } /> + } /> + + } + /> +
) } diff --git a/webapp/src/components/intersections/configuration/create.tsx b/webapp/src/components/intersections/configuration/create.tsx index db0d08b65..9425d9ec6 100644 --- a/webapp/src/components/intersections/configuration/create.tsx +++ b/webapp/src/components/intersections/configuration/create.tsx @@ -1,33 +1,36 @@ -import React, { useState, useCallback, useEffect } from 'react' -import { Box, Container, Typography } from '@mui/material' -import { configParamApi } from '../../../apis/intersections/configuration-param-api' +import React, { useEffect } from 'react' +import { Box, CircularProgress, Container, Typography } from '@mui/material' import { ConfigParamCreateForm } from '../../../features/intersections/configuration/configuration-create-form' -import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' -import { selectToken } from '../../../generalSlices/userSlice' +import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useParams } from 'react-router-dom' import { useAppSelector } from '../../../hooks' +import { + filterParameter, + useLazyGetGeneralParametersQuery, + useLazyGetIntersectionParametersQuery, +} from '../../../features/api/intersectionConfigParamApiSlice' const ConfigParamCreate = () => { - const [parameter, setParameter] = useState(undefined) const intersectionId = useAppSelector(selectSelectedIntersectionId) - const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) - const token = useAppSelector(selectToken) - const { key } = useParams<{ key: string }>() + const [triggerIntersection, { data: intersectionParameters, isFetching: isFetchingIntersection }] = + useLazyGetIntersectionParametersQuery() + const [triggerGeneral, { data: generalParameters, isFetching: isFetchingGeneral }] = + useLazyGetGeneralParametersQuery() - const getParameter = async (key: string) => { - try { - const data = await configParamApi.getParameter(token, key, intersectionId, roadRegulatorId) + const { key } = useParams<{ key: string }>() - setParameter(data) - } catch (err) { - console.error(err) + useEffect(() => { + if (intersectionId) { + triggerIntersection(intersectionId) } - } + }, [intersectionId, triggerIntersection]) useEffect(() => { - getParameter(key as string) - }, [intersectionId]) + triggerGeneral(undefined) + }, [triggerGeneral]) + + const parameter = filterParameter(key, intersectionParameters, generalParameters) if (!parameter) { return ( @@ -48,11 +51,21 @@ const ConfigParamCreate = () => { overflow: 'hidden', }} > -
- - Unable to find parameter {key} - -
+ {isFetchingIntersection || isFetchingGeneral ? ( +
+ + + + Loading {key} + +
+ ) : ( +
+ + Unable to find parameter {key} + +
+ )} diff --git a/webapp/src/components/intersections/configuration/edit.tsx b/webapp/src/components/intersections/configuration/edit.tsx index 47dc4a201..7b2b3829d 100644 --- a/webapp/src/components/intersections/configuration/edit.tsx +++ b/webapp/src/components/intersections/configuration/edit.tsx @@ -1,33 +1,36 @@ -import React, { useState, useEffect } from 'react' -import { Box, Container, Typography } from '@mui/material' -import { configParamApi } from '../../../apis/intersections/configuration-param-api' +import React, { useEffect } from 'react' +import { Box, CircularProgress, Container, Typography } from '@mui/material' import { ConfigParamEditForm } from '../../../features/intersections/configuration/configuration-edit-form' -import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' -import { selectToken } from '../../../generalSlices/userSlice' +import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useParams } from 'react-router-dom' import { useAppSelector } from '../../../hooks' +import { + filterParameter, + useLazyGetGeneralParametersQuery, + useLazyGetIntersectionParametersQuery, +} from '../../../features/api/intersectionConfigParamApiSlice' const ConfigParamEdit = () => { - const [parameter, setParameter] = useState(undefined) const intersectionId = useAppSelector(selectSelectedIntersectionId) - const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) - const token = useAppSelector(selectToken) - const { key } = useParams<{ key: string }>() + const [triggerIntersection, { data: intersectionParameters, isFetching: isFetchingIntersection }] = + useLazyGetIntersectionParametersQuery() + const [triggerGeneral, { data: generalParameters, isFetching: isFetchingGeneral }] = + useLazyGetGeneralParametersQuery() - const getParameter = async (key: string) => { - try { - const data = await configParamApi.getParameter(token, key, intersectionId, roadRegulatorId) + const { key } = useParams<{ key: string }>() - setParameter(data) - } catch (err) { - console.error(err) + useEffect(() => { + if (intersectionId) { + triggerIntersection(intersectionId) } - } + }, [intersectionId, triggerIntersection]) useEffect(() => { - getParameter(key as string) - }, [intersectionId]) + triggerGeneral(undefined) + }, [triggerGeneral]) + + const parameter = filterParameter(key, intersectionParameters, generalParameters) if (!parameter) { return ( @@ -48,11 +51,21 @@ const ConfigParamEdit = () => { overflow: 'hidden', }} > -
- - Unable to find parameter {key} - -
+ {isFetchingIntersection || isFetchingGeneral ? ( +
+ + + + Loading {key} + +
+ ) : ( +
+ + Unable to find parameter {key} + +
+ )} @@ -78,7 +91,7 @@ const ConfigParamEdit = () => { }} >
- + {parameter.key}
diff --git a/webapp/src/components/intersections/configuration/remove.tsx b/webapp/src/components/intersections/configuration/remove.tsx index aa0863abd..173e9bad5 100644 --- a/webapp/src/components/intersections/configuration/remove.tsx +++ b/webapp/src/components/intersections/configuration/remove.tsx @@ -1,33 +1,39 @@ -import React, { useState, useEffect } from 'react' -import { Box, Container, Typography } from '@mui/material' -import { configParamApi } from '../../../apis/intersections/configuration-param-api' +import React, { useEffect } from 'react' +import { Box, CircularProgress, Container, Typography, useTheme } from '@mui/material' import { ConfigParamRemoveForm } from '../../../features/intersections/configuration/configuration-remove-form' -import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' -import { selectToken } from '../../../generalSlices/userSlice' +import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useParams } from 'react-router-dom' import { useAppSelector } from '../../../hooks' +import { + filterParameter, + useLazyGetGeneralParametersQuery, + useLazyGetIntersectionParametersQuery, +} from '../../../features/api/intersectionConfigParamApiSlice' const ConfigParamRemove = () => { - const [parameter, setParameter] = useState(undefined) + const theme = useTheme() // Access the current theme const intersectionId = useAppSelector(selectSelectedIntersectionId) - const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) - const token = useAppSelector(selectToken) - const { key } = useParams<{ key: string }>() + const [triggerIntersection, { data: intersectionParameters, isFetching: isFetchingIntersection }] = + useLazyGetIntersectionParametersQuery() + const [triggerGeneral, { data: generalParameters, isFetching: isFetchingGeneral }] = + useLazyGetGeneralParametersQuery() - const getParameter = async (key: string) => { - try { - const data = await configParamApi.getParameter(token, key, intersectionId, roadRegulatorId) + const { key } = useParams<{ key: string }>() - setParameter(data) - } catch (err) { - console.error(err) + useEffect(() => { + if (intersectionId) { + triggerIntersection(intersectionId) } - } + }, [intersectionId, triggerIntersection]) useEffect(() => { - getParameter(key as string) - }, [intersectionId]) + triggerGeneral(undefined) + }, [triggerGeneral]) + + console.log(theme) + + const parameter = filterParameter(key, intersectionParameters, generalParameters) if (!parameter) { return ( @@ -48,11 +54,21 @@ const ConfigParamRemove = () => { overflow: 'hidden', }} > -
- - Unable to find parameter {key} - -
+ {isFetchingIntersection || isFetchingGeneral ? ( +
+ + + + Loading {key} + +
+ ) : ( +
+ + Unable to find parameter {key} + +
+ )} @@ -78,9 +94,7 @@ const ConfigParamRemove = () => { }} >
- - {parameter.category}/{parameter.key} - + {parameter.key}
diff --git a/webapp/src/features/api/intersectionConfigParamApiSlice.ts b/webapp/src/features/api/intersectionConfigParamApiSlice.ts new file mode 100644 index 000000000..75d01c4f3 --- /dev/null +++ b/webapp/src/features/api/intersectionConfigParamApiSlice.ts @@ -0,0 +1,106 @@ +// Need to use the React-specific entry point to import createApi +import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' +import EnvironmentVars from '../../EnvironmentVars' +import { RootState } from '../../store' +import { selectOrganizationName, selectToken } from '../../generalSlices/userSlice' + +const getQueryString = (query_params: Record) => { + // filter out undefined values from query params + const filteredQueryParams: Record = { ...query_params } + Object.keys(filteredQueryParams).forEach((key) => query_params[key] === undefined && delete query_params[key]) + const queryString = new URLSearchParams(query_params).toString() + return `${queryString ? `?${queryString}` : ''}` +} + +// Define a service using a base URL and expected endpoints +export const intersectionConfigParamApiSlice = createApi({ + reducerPath: 'intersectionConfigParamApi', + baseQuery: fetchBaseQuery({ + baseUrl: EnvironmentVars.CVIZ_API_SERVER_URL, + prepareHeaders: (headers, { getState, endpoint }) => { + const token = selectToken(getState() as RootState) + + // Specify endpoints that do not require a token or organization. These names must match the keys in the endpoints object below. + const endpointsWithoutToken = [] + + if (token && !endpointsWithoutToken.includes(endpoint)) { + headers.set('Authorization', `Bearer ${token}`) + } + + return headers + }, + }), + tagTypes: ['defaultCongifs', 'intersectionConfigs'], + endpoints: (builder) => ({ + getGeneralParameters: builder.query({ + query: () => { + return `config/default/all` + }, + providesTags: ['defaultCongifs'], + }), + getIntersectionParameters: builder.query({ + query: (intersectionId) => { + return `config/intersection/unique${getQueryString({ + intersection_id: intersectionId.toString(), + road_regulator_id: '-1', + })}` + }, + providesTags: ['intersectionConfigs'], + }), + updateDefaultParameter: builder.mutation({ + query: (body) => ({ + url: 'config/default', + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body, + }), + transformResponse: (response: any, meta: any) => response as Config, + invalidatesTags: ['defaultCongifs', 'intersectionConfigs'], + }), + updateIntersectionParameter: builder.mutation({ + query: (body) => ({ + url: 'config/intersection', + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body, + }), + transformResponse: (response: any, meta: any) => response as IntersectionConfig, + invalidatesTags: ['intersectionConfigs'], + }), + removeOverriddenParameter: builder.mutation< + IntersectionConfig | undefined, + { name: string; config: IntersectionConfig } + >({ + query: ({ name, config }) => ({ + url: `config/intersection/create/${name}`, + method: 'DELETE', + headers: { 'Content-Type': 'application/json' }, + body: config, + }), + transformResponse: (response: any, meta: any) => response as IntersectionConfig, + invalidatesTags: ['intersectionConfigs'], + }), + }), +}) + +export const filterParameter = ( + key: string, + intersectionParameters: IntersectionConfig[], + generalParameters: Config[] +): Config | undefined => + intersectionParameters?.find( + (p) => p.key === key && p.intersectionID !== null && p.intersectionID !== 0 && p.intersectionID !== -1 + ) ?? generalParameters?.find((p) => p.key === key) + +// Export hooks for usage in functional components, which are +// auto-generated based on the defined endpoints +export const { + useGetGeneralParametersQuery, + useGetIntersectionParametersQuery, + useUpdateDefaultParameterMutation, + useUpdateIntersectionParameterMutation, + useRemoveOverriddenParameterMutation, + + useLazyGetGeneralParametersQuery, + useLazyGetIntersectionParametersQuery, +} = intersectionConfigParamApiSlice diff --git a/webapp/src/features/intersections/configuration/configuration-create-form.tsx b/webapp/src/features/intersections/configuration/configuration-create-form.tsx index 6e7408eb9..42d4d65e8 100644 --- a/webapp/src/features/intersections/configuration/configuration-create-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-create-form.tsx @@ -4,18 +4,20 @@ import toast from 'react-hot-toast' import * as Yup from 'yup' import { useFormik } from 'formik' import { Button, Card, CardActions, CardContent, CardHeader, Divider, Grid, TextField } from '@mui/material' -import { configParamApi } from '../../../apis/intersections/configuration-param-api' import { useNavigate } from 'react-router-dom' import { selectToken } from '../../../generalSlices/userSlice' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' import { useAppSelector } from '../../../hooks' +import { useUpdateIntersectionParameterMutation } from '../../api/intersectionConfigParamApiSlice' export const ConfigParamCreateForm = (props) => { const navigate = useNavigate() const { parameter }: { parameter: Config } = props - const token = useAppSelector(selectToken) const intersectionId = useAppSelector(selectSelectedIntersectionId) const roadRegulatorId = useAppSelector(selectSelectedRoadRegulatorId) + + const [updateIntersectionParameter, {}] = useUpdateIntersectionParameterMutation() + const formik = useFormik({ initialValues: { name: parameter.key, @@ -41,10 +43,10 @@ export const ConfigParamCreateForm = (props) => { roadRegulatorID: roadRegulatorId, rsuID: '', } - await configParamApi.updateIntersectionParameter(token, values.name, updatedConfig) + await updateIntersectionParameter(updatedConfig) helpers.setStatus({ success: true }) helpers.setSubmitting(false) - navigate(`/configuration`) + navigate(`../`) } catch (err) { console.error(err) toast.error('Something went wrong!') diff --git a/webapp/src/features/intersections/configuration/configuration-edit-form.tsx b/webapp/src/features/intersections/configuration/configuration-edit-form.tsx index fead1ffac..e196faaf1 100644 --- a/webapp/src/features/intersections/configuration/configuration-edit-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-edit-form.tsx @@ -4,15 +4,19 @@ import toast from 'react-hot-toast' import * as Yup from 'yup' import { useFormik } from 'formik' import { Button, Card, CardActions, CardContent, CardHeader, Divider, Grid, TextField } from '@mui/material' -import { configParamApi } from '../../../apis/intersections/configuration-param-api' -import { selectToken } from '../../../generalSlices/userSlice' import { useNavigate } from 'react-router-dom' -import { useAppSelector } from '../../../hooks' +import { + useUpdateDefaultParameterMutation, + useUpdateIntersectionParameterMutation, +} from '../../api/intersectionConfigParamApiSlice' export const ConfigParamEditForm = (props) => { const { parameter }: { parameter: DefaultConfig | IntersectionConfig } = props - const token = useAppSelector(selectToken) const navigate = useNavigate() + + const [updateIntersectionParameter, {}] = useUpdateIntersectionParameterMutation() + const [updateDefaultParameter, {}] = useUpdateDefaultParameterMutation() + const formik = useFormik({ initialValues: { name: parameter.key, @@ -76,17 +80,17 @@ export const ConfigParamEditForm = (props) => { ...(parameter as IntersectionConfig), value: typedValue, } - await configParamApi.updateIntersectionParameter(token, values.name, updatedConfig) + await updateIntersectionParameter(updatedConfig) } else { const updatedConfig = { ...parameter, value: typedValue, } - await configParamApi.updateDefaultParameter(token, values.name, updatedConfig) + await updateDefaultParameter(updatedConfig) } helpers.setStatus({ success: true }) helpers.setSubmitting(false) - navigate('/configuration') + navigate('../') } catch (err) { console.error(err) toast.error('Something went wrong!') @@ -173,7 +177,7 @@ export const ConfigParamEditForm = (props) => { mr: 'auto', }} variant="outlined" - onClick={() => navigate(`/configuration`)} + onClick={() => navigate(`../`)} > Cancel diff --git a/webapp/src/features/intersections/configuration/configuration-list-table.tsx b/webapp/src/features/intersections/configuration/configuration-list-table.tsx index f063d004e..99f2e930a 100644 --- a/webapp/src/features/intersections/configuration/configuration-list-table.tsx +++ b/webapp/src/features/intersections/configuration/configuration-list-table.tsx @@ -43,7 +43,7 @@ export const ConfigParamListTable = (props) => { {param.units?.toString()} {param.description} - navigate(`/configuration/${param.key}/edit`)}> + navigate(`${param.key}/edit`)}> @@ -60,11 +60,11 @@ export const ConfigParamListTable = (props) => { {param.description} {intersectionId != -1 ? ( - navigate(`/configuration/${param.key}/create`)}> + navigate(`${param.key}/create`)}> ) : null} - navigate(`/configuration/${param.key}/edit`)}> + navigate(`${param.key}/edit`)}> @@ -99,11 +99,11 @@ export const ConfigParamListTable = (props) => { {param.unit} {param.description} - navigate(`/configuration/${param.key}/edit`)}> + navigate(`${param.key}/edit`)}> {intersectionId != -1 ? ( - navigate(`/configuration/${param.key}/remove`)}> + navigate(`${param.key}/remove`)}> ) : null} @@ -134,6 +134,7 @@ export const ConfigParamListTable = (props) => { case 'DEFAULT': return generalDefaultRow(param) case 'INTERSECTION': + console.log('intersectionRow') return 'intersectionID' in param ? intersectionRow(param) : generalIntersectionRow(param) default: return readOnlyRow(param) diff --git a/webapp/src/features/intersections/configuration/configuration-remove-form.tsx b/webapp/src/features/intersections/configuration/configuration-remove-form.tsx index d8079260a..81cd3e1d6 100644 --- a/webapp/src/features/intersections/configuration/configuration-remove-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-remove-form.tsx @@ -4,17 +4,18 @@ import toast from 'react-hot-toast' import * as Yup from 'yup' import { useFormik } from 'formik' import { Button, Card, CardActions, CardContent, CardHeader, Divider, Grid, TextField } from '@mui/material' -import { configParamApi } from '../../../apis/intersections/configuration-param-api' import { useNavigate } from 'react-router-dom' -import { selectToken } from '../../../generalSlices/userSlice' import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useAppSelector } from '../../../hooks' +import { useRemoveOverriddenParameterMutation } from '../../api/intersectionConfigParamApiSlice' export const ConfigParamRemoveForm = (props) => { const { parameter, defaultParameter, ...other } = props const navigate = useNavigate() - const token = useAppSelector(selectToken) const intersectionId = useAppSelector(selectSelectedIntersectionId) + + const [removeOverriddenParameter, {}] = useRemoveOverriddenParameterMutation() + const formik = useFormik({ initialValues: { name: parameter.key, @@ -31,10 +32,10 @@ export const ConfigParamRemoveForm = (props) => { return } try { - await configParamApi.removeOverriddenParameter(token, values.name, parameter) + await removeOverriddenParameter(parameter) helpers.setStatus({ success: true }) helpers.setSubmitting(false) - navigate(`/configuration`) + navigate(`../`) } catch (err) { console.error(err) toast.error('Something went wrong!') @@ -132,7 +133,7 @@ export const ConfigParamRemoveForm = (props) => { mr: 'auto', }} variant="outlined" - onClick={() => navigate(`/configuration`)} + onClick={() => navigate(`../`)} > Cancel diff --git a/webapp/src/pages/IntersectionDashboard.tsx b/webapp/src/pages/IntersectionDashboard.tsx index 411c83721..a39408726 100644 --- a/webapp/src/pages/IntersectionDashboard.tsx +++ b/webapp/src/pages/IntersectionDashboard.tsx @@ -19,6 +19,7 @@ import { import MapIconRounded from '@mui/icons-material/Map' import MapDialog from '../features/intersections/intersection-selector/intersection-selector-dialog' import { useAppDispatch, useAppSelector } from '../hooks' +import ConfigurationPage from '../components/intersections/ConfigurationPage' function IntersectionDashboard() { const dispatch = useAppDispatch() @@ -54,6 +55,7 @@ function IntersectionDashboard() { onClick={() => { setOpenMapDialog(true) }} + sx={{ mt: 1, ml: 1 }} > @@ -94,12 +96,11 @@ function IntersectionDashboard() { title: 'Reports', child: , }, - // The configuration page is still under development - // { - // path: 'configuration', - // title: 'Configuration', - // child: , - // }, + { + path: 'configuration', + title: 'Configuration', + child: , + }, ]} /> diff --git a/webapp/src/store.tsx b/webapp/src/store.tsx index fc2ac76fd..2b8098e91 100644 --- a/webapp/src/store.tsx +++ b/webapp/src/store.tsx @@ -26,7 +26,7 @@ import menuReducer from './features/menu/menuSlice' import intersectionMapReducer from './features/intersections/map/map-slice' import intersectionMapLayerStyleReducer from './features/intersections/map/map-layer-style-slice' import dataSelectorReducer from './features/intersections/data-selector/dataSelectorSlice' -import liveIntersectionReducer from './features/intersections/live/live-intersection-slice' +import { intersectionConfigParamApiSlice } from './features/api/intersectionConfigParamApiSlice' export const setupStore = (preloadedState: any) => { return configureStore({ @@ -58,7 +58,7 @@ export const setupStore = (preloadedState: any) => { intersectionMap: intersectionMapReducer, intersectionMapLayerStyle: intersectionMapLayerStyleReducer, dataSelector: dataSelectorReducer, - liveIntersection: liveIntersectionReducer, + [intersectionConfigParamApiSlice.reducerPath]: intersectionConfigParamApiSlice.reducer, }, preloadedState, middleware: (getDefaultMiddleware) => @@ -66,7 +66,7 @@ export const setupStore = (preloadedState: any) => { thunk: true, serializableCheck: false, immutableCheck: false, - }), + }).concat(intersectionConfigParamApiSlice.middleware), devTools: true, }) } diff --git a/webapp/src/styles/index.ts b/webapp/src/styles/index.ts index 46cd262cb..3de624d4e 100644 --- a/webapp/src/styles/index.ts +++ b/webapp/src/styles/index.ts @@ -19,6 +19,7 @@ declare module '@mui/material/styles' { // Global Theme export const theme = createTheme({ palette: { + mode: 'dark', common: { black: '#000000', white: '#ffffff', @@ -36,7 +37,7 @@ export const theme = createTheme({ text: { primary: '#ffffff', secondary: '#d16d15', - disabled: '#000000', + disabled: '#acacac', hint: '#0e2052', }, divider: '#333', @@ -45,35 +46,11 @@ export const theme = createTheme({ default: '#1c1d1f', }, }, - components: { - MuiIcon: { - styleOverrides: { - root: { - color: '#d16d15', - }, - }, - }, - MuiSvgIcon: { - styleOverrides: { - root: { - // Match 24px = 3 * 2 + 1.125 * 16 - color: '#d16d15', - }, - }, - }, - MuiTextField: {}, - MuiInputLabel: { - styleOverrides: { - // This is the global theme styling for Form.Label - root: { - color: 'white', // Set the color to white - }, - }, + typography: { + allVariants: { + color: '#fff', }, }, - input: { - color: '#11ff00', - }, }) // used by AdminTable.tsx From ad6e79b0c63cd8f24343665be5a02396e309b297 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Tue, 15 Oct 2024 19:35:15 -0600 Subject: [PATCH 05/27] Final visual touches --- .../configuration-list-table.tsx | 60 +++++++++---------- .../notifications/notifications-table.tsx | 2 +- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/webapp/src/features/intersections/configuration/configuration-list-table.tsx b/webapp/src/features/intersections/configuration/configuration-list-table.tsx index 99f2e930a..3620807dc 100644 --- a/webapp/src/features/intersections/configuration/configuration-list-table.tsx +++ b/webapp/src/features/intersections/configuration/configuration-list-table.tsx @@ -114,36 +114,36 @@ export const ConfigParamListTable = (props) => { return ( - - - - - - Name - Value - Unit - Description - Actions - - - - {(parameters as Config[]).map((param) => { - switch (param.updateType) { - case 'READ_ONLY': - return readOnlyRow(param) - case 'DEFAULT': - return generalDefaultRow(param) - case 'INTERSECTION': - console.log('intersectionRow') - return 'intersectionID' in param ? intersectionRow(param) : generalIntersectionRow(param) - default: - return readOnlyRow(param) - } - })} - -
-
-
+ + + + + Name + Value + Unit + Description + + Actions + + + + + {(parameters as Config[]).map((param) => { + switch (param.updateType) { + case 'READ_ONLY': + return readOnlyRow(param) + case 'DEFAULT': + return generalDefaultRow(param) + case 'INTERSECTION': + console.log('intersectionRow') + return 'intersectionID' in param ? intersectionRow(param) : generalIntersectionRow(param) + default: + return readOnlyRow(param) + } + })} + +
+
{
)} - + {!simple && ( <> From 8b19fb1661c8df2d63fa212b89aeba1b92ec16da Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Tue, 15 Oct 2024 19:39:59 -0600 Subject: [PATCH 06/27] Fixing deletion of config params --- .../src/features/api/intersectionConfigParamApiSlice.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/webapp/src/features/api/intersectionConfigParamApiSlice.ts b/webapp/src/features/api/intersectionConfigParamApiSlice.ts index 75d01c4f3..f265936e9 100644 --- a/webapp/src/features/api/intersectionConfigParamApiSlice.ts +++ b/webapp/src/features/api/intersectionConfigParamApiSlice.ts @@ -67,12 +67,9 @@ export const intersectionConfigParamApiSlice = createApi({ transformResponse: (response: any, meta: any) => response as IntersectionConfig, invalidatesTags: ['intersectionConfigs'], }), - removeOverriddenParameter: builder.mutation< - IntersectionConfig | undefined, - { name: string; config: IntersectionConfig } - >({ - query: ({ name, config }) => ({ - url: `config/intersection/create/${name}`, + removeOverriddenParameter: builder.mutation({ + query: (config) => ({ + url: `config/intersection`, method: 'DELETE', headers: { 'Content-Type': 'application/json' }, body: config, From 75986b8b5d5a15b4ae14cd1b8e87623f797536e7 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Wed, 16 Oct 2024 09:04:46 -0600 Subject: [PATCH 07/27] changing to selectors (from lazy queries) --- .../intersections/configuration-param-api.ts | 212 ------------------ .../intersections/configuration/create.tsx | 54 ++--- .../intersections/configuration/edit.tsx | 55 +---- .../intersections/configuration/remove.tsx | 54 +---- .../api/intersectionConfigParamApiSlice.ts | 36 ++- .../configuration/configuration-edit-form.tsx | 25 ++- .../configuration-list-table.tsx | 3 +- 7 files changed, 89 insertions(+), 350 deletions(-) delete mode 100644 webapp/src/apis/intersections/configuration-param-api.ts diff --git a/webapp/src/apis/intersections/configuration-param-api.ts b/webapp/src/apis/intersections/configuration-param-api.ts deleted file mode 100644 index f1ed5ae73..000000000 --- a/webapp/src/apis/intersections/configuration-param-api.ts +++ /dev/null @@ -1,212 +0,0 @@ -import { authApiHelper } from './api-helper-cviz' - -class ConfigParamsApi { - async getGeneralParameters(token: string): Promise { - // return ConfigParamsGeneral; - try { - var response = await authApiHelper.invokeApi({ - path: '/config/default/all', - token: token, - failureMessage: 'Failed to retrieve general parameters', - }) - return response ?? ([] as Config[]) - } catch (exception_var) { - console.error(exception_var) - return [] - } - } - - async getIntersectionParameters( - token: string, - intersectionId: number, - roadRegulatorId: number - ): Promise { - // return configParamsIntersection; - try { - var response = await authApiHelper.invokeApi({ - path: '/config/intersection/unique', - token: token, - queryParams: { intersection_id: intersectionId.toString(), road_regulator_id: roadRegulatorId.toString() }, - failureMessage: 'Failed to retrieve unique intersection parameters', - }) - return response ?? ([] as IntersectionConfig[]) - } catch (exception_var) { - console.error(exception_var) - return [] - } - } - - async getAllParameters(token: string, intersectionId: number, roadRegulatorId: number): Promise { - try { - var response = await authApiHelper.invokeApi({ - path: '/config/intersection/unique', - token: token, - queryParams: { intersection_id: intersectionId.toString(), road_regulator_id: roadRegulatorId.toString() }, - failureMessage: 'Failed to retrieve unique intersection parameters', - }) - return response ?? ([] as IntersectionConfig[]) - } catch (exception_var) { - console.error(exception_var) - return [] - } - } - - async getParameterGeneral(token: string, key: string): Promise { - try { - var response = ( - await authApiHelper.invokeApi({ - path: `/config/default/all`, - token: token, - failureMessage: `Failed to Retrieve Configuration Parameter ${key}`, - }) - ) - .filter((c) => c.key === key) - .at(-1) - return response as Config - } catch (exception_var) { - console.error(exception_var) - return undefined - } - } - - async getParameterIntersection( - token: string, - key: string, - intersectionId: number, - roadRegulatorId: number - ): Promise { - try { - var response = ( - await authApiHelper.invokeApi({ - path: `/config/intersection/all`, - token: token, - queryParams: { intersection_id: intersectionId.toString(), road_regulator_id: roadRegulatorId.toString() }, - toastOnFailure: false, - // failureMessage: `Failed to Retrieve Configuration Parameter ${key}`, - }) - ) - .filter((c) => c.key === key && c.intersectionID !== null && c.intersectionID !== 0 && c.intersectionID !== -1) - .at(-1) - return response as IntersectionConfig - } catch (exception_var) { - console.error(exception_var) - return undefined - } - } - - async getParameter( - token: string, - key: string, - intersectionId: number, - roadRegulatorId: number - ): Promise { - // try to get intersection parameter first, if not found, get general parameter - var param: Config | undefined = undefined - if (intersectionId !== -1) { - var param: Config | undefined = await this.getParameterIntersection(token, key, intersectionId, roadRegulatorId) - } - if (param == undefined) { - param = await this.getParameterGeneral(token, key) - } - return param - } - - async updateDefaultParameter(token: string, name: string, param: Config): Promise { - try { - var response = await authApiHelper.invokeApi({ - path: '/config/default', - token: token, - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: param, - toastOnSuccess: true, - successMessage: `Successfully Update Configuration Parameter ${name}`, - failureMessage: `Failed to Update Configuration Parameter ${name}`, - }) - return response as Config - } catch (exception_var) { - console.error(exception_var) - return undefined - } - } - - async updateIntersectionParameter( - token: string, - name: string, - param: IntersectionConfig - ): Promise { - try { - var response = await authApiHelper.invokeApi({ - path: '/config/intersection', - token: token, - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: param, - toastOnSuccess: true, - successMessage: `Successfully Update Intersection Configuration Parameter ${name}`, - failureMessage: `Failed to Update Intersection Configuration Parameter ${name}`, - }) - return response as IntersectionConfig - } catch (exception_var) { - console.error(exception_var) - return undefined - } - } - - async createIntersectionParameter( - token: string, - name: string, - value: Config, - intersectionId: number, - roadRegulatorId: number - ): Promise { - const param: IntersectionConfig = { - intersectionID: intersectionId, - roadRegulatorID: roadRegulatorId, - rsuID: 'rsu_1', - ...value, - } - - try { - var response = await authApiHelper.invokeApi({ - path: '/config/intersection/create/' + name, - token: token, - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: param, - toastOnSuccess: true, - successMessage: `Successfully Created Intersection Configuration Parameter ${name}`, - failureMessage: `Failed to Create Intersection Configuration Parameter ${name}`, - }) - return response as Config - } catch (exception_var) { - console.error(exception_var) - return undefined - } - } - - async removeOverriddenParameter( - token: string, - name: string, - config: IntersectionConfig - ): Promise { - try { - var response = await authApiHelper.invokeApi({ - path: '/config/intersection', - token: token, - method: 'DELETE', - headers: { 'Content-Type': 'application/json' }, - body: config, - toastOnSuccess: true, - successMessage: `Successfully Removed Intersection Configuration Parameter ${name}`, - failureMessage: `Failed to Remove Intersection Configuration Parameter ${name}`, - }) - return response as Config - } catch (exception_var) { - console.error(exception_var) - return undefined - } - } -} - -export const configParamApi = new ConfigParamsApi() diff --git a/webapp/src/components/intersections/configuration/create.tsx b/webapp/src/components/intersections/configuration/create.tsx index 9425d9ec6..10e25989a 100644 --- a/webapp/src/components/intersections/configuration/create.tsx +++ b/webapp/src/components/intersections/configuration/create.tsx @@ -1,38 +1,22 @@ -import React, { useEffect } from 'react' -import { Box, CircularProgress, Container, Typography } from '@mui/material' +import React from 'react' +import { Box, Container, Typography } from '@mui/material' import { ConfigParamCreateForm } from '../../../features/intersections/configuration/configuration-create-form' import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useParams } from 'react-router-dom' import { useAppSelector } from '../../../hooks' import { - filterParameter, - useLazyGetGeneralParametersQuery, - useLazyGetIntersectionParametersQuery, + selectParameter, + selectIntersectionParametersById, } from '../../../features/api/intersectionConfigParamApiSlice' const ConfigParamCreate = () => { const intersectionId = useAppSelector(selectSelectedIntersectionId) - const [triggerIntersection, { data: intersectionParameters, isFetching: isFetchingIntersection }] = - useLazyGetIntersectionParametersQuery() - const [triggerGeneral, { data: generalParameters, isFetching: isFetchingGeneral }] = - useLazyGetGeneralParametersQuery() - const { key } = useParams<{ key: string }>() - useEffect(() => { - if (intersectionId) { - triggerIntersection(intersectionId) - } - }, [intersectionId, triggerIntersection]) - - useEffect(() => { - triggerGeneral(undefined) - }, [triggerGeneral]) + const parameter = useAppSelector(selectParameter(key, intersectionId)) - const parameter = filterParameter(key, intersectionParameters, generalParameters) - - if (!parameter) { + if (!parameter || intersectionId === -1) { return ( <> { py: 8, }} > - + { overflow: 'hidden', }} > - {isFetchingIntersection || isFetchingGeneral ? ( -
- - - - Loading {key} - -
- ) : ( -
- - Unable to find parameter {key} - -
- )} +
+ + Unable to find parameter {key}. +
+ Do you have the right intersection ID selected? +
+
@@ -92,7 +68,7 @@ const ConfigParamCreate = () => { >
- {parameter.category}/{parameter.key} + {parameter.key}
diff --git a/webapp/src/components/intersections/configuration/edit.tsx b/webapp/src/components/intersections/configuration/edit.tsx index 7b2b3829d..b0954c8b6 100644 --- a/webapp/src/components/intersections/configuration/edit.tsx +++ b/webapp/src/components/intersections/configuration/edit.tsx @@ -1,36 +1,17 @@ -import React, { useEffect } from 'react' -import { Box, CircularProgress, Container, Typography } from '@mui/material' +import React from 'react' +import { Box, Container, Typography } from '@mui/material' import { ConfigParamEditForm } from '../../../features/intersections/configuration/configuration-edit-form' import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useParams } from 'react-router-dom' import { useAppSelector } from '../../../hooks' -import { - filterParameter, - useLazyGetGeneralParametersQuery, - useLazyGetIntersectionParametersQuery, -} from '../../../features/api/intersectionConfigParamApiSlice' +import { selectParameter } from '../../../features/api/intersectionConfigParamApiSlice' const ConfigParamEdit = () => { const intersectionId = useAppSelector(selectSelectedIntersectionId) - const [triggerIntersection, { data: intersectionParameters, isFetching: isFetchingIntersection }] = - useLazyGetIntersectionParametersQuery() - const [triggerGeneral, { data: generalParameters, isFetching: isFetchingGeneral }] = - useLazyGetGeneralParametersQuery() - const { key } = useParams<{ key: string }>() - useEffect(() => { - if (intersectionId) { - triggerIntersection(intersectionId) - } - }, [intersectionId, triggerIntersection]) - - useEffect(() => { - triggerGeneral(undefined) - }, [triggerGeneral]) - - const parameter = filterParameter(key, intersectionParameters, generalParameters) + const parameter = useAppSelector(selectParameter(key, intersectionId)) if (!parameter) { return ( @@ -51,21 +32,9 @@ const ConfigParamEdit = () => { overflow: 'hidden', }} > - {isFetchingIntersection || isFetchingGeneral ? ( -
- - - - Loading {key} - -
- ) : ( -
- - Unable to find parameter {key} - -
- )} +
+ Unable to find parameter {key} +
@@ -82,7 +51,7 @@ const ConfigParamEdit = () => { py: 8, }} > - + { overflow: 'hidden', }} > -
- - {parameter.key} - -
+ + {parameter.key} +
diff --git a/webapp/src/components/intersections/configuration/remove.tsx b/webapp/src/components/intersections/configuration/remove.tsx index 173e9bad5..6eb9603c5 100644 --- a/webapp/src/components/intersections/configuration/remove.tsx +++ b/webapp/src/components/intersections/configuration/remove.tsx @@ -1,41 +1,19 @@ -import React, { useEffect } from 'react' -import { Box, CircularProgress, Container, Typography, useTheme } from '@mui/material' +import React from 'react' +import { Box, Container, Typography } from '@mui/material' import { ConfigParamRemoveForm } from '../../../features/intersections/configuration/configuration-remove-form' import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useParams } from 'react-router-dom' import { useAppSelector } from '../../../hooks' -import { - filterParameter, - useLazyGetGeneralParametersQuery, - useLazyGetIntersectionParametersQuery, -} from '../../../features/api/intersectionConfigParamApiSlice' +import { selectParameter } from '../../../features/api/intersectionConfigParamApiSlice' const ConfigParamRemove = () => { - const theme = useTheme() // Access the current theme const intersectionId = useAppSelector(selectSelectedIntersectionId) - const [triggerIntersection, { data: intersectionParameters, isFetching: isFetchingIntersection }] = - useLazyGetIntersectionParametersQuery() - const [triggerGeneral, { data: generalParameters, isFetching: isFetchingGeneral }] = - useLazyGetGeneralParametersQuery() - const { key } = useParams<{ key: string }>() - useEffect(() => { - if (intersectionId) { - triggerIntersection(intersectionId) - } - }, [intersectionId, triggerIntersection]) - - useEffect(() => { - triggerGeneral(undefined) - }, [triggerGeneral]) - - console.log(theme) - - const parameter = filterParameter(key, intersectionParameters, generalParameters) + const parameter = useAppSelector(selectParameter(key, intersectionId)) - if (!parameter) { + if (!parameter || intersectionId === -1) { return ( <> { py: 8, }} > - + { overflow: 'hidden', }} > - {isFetchingIntersection || isFetchingGeneral ? ( -
- - - - Loading {key} - -
- ) : ( -
- - Unable to find parameter {key} - -
- )} +
+ + Unable to find parameter {key}. Do you have the right intersection ID selected? + +
diff --git a/webapp/src/features/api/intersectionConfigParamApiSlice.ts b/webapp/src/features/api/intersectionConfigParamApiSlice.ts index f265936e9..9dec460ab 100644 --- a/webapp/src/features/api/intersectionConfigParamApiSlice.ts +++ b/webapp/src/features/api/intersectionConfigParamApiSlice.ts @@ -1,8 +1,10 @@ // Need to use the React-specific entry point to import createApi import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' +import { createSelector } from '@reduxjs/toolkit' import EnvironmentVars from '../../EnvironmentVars' import { RootState } from '../../store' import { selectOrganizationName, selectToken } from '../../generalSlices/userSlice' +import { selectSelectedIntersectionId } from '../../generalSlices/intersectionSlice' const getQueryString = (query_params: Record) => { // filter out undefined values from query params @@ -80,15 +82,6 @@ export const intersectionConfigParamApiSlice = createApi({ }), }) -export const filterParameter = ( - key: string, - intersectionParameters: IntersectionConfig[], - generalParameters: Config[] -): Config | undefined => - intersectionParameters?.find( - (p) => p.key === key && p.intersectionID !== null && p.intersectionID !== 0 && p.intersectionID !== -1 - ) ?? generalParameters?.find((p) => p.key === key) - // Export hooks for usage in functional components, which are // auto-generated based on the defined endpoints export const { @@ -101,3 +94,28 @@ export const { useLazyGetGeneralParametersQuery, useLazyGetIntersectionParametersQuery, } = intersectionConfigParamApiSlice + +export const filterParameter = ( + key: string, + intersectionParameters: IntersectionConfig[], + generalParameters: Config[], + intersectionId: number +): Config | undefined => + intersectionParameters?.find((p) => p.key === key) ?? generalParameters?.find((p) => p.key === key) + +const intersectionParameters = (intersectionId: number) => + intersectionConfigParamApiSlice.endpoints.getIntersectionParameters.select(intersectionId) +const generalParameters = intersectionConfigParamApiSlice.endpoints.getGeneralParameters.select(undefined) + +export const selectIntersectionParametersById = (intersectionId: number) => + createSelector(intersectionParameters(intersectionId), (result) => result.data ?? []) + +export const selectGeneralParameters = createSelector(generalParameters, (result) => result.data ?? []) + +export const selectParameter = (key: string, intersectionId: number) => + createSelector( + selectIntersectionParametersById(intersectionId), + selectGeneralParameters, + (intersectionParameters, generalParameters) => + filterParameter(key, intersectionParameters, generalParameters, intersectionId) + ) diff --git a/webapp/src/features/intersections/configuration/configuration-edit-form.tsx b/webapp/src/features/intersections/configuration/configuration-edit-form.tsx index e196faaf1..ffb8474eb 100644 --- a/webapp/src/features/intersections/configuration/configuration-edit-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-edit-form.tsx @@ -3,7 +3,19 @@ import PropTypes from 'prop-types' import toast from 'react-hot-toast' import * as Yup from 'yup' import { useFormik } from 'formik' -import { Button, Card, CardActions, CardContent, CardHeader, Divider, Grid, TextField } from '@mui/material' +import { + Box, + Button, + Card, + CardActions, + CardContent, + CardHeader, + Chip, + Divider, + Grid, + TextField, + Typography, +} from '@mui/material' import { useNavigate } from 'react-router-dom' import { useUpdateDefaultParameterMutation, @@ -104,7 +116,16 @@ export const ConfigParamEditForm = (props) => { return (
- + + Edit Configuration Parameter + {'intersectionID' in parameter && ( + Overriden} size="small" /> + )} + + } + /> diff --git a/webapp/src/features/intersections/configuration/configuration-list-table.tsx b/webapp/src/features/intersections/configuration/configuration-list-table.tsx index 3620807dc..cef5df0e4 100644 --- a/webapp/src/features/intersections/configuration/configuration-list-table.tsx +++ b/webapp/src/features/intersections/configuration/configuration-list-table.tsx @@ -22,6 +22,7 @@ import { useNavigate } from 'react-router-dom' export const ConfigParamListTable = (props) => { const { intersectionId, parameters, parametersCount, onPageChange, onRowsPerPageChange, page, rowsPerPage } = props const navigate = useNavigate() + console.log(parameters) const readOnlyRow = (param) => { return ( @@ -89,7 +90,7 @@ export const ConfigParamListTable = (props) => { fontWeight: '600', }} > - Overrriden + Overriden } size="small" From 4a8242b17204710782052a6e76c0149fa3d3af31 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Wed, 16 Oct 2024 09:37:44 -0600 Subject: [PATCH 08/27] fully working configuration page --- .../intersections/ConfigurationPage.tsx | 2 +- .../intersections/configuration/create.tsx | 14 ++-- .../intersections/configuration/edit.tsx | 11 ++-- .../intersections/configuration/remove.tsx | 9 ++- .../api/intersectionConfigParamApiSlice.ts | 2 +- .../configuration-create-form.tsx | 45 ++----------- .../configuration/configuration-edit-form.tsx | 42 ++++-------- .../configuration-list-table.tsx | 2 +- .../configuration-remove-form.tsx | 64 ++----------------- 9 files changed, 46 insertions(+), 145 deletions(-) diff --git a/webapp/src/components/intersections/ConfigurationPage.tsx b/webapp/src/components/intersections/ConfigurationPage.tsx index f27963bad..f45831e57 100644 --- a/webapp/src/components/intersections/ConfigurationPage.tsx +++ b/webapp/src/components/intersections/ConfigurationPage.tsx @@ -276,7 +276,7 @@ const Page = () => { path="*" element={ { const intersectionId = useAppSelector(selectSelectedIntersectionId) @@ -15,6 +12,7 @@ const ConfigParamCreate = () => { const { key } = useParams<{ key: string }>() const parameter = useAppSelector(selectParameter(key, intersectionId)) + const formattedKey = parameter?.key.replace(/\./g, '.\u200B') // Replace periods with period and zero-width space, to help with line breaks if (!parameter || intersectionId === -1) { return ( @@ -37,7 +35,9 @@ const ConfigParamCreate = () => { >
- Unable to find parameter {key}. + Unable to find parameter: +
+ {formattedKey}
Do you have the right intersection ID selected?
@@ -67,9 +67,7 @@ const ConfigParamCreate = () => { }} >
- - {parameter.key} - + {formattedKey}
diff --git a/webapp/src/components/intersections/configuration/edit.tsx b/webapp/src/components/intersections/configuration/edit.tsx index b0954c8b6..612688254 100644 --- a/webapp/src/components/intersections/configuration/edit.tsx +++ b/webapp/src/components/intersections/configuration/edit.tsx @@ -12,6 +12,7 @@ const ConfigParamEdit = () => { const { key } = useParams<{ key: string }>() const parameter = useAppSelector(selectParameter(key, intersectionId)) + const formattedKey = parameter?.key.replace(/\./g, '.\u200B') // Replace periods with period and zero-width space, to help with line breaks if (!parameter) { return ( @@ -33,7 +34,11 @@ const ConfigParamEdit = () => { }} >
- Unable to find parameter {key} + + Unable to find parameter: +
+ {formattedKey} +
@@ -59,9 +64,7 @@ const ConfigParamEdit = () => { overflow: 'hidden', }} > - - {parameter.key} - + {formattedKey} diff --git a/webapp/src/components/intersections/configuration/remove.tsx b/webapp/src/components/intersections/configuration/remove.tsx index 6eb9603c5..8da89d7e7 100644 --- a/webapp/src/components/intersections/configuration/remove.tsx +++ b/webapp/src/components/intersections/configuration/remove.tsx @@ -12,6 +12,7 @@ const ConfigParamRemove = () => { const { key } = useParams<{ key: string }>() const parameter = useAppSelector(selectParameter(key, intersectionId)) + const formattedKey = parameter?.key.replace(/\./g, '.\u200B') // Replace periods with period and zero-width space, to help with line breaks if (!parameter || intersectionId === -1) { return ( @@ -34,7 +35,11 @@ const ConfigParamRemove = () => { >
- Unable to find parameter {key}. Do you have the right intersection ID selected? + Unable to find parameter: +
+ {formattedKey} +
+ Do you have the right intersection ID selected?
@@ -62,7 +67,7 @@ const ConfigParamRemove = () => { }} >
- {parameter.key} + {formattedKey}
diff --git a/webapp/src/features/api/intersectionConfigParamApiSlice.ts b/webapp/src/features/api/intersectionConfigParamApiSlice.ts index 9dec460ab..16356bb72 100644 --- a/webapp/src/features/api/intersectionConfigParamApiSlice.ts +++ b/webapp/src/features/api/intersectionConfigParamApiSlice.ts @@ -47,7 +47,7 @@ export const intersectionConfigParamApiSlice = createApi({ road_regulator_id: '-1', })}` }, - providesTags: ['intersectionConfigs'], + providesTags: (result, error, intersectionId) => [{ type: 'intersectionConfigs', id: intersectionId }], }), updateDefaultParameter: builder.mutation({ query: (body) => ({ diff --git a/webapp/src/features/intersections/configuration/configuration-create-form.tsx b/webapp/src/features/intersections/configuration/configuration-create-form.tsx index 42d4d65e8..25c100b0b 100644 --- a/webapp/src/features/intersections/configuration/configuration-create-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-create-form.tsx @@ -20,10 +20,7 @@ export const ConfigParamCreateForm = (props) => { const formik = useFormik({ initialValues: { - name: parameter.key, - unit: parameter.units, value: parameter.value, - description: parameter.description, submit: null, }, validationSchema: Yup.object({ @@ -65,36 +62,19 @@ export const ConfigParamCreateForm = (props) => { - + - + + + + { /> - + diff --git a/webapp/src/features/intersections/configuration/configuration-edit-form.tsx b/webapp/src/features/intersections/configuration/configuration-edit-form.tsx index ffb8474eb..28c0d6b95 100644 --- a/webapp/src/features/intersections/configuration/configuration-edit-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-edit-form.tsx @@ -29,16 +29,14 @@ export const ConfigParamEditForm = (props) => { const [updateIntersectionParameter, {}] = useUpdateIntersectionParameterMutation() const [updateDefaultParameter, {}] = useUpdateDefaultParameterMutation() + console.log('ConfigParamEditForm', parameter) + const formik = useFormik({ initialValues: { - name: parameter.key, - unit: parameter.units, value: parameter.value, - description: parameter.description, submit: null, }, validationSchema: Yup.object({ - name: Yup.string(), value: Yup.string().required('New value is required'), }), onSubmit: async (values, helpers) => { @@ -102,7 +100,7 @@ export const ConfigParamEditForm = (props) => { } helpers.setStatus({ success: true }) helpers.setSubmitting(false) - navigate('../') + navigate('/dashboard/intersectionDashboard/configuration') } catch (err) { console.error(err) toast.error('Something went wrong!') @@ -121,7 +119,7 @@ export const ConfigParamEditForm = (props) => { Edit Configuration Parameter {'intersectionID' in parameter && ( - Overriden} size="small" /> + Overridden} size="small" /> )} } @@ -130,34 +128,19 @@ export const ConfigParamEditForm = (props) => { - + - + + + + { diff --git a/webapp/src/features/intersections/configuration/configuration-list-table.tsx b/webapp/src/features/intersections/configuration/configuration-list-table.tsx index cef5df0e4..641d66ea9 100644 --- a/webapp/src/features/intersections/configuration/configuration-list-table.tsx +++ b/webapp/src/features/intersections/configuration/configuration-list-table.tsx @@ -90,7 +90,7 @@ export const ConfigParamListTable = (props) => { fontWeight: '600', }} > - Overriden + Overridden } size="small" diff --git a/webapp/src/features/intersections/configuration/configuration-remove-form.tsx b/webapp/src/features/intersections/configuration/configuration-remove-form.tsx index 81cd3e1d6..24d58b53c 100644 --- a/webapp/src/features/intersections/configuration/configuration-remove-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-remove-form.tsx @@ -18,19 +18,11 @@ export const ConfigParamRemoveForm = (props) => { const formik = useFormik({ initialValues: { - name: parameter.key, - unit: parameter.unit, value: parameter.value, - defaultValue: defaultParameter.value, - description: parameter.description, submit: null, }, validationSchema: Yup.object({}), onSubmit: async (values, helpers) => { - if (intersectionId == -1) { - console.error('Did not attempt to remove configuration parameter. Intersection ID:', intersectionId) - return - } try { await removeOverriddenParameter(parameter) helpers.setStatus({ success: true }) @@ -54,65 +46,19 @@ export const ConfigParamRemoveForm = (props) => { - + - + - + - + - + From f05b9a768993b59df14e47451b71526d69b42e98 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Wed, 16 Oct 2024 10:05:32 -0600 Subject: [PATCH 09/27] Re-naming intersection api slice --- .../intersections/ConfigurationPage.tsx | 2 +- .../intersections/configuration/create.tsx | 6 ++-- .../intersections/configuration/edit.tsx | 7 ++--- .../intersections/configuration/remove.tsx | 6 ++-- ...ramApiSlice.ts => intersectionApiSlice.ts} | 29 +++++++++---------- .../configuration-create-form.tsx | 16 +++++----- .../configuration/configuration-edit-form.tsx | 11 +++++-- .../configuration-remove-form.tsx | 6 ++-- webapp/src/store.tsx | 6 ++-- 9 files changed, 45 insertions(+), 44 deletions(-) rename webapp/src/features/api/{intersectionConfigParamApiSlice.ts => intersectionApiSlice.ts} (80%) diff --git a/webapp/src/components/intersections/ConfigurationPage.tsx b/webapp/src/components/intersections/ConfigurationPage.tsx index f45831e57..27b4e6d43 100644 --- a/webapp/src/components/intersections/ConfigurationPage.tsx +++ b/webapp/src/components/intersections/ConfigurationPage.tsx @@ -19,7 +19,7 @@ import RefreshIcon from '@mui/icons-material/Refresh' import SearchIcon from '@mui/icons-material/Search' import { selectSelectedIntersectionId } from '../../generalSlices/intersectionSlice' import { useAppSelector } from '../../hooks' -import { useGetIntersectionParametersQuery } from '../../features/api/intersectionConfigParamApiSlice' +import { useGetIntersectionParametersQuery } from '../../features/api/intersectionApiSlice' import { Route, Routes } from 'react-router-dom' import ConfigParamEdit from './configuration/edit' import ConfigParamCreate from './configuration/create' diff --git a/webapp/src/components/intersections/configuration/create.tsx b/webapp/src/components/intersections/configuration/create.tsx index b42e6510f..a2b693580 100644 --- a/webapp/src/components/intersections/configuration/create.tsx +++ b/webapp/src/components/intersections/configuration/create.tsx @@ -4,14 +4,14 @@ import { ConfigParamCreateForm } from '../../../features/intersections/configura import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useParams } from 'react-router-dom' import { useAppSelector } from '../../../hooks' -import { selectParameter } from '../../../features/api/intersectionConfigParamApiSlice' +import { selectParameter } from '../../../features/api/intersectionApiSlice' const ConfigParamCreate = () => { const intersectionId = useAppSelector(selectSelectedIntersectionId) const { key } = useParams<{ key: string }>() - const parameter = useAppSelector(selectParameter(key, intersectionId)) + const parameter = useAppSelector(selectParameter(key)) const formattedKey = parameter?.key.replace(/\./g, '.\u200B') // Replace periods with period and zero-width space, to help with line breaks if (!parameter || intersectionId === -1) { @@ -67,7 +67,7 @@ const ConfigParamCreate = () => { }} >
- {formattedKey} + {formattedKey}
diff --git a/webapp/src/components/intersections/configuration/edit.tsx b/webapp/src/components/intersections/configuration/edit.tsx index 612688254..e91061596 100644 --- a/webapp/src/components/intersections/configuration/edit.tsx +++ b/webapp/src/components/intersections/configuration/edit.tsx @@ -1,17 +1,14 @@ import React from 'react' import { Box, Container, Typography } from '@mui/material' import { ConfigParamEditForm } from '../../../features/intersections/configuration/configuration-edit-form' -import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useParams } from 'react-router-dom' import { useAppSelector } from '../../../hooks' -import { selectParameter } from '../../../features/api/intersectionConfigParamApiSlice' +import { selectParameter } from '../../../features/api/intersectionApiSlice' const ConfigParamEdit = () => { - const intersectionId = useAppSelector(selectSelectedIntersectionId) - const { key } = useParams<{ key: string }>() - const parameter = useAppSelector(selectParameter(key, intersectionId)) + const parameter = useAppSelector(selectParameter(key)) const formattedKey = parameter?.key.replace(/\./g, '.\u200B') // Replace periods with period and zero-width space, to help with line breaks if (!parameter) { diff --git a/webapp/src/components/intersections/configuration/remove.tsx b/webapp/src/components/intersections/configuration/remove.tsx index 8da89d7e7..bcff6fc41 100644 --- a/webapp/src/components/intersections/configuration/remove.tsx +++ b/webapp/src/components/intersections/configuration/remove.tsx @@ -1,17 +1,17 @@ import React from 'react' import { Box, Container, Typography } from '@mui/material' import { ConfigParamRemoveForm } from '../../../features/intersections/configuration/configuration-remove-form' -import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useParams } from 'react-router-dom' import { useAppSelector } from '../../../hooks' -import { selectParameter } from '../../../features/api/intersectionConfigParamApiSlice' +import { selectParameter } from '../../../features/api/intersectionApiSlice' +import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' const ConfigParamRemove = () => { const intersectionId = useAppSelector(selectSelectedIntersectionId) const { key } = useParams<{ key: string }>() - const parameter = useAppSelector(selectParameter(key, intersectionId)) + const parameter = useAppSelector(selectParameter(key)) const formattedKey = parameter?.key.replace(/\./g, '.\u200B') // Replace periods with period and zero-width space, to help with line breaks if (!parameter || intersectionId === -1) { diff --git a/webapp/src/features/api/intersectionConfigParamApiSlice.ts b/webapp/src/features/api/intersectionApiSlice.ts similarity index 80% rename from webapp/src/features/api/intersectionConfigParamApiSlice.ts rename to webapp/src/features/api/intersectionApiSlice.ts index 16356bb72..79ac3b419 100644 --- a/webapp/src/features/api/intersectionConfigParamApiSlice.ts +++ b/webapp/src/features/api/intersectionApiSlice.ts @@ -3,7 +3,7 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react' import { createSelector } from '@reduxjs/toolkit' import EnvironmentVars from '../../EnvironmentVars' import { RootState } from '../../store' -import { selectOrganizationName, selectToken } from '../../generalSlices/userSlice' +import { selectToken } from '../../generalSlices/userSlice' import { selectSelectedIntersectionId } from '../../generalSlices/intersectionSlice' const getQueryString = (query_params: Record) => { @@ -15,8 +15,8 @@ const getQueryString = (query_params: Record) => { } // Define a service using a base URL and expected endpoints -export const intersectionConfigParamApiSlice = createApi({ - reducerPath: 'intersectionConfigParamApi', +export const intersectionApiSlice = createApi({ + reducerPath: 'intersectionApi', baseQuery: fetchBaseQuery({ baseUrl: EnvironmentVars.CVIZ_API_SERVER_URL, prepareHeaders: (headers, { getState, endpoint }) => { @@ -93,29 +93,28 @@ export const { useLazyGetGeneralParametersQuery, useLazyGetIntersectionParametersQuery, -} = intersectionConfigParamApiSlice +} = intersectionApiSlice -export const filterParameter = ( +const filterParameter = ( key: string, intersectionParameters: IntersectionConfig[], - generalParameters: Config[], - intersectionId: number + generalParameters: Config[] ): Config | undefined => intersectionParameters?.find((p) => p.key === key) ?? generalParameters?.find((p) => p.key === key) const intersectionParameters = (intersectionId: number) => - intersectionConfigParamApiSlice.endpoints.getIntersectionParameters.select(intersectionId) -const generalParameters = intersectionConfigParamApiSlice.endpoints.getGeneralParameters.select(undefined) + intersectionApiSlice.endpoints.getIntersectionParameters.select(intersectionId) +const generalParameters = intersectionApiSlice.endpoints.getGeneralParameters.select(undefined) -export const selectIntersectionParametersById = (intersectionId: number) => +const selectIntersectionParametersById = (intersectionId: number) => createSelector(intersectionParameters(intersectionId), (result) => result.data ?? []) -export const selectGeneralParameters = createSelector(generalParameters, (result) => result.data ?? []) +const selectGeneralParameters = createSelector(generalParameters, (result) => result.data ?? []) -export const selectParameter = (key: string, intersectionId: number) => +export const selectParameter = (key: string) => createSelector( - selectIntersectionParametersById(intersectionId), + (state: RootState) => selectSelectedIntersectionId(state), + (state: RootState) => selectIntersectionParametersById(selectSelectedIntersectionId(state))(state), selectGeneralParameters, - (intersectionParameters, generalParameters) => - filterParameter(key, intersectionParameters, generalParameters, intersectionId) + (_, intersectionParameters, generalParameters) => filterParameter(key, intersectionParameters, generalParameters) ) diff --git a/webapp/src/features/intersections/configuration/configuration-create-form.tsx b/webapp/src/features/intersections/configuration/configuration-create-form.tsx index 25c100b0b..83cd003a5 100644 --- a/webapp/src/features/intersections/configuration/configuration-create-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-create-form.tsx @@ -8,7 +8,7 @@ import { useNavigate } from 'react-router-dom' import { selectToken } from '../../../generalSlices/userSlice' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' import { useAppSelector } from '../../../hooks' -import { useUpdateIntersectionParameterMutation } from '../../api/intersectionConfigParamApiSlice' +import { useUpdateIntersectionParameterMutation } from '../../api/intersectionApiSlice' export const ConfigParamCreateForm = (props) => { const navigate = useNavigate() @@ -24,14 +24,13 @@ export const ConfigParamCreateForm = (props) => { submit: null, }, validationSchema: Yup.object({ - name: Yup.string(), - value: Yup.string().required('New value is required'), + value: Yup.string() + .required('New value is required') + .test('not-same-as-parameter', 'New value must be different from the default value', function (value) { + return value?.toString() !== parameter.value?.toString() + }), }), onSubmit: async (values, helpers) => { - if (intersectionId == -1) { - console.error('Did not attempt to create configuration param. Intersection ID:', intersectionId) - return - } try { const updatedConfig: IntersectionConfig = { ...parameter, @@ -74,6 +73,7 @@ export const ConfigParamCreateForm = (props) => { { Overrride diff --git a/webapp/src/features/intersections/configuration/configuration-remove-form.tsx b/webapp/src/features/intersections/configuration/configuration-remove-form.tsx index 24d58b53c..dd4c22c68 100644 --- a/webapp/src/features/intersections/configuration/configuration-remove-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-remove-form.tsx @@ -7,7 +7,7 @@ import { Button, Card, CardActions, CardContent, CardHeader, Divider, Grid, Text import { useNavigate } from 'react-router-dom' import { selectSelectedIntersectionId } from '../../../generalSlices/intersectionSlice' import { useAppSelector } from '../../../hooks' -import { useRemoveOverriddenParameterMutation } from '../../api/intersectionConfigParamApiSlice' +import { useRemoveOverriddenParameterMutation } from '../../api/intersectionApiSlice' export const ConfigParamRemoveForm = (props) => { const { parameter, defaultParameter, ...other } = props @@ -27,7 +27,7 @@ export const ConfigParamRemoveForm = (props) => { await removeOverriddenParameter(parameter) helpers.setStatus({ success: true }) helpers.setSubmitting(false) - navigate(`../`) + navigate(`/dashboard/intersectionDashboard/configuration`) } catch (err) { console.error(err) toast.error('Something went wrong!') @@ -79,7 +79,7 @@ export const ConfigParamRemoveForm = (props) => { mr: 'auto', }} variant="outlined" - onClick={() => navigate(`../`)} + onClick={() => navigate(`/dashboard/intersectionDashboard/configuration`)} > Cancel diff --git a/webapp/src/store.tsx b/webapp/src/store.tsx index 2b8098e91..d0e42456f 100644 --- a/webapp/src/store.tsx +++ b/webapp/src/store.tsx @@ -26,7 +26,7 @@ import menuReducer from './features/menu/menuSlice' import intersectionMapReducer from './features/intersections/map/map-slice' import intersectionMapLayerStyleReducer from './features/intersections/map/map-layer-style-slice' import dataSelectorReducer from './features/intersections/data-selector/dataSelectorSlice' -import { intersectionConfigParamApiSlice } from './features/api/intersectionConfigParamApiSlice' +import { intersectionApiSlice } from './features/api/intersectionApiSlice' export const setupStore = (preloadedState: any) => { return configureStore({ @@ -58,7 +58,7 @@ export const setupStore = (preloadedState: any) => { intersectionMap: intersectionMapReducer, intersectionMapLayerStyle: intersectionMapLayerStyleReducer, dataSelector: dataSelectorReducer, - [intersectionConfigParamApiSlice.reducerPath]: intersectionConfigParamApiSlice.reducer, + [intersectionApiSlice.reducerPath]: intersectionApiSlice.reducer, }, preloadedState, middleware: (getDefaultMiddleware) => @@ -66,7 +66,7 @@ export const setupStore = (preloadedState: any) => { thunk: true, serializableCheck: false, immutableCheck: false, - }).concat(intersectionConfigParamApiSlice.middleware), + }).concat(intersectionApiSlice.middleware), devTools: true, }) } From bb35d899bef78d57680e723c1b4003b407129063 Mon Sep 17 00:00:00 2001 From: jacob6838 Date: Wed, 16 Oct 2024 10:25:21 -0600 Subject: [PATCH 10/27] Updating Grid to Grid2 --- webapp/src/Dashboard.tsx | 6 +- webapp/src/apis/example_responses/log.txt | 4397 ----------------- webapp/src/components/Header.tsx | 22 +- .../intersections/ConfigurationPage.tsx | 10 +- .../intersections/DashboardPage.tsx | 10 +- .../components/intersections/DecoderPage.tsx | 18 +- .../AdminOrganizationTab.tsx | 18 +- .../connection-of-travel-assessment.tsx | 14 +- .../lane-direction-of-travel-assessment.tsx | 14 +- .../signal-state-event-assessment.tsx | 14 +- .../assessments/stop-line-stop-assessment.tsx | 14 +- .../configuration-create-form.tsx | 26 +- .../configuration/configuration-edit-form.tsx | 26 +- .../configuration-remove-form.tsx | 26 +- .../data-selector/assessment-data-table.tsx | 10 +- .../data-selector/data-selector-edit-form.tsx | 38 +- .../data-selector/data-visualizer.tsx | 10 +- .../data-selector/event-data-table.tsx | 10 +- .../notifications/notifications-table.tsx | 18 +- .../reports/report-request-edit-form.tsx | 18 +- webapp/src/pages/Map.tsx | 6 +- webapp/yarn.lock | 30 +- 22 files changed, 172 insertions(+), 4583 deletions(-) delete mode 100644 webapp/src/apis/example_responses/log.txt diff --git a/webapp/src/Dashboard.tsx b/webapp/src/Dashboard.tsx index b696e56d8..10e653f2d 100644 --- a/webapp/src/Dashboard.tsx +++ b/webapp/src/Dashboard.tsx @@ -5,7 +5,7 @@ import Header from './components/Header' import Menu from './features/menu/Menu' import Help from './components/Help' import Admin from './pages/Admin' -import Grid from '@mui/material/Grid' +import Grid2 from '@mui/material/Grid2' import Tabs, { TabItem } from './components/Tabs' import Map from './pages/Map' import './App.css' @@ -71,7 +71,7 @@ const Dashboard = () => { }} >
- +
{authLoginData && keycloak?.authenticated ? ( <> @@ -109,7 +109,7 @@ const Dashboard = () => { ) : (
)} - +
diff --git a/webapp/src/apis/example_responses/log.txt b/webapp/src/apis/example_responses/log.txt deleted file mode 100644 index d33d3a3f2..000000000 --- a/webapp/src/apis/example_responses/log.txt +++ /dev/null @@ -1,4397 +0,0 @@ -context.js:5 [DEPRECATED] zustand/context will be removed in the future version. Please use `import { createStore, useStore } from "zustand"` for context usage. See: https://github.com/pmndrs/zustand/discussions/1180 -createContext @ context.js:5 -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-online-status WITH QUERY PARAMS [object Object] AND RESPONSE {"172.16.28.204":{"current_status":"online"},"172.16.28.219":{"current_status":"online"},"172.16.28.209":{"current_status":"online"},"172.16.28.214":{"current_status":"online"},"172.16.28.220":{"current_status":"online"},"172.16.28.185":{"current_status":"online"},"172.16.28.202":{"current_status":"online"},"172.16.28.163":{"current_status":"offline"},"172.16.28.154":{"current_status":"online"},"172.16.28.197":{"current_status":"online"},"172.16.28.235":{"current_status":"online"},"172.16.28.184":{"current_status":"online"},"172.16.28.156":{"current_status":"online"},"172.16.28.135":{"current_status":"online"},"172.16.28.165":{"current_status":"online"},"172.16.28.213":{"current_status":"online"},"172.16.28.153":{"current_status":"online"},"172.16.28.134":{"current_status":"online"},"172.16.28.191":{"current_status":"online"},"172.16.28.186":{"current_status":"online"},"172.16.28.226":{"current_status":"online"},"172.16.28.201":{"current_status":"online"},"172.16.28.225":{"current_status":"online"},"10.11.81.12":{"current_status":"online"},"10.11.81.13":{"current_status":"online"},"10.11.81.14":{"current_status":"online"},"10.11.81.18":{"current_status":"online"},"10.11.81.19":{"current_status":"online"},"10.11.81.20":{"current_status":"online"},"10.11.81.21":{"current_status":"online"},"10.11.81.27":{"current_status":"online"},"172.16.28.162":{"current_status":"online"},"172.16.28.136":{"current_status":"online"},"172.16.28.171":{"current_status":"online"},"172.16.28.144":{"current_status":"offline"},"172.16.28.159":{"current_status":"online"},"172.16.28.175":{"current_status":"offline"},"172.16.28.182":{"current_status":"online"},"172.16.28.168":{"current_status":"offline"},"172.16.28.237":{"current_status":"online"},"172.16.28.166":{"current_status":"online"},"172.16.28.195":{"current_status":"online"},"172.16.28.212":{"current_status":"online"},"172.16.28.181":{"current_status":"offline"},"172.16.28.241":{"current_status":"online"},"172.16.28.187":{"current_status":"offline"},"172.16.28.218":{"current_status":"online"},"172.16.28.232":{"current_status":"online"},"172.16.28.143":{"current_status":"online"},"10.11.81.22":{"current_status":"online"},"10.11.81.23":{"current_status":"online"},"10.11.81.24":{"current_status":"online"},"10.11.81.25":{"current_status":"online"},"10.11.81.26":{"current_status":"online"},"10.11.81.28":{"current_status":"online"},"172.16.28.222":{"current_status":"online"},"172.16.28.146":{"current_status":"online"},"172.16.28.132":{"current_status":"online"},"172.16.28.142":{"current_status":"online"},"172.16.28.151":{"current_status":"online"},"172.16.28.167":{"current_status":"online"},"172.16.28.150":{"current_status":"online"},"172.16.28.133":{"current_status":"online"},"172.16.28.174":{"current_status":"online"},"172.16.28.200":{"current_status":"offline"},"172.16.28.236":{"current_status":"online"},"172.16.28.240":{"current_status":"online"},"172.16.28.238":{"current_status":"online"},"172.16.28.228":{"current_status":"online"},"172.16.28.234":{"current_status":"online"},"172.16.28.141":{"current_status":"online"},"172.16.28.217":{"current_status":"online"},"172.16.28.242":{"current_status":"offline"},"172.16.28.177":{"current_status":"online"},"172.16.28.215":{"current_status":"offline"},"172.16.28.224":{"current_status":"offline"},"172.16.28.211":{"current_status":"online"},"172.16.28.190":{"current_status":"offline"},"172.16.28.203":{"current_status":"online"},"172.16.28.173":{"current_status":"offline"},"172.16.28.155":{"current_status":"online"},"172.16.28.152":{"current_status":"offline"},"172.16.28.149":{"current_status":"offline"},"172.16.28.131":{"current_status":"online"},"172.16.28.176":{"current_status":"online"},"172.16.28.137":{"current_status":"online"},"172.16.28.207":{"current_status":"online"},"172.16.28.193":{"current_status":"online"},"172.16.28.148":{"current_status":"online"},"172.16.28.164":{"current_status":"online"},"172.16.28.157":{"current_status":"online"},"172.16.28.169":{"current_status":"online"},"172.16.28.210":{"current_status":"online"},"172.16.28.199":{"current_status":"online"},"172.16.28.188":{"current_status":"online"},"172.16.28.216":{"current_status":"online"},"172.16.28.179":{"current_status":"online"},"172.16.28.208":{"current_status":"online"},"172.16.28.172":{"current_status":"online"},"172.16.28.221":{"current_status":"offline"},"172.16.28.161":{"current_status":"online"},"172.16.28.160":{"current_status":"online"},"172.16.28.229":{"current_status":"online"},"172.16.28.138":{"current_status":"online"},"172.16.28.178":{"current_status":"offline"},"172.16.28.183":{"current_status":"online"},"172.16.28.198":{"current_status":"online"},"172.16.28.147":{"current_status":"online"},"172.16.28.227":{"current_status":"online"},"172.16.28.170":{"current_status":"online"},"172.16.28.192":{"current_status":"online"},"172.16.28.69":{"current_status":"online"},"172.16.28.56":{"current_status":"online"},"172.16.28.57":{"current_status":"online"},"172.16.28.59":{"current_status":"online"},"172.16.28.68":{"current_status":"online"},"172.16.28.72":{"current_status":"online"},"172.16.28.74":{"current_status":"online"},"172.16.28.49":{"current_status":"online"},"172.16.28.42":{"current_status":"online"},"172.16.28.41":{"current_status":"online"},"172.16.28.44":{"current_status":"offline"},"172.16.28.45":{"current_status":"online"},"172.16.28.46":{"current_status":"online"},"172.16.28.48":{"current_status":"online"},"172.16.28.40":{"current_status":"online"},"172.16.28.32":{"current_status":"online"},"172.16.28.33":{"current_status":"online"},"172.16.28.26":{"current_status":"online"},"172.16.28.34":{"current_status":"offline"},"172.16.28.35":{"current_status":"online"},"172.16.28.36":{"current_status":"online"},"172.16.28.29":{"current_status":"online"},"172.16.28.30":{"current_status":"offline"},"172.16.28.25":{"current_status":"online"},"172.16.28.23":{"current_status":"online"},"172.16.28.243":{"current_status":"online"},"172.16.28.112":{"current_status":"online"},"172.16.28.113":{"current_status":"online"},"172.16.28.12":{"current_status":"online"},"172.16.28.80":{"current_status":"online"},"172.16.28.82":{"current_status":"online"},"172.16.28.4":{"current_status":"online"},"172.16.28.100":{"current_status":"online"},"172.16.28.101":{"current_status":"online"},"172.16.28.253":{"current_status":"online"},"10.11.81.29":{"current_status":"online"},"10.11.81.30":{"current_status":"online"},"10.11.81.31":{"current_status":"online"},"10.11.81.32":{"current_status":"online"},"10.11.81.33":{"current_status":"online"},"10.11.81.34":{"current_status":"online"},"10.11.81.35":{"current_status":"online"},"10.11.81.36":{"current_status":"online"},"10.11.81.37":{"current_status":"online"},"10.11.81.38":{"current_status":"online"},"10.11.81.39":{"current_status":"online"},"10.11.81.40":{"current_status":"online"},"172.16.28.98":{"current_status":"online"},"172.16.28.104":{"current_status":"online"},"172.16.28.252":{"current_status":"online"},"172.16.28.54":{"current_status":"online"},"172.16.28.47":{"current_status":"offline"},"172.16.28.21":{"current_status":"online"},"172.16.28.27":{"current_status":"online"},"10.16.28.97":{"current_status":"online"},"10.16.28.84":{"current_status":"online"},"10.16.28.9":{"current_status":"online"},"172.16.28.120":{"current_status":"online"},"10.16.28.99":{"current_status":"online"},"10.16.28.26":{"current_status":"online"},"10.16.28.57":{"current_status":"online"},"10.16.28.28":{"current_status":"online"},"10.16.28.25":{"current_status":"online"},"10.11.81.17":{"current_status":"online"},"172.16.28.20":{"current_status":"online"},"10.16.28.44":{"current_status":"online"},"10.16.28.73":{"current_status":"online"},"10.16.28.74":{"current_status":"online"},"10.16.28.75":{"current_status":"online"},"10.16.28.96":{"current_status":"online"},"10.16.28.86":{"current_status":"online"},"10.16.28.40":{"current_status":"online"}} -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-map-info WITH QUERY PARAMS [object Object] AND RESPONSE ["10.11.81.27","10.11.81.25","10.11.81.24","10.11.81.23","10.11.81.28","10.11.81.22","10.11.81.21","10.11.81.20","10.11.81.14","10.11.81.18","10.11.81.13","10.11.81.19","10.11.81.26","10.11.81.12","10.11.81.30","10.11.81.29","10.11.81.32","10.11.81.33","10.11.81.34","10.11.81.35","10.11.81.36","10.11.81.37","10.11.81.38","10.11.81.39","10.11.81.40","10.11.81.31"] -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsucounts WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.14":{"road":"Region 1","count":0},"10.11.81.22":{"road":"Region 1","count":0},"10.16.28.74":{"road":"I25","count":0},"10.16.28.130":{"road":"I25","count":0},"172.16.28.4":{"road":"I25","count":0},"172.16.28.109":{"road":"I25","count":0},"10.16.28.21":{"road":"C470","count":0},"10.16.28.89":{"road":"C470","count":0},"172.16.28.44":{"road":"C470","count":0},"172.16.28.48":{"road":"C470","count":0},"172.16.28.136":{"road":"I70","count":0},"172.16.28.153":{"road":"I70","count":0},"172.16.28.177":{"road":"I70","count":0},"172.16.28.183":{"road":"I70","count":0},"172.16.28.186":{"road":"I70","count":0},"172.16.28.214":{"road":"I70","count":0},"172.16.28.224":{"road":"I70","count":0},"172.16.28.229":{"road":"I70","count":0},"172.16.28.253":{"road":"I70","count":0},"10.16.28.64":{"road":"I76","count":0},"10.11.81.12":{"road":"Region 1","count":0},"10.16.28.47":{"road":"I25","count":0},"10.16.28.129":{"road":"I25","count":0},"172.16.28.54":{"road":"I25","count":0},"172.16.28.68":{"road":"I25","count":0},"172.16.28.91":{"road":"I25","count":0},"10.16.28.54":{"road":"C470","count":0},"172.16.28.19":{"road":"I70","count":0},"172.16.28.134":{"road":"I70","count":0},"172.16.28.159":{"road":"I70","count":0},"172.16.28.167":{"road":"I70","count":0},"172.16.28.203":{"road":"I70","count":0},"172.16.28.220":{"road":"I70","count":0},"172.16.28.46":{"road":"I270","count":0},"10.11.81.28":{"road":"Region 1","count":0},"10.11.81.34":{"road":"Region 1","count":0},"10.16.28.12":{"road":"I25","count":0},"10.16.28.33":{"road":"I25","count":0},"10.16.28.38":{"road":"I25","count":0},"172.16.28.59":{"road":"I25","count":0},"10.16.28.113":{"road":"C470","count":0},"172.16.28.21":{"road":"I70","count":0},"172.16.28.113":{"road":"I70","count":0},"172.16.28.143":{"road":"I70","count":0},"172.16.28.157":{"road":"I70","count":0},"172.16.28.200":{"road":"I70","count":0},"172.16.28.225":{"road":"I70","count":0},"10.11.81.33":{"road":"Region 1","count":0},"10.11.81.35":{"road":"Region 1","count":0},"10.11.81.37":{"road":"Region 1","count":0},"10.11.81.38":{"road":"Region 1","count":0},"10.16.28.88":{"road":"I25","count":0},"10.16.28.100":{"road":"I25","count":0},"172.16.28.7":{"road":"I25","count":0},"172.16.28.14":{"road":"I25","count":0},"172.16.28.57":{"road":"I25","count":0},"172.16.28.67":{"road":"I25","count":0},"172.16.28.87":{"road":"I25","count":0},"172.16.28.90":{"road":"I25","count":0},"172.16.28.30":{"road":"C470","count":0},"172.16.28.96":{"road":"C470","count":0},"172.16.28.12":{"road":"I70","count":0},"172.16.28.81":{"road":"I70","count":0},"172.16.28.146":{"road":"I70","count":0},"172.16.28.151":{"road":"I70","count":0},"172.16.28.164":{"road":"I70","count":0},"172.16.28.174":{"road":"I70","count":0},"172.16.28.179":{"road":"I70","count":0},"172.16.28.197":{"road":"I70","count":0},"172.16.28.211":{"road":"I70","count":0},"172.16.28.218":{"road":"I70","count":0},"172.16.28.228":{"road":"I70","count":0},"172.16.28.232":{"road":"I70","count":0},"172.16.28.240":{"road":"I70","count":0},"172.16.28.244":{"road":"I76","count":0},"172.16.28.6":{"road":"I225","count":0},"172.16.28.16":{"road":"I270","count":0},"172.16.28.116":{"road":"C470","count":4},"10.11.81.17":{"road":"Region 1","count":0},"10.11.81.21":{"road":"Region 1","count":0},"10.16.28.15":{"road":"I25","count":0},"10.16.28.25":{"road":"I25","count":0},"10.16.28.65":{"road":"I25","count":0},"10.16.28.99":{"road":"I25","count":0},"172.16.28.111":{"road":"I25","count":0},"172.16.28.126":{"road":"I25","count":0},"172.16.28.251":{"road":"I25","count":0},"10.16.28.55":{"road":"C470","count":0},"10.16.28.56":{"road":"C470","count":0},"172.16.28.95":{"road":"C470","count":0},"10.16.28.48":{"road":"I70","count":0},"172.16.28.184":{"road":"I70","count":0},"172.16.28.199":{"road":"I70","count":0},"172.16.28.201":{"road":"I70","count":0},"172.16.28.204":{"road":"I70","count":0},"10.11.81.13":{"road":"Region 1","count":0},"10.11.81.19":{"road":"Region 1","count":0},"10.11.81.31":{"road":"Region 1","count":0},"10.16.28.9":{"road":"I25","count":0},"10.16.28.41":{"road":"I25","count":0},"10.16.28.84":{"road":"I25","count":0},"172.16.28.64":{"road":"I25","count":0},"172.16.28.98":{"road":"I25","count":0},"172.16.28.103":{"road":"I25","count":0},"172.16.28.119":{"road":"I25","count":0},"10.16.28.141":{"road":"C470","count":0},"172.16.28.36":{"road":"C470","count":0},"172.16.28.135":{"road":"I70","count":0},"172.16.28.185":{"road":"I70","count":0},"172.16.28.207":{"road":"I70","count":0},"172.16.28.219":{"road":"I70","count":0},"172.16.28.41":{"road":"I76","count":0},"10.11.81.23":{"road":"Region 1","count":0},"10.16.28.11":{"road":"I25","count":0},"10.16.28.34":{"road":"I25","count":0},"10.16.28.66":{"road":"I25","count":0},"10.16.28.68":{"road":"I25","count":0},"10.16.28.78":{"road":"I25","count":0},"172.16.28.18":{"road":"I25","count":0},"172.16.28.65":{"road":"I25","count":0 -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-online-status WITH QUERY PARAMS [object Object] AND RESPONSE {"ip":"172.16.28.65","last_online":"11/06/2023 07:17:00 AM"} -api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-command WITH QUERY PARAMS [object Object] AND BODY {"command":"rsufwdsnmpwalk","rsu_ip":["172.16.28.65"],"args":{}} AND RESPONSE {"RsuFwdSnmpwalk":{"1":{"Message Type":"BSM","IP":"10.235.1.36","Port":46800,"Protocol":"UDP","RSSI":-100,"Frequency":1,"Start DateTime":"2023-04-17 17:48","End DateTime":"2033-04-17 17:48","Forwarding":"On","Config Active":"Enabled"},"2":{"Message Type":"BSM","IP":"10.235.1.66","Port":46800,"Protocol":"UDP","RSSI":-100,"Frequency":1,"Start DateTime":"2023-04-17 17:48","End DateTime":"2033-04-17 17:48","Forwarding":"On","Config Active":"Enabled"},"3":{"Message Type":"BSM","IP":"10.235.1.3","Port":46800,"Protocol":"UDP","RSSI":-100,"Frequency":1,"Start DateTime":"2023-04-17 17:49","End DateTime":"2033-04-17 17:49","Forwarding":"On","Config Active":"Enabled"}}} -react-jsx-dev-runtime.development.js:106 Warning: Each child in a list should have a unique "key" prop. - -Check the render method of `SnmpwalkMenu`. See https://reactjs.org/link/warning-keys for more information. - at div - at SnmpwalkMenu (http://localhost:3000/static/js/bundle.js:2782:76) - at div - at http://localhost:3000/static/js/bundle.js:16648:66 - at AccordionDetails (http://localhost:3000/static/js/bundle.js:44611:82) - at div - at http://localhost:3000/static/js/bundle.js:16648:66 - at Paper (http://localhost:3000/static/js/bundle.js:58075:83) - at http://localhost:3000/static/js/bundle.js:16648:66 - at Accordion (http://localhost:3000/static/js/bundle.js:45073:83) - at InnerThemeProvider (http://localhost:3000/static/js/bundle.js:70008:70) - at ThemeProvider (http://localhost:3000/static/js/bundle.js:69718:5) - at ThemeProvider (http://localhost:3000/static/js/bundle.js:70027:5) - at div - at div - at http://localhost:3000/static/js/bundle.js:16648:66 - at div - at http://localhost:3000/static/js/bundle.js:16648:66 - at div - at http://localhost:3000/static/js/bundle.js:16648:66 - at Transition (http://localhost:3000/static/js/bundle.js:240685:30) - at Collapse (http://localhost:3000/static/js/bundle.js:48431:82) - at div - at http://localhost:3000/static/js/bundle.js:16648:66 - at Paper (http://localhost:3000/static/js/bundle.js:58075:83) - at http://localhost:3000/static/js/bundle.js:16648:66 - at Accordion (http://localhost:3000/static/js/bundle.js:45073:83) - at InnerThemeProvider (http://localhost:3000/static/js/bundle.js:70008:70) - at ThemeProvider (http://localhost:3000/static/js/bundle.js:69718:5) - at ThemeProvider (http://localhost:3000/static/js/bundle.js:70027:5) - at div - at div - at ConfigureRSU (http://localhost:3000/static/js/bundle.js:10749:76) - at div - at div - at Menu (http://localhost:3000/static/js/bundle.js:11581:76) - at div - at div - at Tabs (http://localhost:3000/static/js/bundle.js:3301:5) - at div - at Grid (http://localhost:3000/static/js/bundle.js:38934:35) - at WithStyles (http://localhost:3000/static/js/bundle.js:41422:31) - at div - at GoogleOAuthProvider (http://localhost:3000/static/js/bundle.js:94219:5) - at App (http://localhost:3000/static/js/bundle.js:61:77) - at Provider (http://localhost:3000/static/js/bundle.js:231775:5) -printWarning @ react-jsx-dev-runtime.development.js:106 -error @ react-jsx-dev-runtime.development.js:85 -validateExplicitKey @ react-jsx-dev-runtime.development.js:850 -validateChildKeys @ react-jsx-dev-runtime.development.js:873 -jsxWithValidation @ react-jsx-dev-runtime.development.js:1017 -SnmpwalkMenu @ SnmpwalkMenu.js:132 -renderWithHooks @ react-dom.development.js:12980 -updateFunctionComponent @ react-dom.development.js:15082 -beginWork @ react-dom.development.js:16529 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ SnmpwalkMenu.js:35 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -onClick @ Map.js:738 -(anonymous) @ marker.js:39 -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-online-status WITH QUERY PARAMS [object Object] AND RESPONSE {"ip":"172.16.28.65","last_online":"11/06/2023 07:17:00 AM"} -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//iss-scms-status WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.12":{"health":"1","expiration":"11/20/2023 10:43:34 AM"},"10.11.81.13":{"health":"1","expiration":"11/23/2023 03:16:11 PM"},"10.11.81.14":{"health":"1","expiration":"11/24/2023 03:49:54 PM"},"10.11.81.17":{"health":"1","expiration":"11/23/2023 11:55:43 AM"},"10.11.81.18":{"health":"1","expiration":"11/24/2023 07:54:17 AM"},"10.11.81.19":{"health":"1","expiration":"11/23/2023 11:10:24 AM"},"10.11.81.20":{"health":"1","expiration":"11/24/2023 06:06:30 AM"},"10.11.81.21":{"health":"1","expiration":"11/23/2023 11:09:02 AM"},"10.11.81.22":{"health":"1","expiration":"11/23/2023 02:28:34 PM"},"10.11.81.23":{"health":"1","expiration":"11/23/2023 11:08:28 AM"},"10.11.81.24":{"health":"1","expiration":"11/22/2023 04:45:02 PM"},"10.11.81.25":{"health":"1","expiration":"11/23/2023 11:07:51 AM"},"10.11.81.26":{"health":"1","expiration":"11/23/2023 11:07:30 AM"},"10.11.81.27":{"health":"0","expiration":"03/14/2022 04:32:12 PM"},"10.11.81.28":{"health":"1","expiration":"11/21/2023 10:44:25 AM"},"10.11.81.29":{"health":"1","expiration":"11/20/2023 02:24:33 PM"},"10.11.81.30":{"health":"1","expiration":"11/23/2023 11:12:07 AM"},"10.11.81.31":{"health":"0","expiration":"04/25/2023 08:43:12 AM"},"10.11.81.32":{"health":"1","expiration":"11/23/2023 11:12:43 AM"},"10.11.81.33":{"health":"1","expiration":"11/23/2023 11:13:00 AM"},"10.11.81.34":{"health":"1","expiration":"11/23/2023 11:14:36 AM"},"10.11.81.35":{"health":"1","expiration":"11/23/2023 11:15:07 AM"},"10.11.81.36":{"health":"1","expiration":"11/23/2023 11:15:22 AM"},"10.11.81.37":{"health":"1","expiration":"11/23/2023 11:15:48 AM"},"10.11.81.38":{"health":"1","expiration":"11/23/2023 11:16:13 AM"},"10.11.81.39":{"health":"1","expiration":"11/22/2023 10:27:14 AM"},"10.11.81.40":{"health":"1","expiration":"11/24/2023 01:13:18 PM"},"10.16.28.6":{"health":"1","expiration":"11/24/2023 06:17:31 PM"},"10.16.28.8":{"health":"1","expiration":"11/20/2023 02:11:31 PM"},"10.16.28.9":{"health":"1","expiration":"11/21/2023 10:15:32 AM"},"10.16.28.11":{"health":"1","expiration":"11/22/2023 07:50:23 AM"},"10.16.28.12":{"health":"1","expiration":"11/22/2023 08:07:55 AM"},"10.16.28.13":{"health":"1","expiration":"11/22/2023 02:08:51 PM"},"10.16.28.14":{"health":"1","expiration":"11/26/2023 09:40:21 AM"},"10.16.28.15":{"health":"1","expiration":"11/26/2023 09:12:50 AM"},"10.16.28.21":{"health":"1","expiration":"11/23/2023 05:27:14 PM"},"10.16.28.22":{"health":"1","expiration":"11/21/2023 08:39:09 AM"},"10.16.28.23":{"health":"1","expiration":"11/21/2023 08:19:59 AM"},"10.16.28.24":{"health":"1","expiration":"11/21/2023 08:45:25 AM"},"10.16.28.25":{"health":"1","expiration":"11/21/2023 05:09:34 PM"},"10.16.28.26":{"health":"1","expiration":"11/23/2023 09:46:28 AM"},"10.16.28.28":{"health":"1","expiration":"11/21/2023 04:43:59 PM"},"10.16.28.29":{"health":"1","expiration":"11/22/2023 04:30:17 PM"},"10.16.28.30":{"health":"1","expiration":"11/27/2023 08:36:14 AM"},"10.16.28.31":{"health":"1","expiration":"11/22/2023 03:27:41 AM"},"10.16.28.32":{"health":"0","expiration":"06/08/2023 06:45:35 AM"},"10.16.28.33":{"health":"1","expiration":"11/20/2023 03:08:14 PM"},"10.16.28.34":{"health":"1","expiration":"11/21/2023 02:27:13 AM"},"10.16.28.38":{"health":"1","expiration":"11/22/2023 06:14:50 PM"},"10.16.28.40":{"health":"1","expiration":"11/21/2023 09:18:47 AM"},"10.16.28.41":{"health":"0","expiration":"10/04/2023 01:17:03 PM"},"10.16.28.42":{"health":"1","expiration":"11/26/2023 10:23:33 AM"},"10.16.28.43":{"health":"1","expiration":"11/20/2023 04:17:35 PM"},"10.16.28.44":{"health":"1","expiration":"11/21/2023 04:03:41 PM"},"10.16.28.47":{"health":"0","expiration":"06/21/2023 04:49:32 PM"},"10.16.28.48":{"health":"1","expiration":"11/22/2023 04:02:14 PM"},"10.16.28.51":{"health":"1","expiration":"11/25/2023 10:00:37 AM"},"10.16.28.53":{"health":"1","expiration":"11/21/2023 11:31:16 AM"},"10.16.28.54":{"health":"1","expiration":"11/21/2023 08:05:00 AM"},"10.16.28.55":{"health":"0","expiration":"07/18/2023 11:09:31 AM"},"10.16.28.56":{"health":"1","expiration":"11/21/2023 08:21:57 AM"},"10.16.28.57":{"health":"1","expiration":"11/21/2023 12:33:39 PM"},"10.16.28.58":{"health":"1","expiration":"11/23/2023 06:06:39 AM"},"10.16.28.61":{"health":"1","expiration":"11/23/2023 12:53:09 AM"},"10.16.28.64":{"health":"0","expiration":"10/25/2023 08:19:32 AM"},"10.16.28.65":{"health":"1","expiration":"11/26/2023 10:10:12 AM"},"10.16.28.66":{"health":"1","expiration":"11/22/2023 05:31:56 PM"},"10.16.28.67":{"health":"1","expiration":"11/21/2023 11:42:32 PM"},"10.16.28.68":{"health":"1","expiration":"11/21/2023 11:04:56 PM"},"10.16.28.70":{"health":"0","expiration":"10/14/2023 06:01:28 PM"},"10.16.28.73":{"health":"1","expiration":"11/23/2023 01:21:00 PM"},"10.16.28.74":{"health":"1","expiration":"11/23/2023 03:53:29 PM"},"10.16.28.75":{"health":"1","expiration":"11/23/2023 04:23:48 PM" -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//iss-scms-status WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.12":{"health":"1","expiration":"11/20/2023 10:43:34 AM"},"10.11.81.13":{"health":"1","expiration":"11/23/2023 03:16:11 PM"},"10.11.81.14":{"health":"1","expiration":"11/24/2023 03:49:54 PM"},"10.11.81.17":{"health":"1","expiration":"11/23/2023 11:55:43 AM"},"10.11.81.18":{"health":"1","expiration":"11/24/2023 07:54:17 AM"},"10.11.81.19":{"health":"1","expiration":"11/23/2023 11:10:24 AM"},"10.11.81.20":{"health":"1","expiration":"11/24/2023 06:06:30 AM"},"10.11.81.21":{"health":"1","expiration":"11/23/2023 11:09:02 AM"},"10.11.81.22":{"health":"1","expiration":"11/23/2023 02:28:34 PM"},"10.11.81.23":{"health":"1","expiration":"11/23/2023 11:08:28 AM"},"10.11.81.24":{"health":"1","expiration":"11/22/2023 04:45:02 PM"},"10.11.81.25":{"health":"1","expiration":"11/23/2023 11:07:51 AM"},"10.11.81.26":{"health":"1","expiration":"11/23/2023 11:07:30 AM"},"10.11.81.27":{"health":"0","expiration":"03/14/2022 04:32:12 PM"},"10.11.81.28":{"health":"1","expiration":"11/21/2023 10:44:25 AM"},"10.11.81.29":{"health":"1","expiration":"11/20/2023 02:24:33 PM"},"10.11.81.30":{"health":"1","expiration":"11/23/2023 11:12:07 AM"},"10.11.81.31":{"health":"0","expiration":"04/25/2023 08:43:12 AM"},"10.11.81.32":{"health":"1","expiration":"11/23/2023 11:12:43 AM"},"10.11.81.33":{"health":"1","expiration":"11/23/2023 11:13:00 AM"},"10.11.81.34":{"health":"1","expiration":"11/23/2023 11:14:36 AM"},"10.11.81.35":{"health":"1","expiration":"11/23/2023 11:15:07 AM"},"10.11.81.36":{"health":"1","expiration":"11/23/2023 11:15:22 AM"},"10.11.81.37":{"health":"1","expiration":"11/23/2023 11:15:48 AM"},"10.11.81.38":{"health":"1","expiration":"11/23/2023 11:16:13 AM"},"10.11.81.39":{"health":"1","expiration":"11/22/2023 10:27:14 AM"},"10.11.81.40":{"health":"1","expiration":"11/24/2023 01:13:18 PM"},"10.16.28.6":{"health":"1","expiration":"11/24/2023 06:17:31 PM"},"10.16.28.8":{"health":"1","expiration":"11/20/2023 02:11:31 PM"},"10.16.28.9":{"health":"1","expiration":"11/21/2023 10:15:32 AM"},"10.16.28.11":{"health":"1","expiration":"11/22/2023 07:50:23 AM"},"10.16.28.12":{"health":"1","expiration":"11/22/2023 08:07:55 AM"},"10.16.28.13":{"health":"1","expiration":"11/22/2023 02:08:51 PM"},"10.16.28.14":{"health":"1","expiration":"11/26/2023 09:40:21 AM"},"10.16.28.15":{"health":"1","expiration":"11/26/2023 09:12:50 AM"},"10.16.28.21":{"health":"1","expiration":"11/23/2023 05:27:14 PM"},"10.16.28.22":{"health":"1","expiration":"11/21/2023 08:39:09 AM"},"10.16.28.23":{"health":"1","expiration":"11/21/2023 08:19:59 AM"},"10.16.28.24":{"health":"1","expiration":"11/21/2023 08:45:25 AM"},"10.16.28.25":{"health":"1","expiration":"11/21/2023 05:09:34 PM"},"10.16.28.26":{"health":"1","expiration":"11/23/2023 09:46:28 AM"},"10.16.28.28":{"health":"1","expiration":"11/21/2023 04:43:59 PM"},"10.16.28.29":{"health":"1","expiration":"11/22/2023 04:30:17 PM"},"10.16.28.30":{"health":"1","expiration":"11/27/2023 08:36:14 AM"},"10.16.28.31":{"health":"1","expiration":"11/22/2023 03:27:41 AM"},"10.16.28.32":{"health":"0","expiration":"06/08/2023 06:45:35 AM"},"10.16.28.33":{"health":"1","expiration":"11/20/2023 03:08:14 PM"},"10.16.28.34":{"health":"1","expiration":"11/21/2023 02:27:13 AM"},"10.16.28.38":{"health":"1","expiration":"11/22/2023 06:14:50 PM"},"10.16.28.40":{"health":"1","expiration":"11/21/2023 09:18:47 AM"},"10.16.28.41":{"health":"0","expiration":"10/04/2023 01:17:03 PM"},"10.16.28.42":{"health":"1","expiration":"11/26/2023 10:23:33 AM"},"10.16.28.43":{"health":"1","expiration":"11/20/2023 04:17:35 PM"},"10.16.28.44":{"health":"1","expiration":"11/21/2023 04:03:41 PM"},"10.16.28.47":{"health":"0","expiration":"06/21/2023 04:49:32 PM"},"10.16.28.48":{"health":"1","expiration":"11/22/2023 04:02:14 PM"},"10.16.28.51":{"health":"1","expiration":"11/25/2023 10:00:37 AM"},"10.16.28.53":{"health":"1","expiration":"11/21/2023 11:31:16 AM"},"10.16.28.54":{"health":"1","expiration":"11/21/2023 08:05:00 AM"},"10.16.28.55":{"health":"0","expiration":"07/18/2023 11:09:31 AM"},"10.16.28.56":{"health":"1","expiration":"11/21/2023 08:21:57 AM"},"10.16.28.57":{"health":"1","expiration":"11/21/2023 12:33:39 PM"},"10.16.28.58":{"health":"1","expiration":"11/23/2023 06:06:39 AM"},"10.16.28.61":{"health":"1","expiration":"11/23/2023 12:53:09 AM"},"10.16.28.64":{"health":"0","expiration":"10/25/2023 08:19:32 AM"},"10.16.28.65":{"health":"1","expiration":"11/26/2023 10:10:12 AM"},"10.16.28.66":{"health":"1","expiration":"11/22/2023 05:31:56 PM"},"10.16.28.67":{"health":"1","expiration":"11/21/2023 11:42:32 PM"},"10.16.28.68":{"health":"1","expiration":"11/21/2023 11:04:56 PM"},"10.16.28.70":{"health":"0","expiration":"10/14/2023 06:01:28 PM"},"10.16.28.73":{"health":"1","expiration":"11/23/2023 01:21:00 PM"},"10.16.28.74":{"health":"1","expiration":"11/23/2023 03:53:29 PM"},"10.16.28.75":{"health":"1","expiration":"11/23/2023 04:23:48 PM" -api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-bsm-data WITH QUERY PARAMS [object Object] AND BODY {"start":"2023-11-13T13:39:37.686-07:00","end":"2023-11-13T13:39:37.689-07:00","geometry":[[-105.1199509383924,39.88357964587854],[-105.01629278314967,39.878311762940626],[-104.95862864380933,39.84142525180897],[-105.00462265971177,39.78447574656593],[-105.10210251431104,39.80451891549569],[-105.1199509383924,39.88357964587854]]} AND RESPONSE [] -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsucounts WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.14":{"road":"Region 1","count":0},"10.11.81.22":{"road":"Region 1","count":0},"10.16.28.74":{"road":"I25","count":0},"10.16.28.130":{"road":"I25","count":0},"172.16.28.4":{"road":"I25","count":0},"172.16.28.109":{"road":"I25","count":0},"10.16.28.21":{"road":"C470","count":0},"10.16.28.89":{"road":"C470","count":0},"172.16.28.44":{"road":"C470","count":0},"172.16.28.48":{"road":"C470","count":0},"172.16.28.136":{"road":"I70","count":0},"172.16.28.153":{"road":"I70","count":0},"172.16.28.177":{"road":"I70","count":0},"172.16.28.183":{"road":"I70","count":0},"172.16.28.186":{"road":"I70","count":0},"172.16.28.214":{"road":"I70","count":0},"172.16.28.224":{"road":"I70","count":0},"172.16.28.229":{"road":"I70","count":0},"172.16.28.253":{"road":"I70","count":0},"10.16.28.64":{"road":"I76","count":0},"10.11.81.12":{"road":"Region 1","count":0},"10.16.28.47":{"road":"I25","count":0},"10.16.28.129":{"road":"I25","count":0},"172.16.28.54":{"road":"I25","count":0},"172.16.28.68":{"road":"I25","count":0},"172.16.28.91":{"road":"I25","count":0},"10.16.28.54":{"road":"C470","count":0},"172.16.28.19":{"road":"I70","count":0},"172.16.28.134":{"road":"I70","count":0},"172.16.28.159":{"road":"I70","count":0},"172.16.28.167":{"road":"I70","count":0},"172.16.28.203":{"road":"I70","count":0},"172.16.28.220":{"road":"I70","count":0},"172.16.28.46":{"road":"I270","count":0},"10.11.81.28":{"road":"Region 1","count":0},"10.11.81.34":{"road":"Region 1","count":0},"10.16.28.12":{"road":"I25","count":0},"10.16.28.33":{"road":"I25","count":0},"10.16.28.38":{"road":"I25","count":0},"172.16.28.59":{"road":"I25","count":0},"10.16.28.113":{"road":"C470","count":0},"172.16.28.21":{"road":"I70","count":0},"172.16.28.113":{"road":"I70","count":0},"172.16.28.143":{"road":"I70","count":0},"172.16.28.157":{"road":"I70","count":0},"172.16.28.200":{"road":"I70","count":0},"172.16.28.225":{"road":"I70","count":0},"10.11.81.33":{"road":"Region 1","count":0},"10.11.81.35":{"road":"Region 1","count":0},"10.11.81.37":{"road":"Region 1","count":0},"10.11.81.38":{"road":"Region 1","count":0},"10.16.28.88":{"road":"I25","count":0},"10.16.28.100":{"road":"I25","count":0},"172.16.28.7":{"road":"I25","count":0},"172.16.28.14":{"road":"I25","count":0},"172.16.28.57":{"road":"I25","count":0},"172.16.28.67":{"road":"I25","count":0},"172.16.28.87":{"road":"I25","count":0},"172.16.28.90":{"road":"I25","count":0},"172.16.28.30":{"road":"C470","count":0},"172.16.28.96":{"road":"C470","count":0},"172.16.28.12":{"road":"I70","count":0},"172.16.28.81":{"road":"I70","count":0},"172.16.28.146":{"road":"I70","count":0},"172.16.28.151":{"road":"I70","count":0},"172.16.28.164":{"road":"I70","count":0},"172.16.28.174":{"road":"I70","count":0},"172.16.28.179":{"road":"I70","count":0},"172.16.28.197":{"road":"I70","count":0},"172.16.28.211":{"road":"I70","count":0},"172.16.28.218":{"road":"I70","count":0},"172.16.28.228":{"road":"I70","count":0},"172.16.28.232":{"road":"I70","count":0},"172.16.28.240":{"road":"I70","count":0},"172.16.28.244":{"road":"I76","count":0},"172.16.28.6":{"road":"I225","count":0},"172.16.28.16":{"road":"I270","count":0},"172.16.28.116":{"road":"C470","count":4},"10.11.81.17":{"road":"Region 1","count":0},"10.11.81.21":{"road":"Region 1","count":0},"10.16.28.15":{"road":"I25","count":0},"10.16.28.25":{"road":"I25","count":0},"10.16.28.65":{"road":"I25","count":0},"10.16.28.99":{"road":"I25","count":0},"172.16.28.111":{"road":"I25","count":0},"172.16.28.126":{"road":"I25","count":0},"172.16.28.251":{"road":"I25","count":0},"10.16.28.55":{"road":"C470","count":0},"10.16.28.56":{"road":"C470","count":0},"172.16.28.95":{"road":"C470","count":0},"10.16.28.48":{"road":"I70","count":0},"172.16.28.184":{"road":"I70","count":0},"172.16.28.199":{"road":"I70","count":0},"172.16.28.201":{"road":"I70","count":0},"172.16.28.204":{"road":"I70","count":0},"10.11.81.13":{"road":"Region 1","count":0},"10.11.81.19":{"road":"Region 1","count":0},"10.11.81.31":{"road":"Region 1","count":0},"10.16.28.9":{"road":"I25","count":0},"10.16.28.41":{"road":"I25","count":0},"10.16.28.84":{"road":"I25","count":0},"172.16.28.64":{"road":"I25","count":0},"172.16.28.98":{"road":"I25","count":0},"172.16.28.103":{"road":"I25","count":0},"172.16.28.119":{"road":"I25","count":0},"10.16.28.141":{"road":"C470","count":0},"172.16.28.36":{"road":"C470","count":0},"172.16.28.135":{"road":"I70","count":0},"172.16.28.185":{"road":"I70","count":0},"172.16.28.207":{"road":"I70","count":0},"172.16.28.219":{"road":"I70","count":0},"172.16.28.41":{"road":"I76","count":0},"10.11.81.23":{"road":"Region 1","count":0},"10.16.28.11":{"road":"I25","count":0},"10.16.28.34":{"road":"I25","count":0},"10.16.28.66":{"road":"I25","count":0},"10.16.28.68":{"road":"I25","count":0},"10.16.28.78":{"road":"I25","count":0},"172.16.28.18":{"road":"I25","count":0},"172.16.28.65":{"road":"I25","count":0 -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsucounts WITH QUERY PARAMS [object Object] AND RESPONSE {"10.11.81.23":{"road":"Region 1","count":0},"10.16.28.11":{"road":"I25","count":0},"10.16.28.34":{"road":"I25","count":0},"10.16.28.66":{"road":"I25","count":0},"10.16.28.68":{"road":"I25","count":0},"10.16.28.78":{"road":"I25","count":0},"172.16.28.18":{"road":"I25","count":0},"172.16.28.65":{"road":"I25","count":0},"172.16.28.97":{"road":"I25","count":0},"172.16.28.124":{"road":"I25","count":0},"172.16.28.249":{"road":"I25","count":0},"172.16.28.32":{"road":"C470","count":0},"172.16.28.40":{"road":"C470","count":0},"10.16.28.29":{"road":"I70","count":0},"172.16.28.80":{"road":"I70","count":0},"172.16.28.147":{"road":"I70","count":0},"172.16.28.170":{"road":"I70","count":0},"172.16.28.42":{"road":"I76","count":0},"10.11.81.28":{"road":"Region 1","count":0},"10.11.81.34":{"road":"Region 1","count":0},"10.16.28.12":{"road":"I25","count":0},"10.16.28.33":{"road":"I25","count":0},"10.16.28.38":{"road":"I25","count":0},"172.16.28.59":{"road":"I25","count":0},"10.16.28.113":{"road":"C470","count":0},"172.16.28.21":{"road":"I70","count":0},"172.16.28.113":{"road":"I70","count":0},"172.16.28.143":{"road":"I70","count":0},"172.16.28.157":{"road":"I70","count":0},"172.16.28.200":{"road":"I70","count":0},"172.16.28.225":{"road":"I70","count":0},"10.11.81.25":{"road":"Region 1","count":0},"10.16.28.40":{"road":"I25","count":0},"10.16.28.43":{"road":"I25","count":0},"10.16.28.44":{"road":"I25","count":0},"10.16.28.95":{"road":"I25","count":0},"10.16.28.96":{"road":"I25","count":0},"172.16.28.5":{"road":"I25","count":0},"172.16.28.27":{"road":"I25","count":0},"172.16.28.121":{"road":"I25","count":0},"10.16.28.22":{"road":"C470","count":0},"10.16.28.114":{"road":"C470","count":0},"10.16.28.142":{"road":"C470","count":0},"172.16.28.154":{"road":"I70","count":0},"172.16.28.161":{"road":"I70","count":0},"172.16.28.172":{"road":"I70","count":0},"172.16.28.182":{"road":"I70","count":0},"10.16.28.67":{"road":"I76","count":0},"172.16.28.47":{"road":"I76","count":0},"172.16.28.86":{"road":"I76","count":0},"172.16.28.26":{"road":"I225","count":0},"10.11.81.14":{"road":"Region 1","count":0},"10.11.81.22":{"road":"Region 1","count":0},"10.16.28.74":{"road":"I25","count":0},"10.16.28.130":{"road":"I25","count":0},"172.16.28.4":{"road":"I25","count":0},"172.16.28.109":{"road":"I25","count":0},"10.16.28.21":{"road":"C470","count":0},"10.16.28.89":{"road":"C470","count":0},"172.16.28.44":{"road":"C470","count":0},"172.16.28.48":{"road":"C470","count":0},"172.16.28.136":{"road":"I70","count":0},"172.16.28.153":{"road":"I70","count":0},"172.16.28.177":{"road":"I70","count":0},"172.16.28.183":{"road":"I70","count":0},"172.16.28.186":{"road":"I70","count":0},"172.16.28.214":{"road":"I70","count":0},"172.16.28.224":{"road":"I70","count":0},"172.16.28.229":{"road":"I70","count":0},"172.16.28.253":{"road":"I70","count":0},"10.16.28.64":{"road":"I76","count":0},"10.16.28.32":{"road":"I25","count":0},"10.16.28.61":{"road":"I25","count":0},"10.16.28.86":{"road":"I25","count":0},"172.16.28.56":{"road":"I25","count":0},"172.16.28.78":{"road":"I25","count":0},"172.16.28.122":{"road":"I25","count":0},"172.16.28.123":{"road":"I25","count":0},"10.16.28.98":{"road":"C470","count":0},"10.16.28.139":{"road":"C470","count":0},"172.16.28.100":{"road":"I70","count":0},"172.16.28.181":{"road":"I70","count":0},"172.16.28.192":{"road":"I70","count":0},"172.16.28.227":{"road":"I70","count":0},"172.16.28.238":{"road":"I70","count":0},"172.16.28.45":{"road":"I270","count":0},"10.11.81.40":{"road":"Region 1","count":0},"172.16.28.106":{"road":"I25","count":0},"172.16.28.239":{"road":"I25","count":0},"172.16.28.246":{"road":"I25","count":0},"10.16.28.13":{"road":"C470","count":0},"172.16.28.11":{"road":"I70","count":0},"172.16.28.132":{"road":"I70","count":0},"172.16.28.165":{"road":"I70","count":0},"172.16.28.193":{"road":"I70","count":0},"172.16.28.202":{"road":"I70","count":0},"172.16.28.215":{"road":"I70","count":0},"172.16.28.217":{"road":"I70","count":0},"172.16.28.221":{"road":"I70","count":0},"10.16.28.51":{"road":"I76","count":0},"172.16.28.25":{"road":"I225","count":0},"172.16.28.34":{"road":"I225","count":0},"172.16.28.15":{"road":"I270","count":0},"10.11.81.24":{"road":"Region 1","count":0},"10.11.81.29":{"road":"Region 1","count":0},"10.11.81.30":{"road":"Region 1","count":0},"10.16.28.8":{"road":"I25","count":0},"10.16.28.28":{"road":"I25","count":0},"10.16.28.70":{"road":"I25","count":0},"10.16.28.85":{"road":"I25","count":0},"10.16.28.87":{"road":"I25","count":0},"172.16.28.20":{"road":"I25","count":0},"172.16.28.69":{"road":"I25","count":0},"172.16.28.77":{"road":"I25","count":0},"172.16.28.85":{"road":"I25","count":0},"172.16.28.94":{"road":"I25","count":0},"172.16.28.108":{"road":"I25","count":0},"172.16.28.127":{"road":"I25","count":0},"172.16.28.129":{"road":"I25","count":0},"172.16.28.252":{"road":"I25","count":0},"172.16.28.49":{"road": -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.test","first_name":"test","last_name":"test","super_user":false,"organizations":[{"name":"testorg","role":"admin"}]}]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ Admin.js:14 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ Admin.js:14 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"10.16.28.89","geo_position":{"latitude":39.558933,"longitude":-105.006405},"milepost":18.5,"primary_route":"C470","serial_number":"2149401003477","scms_id":"2149401003477","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"4.1","organizations":["CDOT CV"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} -api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND BODY {"orig_ip":"10.16.28.89","ip":"10.16.28.89","geo_position":{"latitude":39.558933,"longitude":-105.006405},"milepost":18.6,"primary_route":"C470","serial_number":"2149401003477","model":"Commsignia ITS-RS4-M","scms_id":"2149401003477","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"4.1","organizations_to_add":[],"organizations_to_remove":[]} AND RESPONSE {"message":"RSU successfully modified"} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- -api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND BODY {"orig_ip":"10.16.28.89","ip":"10.16.28.89","geo_position":{"latitude":39.558933,"longitude":-105.006405},"milepost":18.5,"primary_route":"C470","serial_number":"2149401003477","model":"Commsignia ITS-RS4-M","scms_id":"2149401003477","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"4.1","organizations_to_add":[],"organizations_to_remove":[]} AND RESPONSE {"message":"RSU successfully modified"} -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]} -api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND BODY {"ip":"1.1.1.1","milepost":1,"serial_number":"1234","scms_id":"1234","geo_position":{"latitude":12,"longitude":23},"primary_route":"C470","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["CDOT CV"]} AND RESPONSE {"message":"New RSU successfully added"} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:151 DELETE REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"message":"RSU successfully deleted"} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -onDelete @ AdminRsuTab.js:96 -onClick @ AdminRsuTab.js:52 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -onDelete @ AdminRsuTab.js:96 -onClick @ AdminRsuTab.js:52 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":{"email":"test@test.test","first_name":"test","last_name":"test","super_user":false,"organizations":[{"name":"testorg","role":"admin"}]},"allowed_selections":{"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]}} -react-jsx-dev-runtime.development.js:106 Warning: Each child in a list should have a unique "key" prop. - -Check the render method of `AdminEditUser`. See https://reactjs.org/link/warning-keys for more information. - at http://localhost:3000/static/js/bundle.js:159082:5 - at AdminEditUser (http://localhost:3000/static/js/bundle.js:6892:76) - at div - at div - at AdminUserTab (http://localhost:3000/static/js/bundle.js:10275:76) - at div - at AdminFormManager (http://localhost:3000/static/js/bundle.js:954:7) - at div - at div - at TabPanel (http://localhost:3000/static/js/bundle.js:239007:24) - at div - at UncontrolledTabs (http://localhost:3000/static/js/bundle.js:239271:63) - at Tabs (http://localhost:3000/static/js/bundle.js:239110:24) - at div - at Admin (http://localhost:3000/static/js/bundle.js:13290:76) - at div - at div - at Tabs (http://localhost:3000/static/js/bundle.js:3301:5) - at div - at Grid (http://localhost:3000/static/js/bundle.js:38934:35) - at WithStyles (http://localhost:3000/static/js/bundle.js:41422:31) - at div - at GoogleOAuthProvider (http://localhost:3000/static/js/bundle.js:94219:5) - at App (http://localhost:3000/static/js/bundle.js:61:77) - at Provider (http://localhost:3000/static/js/bundle.js:231775:5) -printWarning @ react-jsx-dev-runtime.development.js:106 -error @ react-jsx-dev-runtime.development.js:85 -validateExplicitKey @ react-jsx-dev-runtime.development.js:850 -validateChildKeys @ react-jsx-dev-runtime.development.js:873 -jsxWithValidation @ react-jsx-dev-runtime.development.js:1008 -AdminEditUser @ AdminEditUser.js:135 -renderWithHooks @ react-dom.development.js:12980 -updateFunctionComponent @ react-dom.development.js:15082 -beginWork @ react-dom.development.js:16529 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -getUserData.condition.getState.getState @ adminEditUserSlice.js:66 -await in getUserData.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminEditUser.js:59 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND BODY {"orig_email":"test@test.test","email":"test@test.test","first_name":"test","last_name":"test","super_user":false,"organizations_to_add":[{"name":"Region 1","role":"admin"}],"organizations_to_modify":[],"organizations_to_remove":[]} AND RESPONSE {"message":"User successfully modified"} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.test","first_name":"test","last_name":"test","super_user":false,"organizations":[{"name":"testorg","role":"admin"},{"name":"Region 1","role":"admin"}]}]} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:151 DELETE REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"message":"User successfully deleted"} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND RESPONSE {"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]} -react-jsx-dev-runtime.development.js:106 Warning: Each child in a list should have a unique "key" prop. - -Check the render method of `AdminAddUser`. See https://reactjs.org/link/warning-keys for more information. - at http://localhost:3000/static/js/bundle.js:159082:5 - at AdminAddUser (http://localhost:3000/static/js/bundle.js:4812:76) - at div - at div - at AdminUserTab (http://localhost:3000/static/js/bundle.js:10275:76) - at div - at AdminFormManager (http://localhost:3000/static/js/bundle.js:954:7) - at div - at div - at TabPanel (http://localhost:3000/static/js/bundle.js:239007:24) - at div - at UncontrolledTabs (http://localhost:3000/static/js/bundle.js:239271:63) - at Tabs (http://localhost:3000/static/js/bundle.js:239110:24) - at div - at Admin (http://localhost:3000/static/js/bundle.js:13290:76) - at div - at div - at Tabs (http://localhost:3000/static/js/bundle.js:3301:5) - at div - at Grid (http://localhost:3000/static/js/bundle.js:38934:35) - at WithStyles (http://localhost:3000/static/js/bundle.js:41422:31) - at div - at GoogleOAuthProvider (http://localhost:3000/static/js/bundle.js:94219:5) - at App (http://localhost:3000/static/js/bundle.js:61:77) - at Provider (http://localhost:3000/static/js/bundle.js:231775:5) -printWarning @ react-jsx-dev-runtime.development.js:106 -error @ react-jsx-dev-runtime.development.js:85 -validateExplicitKey @ react-jsx-dev-runtime.development.js:850 -validateChildKeys @ react-jsx-dev-runtime.development.js:873 -jsxWithValidation @ react-jsx-dev-runtime.development.js:1008 -AdminAddUser @ AdminAddUser.js:117 -renderWithHooks @ react-dom.development.js:12980 -updateFunctionComponent @ react-dom.development.js:15082 -beginWork @ react-dom.development.js:16529 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND BODY {"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]} AND RESPONSE {"message":"New user successfully added"} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND RESPONSE {"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":[{"name":"CDOT CV","user_count":12,"rsu_count":313},{"name":"brandon_test_org","user_count":0,"rsu_count":0},{"name":"Region 1","user_count":3,"rsu_count":28},{"name":"testorg","user_count":0,"rsu_count":0}]} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[],"org_rsus":[]},"allowed_selections":{"user_roles":["user","operator","admin"]}} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTabUser.js:129 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTabUser.js:129 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]} -api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND BODY {"ip":"1.1.1.1","milepost":1,"serial_number":"1234","scms_id":"1234","geo_position":{"latitude":12,"longitude":23},"primary_route":"C470","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["CDOT CV","testorg","brandon_test_org"]} AND RESPONSE {"message":"New RSU successfully added"} -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND RESPONSE {"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":[{"name":"CDOT CV","user_count":12,"rsu_count":314},{"name":"brandon_test_org","user_count":0,"rsu_count":1},{"name":"Region 1","user_count":3,"rsu_count":28},{"name":"testorg","user_count":0,"rsu_count":1}]} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"1.1.1.1","geo_position":{"latitude":12,"longitude":23},"milepost":1,"primary_route":"C470","serial_number":"1234","scms_id":"1234","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["CDOT CV","testorg","brandon_test_org"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} -api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND BODY {"orig_name":"CDOT CV","name":"CDOT CV","users_to_add":[],"users_to_modify":[],"users_to_remove":[],"rsus_to_add":[],"rsus_to_remove":["1.1.1.1"]} AND RESPONSE {"message":"Organization successfully modified"} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabRsuSlice.js:58 -Promise.then (async) -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabRsuSlice.js:58 -Promise.then (async) -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabRsuSlice.js:58 -Promise.then (async) -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabRsuSlice.js:58 -Promise.then (async) -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},"allowed_selections":{"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]}} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]}]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -updateTableData @ AdminOrganizationTab.js:66 -refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabUserSlice.js:86 -Promise.then (async) -userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 -await in userDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -userOnDelete @ AdminOrganizationTabUser.js:133 -onClick @ AdminOrganizationTabUser.js:74 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -updateTableData @ AdminOrganizationTab.js:66 -refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabUserSlice.js:86 -Promise.then (async) -userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 -await in userDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -userOnDelete @ AdminOrganizationTabUser.js:133 -onClick @ AdminOrganizationTabUser.js:74 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -updateTableData @ AdminOrganizationTab.js:66 -refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabUserSlice.js:86 -Promise.then (async) -userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 -await in userDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -userOnDelete @ AdminOrganizationTabUser.js:133 -onClick @ AdminOrganizationTabUser.js:74 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -updateTableData @ AdminOrganizationTab.js:66 -refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabUserSlice.js:86 -Promise.then (async) -userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 -await in userDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -userOnDelete @ AdminOrganizationTabUser.js:133 -onClick @ AdminOrganizationTabUser.js:74 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"1.1.1.1","geo_position":{"latitude":12,"longitude":23},"milepost":1,"primary_route":"C470","serial_number":"1234","scms_id":"1234","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["testorg","brandon_test_org"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},"allowed_selections":{"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]}} -api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND BODY {"orig_email":"test@test.com","email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations_to_add":[{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}],"organizations_to_modify":[],"organizations_to_remove":[]} AND RESPONSE {"message":"User successfully modified"} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}]}]} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-new-user WITH QUERY PARAMS [object Object] AND RESPONSE {"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":[{"name":"brandon_test_org","user_count":1,"rsu_count":1},{"name":"Region 1","user_count":3,"rsu_count":28},{"name":"testorg","user_count":1,"rsu_count":1},{"name":"CDOT CV","user_count":12,"rsu_count":313}]} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","role":"admin"},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","role":"admin"},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","role":"admin"},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","role":"admin"},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","role":"admin"},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","role":"admin"},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","role":"admin"},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","role":"admin"},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","role":"admin"},{"email":"test@gmail.com","first_name":"test","last_name":"test2","role":"admin"},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","role":"admin"},{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"172.16.28.92","primary_route":"I25","milepost":212.05},{"ip":"172.16.28.204","primary_route":"I70","milepost":177.3},{"ip":"172.16.28.93","primary_route":"I25","milepost":211.1},{"ip":"172.16.28.236","primary_route":"I70","milepost":259.12},{"ip":"172.16.28.166","primary_route":"I70","milepost":238.8},{"ip":"172.16.28.168","primary_route":"I70","milepost":231.2},{"ip":"172.16.28.209","primary_route":"I70","milepost":201.1},{"ip":"172.16.28.237","primary_route":"I70","milepost":237.67},{"ip":"172.16.28.222","primary_route":"I70","milepost":242.7},{"ip":"172.16.28.200","primary_route":"I70","milepost":259.01},{"ip":"172.16.28.174","primary_route":"I70","milepost":257},{"ip":"172.16.28.133","primary_route":"I70","milepost":256.6},{"ip":"172.16.28.167","primary_route":"I70","milepost":254.7},{"ip":"172.16.28.151","primary_route":"I70","milepost":253.55},{"ip":"172.16.28.142","primary_route":"I70","milepost":251.7},{"ip":"172.16.28.132","primary_route":"I70","milepost":250.8},{"ip":"172.16.28.146","primary_route":"I70","milepost":243.7},{"ip":"172.16.28.232","primary_route":"I70","milepost":195.88},{"ip":"172.16.28.218","primary_route":"I70","milepost":195.3},{"ip":"172.16.28.187","primary_route":"I70","milepost":192.1},{"ip":"172.16.28.241","primary_route":"I70","milepost":191.9},{"ip":"172.16.28.181","primary_route":"I70","milepost":190.45},{"ip":"172.16.28.212","primary_route":"I70","milepost":189.5},{"ip":"172.16.28.182","primary_route":"I70","milepost":182.3},{"ip":"172.16.28.175","primary_route":"I70","milepost":247.6},{"ip":"172.16.28.159","primary_route":"I70","milepost":246.65},{"ip":"172.16.28.144","primary_route":"I70","milepost":246.35},{"ip":"172.16.28.171","primary_route":"I70","milepost":245.4},{"ip":"172.16.28.136","primary_route":"I70","milepost":241.25},{"ip":"172.16.28.225","primary_route":"I70","milepost":178.5},{"ip":"172.16.28.201","primary_route":"I70","milepost":186.3},{"ip":"172.16.28.226","primary_route":"I70","milepost":186.1},{"ip":"172.16.28.186","primary_route":"I70","milepost":183.6},{"ip":"172.16.28.191","primary_route":"I70","milepost":182.8},{"ip":"172.16.28.153","primary_route":"I70","milepost":175.2},{"ip":"172.16.28.213","primary_route":"I70","milepost":173.6},{"ip":"172.16.28.165","primary_route":"I70","milepost":172.1},{"ip":"172.16.28.135","primary_route":"I70","milepost":171.8},{"ip":"172.16.28.156","primary_route":"I70","milepost":170.5},{"ip":"172.16.28.233","primary_route":"I70","milepost":169.52},{"ip":"172.16.28.235","primary_route":"I70","milepost":208.91},{"ip":"172.16.28.197","primary_route":"I70","milepost":207.04},{"ip":"172.16.28.154","primary_route":"I70","milepost":206.84},{"ip":"172.16.28.163","primary_route":"I70","milepost":205.7},{"ip":"172.16.28.202","primary_route":"I70","milepost":205},{"ip":"172.16.28.220","primary_route":"I70","milepost":203.3},{"ip":"172.16.28.214","primary_route":"I70","milepost":202.35},{"ip":"172.16.28.219","primary_route":"I70","milepost":200.68},{"ip":"10.11.81.27","primary_route":"Region 1","milepost":0.14},{"ip":"10.11.81.25","primary_route":"Region 1","milepost":0.12},{"ip":"10.11.81.24","primary_route":"Region 1","milepost":0.11},{"ip":"10.11.81.23","primary_route":"Region 1","milepost":0.9},{"ip":"10.11.81.28","primary_route":"Region 1","milepost":0.15},{"ip":"10.11.81.22","primary_route":"Region 1","milepost":0.8},{"ip":"10.11.81.21","primary_route":"Region 1","milepost":0.7},{"ip":"10.11.81.20","primary_route":"Region 1","milepost":0.6},{"ip":"10.11.81.14","primary_route":"Region 1","milepost":0.3},{"ip":"10.11.81.18","primary_route":"Region 1","milepost":0.4},{"ip":"172.16.28.54","primary_route":"I25","milepost":182.7},{"ip":"172.16.28.138","primary_route":"I70","milepo -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}]}]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTabRsu.js:80 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTabRsu.js:80 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTabRsu.js:80 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTabRsu.js:80 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -(anonymous) @ AdminOrganizationTab.js:62 -invokePassiveEffectCreate @ react-dom.development.js:20262 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -flushPassiveEffectsImpl @ react-dom.development.js:20332 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushPassiveEffects @ react-dom.development.js:20228 -performSyncWorkOnRoot @ react-dom.development.js:19229 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}]}]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[{"ip":"1.1.1.1","primary_route":"C470","milepost":1}]},"allowed_selections":{"user_roles":["user","operator","admin"]}} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"1.1.1.1","geo_position":{"latitude":12,"longitude":23},"milepost":1,"primary_route":"C470","serial_number":"1234","scms_id":"1234","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["testorg","brandon_test_org"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} -api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND BODY {"orig_name":"brandon_test_org","name":"brandon_test_org","users_to_add":[],"users_to_modify":[],"users_to_remove":[],"rsus_to_add":[],"rsus_to_remove":["1.1.1.1"]} AND RESPONSE {"message":"Organization successfully modified"} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:51 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[{"email":"test@test.com","first_name":"test","last_name":"test","role":"admin"}],"org_rsus":[]},"allowed_selections":{"user_roles":["user","operator","admin"]}} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabRsuSlice.js:58 -Promise.then (async) -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabRsuSlice.js:58 -Promise.then (async) -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -refresh.condition.getState.getState @ adminOrganizationTabRsuSlice.js:118 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabRsuSlice.js:58 -Promise.then (async) -rsuDeleteSingle.condition.getState.getState @ adminOrganizationTabRsuSlice.js:57 -await in rsuDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -rsuOnDelete @ AdminOrganizationTabRsu.js:84 -onClick @ AdminOrganizationTabRsu.js:49 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"brandon_test_org","role":"admin"},{"name":"testorg","role":"admin"}]},"allowed_selections":{"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"],"roles":["admin","operator","user"]}} -api-helper.js:194 PATCH REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND BODY {"orig_name":"brandon_test_org","name":"brandon_test_org","users_to_add":[],"users_to_modify":[],"users_to_remove":[{"email":"test@test.com","role":"admin"}],"rsus_to_add":[],"rsus_to_remove":[]} AND RESPONSE {"message":"Organization successfully modified"} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:75 -await in userDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -userOnDelete @ AdminOrganizationTabUser.js:133 -onClick @ AdminOrganizationTabUser.js:74 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:75 -await in userDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -userOnDelete @ AdminOrganizationTabUser.js:133 -onClick @ AdminOrganizationTabUser.js:74 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -editOrganization @ AdminOrganizationTab.js:77 -userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:75 -await in userDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -userOnDelete @ AdminOrganizationTabUser.js:133 -onClick @ AdminOrganizationTabUser.js:74 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-user WITH QUERY PARAMS [object Object] AND RESPONSE {"user_data":[{"email":"bpayne@trihydro.com","first_name":"Brandon","last_name":"Payne","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"drewjj901@gmail.com","first_name":"Drew","last_name":"Johnston","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"tonyenglish11@gmail.com","first_name":"Tony","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"mwodahl@trihydro.com","first_name":"Marc","last_name":"Wodahl","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"ivan.neaera@gmail.com","first_name":"Ivan","last_name":"Yourshaw","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"jfrye@neaeraconsulting.com","first_name":"Jacob","last_name":"Frye","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"dstephensontrihydro@gmail.com","first_name":"Daniel","last_name":"Stephenson","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"Region 1","role":"admin"}]},{"email":"debbieneaeraconsulting@gmail.com","first_name":"Debbie","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"michaelenglish47374@gmail.com","first_name":"Michael","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"kaylaenglish218@gmail.com","first_name":"Kayla","last_name":"English","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@gmail.com","first_name":"test","last_name":"test2","super_user":false,"organizations":[{"name":"CDOT CV","role":"admin"}]},{"email":"test@test.com","first_name":"test","last_name":"test","super_user":true,"organizations":[{"name":"CDOT CV","role":"admin"},{"name":"testorg","role":"admin"}]}]} -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-org WITH QUERY PARAMS [object Object] AND RESPONSE {"org_data":{"org_users":[],"org_rsus":[]},"allowed_selections":{"user_roles":["user","operator","admin"]}} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -updateTableData @ AdminOrganizationTab.js:66 -refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabUserSlice.js:86 -Promise.then (async) -userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 -await in userDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -userOnDelete @ AdminOrganizationTabUser.js:133 -onClick @ AdminOrganizationTabUser.js:74 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -updateTableData @ AdminOrganizationTab.js:66 -refresh.condition.getState.getState @ adminOrganizationTabUserSlice.js:163 -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ adminOrganizationTabUserSlice.js:86 -Promise.then (async) -userDeleteSingle.condition.getState.getState @ adminOrganizationTabUserSlice.js:85 -await in userDeleteSingle.condition.getState.getState (async) -(anonymous) @ redux-toolkit.esm.js:1461 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -userOnDelete @ AdminOrganizationTabUser.js:133 -onClick @ AdminOrganizationTabUser.js:74 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -discreteUpdates$1 @ react-dom.development.js:19362 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":{"ip":"1.1.1.1","geo_position":{"latitude":12,"longitude":23},"milepost":1,"primary_route":"C470","serial_number":"1234","scms_id":"1234","model":"Commsignia ITS-RS4-M","ssh_credential_group":"Commsignia BUILD","snmp_credential_group":"Commsignia BUILD","snmp_version_group":"12.18","organizations":["testorg"]},"allowed_selections":{"primary_routes":["C470","I225","I25","I270","I70","I76","Region 1"],"rsu_models":["Commsignia ITS-RS4-M","Kapsch RIS-9160","Kapsch RIS-9260","Kapsch RIS-9360","Yunex RSU2X US"],"ssh_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_credential_groups":["Commsignia BUILD","I70","Region 1","Yunex BUILD"],"snmp_version_groups":["12.18","4.1"],"organizations":["brandon_test_org","CDOT CV","Region 1","testorg"]}} -api-helper.js:151 DELETE REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"message":"RSU successfully deleted"} -index.js:27 [DEPRECATED] default export is deprecated, instead import { create } from'zustand' -react @ index.js:27 -createStore @ LocalizationStore.js:52 -createStore @ LocalizationStore.js:172 -Provider @ context.js:15 -renderWithHooks @ react-dom.development.js:12980 -mountIndeterminateComponent @ react-dom.development.js:15463 -beginWork @ react-dom.development.js:16517 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -onDelete @ AdminRsuTab.js:96 -onClick @ AdminRsuTab.js:52 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -data-manager.js:433 The table requires all rows to have an unique id property. A row was provided without id in the rows prop. To prevent the loss of state between renders, please provide an unique id for each row. -setData @ data-manager.js:433 -setDataManagerFields @ material-table.js:694 -MaterialTable @ material-table.js:590 -constructClassInstance @ react-dom.development.js:11097 -updateClassComponent @ react-dom.development.js:15140 -beginWork @ react-dom.development.js:16536 -beginWork$1 @ react-dom.development.js:20634 -performUnitOfWork @ react-dom.development.js:19666 -workLoopSync @ react-dom.development.js:19611 -renderRootSync @ react-dom.development.js:19581 -performSyncWorkOnRoot @ react-dom.development.js:19251 -(anonymous) @ react-dom.development.js:9937 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -flushSyncCallbackQueueImpl @ react-dom.development.js:9933 -flushSyncCallbackQueue @ react-dom.development.js:9922 -batchedUpdates$1 @ react-dom.development.js:19333 -notify @ Subscription.js:15 -notifyNestedSubs @ Subscription.js:73 -handleChangeWrapper @ Subscription.js:77 -dispatch @ redux.js:265 -s @ VM10:3 -(anonymous) @ redux-toolkit.esm.js:554 -(anonymous) @ index.js:19 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ redux.js:612 -(anonymous) @ redux-toolkit.esm.js:1493 -step @ redux-toolkit.esm.js:95 -(anonymous) @ redux-toolkit.esm.js:44 -fulfilled @ redux-toolkit.esm.js:142 -Promise.then (async) -step @ redux-toolkit.esm.js:155 -(anonymous) @ redux-toolkit.esm.js:157 -__async @ redux-toolkit.esm.js:139 -(anonymous) @ redux-toolkit.esm.js:1423 -(anonymous) @ redux-toolkit.esm.js:1499 -(anonymous) @ index.js:16 -(anonymous) @ redux-toolkit.esm.js:430 -dispatch @ VM10:6 -onDelete @ AdminRsuTab.js:96 -onClick @ AdminRsuTab.js:52 -ReactConfirmAlert._this.handleClickButton @ index.js:70 -onClick @ index.js:147 -callCallback @ react-dom.development.js:3555 -invokeGuardedCallbackDev @ react-dom.development.js:3599 -invokeGuardedCallback @ react-dom.development.js:3654 -invokeGuardedCallbackAndCatchFirstError @ react-dom.development.js:3668 -executeDispatch @ react-dom.development.js:7290 -processDispatchQueueItemsInOrder @ react-dom.development.js:7316 -processDispatchQueue @ react-dom.development.js:7327 -dispatchEventsForPlugins @ react-dom.development.js:7336 -(anonymous) @ react-dom.development.js:7514 -batchedEventUpdates$1 @ react-dom.development.js:19341 -batchedEventUpdates @ react-dom.development.js:3378 -dispatchEventForPluginEventSystem @ react-dom.development.js:7513 -attemptToDispatchEvent @ react-dom.development.js:5302 -dispatchEvent @ react-dom.development.js:5235 -unstable_runWithPriority @ scheduler.development.js:401 -runWithPriority$1 @ react-dom.development.js:9891 -discreteUpdates$1 @ react-dom.development.js:19356 -discreteUpdates @ react-dom.development.js:3388 -dispatchDiscreteEvent @ react-dom.development.js:5205 -api-helper.js:67 GET CODES REQUEST MADE TO https://dev-api.cv.codot.gov//admin-rsu WITH QUERY PARAMS [object Object] AND RESPONSE {"rsu_data":[{"ip":"172.16.28.219","geo_position":{"latitude":39.57312,"longitude":-106.11322},"milepost":200.68,"primary_route":"I70","serial_number":"RSE00331","scms_id":"RSE00331","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.209","geo_position":{"latitude":39.57817,"longitude":-106.11222},"milepost":201.1,"primary_route":"I70","serial_number":"RSE00341","scms_id":"RSE00341","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.214","geo_position":{"latitude":39.59222,"longitude":-106.09605},"milepost":202.35,"primary_route":"I70","serial_number":"RSE00316","scms_id":"RSE00316","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.220","geo_position":{"latitude":39.60247,"longitude":-106.08566},"milepost":203.3,"primary_route":"I70","serial_number":"RZQ00085","scms_id":"RZQ00085","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.185","geo_position":{"latitude":39.61979,"longitude":-106.07284},"milepost":204.67,"primary_route":"I70","serial_number":"SEM00009","scms_id":"SEM00009","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.202","geo_position":{"latitude":39.62442,"longitude":-106.07247},"milepost":205,"primary_route":"I70","serial_number":"RSE00330","scms_id":"RSE00330","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.163","geo_position":{"latitude":39.63075,"longitude":-106.06272},"milepost":205.7,"primary_route":"I70","serial_number":"RFS00073","scms_id":"RFS00073","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.154","geo_position":{"latitude":39.63993,"longitude":-106.04507},"milepost":206.84,"primary_route":"I70","serial_number":"RSE00334","scms_id":"RSE00334","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.197","geo_position":{"latitude":39.6414,"longitude":-106.04239},"milepost":207.04,"primary_route":"I70","serial_number":"RSE00315","scms_id":"RSE00315","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.235","geo_position":{"latitude":39.65298,"longitude":-106.01213},"milepost":208.91,"primary_route":"I70","serial_number":"RZQ00084","scms_id":"RZQ00084","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.184","geo_position":{"latitude":39.65664,"longitude":-105.99598},"milepost":209.8,"primary_route":"I70","serial_number":"RFS00074","scms_id":"RFS00074","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.233","geo_position":{"latitude":39.62009,"longitude":-106.47159},"milepost":169.52,"primary_route":"I70","serial_number":"RSE00308","scms_id":"RSE00308","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.156","geo_position":{"latitude":39.61257,"longitude":-106.45896},"milepost":170.5,"primary_route":"I70","serial_number":"SEM00004","scms_id":"SEM00004","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.135","geo_position":{"latitude":39.61471,"longitude":-106.44254},"milepost":171.8,"primary_route":"I70","serial_number":"RZQ00090","scms_id":"RZQ00090","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.165","geo_position":{"latitude":39.61624,"longitude":-106.43809},"milepost":172.1,"primary_route":"I70","serial_number":"SPP00068","scms_id":"SPP00068","model":"Kapsch RIS-9260","ssh_credential_group":"I70","snmp_credential_group":"I70","snmp_version_group":"4.1","organizations":["CDOT CV"]},{"ip":"172.16.28.213","geo_position":{"latitude":39.63075,"longitude":-106.41669},"milepost":173.6,"primary_route":"I70","serial_number":"SEF00744","scms_id":"SEF00744","model":"Kapsch RIS-9260","ssh_credential_group":"I -api-helper.js:32 GET REQUEST MADE TO https://dev-api.cv.codot.gov//rsuinfo WITH QUERY PARAMS [object Object] AND RESPONSE {"rsuList":[{"id":317,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.004905,39.761463]},"properties":{"rsu_id":317,"milepost":212.05,"geography":"0101000020E61000008FA50F5D50405AC0990E9D9E77E14340","model_name":"RSU2X US","ipv4_address":"172.16.28.92","primary_route":"I25","serial_number":"SPLP7101396","manufacturer_name":"Yunex"}},{"id":1,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.35329,39.64216]},"properties":{"rsu_id":1,"milepost":177.3,"geography":"0101000020E61000003F00A94D9C965AC05166834C32D24340","model_name":"RIS-9260","ipv4_address":"172.16.28.204","primary_route":"I70","serial_number":"RSE00333","manufacturer_name":"Kapsch"}},{"id":318,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.017186,39.75141]},"properties":{"rsu_id":318,"milepost":211.1,"geography":"0101000020E6100000BDFC4E9319415AC095F1EF332EE04340","model_name":"RSU2X US","ipv4_address":"172.16.28.93","primary_route":"I25","serial_number":"SPLP7101384","manufacturer_name":"Yunex"}},{"id":68,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20139,39.7028]},"properties":{"rsu_id":68,"milepost":259.12,"geography":"0101000020E610000074EFE192E34C5AC07DD0B359F5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.236","primary_route":"I70","serial_number":"RSE00328","manufacturer_name":"Kapsch"}},{"id":43,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.53613,39.74438]},"properties":{"rsu_id":43,"milepost":238.8,"geography":"0101000020E6100000E31934F44F625AC0F3E505D847DF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.166","primary_route":"I70","serial_number":"RFS00085","manufacturer_name":"Kapsch"}},{"id":41,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.66319,39.75177]},"properties":{"rsu_id":41,"milepost":231.2,"geography":"0101000020E6100000314278B4716A5AC0950ED6FF39E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.168","primary_route":"I70","serial_number":"SPP00062","manufacturer_name":"Kapsch"}},{"id":3,"type":"Feature","geometry":{"type":"Point","coordinates":[-106.11222,39.57817]},"properties":{"rsu_id":3,"milepost":201.1,"geography":"0101000020E6100000417DCB9C2E875AC0A0C37C7901CA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.209","primary_route":"I70","serial_number":"RSE00341","manufacturer_name":"Kapsch"}},{"id":42,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.55402,39.75219]},"properties":{"rsu_id":42,"milepost":237.67,"geography":"0101000020E61000001D554D1075635AC06A300DC347E04340","model_name":"RIS-9260","ipv4_address":"172.16.28.237","primary_route":"I70","serial_number":"RFS00090","manufacturer_name":"Kapsch"}},{"id":58,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.46388,39.74698]},"properties":{"rsu_id":58,"milepost":242.7,"geography":"0101000020E61000002F51BD35B05D5AC00F62670A9DDF4340","model_name":"RIS-9260","ipv4_address":"172.16.28.222","primary_route":"I70","serial_number":"SEM00010","manufacturer_name":"Kapsch"}},{"id":67,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.20242,39.70149]},"properties":{"rsu_id":67,"milepost":259.01,"geography":"0101000020E61000009B030473F44C5AC04B3CA06CCAD94340","model_name":"RIS-9260","ipv4_address":"172.16.28.200","primary_route":"I70","serial_number":"SPP00067","manufacturer_name":"Kapsch"}},{"id":66,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.23415,39.69836]},"properties":{"rsu_id":66,"milepost":257,"geography":"0101000020E6100000F0164850FC4E5AC0D36A48DC63D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.174","primary_route":"I70","serial_number":"RSE00322","manufacturer_name":"Kapsch"}},{"id":65,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.24034,39.70134]},"properties":{"rsu_id":65,"milepost":256.6,"geography":"0101000020E6100000ECFA05BB614F5AC036B05582C5D94340","model_name":"RIS-9260","ipv4_address":"172.16.28.133","primary_route":"I70","serial_number":"RFS00079","manufacturer_name":"Kapsch"}},{"id":63,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.27525,39.7061]},"properties":{"rsu_id":63,"milepost":254.7,"geography":"0101000020E6100000560E2DB29D515AC051DA1B7C61DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.167","primary_route":"I70","serial_number":"RFS00081","manufacturer_name":"Kapsch"}},{"id":62,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.2943,39.71053]},"properties":{"rsu_id":62,"milepost":253.55,"geography":"0101000020E61000009FCDAACFD5525AC0D769A4A5F2DA4340","model_name":"RIS-9260","ipv4_address":"172.16.28.151","primary_route":"I70","serial_number":"RSE00309","manufacturer_name":"Kapsch"}},{"id":61,"type":"Feature","geometry":{"type":"Point","coordinates":[-105.32399,39.70569]},"properties":{"rsu_id":61,"milepost":251.7,"geography":"0101000020E6100000C98E8D40BC545AC09F8EC70C54DA4340","model_name":"RIS- -api-helper.js:108 POST REQUEST MADE TO https://dev-api.cv.codot.gov//rsu-bsm-data WITH QUERY PARAMS [object Object] AND BODY {"start":"2023-11-13T10:49:44.000-07:00","end":"2023-11-13T13:54:07.673-07:00","geometry":[[-105.18395329918614,39.796286821490156],[-105.2825684187572,39.73832183013596],[-105.27676752937091,39.675843426647134],[-105.11086209291594,39.666020248412025],[-105.07025586721028,39.756162409815744],[-105.09693995838809,39.794504011035855],[-105.18395329918614,39.796286821490156]]} AND RESPONSE [] diff --git a/webapp/src/components/Header.tsx b/webapp/src/components/Header.tsx index 54981b197..ad27503e1 100644 --- a/webapp/src/components/Header.tsx +++ b/webapp/src/components/Header.tsx @@ -1,5 +1,5 @@ import React, { useEffect } from 'react' -import Grid from '@mui/material/Grid' +import Grid2 from '@mui/material/Grid2' import logo from '../icons/logo.png' import EnvironmentVars from '../EnvironmentVars' import { @@ -60,12 +60,12 @@ const Header = () => {
{authLoginData && keycloak?.authenticated ? ( ) : (
- - + +

{EnvironmentVars.DOT_NAME} CV Manager

-
+ {loginFailure &&

{loginMessage}

}
{loginFailure && ( @@ -107,7 +107,7 @@ const Header = () => {
{loginFailure && } - +
)}
diff --git a/webapp/src/components/intersections/ConfigurationPage.tsx b/webapp/src/components/intersections/ConfigurationPage.tsx index 27b4e6d43..e65856325 100644 --- a/webapp/src/components/intersections/ConfigurationPage.tsx +++ b/webapp/src/components/intersections/ConfigurationPage.tsx @@ -5,7 +5,7 @@ import { Card, Container, Divider, - Grid, + Grid2, InputAdornment, Stack, Tab, @@ -172,13 +172,13 @@ const Page = () => { m: -1, }} > - - + + Configuration Parameters - - + + { }} > - + - + - - + + diff --git a/webapp/src/components/intersections/DecoderPage.tsx b/webapp/src/components/intersections/DecoderPage.tsx index 227edecba..593e70890 100644 --- a/webapp/src/components/intersections/DecoderPage.tsx +++ b/webapp/src/components/intersections/DecoderPage.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react' -import { Box, Container, Grid, Typography } from '@mui/material' +import { Box, Container, Grid2, Typography } from '@mui/material' import DecoderApi from '../../apis/intersections/decoder-api' import { DecoderTables } from '../../features/intersections/decoder/decoder-tables' import { v4 as uuidv4 } from 'uuid' @@ -223,13 +223,13 @@ const DecoderPage = () => { m: -1, }} > - - + + ASN.1 Decoder - - + + { roadRegulatorId={-1} /> - - + + 1. Upload data, either by uploading individual files or pasting the data directly into the text box.
@@ -268,8 +268,8 @@ const DecoderPage = () => {
3. Select BSM messages to view the decoded data. All selected BSM data is shown.
-
-
+ + { path="/" element={
- - + + { value={selectedOrg} onChange={(value) => dispatch(setSelectedOrg(value))} /> - - + + - - + + handleOrgDelete(selectedOrgName)} selectedOrganization={selectedOrgName} /> - - + +
<> diff --git a/webapp/src/features/intersections/assessments/connection-of-travel-assessment.tsx b/webapp/src/features/intersections/assessments/connection-of-travel-assessment.tsx index 7faf889f1..5bee048c9 100644 --- a/webapp/src/features/intersections/assessments/connection-of-travel-assessment.tsx +++ b/webapp/src/features/intersections/assessments/connection-of-travel-assessment.tsx @@ -1,4 +1,4 @@ -import { Card, CardContent, Grid, Typography } from '@mui/material' +import { Card, CardContent, Grid2, Typography } from '@mui/material' import React from 'react' import { BarChart, CartesianGrid, XAxis, YAxis, Legend, Bar, Tooltip, TooltipProps } from 'recharts' import { NameType, ValueType } from 'recharts/types/component/DefaultTooltipContent' @@ -69,11 +69,11 @@ export const ConnectionOfTravelAssessmentCard = (props: { assessment: Connection const hasInvalidEvents = data?.some((item) => item.eventCountInvalid > 0) return ( - + - - + + Connection of Travel Assessment @@ -134,10 +134,10 @@ export const ConnectionOfTravelAssessmentCard = (props: { assessment: Connection )} - - + + - + ) } diff --git a/webapp/src/features/intersections/assessments/lane-direction-of-travel-assessment.tsx b/webapp/src/features/intersections/assessments/lane-direction-of-travel-assessment.tsx index e7a1303cb..5100d6e7b 100644 --- a/webapp/src/features/intersections/assessments/lane-direction-of-travel-assessment.tsx +++ b/webapp/src/features/intersections/assessments/lane-direction-of-travel-assessment.tsx @@ -1,4 +1,4 @@ -import { Card, CardContent, Grid, Typography } from '@mui/material' +import { Card, CardContent, Grid2, Typography } from '@mui/material' import React from 'react' import { BarChart, CartesianGrid, XAxis, YAxis, Legend, Bar, Tooltip, TooltipProps } from 'recharts' import { NameType, ValueType } from 'recharts/types/component/DefaultTooltipContent' @@ -119,11 +119,11 @@ export const LaneDirectionOfTravelAssessmentCard = (props: { } return ( - + - - + + Lane Direction of Travel Assessment @@ -198,10 +198,10 @@ export const LaneDirectionOfTravelAssessmentCard = (props: { })} )} - - + + - + ) } diff --git a/webapp/src/features/intersections/assessments/signal-state-event-assessment.tsx b/webapp/src/features/intersections/assessments/signal-state-event-assessment.tsx index 3bff73c7e..c974368e3 100644 --- a/webapp/src/features/intersections/assessments/signal-state-event-assessment.tsx +++ b/webapp/src/features/intersections/assessments/signal-state-event-assessment.tsx @@ -1,4 +1,4 @@ -import { Card, CardContent, Grid, Typography } from '@mui/material' +import { Card, CardContent, Grid2, Typography } from '@mui/material' import React from 'react' import { BarChart, CartesianGrid, XAxis, YAxis, Legend, Bar, Tooltip, TooltipProps } from 'recharts' import { NameType, ValueType } from 'recharts/types/component/DefaultTooltipContent' @@ -111,11 +111,11 @@ export const SignalStateEventAssessmentCard = (props: { assessment: SignalStateE const hasDark = data?.some((item) => item.darkCount > 0) return ( - + - - + + Signal State Passage Assessment @@ -159,10 +159,10 @@ export const SignalStateEventAssessmentCard = (props: { assessment: SignalStateE )} - - + + - + ) } diff --git a/webapp/src/features/intersections/assessments/stop-line-stop-assessment.tsx b/webapp/src/features/intersections/assessments/stop-line-stop-assessment.tsx index 817e8bef4..47dc7d83c 100644 --- a/webapp/src/features/intersections/assessments/stop-line-stop-assessment.tsx +++ b/webapp/src/features/intersections/assessments/stop-line-stop-assessment.tsx @@ -1,4 +1,4 @@ -import { Card, CardContent, Grid, Typography } from '@mui/material' +import { Card, CardContent, Grid2, Typography } from '@mui/material' import React from 'react' import { BarChart, CartesianGrid, XAxis, YAxis, Legend, Bar, Tooltip, TooltipProps } from 'recharts' import { NameType, ValueType } from 'recharts/types/component/DefaultTooltipContent' @@ -115,11 +115,11 @@ export const StopLineStopAssessmentCard = (props: { assessment: StopLineStopAsse const hasDark = data?.some((item) => item.dark > 0) return ( - + - - + + Signal State Stop Assessment @@ -163,10 +163,10 @@ export const StopLineStopAssessmentCard = (props: { assessment: StopLineStopAsse )} - - + + - + ) } diff --git a/webapp/src/features/intersections/configuration/configuration-create-form.tsx b/webapp/src/features/intersections/configuration/configuration-create-form.tsx index 83cd003a5..a64eeb1f7 100644 --- a/webapp/src/features/intersections/configuration/configuration-create-form.tsx +++ b/webapp/src/features/intersections/configuration/configuration-create-form.tsx @@ -3,7 +3,7 @@ import PropTypes from 'prop-types' import toast from 'react-hot-toast' import * as Yup from 'yup' import { useFormik } from 'formik' -import { Button, Card, CardActions, CardContent, CardHeader, Divider, Grid, TextField } from '@mui/material' +import { Button, Card, CardActions, CardContent, CardHeader, Divider, Grid2, TextField } from '@mui/material' import { useNavigate } from 'react-router-dom' import { selectToken } from '../../../generalSlices/userSlice' import { selectSelectedIntersectionId, selectSelectedRoadRegulatorId } from '../../../generalSlices/intersectionSlice' @@ -59,17 +59,17 @@ export const ConfigParamCreateForm = (props) => { - - + + - - + + - - + + - - + + { required value={formik.values.value} /> - - + + - - + + { /> - - + + - - + + - - + + - - + + { required value={formik.values.value} /> - - + + { disabled value={parameter.description} /> - - + + { - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + diff --git a/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx b/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx index 7b11a8f52..a3f106b4f 100644 --- a/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx +++ b/webapp/src/features/intersections/data-selector/data-selector-edit-form.tsx @@ -13,7 +13,7 @@ import { CardActions, CardContent, Divider, - Grid, + Grid2, TextField, InputLabel, MenuItem, @@ -120,7 +120,7 @@ export const DataSelectorEditForm = (props: { case 'bsm': return ( <> - + - + ) case 'events': return ( <> - + Event Type @@ -145,13 +145,13 @@ export const DataSelectorEditForm = (props: { selectedValues={formik.values.eventTypes} setValues={(val) => formik.setFieldValue('eventTypes', val)} /> - + ) case 'assessments': return ( <> - + Assessment Type @@ -160,7 +160,7 @@ export const DataSelectorEditForm = (props: { selectedValues={formik.values.assessmentTypes} setValues={(val) => formik.setFieldValue('assessmentTypes', val)} /> - + ) default: @@ -174,8 +174,8 @@ export const DataSelectorEditForm = (props: { {/* */} - - + + Intersection ID - - + + - - + + formik.setFieldValue('startDate', e as Date | null, true)} /> - - + + - + {getTypeSpecificFilters(formik.values.type)} - + void }) = mt: 3, }} > - - + + - - + + diff --git a/webapp/src/features/intersections/data-selector/event-data-table.tsx b/webapp/src/features/intersections/data-selector/event-data-table.tsx index 70b584b9e..9c9b38f25 100644 --- a/webapp/src/features/intersections/data-selector/event-data-table.tsx +++ b/webapp/src/features/intersections/data-selector/event-data-table.tsx @@ -1,4 +1,4 @@ -import { Box, Button, Card, Container, Divider, Grid, TextFieldProps, CardHeader } from '@mui/material' +import { Box, Button, Card, Container, Divider, Grid2, TextFieldProps, CardHeader } from '@mui/material' import { EventListResults } from './event-list-results' import React, { useEffect, useState, useRef } from 'react' @@ -53,8 +53,8 @@ export const EventDataTable = (props: { mt: 3, }} > - - + + - - + + diff --git a/webapp/src/features/intersections/notifications/notifications-table.tsx b/webapp/src/features/intersections/notifications/notifications-table.tsx index ae998d5d2..259a3e098 100644 --- a/webapp/src/features/intersections/notifications/notifications-table.tsx +++ b/webapp/src/features/intersections/notifications/notifications-table.tsx @@ -4,7 +4,7 @@ import { Card, Container, Divider, - Grid, + Grid2, InputAdornment, Stack, Tab, @@ -159,13 +159,13 @@ export const NotificationsTable = (props: { simple: Boolean }) => { m: -1, }} > - - + + Notifications - - + + { mt: 3, }} > - - + + - - + + diff --git a/webapp/src/features/intersections/reports/report-request-edit-form.tsx b/webapp/src/features/intersections/reports/report-request-edit-form.tsx index 12ef0c14c..42d4474ec 100644 --- a/webapp/src/features/intersections/reports/report-request-edit-form.tsx +++ b/webapp/src/features/intersections/reports/report-request-edit-form.tsx @@ -5,7 +5,7 @@ import { useFormik } from 'formik' import { LocalizationProvider } from '@mui/x-date-pickers' import { AdapterDateFns } from '@mui/x-date-pickers/AdapterDateFns' import { DateTimePicker } from '@mui/x-date-pickers/DateTimePicker' -import { Button, Card, CardActions, CardContent, Divider, Grid, TextField } from '@mui/material' +import { Button, Card, CardActions, CardContent, Divider, Grid2, TextField } from '@mui/material' type Props = { onGenerateReport: ({ @@ -65,8 +65,8 @@ export const ReportRequestEditForm = (props: Props) => { - - + + { onChange={formik.handleChange} value={formik.values.intersectionId} /> - - + + { disableFuture /> - - + + { disableFuture /> - - + + - + {activeLayers.includes('rsu-layer') && (
@@ -756,7 +756,7 @@ function MapPage(props: MapPageProps) { />
) : null} -
+ Date: Wed, 16 Oct 2024 10:32:06 -0600 Subject: [PATCH 11/27] Updating test snapshots --- webapp/src/__snapshots__/App.test.tsx.snap | 6 +- .../AdminFormManager.test.tsx.snap | 193 ++++++++++-------- .../__snapshots__/Header.test.tsx.snap | 4 +- .../__snapshots__/SnmpwalkMenu.test.tsx.snap | 3 - .../AdminOrganizationTab.test.tsx.snap | 193 ++++++++++-------- ...nOrganizationTabIntersection.test.tsx.snap | 63 +++--- .../AdminOrganizationTabRsu.test.tsx.snap | 63 +++--- .../AdminOrganizationTabUser.test.tsx.snap | 63 +++--- .../__snapshots__/DisplayCounts.test.tsx.snap | 52 +++-- .../pages/__snapshots__/Admin.test.tsx.snap | 3 - .../src/pages/__snapshots__/Map.test.tsx.snap | 60 +++--- 11 files changed, 365 insertions(+), 338 deletions(-) diff --git a/webapp/src/__snapshots__/App.test.tsx.snap b/webapp/src/__snapshots__/App.test.tsx.snap index 4270f02c6..2b47d5b30 100644 --- a/webapp/src/__snapshots__/App.test.tsx.snap +++ b/webapp/src/__snapshots__/App.test.tsx.snap @@ -6,7 +6,7 @@ exports[`should take a snapshot 1`] = ` id="masterdiv" >
@@ -14,11 +14,11 @@ exports[`should take a snapshot 1`] = ` id="frontpage" >
Logo
diff --git a/webapp/src/features/adminOrganizationTab/__snapshots__/AdminOrganizationTab.test.tsx.snap b/webapp/src/features/adminOrganizationTab/__snapshots__/AdminOrganizationTab.test.tsx.snap index 34d719cf1..554adc5a2 100644 --- a/webapp/src/features/adminOrganizationTab/__snapshots__/AdminOrganizationTab.test.tsx.snap +++ b/webapp/src/features/adminOrganizationTab/__snapshots__/AdminOrganizationTab.test.tsx.snap @@ -62,10 +62,10 @@ exports[`should take a snapshot 1`] = `
Select start date @@ -87,24 +84,24 @@ exports[`should take a snapshot 1`] = ` class="MuiFormControl-root MuiTextField-root css-mocked-MuiFormControl-root-MuiTextField-root" >
-
Select end date @@ -161,19 +155,19 @@ exports[`should take a snapshot 1`] = ` class="css-mocked-a11yText-A11yText" />
Select Message Type