Merge branch 'access_object' into dev_environment

This commit is contained in:
Carter 2025-10-21 12:30:35 -06:00
commit deb3fabd45
12 changed files with 72 additions and 43 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -22,6 +22,7 @@ interface Props {
loadMore?: () => void; loadMore?: () => void;
//startingTranslate: number; //startingTranslate: number;
valDisplay?: "high" | "low" | "average"; valDisplay?: "high" | "low" | "average";
insert?: boolean
} }
const useStyles = makeStyles((_theme) => { const useStyles = makeStyles((_theme) => {
@ -39,7 +40,7 @@ const useStyles = makeStyles((_theme) => {
}); });
export default function BinsList(props: Props) { export default function BinsList(props: Props) {
const { bins, duplicateBin, title, gridView, loadMore, valDisplay } = props; const { bins, duplicateBin, title, gridView, loadMore, valDisplay, insert } = props;
const classes = useStyles(); const classes = useStyles();
// const history = useHistory(); // const history = useHistory();
const navigate = useNavigate() const navigate = useNavigate()
@ -114,7 +115,12 @@ export default function BinsList(props: Props) {
{bins.map((b, i) => {bins.map((b, i) =>
( (
<Grid <Grid
size={{ size={insert ? {
xs: 6,
sm: 6,
md: 4,
lg: 3,
} : {
xs: 6, xs: 6,
sm: 4, sm: 4,
md: 3, md: 3,

View file

@ -316,6 +316,7 @@ export default function BinyardDisplay(props: Props) {
<Grid size={12}> <Grid size={12}>
<BinsList <BinsList
gridView gridView
insert
valDisplay="average" valDisplay="average"
bins={grainBins} bins={grainBins}
duplicateBin={duplicateBin} duplicateBin={duplicateBin}
@ -332,6 +333,7 @@ export default function BinyardDisplay(props: Props) {
<Grid size={12}> <Grid size={12}>
<BinsList <BinsList
gridView gridView
insert
valDisplay="average" valDisplay="average"
bins={fertBins} bins={fertBins}
duplicateBin={duplicateBin} duplicateBin={duplicateBin}
@ -348,6 +350,7 @@ export default function BinyardDisplay(props: Props) {
<Grid size={12}> <Grid size={12}>
<BinsList <BinsList
gridView gridView
insert
valDisplay="average" valDisplay="average"
bins={emptyBins} bins={emptyBins}
duplicateBin={duplicateBin} duplicateBin={duplicateBin}

View file

@ -8,6 +8,7 @@ import {
MenuItem, MenuItem,
OutlinedInput, OutlinedInput,
Select, Select,
TextField,
Theme Theme
} from "@mui/material"; } from "@mui/material";
import moment, { Moment } from "moment"; import moment, { Moment } from "moment";
@ -16,6 +17,7 @@ import ReactDOM from "react-dom";
import { DateRangePreset, SetDefaultPreset } from "./DateRange"; import { DateRangePreset, SetDefaultPreset } from "./DateRange";
import ResponsiveDialog from "common/ResponsiveDialog"; import ResponsiveDialog from "common/ResponsiveDialog";
import { withStyles, WithStyles } from "@mui/styles"; import { withStyles, WithStyles } from "@mui/styles";
import { cloneDeep } from "lodash";
const styles = (_theme: Theme) => createStyles({}); const styles = (_theme: Theme) => createStyles({});
@ -249,18 +251,30 @@ class DateSelect extends React.Component<Props, State> {
onClose={this.closeDateRangeDialog} onClose={this.closeDateRangeDialog}
aria-labelledby="date-range-dialog"> aria-labelledby="date-range-dialog">
<DialogContent> <DialogContent>
{/* <StaticDateRangePicker <TextField
disableFuture fullWidth
value={dateRange} margin="normal"
onChange={date => this.updateDateRange(date)} type="date"
renderInput={(startProps, endProps) => ( label="Start Time"
<React.Fragment> value={dateRange[0]?.format("YYYY-MM-DD")}
<TextField {...startProps} /> onChange={e => {
<DateRangeDelimiter> to </DateRangeDelimiter> let range = cloneDeep(dateRange)
<TextField {...endProps} /> range[0] = moment(e.target.value)
</React.Fragment> this.updateDateRange(range)
)} }}
/> */} />
<TextField
fullWidth
margin="normal"
type="date"
label="End Time"
value={dateRange[1]?.format("YYYY-MM-DD")}
onChange={e => {
let range = cloneDeep(dateRange)
range[1] = moment(e.target.value)
this.updateDateRange(range)
}}
/>
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
<Button onClick={this.closeDateRangeDialog} color="primary"> <Button onClick={this.closeDateRangeDialog} color="primary">

View file

@ -42,11 +42,11 @@ const featureVersions: Map<string, FeatureVersionByPlatform> = new Map([
v2Cell: "N/A", v2Cell: "N/A",
v2WifiS3: "N/A", v2WifiS3: "N/A",
v2CellS3: "N/A", v2CellS3: "N/A",
v2CellBlack: "2.1.6", v2CellBlack: "2.1.7",
v2CellGreen: "N/A", v2CellGreen: "N/A",
v2WifiBlue: "2.1.6", v2WifiBlue: "2.1.7",
v2CellBlue: "2.1.6", v2CellBlue: "2.1.7",
v2EthBlue: "2.1.6" v2EthBlue: "2.1.7"
} }
] ]
]); ]);

View file

@ -40,7 +40,7 @@ export default function Heaters() {
.listObjectHeatersPageData(pageSize, tablePage * pageSize, undefined, undefined, searchText, as) .listObjectHeatersPageData(pageSize, tablePage * pageSize, undefined, undefined, searchText, as)
.then(resp => { .then(resp => {
setTotal(resp.data.total) setTotal(resp.data.total)
setHeaters(resp.data.heaterData); setHeaters(resp.data.heaterData ?? []);
}); });
}, [objectHeaterAPI, as, pageSize, tablePage, searchText]); }, [objectHeaterAPI, as, pageSize, tablePage, searchText]);

View file

@ -108,7 +108,8 @@ export default function Users() {
"remove-devices", "remove-devices",
"copy-token", "copy-token",
"recluse", "recluse",
"pause-data" "pause-data",
"access-object"
].sort(); ].sort();
const features = [ const features = [
"admin", "admin",

View file

@ -90,8 +90,7 @@ export default function InteractionProvider(props: PropsWithChildren<Props>) {
) => { ) => {
const view = otherTeam ? otherTeam : as const view = otherTeam ? otherTeam : as
let url = pondURL( let url = pondURL(
"/interactions/forComponents/" + "/interactions/forComponents?componentIds=" +
"?componentIds=" +
fullComponentLocations.toString() + fullComponentLocations.toString() +
(view ? "&as=" + view : "") (view ? "&as=" + view : "")
) )

View file

@ -119,7 +119,7 @@ export default function TeamProvider(props: PropsWithChildren<Props>) {
prefixSearch?: string, prefixSearch?: string,
) => { ) => {
//let asText = team ? "&as=" + team.key() : ""; //let asText = team ? "&as=" + team.key() : "";
const view = otherTeam ? otherTeam : as const view = otherTeam ? otherTeam : (as.length > 0 ? as : undefined)
let url = pondURL( let url = pondURL(
"/teams" + "/teams" +
"?limit=" + "?limit=" +

View file

@ -138,6 +138,7 @@ export default function TaskViewer(props: ViewProps) {
openDialog(); openDialog();
}; };
const loadMultitask = useCallback(() => { const loadMultitask = useCallback(() => {
if (!loadKeys) return; if (!loadKeys) return;
if (loadKeys.length > 0) { if (loadKeys.length > 0) {
@ -146,11 +147,13 @@ export default function TaskViewer(props: ViewProps) {
taskAPI taskAPI
.getMultiTasks(loadKeys, as) .getMultiTasks(loadKeys, as)
.then(resp => { .then(resp => {
resp.data.tasks.forEach(task => { if(resp.data.tasks){
if (task.settings) { resp.data.tasks.forEach(task => {
temp.set(task.key, Task.any(task)); if (task.settings) {
} temp.set(task.key, Task.any(task));
}); }
});
}
setTasks(temp); setTasks(temp);
setLoaded(true); setLoaded(true);
}) })
@ -167,11 +170,13 @@ export default function TaskViewer(props: ViewProps) {
taskAPI taskAPI
.listTasks(50, 0, "asc", "start", undefined, undefined, as, prevMonth, nextMonth) .listTasks(50, 0, "asc", "start", undefined, undefined, as, prevMonth, nextMonth)
.then(resp => { .then(resp => {
resp.data.tasks.forEach(task => { if(resp.data.tasks){
if (task.settings) { resp.data.tasks.forEach(task => {
temp.set(task.key, Task.any(task)); if (task.settings) {
} temp.set(task.key, Task.any(task));
}); }
});
}
setTasks(temp); setTasks(temp);
setLoaded(true); setLoaded(true);
}) })

View file

@ -266,7 +266,7 @@ export default function UserMenu() {
</MenuItem> </MenuItem>
)} )}
<Divider /> <Divider />
{hasAdmin && ( {(hasAdmin || user.allowedTo("access-object")) && (
<Tooltip title="Access Object"> <Tooltip title="Access Object">
<MenuItem onClick={() => openAccessObject()} aria-label="Access Object" dense> <MenuItem onClick={() => openAccessObject()} aria-label="Access Object" dense>
<ListItemIcon> <ListItemIcon>
@ -276,7 +276,7 @@ export default function UserMenu() {
</MenuItem> </MenuItem>
</Tooltip> </Tooltip>
)} )}
<Divider /> {(hasAdmin || user.allowedTo("access-object")) && <Divider /> }
<MenuItem onClick={handleLogout} aria-label="Sign Out" dense> <MenuItem onClick={handleLogout} aria-label="Sign Out" dense>
<ListItemIcon> <ListItemIcon>
<ExitToApp className={classes.red} /> <ExitToApp className={classes.red} />

View file

@ -17,6 +17,7 @@ import FeatureCard from "./FeatureCard";
//import { ImgIcon } from "common/ImgIcon"; //import { ImgIcon } from "common/ImgIcon";
//images to import for the image in the card for the feature make sure to have a 2:1 aspect ratio to keep the cards symmetrical //images to import for the image in the card for the feature make sure to have a 2:1 aspect ratio to keep the cards symmetrical
import FeatureImageTest from "assets/marketplaceImages/VisualFarmMPImage.png"; import FeatureImageTest from "assets/marketplaceImages/VisualFarmMPImage.png";
import LibraCartImage from "assets/marketplaceImages/Libra_Cart_temp.jpg";
// export interface FAQ { // export interface FAQ {
// question: string; // question: string;
@ -62,14 +63,14 @@ const agFeatureList: ProductDetails[] = [
// bulletPoints: ["bullet one", "bullet two"], // bulletPoints: ["bullet one", "bullet two"],
// questions: [], // questions: [],
}, },
// { {
// featureName: "libra-cart", featureName: "libra-cart",
// featureLogo: <LibraCartIcon />, featureLogo: <LibraCartIcon />,
// featureCost: 0, featureCost: 0,
// cardImage: FeatureImageTest, cardImage: LibraCartImage,
// featureTitle: "Libra Cart", featureTitle: "Libra Cart",
// longDescription: "Integrate with Libra Cart to bring your data into our platform" longDescription: "Integrate with Libra Cart to bring your data into our platform"
// } }
]; ];
// const constructionFeatureList: ProductDetails[] = [] // const constructionFeatureList: ProductDetails[] = []