improvement: hide some elements base on user profile

This commit is contained in:
canove
2021-01-14 06:55:44 -03:00
parent 3bb63a25da
commit b2438c4fdf
8 changed files with 83 additions and 36 deletions

View File

@@ -4,7 +4,14 @@ const rules = {
}, },
admin: { admin: {
static: ["drawer-admin-items:view", "tickets-manager:showall"], static: [
"drawer-admin-items:view",
"tickets-manager:showall",
"user-modal:editProfile",
"user-modal:editQueues",
"ticket-options:deleteTicket",
"contacts-page:deleteContact",
],
}, },
}; };

View File

@@ -36,4 +36,4 @@ Can.defaultProps = {
no: () => null, no: () => null,
}; };
export default Can; export { Can };

View File

@@ -1,4 +1,4 @@
import React, { useEffect, useRef, useState } from "react"; import React, { useContext, useEffect, useRef, useState } from "react";
import MenuItem from "@material-ui/core/MenuItem"; import MenuItem from "@material-ui/core/MenuItem";
import Menu from "@material-ui/core/Menu"; import Menu from "@material-ui/core/Menu";
@@ -8,11 +8,14 @@ import api from "../../services/api";
import ConfirmationModal from "../ConfirmationModal"; import ConfirmationModal from "../ConfirmationModal";
import TransferTicketModal from "../TransferTicketModal"; import TransferTicketModal from "../TransferTicketModal";
import toastError from "../../errors/toastError"; import toastError from "../../errors/toastError";
import { Can } from "../Can";
import { AuthContext } from "../../context/Auth/AuthContext";
const TicketOptionsMenu = ({ ticket, menuOpen, handleClose, anchorEl }) => { const TicketOptionsMenu = ({ ticket, menuOpen, handleClose, anchorEl }) => {
const [confirmationOpen, setConfirmationOpen] = useState(false); const [confirmationOpen, setConfirmationOpen] = useState(false);
const [transferTicketModalOpen, setTransferTicketModalOpen] = useState(false); const [transferTicketModalOpen, setTransferTicketModalOpen] = useState(false);
const isMounted = useRef(true); const isMounted = useRef(true);
const { user } = useContext(AuthContext);
useEffect(() => { useEffect(() => {
return () => { return () => {
@@ -62,9 +65,16 @@ const TicketOptionsMenu = ({ ticket, menuOpen, handleClose, anchorEl }) => {
open={menuOpen} open={menuOpen}
onClose={handleClose} onClose={handleClose}
> >
<Can
role={user.profile}
perform="ticket-options:deleteTicket"
yes={() => (
<MenuItem onClick={handleOpenConfirmationModal}> <MenuItem onClick={handleOpenConfirmationModal}>
{i18n.t("ticketOptionsMenu.delete")} {i18n.t("ticketOptionsMenu.delete")}
</MenuItem> </MenuItem>
)}
/>
<MenuItem onClick={handleOpenTransferModal}> <MenuItem onClick={handleOpenTransferModal}>
{i18n.t("ticketOptionsMenu.transfer")} {i18n.t("ticketOptionsMenu.transfer")}
</MenuItem> </MenuItem>

View File

@@ -18,7 +18,7 @@ import TabPanel from "../TabPanel";
import { i18n } from "../../translate/i18n"; import { i18n } from "../../translate/i18n";
import { AuthContext } from "../../context/Auth/AuthContext"; import { AuthContext } from "../../context/Auth/AuthContext";
import Can from "../Can"; import { Can } from "../Can";
import TicketsQueueSelect from "../TicketsQueueSelect"; import TicketsQueueSelect from "../TicketsQueueSelect";
import { Button } from "@material-ui/core"; import { Button } from "@material-ui/core";
import { useLocalStorage } from "../../hooks/useLocalStorage"; import { useLocalStorage } from "../../hooks/useLocalStorage";

View File

@@ -23,6 +23,7 @@ import { i18n } from "../../translate/i18n";
import api from "../../services/api"; import api from "../../services/api";
import toastError from "../../errors/toastError"; import toastError from "../../errors/toastError";
import QueueSelect from "../QueueSelect"; import QueueSelect from "../QueueSelect";
import { Can } from "../Can";
const useStyles = makeStyles(theme => ({ const useStyles = makeStyles(theme => ({
root: { root: {
@@ -182,9 +183,15 @@ const UserModal = ({ open, onClose, userId }) => {
className={classes.formControl} className={classes.formControl}
margin="dense" margin="dense"
> >
<Can
role={user.profile}
perform="user-modal:editProfile"
yes={() => (
<>
<InputLabel id="profile-selection-input-label"> <InputLabel id="profile-selection-input-label">
{i18n.t("userModal.form.profile")} {i18n.t("userModal.form.profile")}
</InputLabel> </InputLabel>
<Field <Field
as={Select} as={Select}
label={i18n.t("userModal.form.profile")} label={i18n.t("userModal.form.profile")}
@@ -196,12 +203,21 @@ const UserModal = ({ open, onClose, userId }) => {
<MenuItem value="admin">Admin</MenuItem> <MenuItem value="admin">Admin</MenuItem>
<MenuItem value="user">User</MenuItem> <MenuItem value="user">User</MenuItem>
</Field> </Field>
</>
)}
/>
</FormControl> </FormControl>
</div> </div>
<Can
role={user.profile}
perform="user-modal:editQueues"
yes={() => (
<QueueSelect <QueueSelect
selectedQueueIds={selectedQueueIds} selectedQueueIds={selectedQueueIds}
onChange={values => setSelectedQueueIds(values)} onChange={values => setSelectedQueueIds(values)}
/> />
)}
/>
</DialogContent> </DialogContent>
<DialogActions> <DialogActions>
<Button <Button

View File

@@ -5,11 +5,18 @@ import useAuth from "./useAuth";
const AuthContext = createContext(); const AuthContext = createContext();
const AuthProvider = ({ children }) => { const AuthProvider = ({ children }) => {
const { loading, user, isAuth, handleLogin, handleLogout } = useAuth(); const {
loading,
user,
setUser,
isAuth,
handleLogin,
handleLogout,
} = useAuth();
return ( return (
<AuthContext.Provider <AuthContext.Provider
value={{ loading, user, isAuth, handleLogin, handleLogout }} value={{ loading, user, setUser, isAuth, handleLogin, handleLogout }}
> >
{children} {children}
</AuthContext.Provider> </AuthContext.Provider>

View File

@@ -18,7 +18,7 @@ import AccountTreeOutlinedIcon from "@material-ui/icons/AccountTreeOutlined";
import { i18n } from "../translate/i18n"; import { i18n } from "../translate/i18n";
import { WhatsAppsContext } from "../context/WhatsApp/WhatsAppsContext"; import { WhatsAppsContext } from "../context/WhatsApp/WhatsAppsContext";
import { AuthContext } from "../context/Auth/AuthContext"; import { AuthContext } from "../context/Auth/AuthContext";
import Can from "../components/Can"; import { Can } from "../components/Can";
function ListItemLink(props) { function ListItemLink(props) {
const { icon, primary, to, className } = props; const { icon, primary, to, className } = props;

View File

@@ -33,6 +33,7 @@ import MainHeaderButtonsWrapper from "../../components/MainHeaderButtonsWrapper"
import MainContainer from "../../components/MainContainer"; import MainContainer from "../../components/MainContainer";
import toastError from "../../errors/toastError"; import toastError from "../../errors/toastError";
import { AuthContext } from "../../context/Auth/AuthContext"; import { AuthContext } from "../../context/Auth/AuthContext";
import { Can } from "../../components/Can";
const reducer = (state, action) => { const reducer = (state, action) => {
if (action.type === "LOAD_CONTACTS") { if (action.type === "LOAD_CONTACTS") {
@@ -318,6 +319,10 @@ const Contacts = () => {
> >
<EditIcon /> <EditIcon />
</IconButton> </IconButton>
<Can
role={user.profile}
perform="contacts-page:deleteContact"
yes={() => (
<IconButton <IconButton
size="small" size="small"
onClick={e => { onClick={e => {
@@ -327,6 +332,8 @@ const Contacts = () => {
> >
<DeleteOutlineIcon /> <DeleteOutlineIcon />
</IconButton> </IconButton>
)}
/>
</TableCell> </TableCell>
</TableRow> </TableRow>
))} ))}