-
-
+ //Solicitado pelo Adriano: Click no LinkItem e fechar o menu!
+
setDrawerOpen(false)}>
{
primary={i18n.t("mainDrawer.listItems.contacts")}
icon={}
/>
- }
- />
+ } />
{
yes={() => (
<>
-
- {i18n.t("mainDrawer.listItems.administration")}
-
+ {i18n.t("mainDrawer.listItems.administration")}
{
}
/>
- }
- />
-
- }
- />
+ } />
+ } />
(
- }
- />
- )}
+ role={user.profile}
+ perform="settings-view:show"
+ yes={() => (
+ }
+ />
+ )}
/>
-
-
>
)}
/>
diff --git a/frontend/src/layout/index.js b/frontend/src/layout/index.js
index ce410d0..dc9dccb 100644
--- a/frontend/src/layout/index.js
+++ b/frontend/src/layout/index.js
@@ -185,7 +185,7 @@ const LoggedInLayout = ({ children }) => {
-
+
diff --git a/frontend/src/pages/Dashboard/Title.js b/frontend/src/pages/Dashboard/Title.js
index 8fa5dad..9dbb8b8 100644
--- a/frontend/src/pages/Dashboard/Title.js
+++ b/frontend/src/pages/Dashboard/Title.js
@@ -1,10 +1,10 @@
import React from "react";
import Typography from "@material-ui/core/Typography";
-const Title = props => {
+const Title = ({children}) => {
return (
- {props.children}
+ {children}
);
};
diff --git a/frontend/src/pages/Dashboard/index.js b/frontend/src/pages/Dashboard/index.js
index 29d59e7..36c84a7 100644
--- a/frontend/src/pages/Dashboard/index.js
+++ b/frontend/src/pages/Dashboard/index.js
@@ -1,139 +1,177 @@
-import React, { useContext, useReducer, useEffect, useState } from "react"
+import React, { useContext, useReducer, useEffect } from "react";
-import Paper from "@material-ui/core/Paper"
-import Container from "@material-ui/core/Container"
-import Grid from "@material-ui/core/Grid"
-import { makeStyles } from "@material-ui/core/styles"
+import Paper from "@material-ui/core/Paper";
+import Container from "@material-ui/core/Container";
+import Grid from "@material-ui/core/Grid";
+import { makeStyles } from "@material-ui/core/styles";
import Typography from "@material-ui/core/Typography";
+import Tooltip from "@mui/material/Tooltip";
+import Zoom from "@mui/material/Zoom";
+import IconButton from "@mui/material/IconButton";
+import Info from "@material-ui/icons/Info";
-// import useTickets from "../../hooks/useTickets"
+import useTickets from "../../hooks/useTickets";
import { AuthContext } from "../../context/Auth/AuthContext";
import { i18n } from "../../translate/i18n";
-import Chart from "./Chart"
+import Chart from "./Chart";
import openSocket from "socket.io-client";
import api from "../../services/api";
import { Can } from "../../components/Can";
+import CardUser from "../../components/DashboardUser/CardUser";
+import TableUser from "../../components/DashboardUser/TableUser";
-import { Button } from "@material-ui/core";
-
-const useStyles = makeStyles(theme => ({
- container: {
- paddingTop: theme.spacing(4),
- paddingBottom: theme.spacing(4),
- },
- fixedHeightPaper: {
- padding: theme.spacing(2),
- display: "flex",
- overflow: "auto",
- flexDirection: "column",
- height: 240,
- },
- customFixedHeightPaper: {
- padding: theme.spacing(2),
- display: "flex",
- overflow: "auto",
- flexDirection: "column",
- height: 120,
- },
- customFixedHeightPaperLg: {
- padding: theme.spacing(2),
- display: "flex",
- overflow: "auto",
- flexDirection: "column",
- height: "100%",
- },
-}))
-
-
-
+const useStyles = makeStyles((theme) => ({
+ container: {
+ paddingTop: theme.spacing(4),
+ paddingBottom: theme.spacing(4),
+ },
+ fixedHeightPaper: {
+ padding: theme.spacing(2),
+ display: "flex",
+ overflow: "auto",
+ flexDirection: "column",
+ height: 240,
+ },
+ customFixedHeightPaper: {
+ padding: theme.spacing(2),
+ display: "flex",
+ overflow: "auto",
+ flexDirection: "column",
+ height: 120,
+ },
+ customFixedHeightPaperLg: {
+ padding: theme.spacing(2),
+ display: "flex",
+ overflow: "auto",
+ flexDirection: "column",
+ height: "100%",
+ },
+ containerPaperFix: {
+ width: "100%",
+ textTransform: "capitalize",
+ padding: theme.spacing(2),
+ paddingBottom: theme.spacing(4),
+ height: "auto",
+ overflowY: "hidden",
+ },
+ cardPaperFix: {
+ textTransform: "capitalize",
+ paddingLeft: theme.spacing(4),
+ paddingRight: theme.spacing(4),
+ height: window.innerWidth <= 992 ? "500px" : "auto",
+ overflowY: "hidden",
+ },
+ cardStyleFix: {
+ display: "flex",
+ flexDirection: "row",
+ justifyContent: "left",
+ alignItems: "center",
+ gap: "32px",
+ },
+ logginBtn: {
+ position: "absolute",
+ bottom: "21px",
+ right: "21px",
+ fontSize: "12px",
+ },
+ tableRowHead: {
+ backgroundColor: "lightgrey",
+ },
+ tableRowBody: {
+ textAlign: "center",
+ " &:nth-child(even)": {
+ backgroundColor: "#f7f7f7",
+ },
+ },
+ tableCounterOpen: {
+ color: "white",
+ backgroundColor: "green",
+ width: "25px",
+ textAlign: "center",
+ borderRadius: "5px",
+ },
+ tableCounterClosed: {
+ color: "white",
+ backgroundColor: "red",
+ width: "25px",
+ textAlign: "center",
+ borderRadius: "5px",
+ },
+}));
const reducer = (state, action) => {
+ if (action.type === "DELETE_USER_STATUS") {
+ const userId = action.payload;
- if (action.type === "DELETE_USER_STATUS") {
+ const userIndex = state.findIndex((u) => `${u.id}` === `${userId}`);
- const userId = action.payload;
+ if (userIndex !== -1) {
+ state.splice(userIndex, 1);
+ }
- const userIndex = state.findIndex((u) => `${u.id}` === `${userId}`);
+ return [...state];
+ }
- if (userIndex !== -1) {
- state.splice(userIndex, 1);
- }
+ if (action.type === "LOAD_QUERY") {
+ const queries = action.payload;
+ const newQueries = [];
- return [...state];
- }
+ queries.forEach((query) => {
+ const queryIndex = state.findIndex((q) => q.id === query.id);
+ if (queryIndex !== -1) {
+ state[queryIndex] = query;
+ } else {
+ newQueries.push(query);
+ }
+ });
+ return [...state, ...newQueries];
+ }
- if (action.type === 'LOAD_QUERY') {
+ if (action.type === "UPDATE_STATUS_ONLINE") {
+ let onlineUser = action.payload;
+ let index = -1;
- const queries = action.payload
- const newQueries = []
+ let onlySumOpenClosed = false;
- queries.forEach((query) => {
+ if (onlineUser.sumOpen || onlineUser.sumClosed) {
+ index = state.findIndex(
+ (e) =>
+ (onlineUser.sumOpen && e.id === onlineUser.sumOpen.userId) ||
+ (onlineUser.sumClosed && e.id === onlineUser.sumClosed.userId)
+ );
- const queryIndex = state.findIndex((q) => q.id === query.id)
+ onlySumOpenClosed = true;
+ } else {
+ index = state.findIndex((e) => `${e.id}` === `${onlineUser.userId}`);
+ }
- if (queryIndex !== -1) {
- state[queryIndex] = query
- }
- else {
- newQueries.push(query)
- }
+ if (index !== -1) {
+ if (!onlySumOpenClosed) {
+ if (!("statusOnline" in state[index])) {
+ state[index].statusOnline = onlineUser;
+ } else if ("statusOnline" in state[index]) {
+ state[index].statusOnline["status"] = onlineUser.status;
+ }
+ }
- })
-
- return [...state, ...newQueries]
- }
-
- if (action.type === "UPDATE_STATUS_ONLINE") {
-
- let onlineUser = action.payload
- let index = -1
-
- let onlySumOpenClosed = false
-
- if (onlineUser.sumOpen || onlineUser.sumClosed) {
- index = state.findIndex((e) => ((onlineUser.sumOpen && e.id === onlineUser.sumOpen.userId) || (onlineUser.sumClosed && e.id === onlineUser.sumClosed.userId)))
-
- onlySumOpenClosed = true
- }
- else {
- index = state.findIndex((e) => `${e.id}` === `${onlineUser.userId}`)
- }
-
-
- if (index !== -1) {
-
- if (!onlySumOpenClosed) {
-
- if (!("statusOnline" in state[index])) {
-
- state[index].statusOnline = onlineUser
-
- }
- else if ("statusOnline" in state[index]) {
-
- state[index].statusOnline['status'] = onlineUser.status
-
- }
-
- }
-
-
- if ("onlineTime" in onlineUser) {
-
- if ("sumOnlineTime" in state[index]) {
- state[index].sumOnlineTime['sum'] = (onlineUser.onlineTime).split(" ")[1]
- }
- else if (!("sumOnlineTime" in state[index])) {
- state[index].sumOnlineTime = { userId: onlineUser.userId, sum: (onlineUser.onlineTime).split(" ")[1] }
- }
+ if ("onlineTime" in onlineUser) {
+ if ("sumOnlineTime" in state[index]) {
+ state[index].sumOnlineTime["sum"] = onlineUser.onlineTime.split(" ")[1];
+ } else if (!("sumOnlineTime" in state[index])) {
+ state[index].sumOnlineTime = {
+ userId: onlineUser.userId,
+ sum: onlineUser.onlineTime.split(" ")[1],
+ };
+ }
+ }
}
@@ -166,37 +204,19 @@ const reducer = (state, action) => {
if(onlineUser.openClosedInQueue){
state[index].openClosedInQueue = onlineUser.openClosedInQueue
}
- if(onlineUser.openClosedOutQueue){
- state[index].openClosedOutQueue = onlineUser.openClosedOutQueue
- }
-
-
-
- // if(onlineUser.closedTicketByUserIn){
- // state[index].closedTicketByUserIn = onlineUser.closedTicketByUserIn
- // }
- // if(onlineUser.closedTicketByUserOut){
- // state[index].closedTicketByUserOut = onlineUser.closedTicketByUserOut
- // }
- // if(onlineUser.openTicketByUserIn){
- // state[index].openTicketByUserIn = onlineUser.openTicketByUserIn
- // }
- // if(onlineUser.openTicketByUserOut){
- // state[index].openTicketByUserOut = onlineUser.openTicketByUserOut
- // }
-
- }
- return [...state]
-
- }
-
- if (action.type === "RESET") {
- return [];
- }
-
-}
+ if (onlineUser.openClosedOutQueue) {
+ state[index].openClosedOutQueue = onlineUser.openClosedOutQueue;
+ }
+
+ }
+ return [...state];
+ }
+ if (action.type === "RESET") {
+ return [];
+ }
+};
const Dashboard = () => {
const classes = useStyles()
@@ -207,26 +227,7 @@ const Dashboard = () => {
const [pending, setPending] = useState(0)
const { user } = useContext(AuthContext);
-
- const [ticketStatusChange, setStatus] = useState()
-
- // var userQueueIds = [];
-
- // if (user.queues && user.queues.length > 0) {
- // userQueueIds = user.queues.map(q => q.id);
- // }
-
- // const GetTickets = (status, showAll, withUnreadMessages, unlimited) => {
-
- // const { tickets } = useTickets({
- // status: status,
- // showAll: showAll,
- // withUnreadMessages: withUnreadMessages,
- // queueIds: JSON.stringify(userQueueIds),
- // unlimited: unlimited
- // });
- // return tickets.length;
- // }
+
useEffect(() => {
@@ -364,225 +365,190 @@ const Dashboard = () => {
+ return (
+
(
+
+
+
+
+
+ tickets
+
+
+
+
+
+
+
+
+
+
+
+ {i18n.t("dashboard.messages.inAttendance.title")}
+
+
+
+ {GetTickets("open", "true", "false", "true")}
+
+
+
+
+
+
+
+ {i18n.t("dashboard.messages.waiting.title")}
+
+
+
+ {GetTickets("pending", "true", "false", "true")}
+
+
+
+
+
+
+
+ {i18n.t("dashboard.messages.closed.title")}
+
+
+
+ {GetTickets("closed", "true", "false", "true")}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Usuários
+
+
+
+
+
+
+
+
+
+
+
+ Total de Agentes
+
+
+
+ {usersOnlineInfo.length}
+
+
+
+
+
+
+
+ Online
+
+
+
+ {
+ usersOnlineInfo.filter(
+ (status) =>
+ status.statusOnline && status.statusOnline.status === "online"
+ ).length
+ }
+
+
+
+
+
+
+
+ Offline
+
+
+
+ {
+ usersOnlineInfo.filter(
+ (status) =>
+ !status.statusOnline || status.statusOnline.status === "offline"
+ ).length
+ }
+
+
+
+
+ {window.innerWidth <= 992 ? (
+
+ ) : (
+
+ )}
+
+
+
+
+ )}
+ />
- return (
-
- (
-
-
-
-
-
-
-
- {i18n.t("dashboard.messages.inAttendance.title")}
-
-
-
- {/* {GetTickets("open", "true", "false", "true")} */}
- {open}
-
-
-
-
-
-
-
- {i18n.t("dashboard.messages.waiting.title")}
-
-
-
- {/* {GetTickets("pending", "true", "false", "true")} */}
- {pending}
-
-
-
-
-
-
-
- {i18n.t("dashboard.messages.closed.title")}
-
-
-
- {/* {GetTickets("closed", "true", "false", "true")} */}
- {closed}
-
-
-
-
-
-
-
-
-
-
-
- {'Total online'}
-
-
-
- {usersOnlineInfo &&
- usersOnlineInfo.filter((user) => user.statusOnline && user.statusOnline.status === 'online').length
- }
-
-
-
-
-
-
-
- {'Total offline'}
-
-
-
- {usersOnlineInfo &&
- usersOnlineInfo.filter((user) => !user.statusOnline || user.statusOnline.status === 'offline').length
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {usersOnlineInfo &&
-
- usersOnlineInfo.map((userInfo, index) => (
-
- //
-
-
- <>
- {userInfo.statusOnline &&
-
-
-
-
-
-
- {userInfo.name}
-
-
-
-
- {userInfo.statusOnline &&
- userInfo.statusOnline.status
- }
-
-
-
- Em atendimento: {userInfo.sumOpen && userInfo.sumOpen.count}
-
-
-
- Finalizado: {userInfo.sumClosed && userInfo.sumClosed.count}
-
-
-
- Tempo online: {userInfo.sumOnlineTime && userInfo.sumOnlineTime.sum}
-
-
-
-
-
-
Em atendimento(open/closed) por fila, conversas iniciadas pelos clientes:
-
-
- {userInfo.openClosedInQueue &&
-
- userInfo.openClosedInQueue.map((info, index) => (
- <>
-
- {info.name}: OPEN {info.countOpen} | CLOSED {info.countClosed}
-
- >
- ))
-
- }
-
-
-
-
-
-
Em atendimento(open/closed) sem fila, conversas iniciadas por atendentes:
-
- {userInfo.openClosedOutQueue &&
-
-
- SEM FILA: OPEN {userInfo.openClosedOutQueue.countOpen} | CLOSED {userInfo.openClosedOutQueue.countClosed}
-
-
- }
-
-
-
-
- {userInfo.statusOnline && userInfo.statusOnline.status === "online" &&
-
- userInfo.statusOnline &&
-
-
-
-
-
-
-
- }
-
-
-
-
-
-
-
- }
- >
-
-
- ))
- }
-
-
-
-
-
-
- )}
- />
-
-
-
-
-
-
- /**/
- )
+ /**/
+ );
}
export default Dashboard