From d19d37410ed41ccc9a989d4285eeb0a36e95a285 Mon Sep 17 00:00:00 2001 From: Carter Date: Fri, 7 Mar 2025 13:09:14 -0600 Subject: [PATCH] added view as button to user menu --- src/teams/TeamList.tsx | 30 ++++++++++++++++++++++++------ src/user/UserMenu.tsx | 40 ++++++++++++++++++++++++++++++++++++---- 2 files changed, 60 insertions(+), 10 deletions(-) diff --git a/src/teams/TeamList.tsx b/src/teams/TeamList.tsx index 886c811..4f0c431 100644 --- a/src/teams/TeamList.tsx +++ b/src/teams/TeamList.tsx @@ -9,6 +9,7 @@ import { ListItemButton, Box, IconButton, + Grid2, } from "@mui/material"; import { pond } from "protobuf-ts/pond"; import { useGlobalState, useSnackbar, useTeamAPI, useUserAPI } from "providers"; @@ -59,7 +60,7 @@ export default function TeamList() { const history = useNavigate(); const isMobile = useMobile() const snackbar = useSnackbar(); - const [{ user, as }] = useGlobalState(); + const [{ user, as, team }] = useGlobalState(); const [teamPerms, setTeamPerms] = useState>(new Map()); const [teamPrefs, setTeamPrefs] = useState >(new Map()); const [total, setTotal] = useState(0); @@ -73,13 +74,17 @@ export default function TeamList() { setLoading(true); let newTeamPerms: Map = new Map(); let newTeamPrefs: Map = new Map(); + let viewAs: string | undefined = as + if (as === team.key()) { + viewAs = undefined + } teamAPI - .listTeams(limit, limit * page, undefined, "name", undefined, undefined, as, search) + .listTeams(limit, limit * page, undefined, "name", undefined, undefined, viewAs, search) .then(resp => { setTotal(resp.data.total ? resp.data.total : 0); let newTeams: Team[] = [] resp.data.teams.forEach(team => { - let u = as ? as : user.id(); + let u = viewAs ? viewAs : user.id(); let t = Team.create(team) if (team.settings && u !== "") { userAPI @@ -207,9 +212,22 @@ export default function TeamList() { const renderTitle = () => { return ( - - Teams - + + + + + {user.name()}'s Teams + + + + + All teams you are a member of. + + + + setTeamDialogOpen(true)} color="primary" className={classes.button}> diff --git a/src/user/UserMenu.tsx b/src/user/UserMenu.tsx index c7fa864..6233d7d 100644 --- a/src/user/UserMenu.tsx +++ b/src/user/UserMenu.tsx @@ -1,4 +1,4 @@ -import { Avatar, Box, Button, IconButton, ListItemIcon, ListItemText, Menu, MenuItem, PaletteColor, Theme, Tooltip, useTheme } from "@mui/material"; +import { Avatar, Box, Button, Checkbox, IconButton, ListItemIcon, ListItemText, Menu, MenuItem, PaletteColor, Theme, Tooltip, useTheme } from "@mui/material"; import { useGlobalState } from "../providers/StateContainer"; import { getSecondaryColour, getSignatureAccentColour } from "../services/whiteLabel"; import { makeStyles } from "@mui/styles"; @@ -14,6 +14,7 @@ import { purple } from "@mui/material/colors"; import { useNavigate } from "react-router-dom"; import TeamDialog from "teams/TeamDialog"; import AccessObject from "./AccessObject"; +import { useSnackbar, useUserAPI } from "hooks"; const useStyles = makeStyles((theme: Theme) => ({ accessIcon: { @@ -80,19 +81,20 @@ interface Props { export default function UserMenu(props: Props) { const { toggleTheme } = props; - const [{ user, team, as }] = useGlobalState(); + const [{ user, team, as }, dispatch] = useGlobalState(); const { loginWithRedirect } = useAuth0(); const classes = useStyles(); const theme = useTheme(); + const userAPI = useUserAPI() + const snackbar = useSnackbar() + const name = user.name(); const picture = user.settings.avatar; const [lockIsHovered, setLockIsHovered] = useState(false); const [userMenuIsOpen, setUserMenuIsOpen] = useState(false); const [anchorEl, setAnchorEl] = useState(null); const [userSettingsIsOpen, setUserSettingsIsOpen] = useState(false); - // const hasAdmin = user.hasFeature ? user.hasFeature("admin") : false; - // const allowedToCopyToken = user.allowedTo("copy-token"); const hasTeams = user.hasFeature ? user.hasFeature("teams") : false; const [teamDialogIsOpen, setTeamDialogIsOpen] = useState(false); const [accessDialogOpen, setAccessDialogOpen] = useState(false); @@ -242,6 +244,36 @@ export default function UserMenu(props: Props) { )} + {hasTeams && ( + { + if (as.length > 1) { + user.settings.useTeam = false; + dispatch({ key: "as", value: "" }); + userAPI.updateUser(user.id(), user.protobuf()).then(_resp => { + snackbar.info("Will no longer view as team by default"); + }); + } else { + user.settings.useTeam = true; + dispatch({ key: "as", value: team.key() }); + userAPI.updateUser(user.id(), user.protobuf()).then(_resp => { + snackbar.info("Will now view as " + team.name() + " by default"); + }); + } + }} + disabled={user.settings.defaultTeam.length < 1} + aria-label="Open Team Menu" + dense> + + 1} + style={{ margin: 0, padding: 0 }} + /> + + + + )} {hasAdmin && ( openAccessObject()} aria-label="Access Object" dense>