Merge branch 'staging_environment' into dev_environment
This commit is contained in:
commit
ea2ba42024
8 changed files with 54 additions and 36 deletions
|
|
@ -60,7 +60,7 @@ function App() {
|
||||||
<AuthWrapper setToken={setToken}>
|
<AuthWrapper setToken={setToken}>
|
||||||
{ token ?
|
{ token ?
|
||||||
<HTTPProvider token={token}>
|
<HTTPProvider token={token}>
|
||||||
<UserWrapper />
|
<UserWrapper token={token} />
|
||||||
</HTTPProvider>
|
</HTTPProvider>
|
||||||
:
|
:
|
||||||
<LoadingScreen
|
<LoadingScreen
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import { Team } from '../models/team'
|
||||||
import { makeStyles } from '@mui/styles'
|
import { makeStyles } from '@mui/styles'
|
||||||
import { CssBaseline, Theme } from '@mui/material'
|
import { CssBaseline, Theme } from '@mui/material'
|
||||||
import { AppThemeProvider } from 'theme/AppThemeProvider'
|
import { AppThemeProvider } from 'theme/AppThemeProvider'
|
||||||
|
import HTTPProvider from 'providers/http'
|
||||||
// import FirmwareLoader from './FirmwareLoader'
|
// import FirmwareLoader from './FirmwareLoader'
|
||||||
|
|
||||||
const reducer = (state: GlobalState, action: GlobalStateAction): GlobalState => {
|
const reducer = (state: GlobalState, action: GlobalStateAction): GlobalState => {
|
||||||
|
|
@ -48,10 +49,15 @@ const globalDefault = {
|
||||||
showErrors: false,
|
showErrors: false,
|
||||||
userTeamPermissions: [],
|
userTeamPermissions: [],
|
||||||
backgroundTasksComplete: false,
|
backgroundTasksComplete: false,
|
||||||
firmware: new Map()
|
firmware: new Map(),
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function UserWrapper() {
|
interface Props {
|
||||||
|
token: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function UserWrapper(props: Props) {
|
||||||
|
const { token } = props;
|
||||||
const [loading, setLoading] = useState(false)
|
const [loading, setLoading] = useState(false)
|
||||||
const userAPI = useUserAPI();
|
const userAPI = useUserAPI();
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
|
|
@ -98,7 +104,9 @@ export default function UserWrapper() {
|
||||||
<AppThemeProvider >
|
<AppThemeProvider >
|
||||||
<CssBaseline/>
|
<CssBaseline/>
|
||||||
<main className={classes.appContent}>
|
<main className={classes.appContent}>
|
||||||
<NavigationContainer />
|
<HTTPProvider token={token}>
|
||||||
|
<NavigationContainer />
|
||||||
|
</HTTPProvider>
|
||||||
</main>
|
</main>
|
||||||
</AppThemeProvider>
|
</AppThemeProvider>
|
||||||
</StateProvider>
|
</StateProvider>
|
||||||
|
|
|
||||||
|
|
@ -288,7 +288,9 @@ export default function SmartBreadcrumb(props: Props) {
|
||||||
return [linkComponent("/", "Dashboard", true)];
|
return [linkComponent("/", "Dashboard", true)];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prependPaths) pathnames.unshift(...prependPaths)
|
// if (prependPaths) pathnames.unshift(...prependPaths)
|
||||||
|
// if (prependPaths) pathnames.push(...prependPaths)
|
||||||
|
if (prependPaths) pathnames.splice(pathnames.length - 1, 0, ...prependPaths);
|
||||||
|
|
||||||
//console.log(pathnames)
|
//console.log(pathnames)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -47,11 +47,12 @@ interface Props {
|
||||||
devices: Device[];
|
devices: Device[];
|
||||||
permissions: pond.Permission[];
|
permissions: pond.Permission[];
|
||||||
refreshCallback: () => void;
|
refreshCallback: () => void;
|
||||||
|
removeCallback?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function GroupActions(props: Props) {
|
export default function GroupActions(props: Props) {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const { group, permissions, refreshCallback, devices } = props;
|
const { group, permissions, refreshCallback, devices, removeCallback } = props;
|
||||||
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
|
const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);
|
||||||
const [groupSettingsOpen, setGroupSettingsOpen] = useState(false);
|
const [groupSettingsOpen, setGroupSettingsOpen] = useState(false);
|
||||||
const [shareOpen, setShareOpen] = useState(false);
|
const [shareOpen, setShareOpen] = useState(false);
|
||||||
|
|
@ -142,6 +143,7 @@ export default function GroupActions(props: Props) {
|
||||||
isDialogOpen={groupSettingsOpen}
|
isDialogOpen={groupSettingsOpen}
|
||||||
refreshCallback={refreshCallback}
|
refreshCallback={refreshCallback}
|
||||||
closeDialogCallback={() => setGroupSettingsOpen(false)}
|
closeDialogCallback={() => setGroupSettingsOpen(false)}
|
||||||
|
removeGroupCallback={removeCallback}
|
||||||
groupDevices={devices}
|
groupDevices={devices}
|
||||||
/>
|
/>
|
||||||
<ShareObject
|
<ShareObject
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@ import { groupsAreEqual } from "pbHelpers/Group";
|
||||||
import { useGlobalState } from "providers";
|
import { useGlobalState } from "providers";
|
||||||
import React, { useCallback, useEffect, useState } from "react";
|
import React, { useCallback, useEffect, useState } from "react";
|
||||||
import RemoveGroup from "./RemoveGroup";
|
import RemoveGroup from "./RemoveGroup";
|
||||||
|
import { pond } from "protobuf-ts/pond";
|
||||||
|
|
||||||
const useStyles = makeStyles((theme: Theme) => {
|
const useStyles = makeStyles((theme: Theme) => {
|
||||||
return ({
|
return ({
|
||||||
|
|
@ -63,6 +64,7 @@ interface Props {
|
||||||
canEdit?: boolean;
|
canEdit?: boolean;
|
||||||
groupDevices?: Device[];
|
groupDevices?: Device[];
|
||||||
removeGroupCallback?: Function;
|
removeGroupCallback?: Function;
|
||||||
|
addGroupCallback?: (group: pond.GroupSettings) => void
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function GroupSettings(props: Props) {
|
export default function GroupSettings(props: Props) {
|
||||||
|
|
@ -77,6 +79,7 @@ export default function GroupSettings(props: Props) {
|
||||||
canEdit,
|
canEdit,
|
||||||
groupDevices,
|
groupDevices,
|
||||||
removeGroupCallback,
|
removeGroupCallback,
|
||||||
|
addGroupCallback,
|
||||||
} = props;
|
} = props;
|
||||||
const prevInitialGroup = usePrevious(initialGroup);
|
const prevInitialGroup = usePrevious(initialGroup);
|
||||||
const [{as}] = useGlobalState();
|
const [{as}] = useGlobalState();
|
||||||
|
|
@ -96,15 +99,6 @@ export default function GroupSettings(props: Props) {
|
||||||
|
|
||||||
const [groupDeviceNumbers, setGroupDeviceNumbers] = useState<number[]>([])
|
const [groupDeviceNumbers, setGroupDeviceNumbers] = useState<number[]>([])
|
||||||
|
|
||||||
// Use a ref to store removeGroupCallback
|
|
||||||
const removeCallbackRef = React.useRef(removeGroupCallback);
|
|
||||||
|
|
||||||
// Update ref when prop changes
|
|
||||||
useEffect(() => {
|
|
||||||
console.log("Updating removeCallbackRef with:", removeGroupCallback);
|
|
||||||
removeCallbackRef.current = removeGroupCallback;
|
|
||||||
}, [removeGroupCallback]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
let newNumbers: number[] = []
|
let newNumbers: number[] = []
|
||||||
groupDevices?.forEach(device => {
|
groupDevices?.forEach(device => {
|
||||||
|
|
@ -116,7 +110,7 @@ export default function GroupSettings(props: Props) {
|
||||||
const loadDevices = useCallback(() => {
|
const loadDevices = useCallback(() => {
|
||||||
setLoadingDevices(true);
|
setLoadingDevices(true);
|
||||||
deviceAPI
|
deviceAPI
|
||||||
.list(1000000, 0, "asc", undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,as)
|
.list(1000000, 0, "asc")
|
||||||
.then((response: any) => {
|
.then((response: any) => {
|
||||||
let rDevices: Device[] = response.data.devices
|
let rDevices: Device[] = response.data.devices
|
||||||
? response.data.devices.map((device: any) => Device.any(device))
|
? response.data.devices.map((device: any) => Device.any(device))
|
||||||
|
|
@ -154,10 +148,13 @@ export default function GroupSettings(props: Props) {
|
||||||
case "add":
|
case "add":
|
||||||
groupAPI
|
groupAPI
|
||||||
.addGroup(group.settings)
|
.addGroup(group.settings)
|
||||||
.then((_response: any) => {
|
.then((response: any) => {
|
||||||
success(groupName + " was successfully created");
|
success(groupName + " was successfully created");
|
||||||
close();
|
close();
|
||||||
refreshCallback();
|
console.log(response)
|
||||||
|
group.settings.groupId = parseInt(response.data.id)
|
||||||
|
if (addGroupCallback) addGroupCallback(group.settings)
|
||||||
|
else refreshCallback();
|
||||||
})
|
})
|
||||||
.catch((err: any) => {
|
.catch((err: any) => {
|
||||||
err.response.data.error
|
err.response.data.error
|
||||||
|
|
@ -482,14 +479,12 @@ export default function GroupSettings(props: Props) {
|
||||||
};
|
};
|
||||||
|
|
||||||
const dialogs = () => {
|
const dialogs = () => {
|
||||||
console.log("dialogs: removeCallbackRef.current =", removeCallbackRef.current); // Log ref
|
|
||||||
console.log("dialogs: removeGroupCallback =", removeGroupCallback); // Log prop
|
|
||||||
return (
|
return (
|
||||||
<RemoveGroup
|
<RemoveGroup
|
||||||
group={group}
|
group={group}
|
||||||
isDialogOpen={isRemoveGroupOpen}
|
isDialogOpen={isRemoveGroupOpen}
|
||||||
closeDialogCallback={closeRemoveGroup}
|
closeDialogCallback={closeRemoveGroup}
|
||||||
removeCallback={removeCallbackRef.current}
|
removeCallback={removeGroupCallback}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,6 @@ import {
|
||||||
import { makeStyles } from "@mui/styles";
|
import { makeStyles } from "@mui/styles";
|
||||||
import { useGroupAPI, useSnackbar } from "hooks";
|
import { useGroupAPI, useSnackbar } from "hooks";
|
||||||
import { Group } from "models";
|
import { Group } from "models";
|
||||||
import { useNavigate } from "react-router-dom";
|
|
||||||
|
|
||||||
const useStyles = makeStyles((theme: Theme) => {
|
const useStyles = makeStyles((theme: Theme) => {
|
||||||
return ({
|
return ({
|
||||||
|
|
@ -30,7 +29,7 @@ interface Props {
|
||||||
|
|
||||||
export default function RemoveGroup(props: Props) {
|
export default function RemoveGroup(props: Props) {
|
||||||
const classes = useStyles();
|
const classes = useStyles();
|
||||||
const navigate = useNavigate();
|
// const navigate = useNavigate();
|
||||||
const groupAPI = useGroupAPI();
|
const groupAPI = useGroupAPI();
|
||||||
const { success, error, warning } = useSnackbar();
|
const { success, error, warning } = useSnackbar();
|
||||||
const { group, isDialogOpen, closeDialogCallback, removeCallback } = props;
|
const { group, isDialogOpen, closeDialogCallback, removeCallback } = props;
|
||||||
|
|
@ -43,12 +42,9 @@ export default function RemoveGroup(props: Props) {
|
||||||
const submit = () => {
|
const submit = () => {
|
||||||
groupAPI
|
groupAPI
|
||||||
.removeGroup(group.id())
|
.removeGroup(group.id())
|
||||||
.then((response: any) => {
|
.then((_response: any) => {
|
||||||
success(groupName + " was successfully removed");
|
success(groupName + " was successfully removed");
|
||||||
// navigate("/groups");
|
|
||||||
console.log(removeCallback)
|
|
||||||
if (removeCallback) removeCallback()
|
if (removeCallback) removeCallback()
|
||||||
// removeCallback()
|
|
||||||
})
|
})
|
||||||
.catch((err: any) => {
|
.catch((err: any) => {
|
||||||
err ? warning(err) : error("Error occured while removing " + groupName);
|
err ? warning(err) : error("Error occured while removing " + groupName);
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,6 @@ export default function Devices() {
|
||||||
};
|
};
|
||||||
|
|
||||||
const removeGroupCallback = useCallback(() => {
|
const removeGroupCallback = useCallback(() => {
|
||||||
console.log("Remove callback");
|
|
||||||
let newGroups = [...groups];
|
let newGroups = [...groups];
|
||||||
newGroups.splice(parseInt(tab), 1);
|
newGroups.splice(parseInt(tab), 1);
|
||||||
setGroups(newGroups);
|
setGroups(newGroups);
|
||||||
|
|
@ -149,6 +148,16 @@ export default function Devices() {
|
||||||
setGroupSettingsIsOpen(false);
|
setGroupSettingsIsOpen(false);
|
||||||
}, [groups, tab]); // Include dependencies
|
}, [groups, tab]); // Include dependencies
|
||||||
|
|
||||||
|
const addGroupCallback = useCallback((groupSettings: pond.GroupSettings) => {
|
||||||
|
let newGroups = [...groups];
|
||||||
|
let group = pond.Group.create({
|
||||||
|
settings: groupSettings
|
||||||
|
})
|
||||||
|
newGroups.push(Group.create(group))
|
||||||
|
setGroups(newGroups);
|
||||||
|
// setTab(groups.length.toString())
|
||||||
|
}, [groups, tab]); // Include dependencies
|
||||||
|
|
||||||
const openGroupSettings = (
|
const openGroupSettings = (
|
||||||
group: Group | undefined,
|
group: Group | undefined,
|
||||||
mode: "add" | "update" | "remove" | undefined
|
mode: "add" | "update" | "remove" | undefined
|
||||||
|
|
@ -162,7 +171,6 @@ export default function Devices() {
|
||||||
setGroupSettingsIsOpen(false);
|
setGroupSettingsIsOpen(false);
|
||||||
setGroupSettingsMode(undefined);
|
setGroupSettingsMode(undefined);
|
||||||
setSelectedGroup(undefined);
|
setSelectedGroup(undefined);
|
||||||
console.log("close callback")
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const getKeys = () => {
|
const getKeys = () => {
|
||||||
|
|
@ -197,7 +205,9 @@ export default function Devices() {
|
||||||
orderGroup,
|
orderGroup,
|
||||||
orderGroupBy,
|
orderGroupBy,
|
||||||
searchGroup,
|
searchGroup,
|
||||||
undefined
|
undefined,
|
||||||
|
getKeys(),
|
||||||
|
getTypes(),
|
||||||
).then(resp => {
|
).then(resp => {
|
||||||
let newGroups: Group[] = []
|
let newGroups: Group[] = []
|
||||||
resp.data.groups?.forEach((group: pond.Group) => {
|
resp.data.groups?.forEach((group: pond.Group) => {
|
||||||
|
|
@ -210,7 +220,6 @@ export default function Devices() {
|
||||||
}
|
}
|
||||||
|
|
||||||
const loadDevices = () => {
|
const loadDevices = () => {
|
||||||
console.log("load callback")
|
|
||||||
setDevicesLoading(true)
|
setDevicesLoading(true)
|
||||||
deviceAPI.list(
|
deviceAPI.list(
|
||||||
limit,
|
limit,
|
||||||
|
|
@ -492,22 +501,24 @@ export default function Devices() {
|
||||||
onRowClick={toDevice}
|
onRowClick={toDevice}
|
||||||
setSearchText={setSearch}
|
setSearchText={setSearch}
|
||||||
isLoading={devicesLoading}
|
isLoading={devicesLoading}
|
||||||
actions={getGroup() && <GroupActions group={getGroup()} permissions={groupPermissions} devices={devices} refreshCallback={loadDevices}/>}
|
actions={getGroup() && <GroupActions removeCallback={removeGroupCallback} group={getGroup()} permissions={groupPermissions} devices={devices} refreshCallback={loadDevices}/>}
|
||||||
/>
|
/>
|
||||||
<ProvisionDevice
|
<ProvisionDevice
|
||||||
isOpen={isProvisionDialogOpen}
|
isOpen={isProvisionDialogOpen}
|
||||||
refreshCallback={loadDevices}
|
refreshCallback={loadDevices}
|
||||||
closeDialogCallback={closeProvisionDialog}
|
closeDialogCallback={closeProvisionDialog}
|
||||||
/>
|
/>
|
||||||
|
{/* This GroupSettings is used for adding */}
|
||||||
<GroupSettings
|
<GroupSettings
|
||||||
initialGroup={selectedGroup}
|
initialGroup={selectedGroup}
|
||||||
mode={groupSettingsMode}
|
mode={groupSettingsMode}
|
||||||
isDialogOpen={groupSettingsIsOpen}
|
isDialogOpen={groupSettingsIsOpen}
|
||||||
closeDialogCallback={closeGroupSettings}
|
closeDialogCallback={closeGroupSettings}
|
||||||
refreshCallback={loadDevices}
|
refreshCallback={() => {}}
|
||||||
canEdit={true}
|
canEdit={true}
|
||||||
groupDevices={devices}
|
groupDevices={devices}
|
||||||
removeGroupCallback={removeGroupCallback}
|
removeGroupCallback={removeGroupCallback}
|
||||||
|
addGroupCallback={addGroupCallback}
|
||||||
/>
|
/>
|
||||||
</PageContainer>
|
</PageContainer>
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -123,10 +123,14 @@ export default function GroupProvider(props: PropsWithChildren<Props>) {
|
||||||
};
|
};
|
||||||
|
|
||||||
const removeGroup = (id: number) => {
|
const removeGroup = (id: number) => {
|
||||||
let url = pondURL("/groups/" + id)
|
const params = {
|
||||||
if (as) url = pondURL("/groups/" + id + "?as=" + as)
|
keys: getContextKeys(),
|
||||||
|
types: getContextTypes(),
|
||||||
|
as: getContextTypes().includes("team") ? undefined : as
|
||||||
|
}
|
||||||
|
pondURL(`/groups/${id}${buildQueryString(params)}`)
|
||||||
return new Promise<AxiosResponse>((resolve, reject) => {
|
return new Promise<AxiosResponse>((resolve, reject) => {
|
||||||
del(url).then(resp => {
|
del(pondURL(`/groups/${id}${buildQueryString(params)}`)).then(resp => {
|
||||||
return resolve(resp)
|
return resolve(resp)
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
return reject(err)
|
return reject(err)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue