diff --git a/src/API/LayoutApi/tasks.ts b/src/API/LayoutApi/tasks.ts index a6c5afe..42b0d8e 100644 --- a/src/API/LayoutApi/tasks.ts +++ b/src/API/LayoutApi/tasks.ts @@ -9,6 +9,7 @@ export type TTasksGetParams = { team?: string; page?: number; page_size: number; + team_monitoring?: string; }; export type TTasksPutParams = { diff --git a/src/API/LayoutApi/teams.ts b/src/API/LayoutApi/teams.ts index d2ff81e..60a77de 100644 --- a/src/API/LayoutApi/teams.ts +++ b/src/API/LayoutApi/teams.ts @@ -19,6 +19,25 @@ export type TTeamPostParams = { is_active?: boolean; }; +export interface TeamMonitorCreatePayload { + name: string; + company_ids: number[]; +} + +export interface TeamMonitorUpdatePayload { + name?: string; + is_active?: boolean; +} + +export interface UpdateTeamMonitorVars { + id: string; + payload: { + name?: string; + is_active?: boolean; + company_ids?: any[]; + }; +} + export const teamController = { async read(obj: TTeamGetParams) { const params = { ...obj }; @@ -86,4 +105,47 @@ export const teamController = { } return { data: res, error }; }, + // Team Monitoring + + async readTeamsMonitor(obj: TTeamGetParams) { + const params: any = {}; + + if (obj.page) params.page = obj.page; + if (obj.page_size) params.page_size = obj.page_size; + if (obj.name) params.name = obj.name; + + const { data } = await instance.get("/teams-monitor/", { + params, + }); + + return data; + }, + + async createTeamMonitor(payload: TeamMonitorCreatePayload) { + const { data } = await instance.post("/team-monitor/", payload); + return data; + }, + + async readTeamsGetOne(id: any) { + const { data } = await instance.get(`/team-monitor/${id}/`); + + return data; + }, + + async deleteTeamMonitor(id: string) { + try { + const { data } = await instance.delete(`/team-monitor/${id}`); + return data; + } catch (err) { + throw new Error("Oops something went wrong!"); + } + }, + async updateTeamMonitor(id: string, payload: TeamMonitorUpdatePayload) { + try { + const { data } = await instance.put(`/team-monitor/${id}/`, payload); + return data; + } catch (error) { + throw new Error("Failed to update team monitor"); + } + }, }; diff --git a/src/Components/Accounting/AccountingCurrent.tsx b/src/Components/Accounting/AccountingCurrent.tsx index f03023c..f9fd248 100644 --- a/src/Components/Accounting/AccountingCurrent.tsx +++ b/src/Components/Accounting/AccountingCurrent.tsx @@ -654,6 +654,14 @@ const AccountingCurrent: React.FC = () => { } }, }, + { + title: "Salary Rate", + dataIndex: "salary_rate", + key: "salary_rate", + render: (text: string, record: any) => ( +

${record?.salary_rate}

+ ), + }, { title: "Base Salary", dataIndex: "salary_base_amount", diff --git a/src/Components/Accounting/AccountingHistory.tsx b/src/Components/Accounting/AccountingHistory.tsx index e15dacc..cc4ae00 100644 --- a/src/Components/Accounting/AccountingHistory.tsx +++ b/src/Components/Accounting/AccountingHistory.tsx @@ -305,6 +305,14 @@ const AccountingHistory: React.FC = () => { } }, }, + { + title: "Salary Rate", + dataIndex: "salary_rate", + key: "salary_rate", + render: (text: string, record: any) => ( +

${record?.salary_rate}

+ ), + }, { title: "Base Salary", dataIndex: "total_base_salary", diff --git a/src/Components/Accounting/AccountingLast.tsx b/src/Components/Accounting/AccountingLast.tsx index fa91fd3..e950cb8 100644 --- a/src/Components/Accounting/AccountingLast.tsx +++ b/src/Components/Accounting/AccountingLast.tsx @@ -818,6 +818,14 @@ const AccountingCurrent: React.FC = () => { } }, }, + { + title: "Salary Rate", + dataIndex: "salary_rate", + key: "salary_rate", + render: (text: string, record: any) => ( +

${record?.salary_rate}

+ ), + }, { title: "Base Salary", dataIndex: "salary_base_amount", diff --git a/src/Components/Companies/CompaniesTable.tsx b/src/Components/Companies/CompaniesTable.tsx index 93992c7..f846986 100644 --- a/src/Components/Companies/CompaniesTable.tsx +++ b/src/Components/Companies/CompaniesTable.tsx @@ -78,7 +78,7 @@ function CompanyTable({ { title: "Company", dataIndex: "name", - width: "25%", + width: "20%", ellipsis: { showTitle: false, }, @@ -98,12 +98,21 @@ function CompanyTable({ ), }, { - title: "Team", + title: "Service Team", dataIndex: "team", render: (status: string, record: TCompany) => ( {record?.team?.name} ), }, + { + title: "Monitoring Team", + dataIndex: "team_monitoring", + render: (status: string, record: TCompany) => ( + + {record?.team_monitoring?.name} + + ), + }, { title: "USDOT", dataIndex: "usdot", diff --git a/src/Components/Tasks/AddTask.tsx b/src/Components/Tasks/AddTask.tsx index f3a01db..cb64cea 100644 --- a/src/Components/Tasks/AddTask.tsx +++ b/src/Components/Tasks/AddTask.tsx @@ -31,7 +31,6 @@ import tt from "../../assets/tticon.svg"; import addicon from "../../assets/addiconpng.png"; //ts-ignore import fileUpload from "../../assets/upload-file.png"; -import closeIcon from "../../assets/closeIcon.png"; import AddCustomer from "../Customers/AddCustomer"; import AddDriver from "../Companies/AddDriver"; @@ -210,6 +209,23 @@ const AddTask = ({ return tt; } }; + + const handleSubmit = async (values: any) => { + values.attachment_ids = fileIds; + values.note = + (text ? text + ", " : "") + + (note ? note + ", " : "") + + (note2 ? note2 + ", " : ""); + + try { + await taskController.addTaskController(values); + form.resetFields(); + setOpen(false); + } catch (error) { + console.error(error); + } + }; + return (
handlePaste(event)}> {openDrive && } @@ -235,23 +251,13 @@ const AddTask = ({ } okText="Create" cancelText="Cancel" - centered={false} - bodyStyle={{ - height: 685, - }} - onCancel={handleCancel} - onOk={() => { - form.validateFields().then(async (values) => { - values.attachment_ids = fileIds; - values.note = - (text ? text + ", " : "") + - (note ? note + ", " : "") + - (note2 ? note2 + ", " : ""); - form.resetFields(); - await taskController.addTaskController(values); - setOpen(!open); - }); + onCancel={() => { + form.resetFields(); + setOpen(false); }} + onOk={() => form.submit()} + bodyStyle={{ height: 685 }} + centered={false} > { + if (e.key === "Enter") { + e.preventDefault(); + form.submit(); + } + }} > @@ -346,13 +359,16 @@ const AddTask = ({ name="service_id" rules={[{ required: true, message: "Please select service!" }]} > - ), }, + { + title: "Monitoring Team", + dataIndex: "team_monitoring", + width: isMobile ? "3%" : "8%", + key: "7", + ellipsis: { + showTitle: false, + }, + render: (item: { name: string }) => ( + + {item?.name} + + ), + }, { title: "Assignee", dataIndex: "in_charge", @@ -429,7 +443,7 @@ const TaskTable = ({ { title: "PTI", dataIndex: "pti", - width: "8%", + width: "7%", key: "8", responsive: ["lg"], render: (pti: boolean, record: TTask) => @@ -606,9 +620,17 @@ const TaskTable = ({ ]; if (role === "Checker") { - const teamColIndex = columns.findIndex((c) => c.title === "Team"); + const forbiddenTitles = ["Service Team", "Monitoring Team"]; - teamColIndex !== -1 && columns.splice(teamColIndex, 1); + forbiddenTitles.forEach((title) => { + const index = columns.findIndex( + (c) => typeof c.title === "string" && c.title === title + ); + + if (index !== -1) { + columns.splice(index, 1); + } + }); } return columns; diff --git a/src/Components/Tasks/Tasks.tsx b/src/Components/Tasks/Tasks.tsx index 1a30e88..8fab004 100644 --- a/src/Components/Tasks/Tasks.tsx +++ b/src/Components/Tasks/Tasks.tsx @@ -2,7 +2,7 @@ import { useEffect, useRef, useState } from "react"; import AddTask from "./AddTask"; import { Button, Input, Pagination, Select, Space, Typography } from "antd"; import TaskTable from "./TaskTable"; -import { useTeamData } from "../../Hooks/Teams"; +import { useTeamData, useTeamsMonitorData } from "../../Hooks/Teams"; import { useTasks } from "../../Hooks/Tasks"; import { TTask } from "../../types/Tasks/TTasks"; import { isMobile, role, team_id } from "../../App"; @@ -40,6 +40,7 @@ const Task = ({ const [modalOpen, setModalOpen] = useState(false); const [characters, setCharacters] = useState(); const [team, setTeam] = useState(); + const [teamMonitoring, setTeamMonitoring] = useState(); const [search, setSearch] = useState(""); const [status, setStatus] = useState(); const [page, setPage] = useState(1); @@ -144,17 +145,29 @@ const Task = ({ const teamData = useTeamData({}); + const TeamMonitorData = useTeamsMonitorData({}); + + console.log(TeamMonitorData); + const teamOptions: { label: string; value: any }[] | undefined = teamData?.data?.map((item: any) => ({ label: item?.name, value: item?.id, })); + + const teamMonitorOptions: { label: string; value: any }[] | undefined = + TeamMonitorData?.data?.map((item: any) => ({ + label: item?.name, + value: item?.name, + })); + const { data, isLoading, refetch } = useTasks({ search, status, team, page, page_size: pageSize, + team_monitoring: teamMonitoring, }); useEffect(() => { if (data) { @@ -241,14 +254,6 @@ const Task = ({
{role !== "Checker" && ( - //
- {/*
- - -
*/}
} onChange={handleSearchChange} @@ -338,13 +333,22 @@ const Task = ({ {role !== "Checker" && ( - setTeam(value)} + options={teamOptions} + /> + + + + + + + + + } + onChange={handleSearchChange} + /> +
+ +
+ + + + { + let num = e.target.value; + if (Number(num) && num !== "0") { + setPage(Number(num)); + } + }} + /> + + + + + ); +}; + +export default TeamMonitoring; diff --git a/src/Components/Teams/TeamMonitoring/TeamMonitoringPreview.tsx b/src/Components/Teams/TeamMonitoring/TeamMonitoringPreview.tsx new file mode 100644 index 0000000..472942a --- /dev/null +++ b/src/Components/Teams/TeamMonitoring/TeamMonitoringPreview.tsx @@ -0,0 +1,150 @@ +import { useNavigate, useParams } from "react-router-dom"; +import type { ColumnsType } from "antd/es/table"; +import { + useDeleteTeamMonitor, + useTeamsMonitorGetOne, + useUpdateTeamMonitor, +} from "../../../Hooks/Teams"; +import { + Form, + Spin, + Space, + Row, + Col, + Input, + Button, + Table, + Modal, + message, + Typography, +} from "antd"; +import Notfound from "../../../Utils/Notfound"; +import tagIcon from "../../../assets/tagIcon.svg"; +import { role } from "../../../App"; +import moment from "moment"; + +const { Title, Text } = Typography; + +type Params = { + id: any; +}; + +const TeamMonitoringPreview = () => { + const { id } = useParams(); + const navigate = useNavigate(); + + const { data, isLoading, refetch } = useTeamsMonitorGetOne(id); + const { mutate: deleteTeam, isLoading: deleteLoading } = + useDeleteTeamMonitor(); + const { mutateAsync: updateTeam, isLoading: isSubmitting } = + useUpdateTeamMonitor(); + + if (isLoading) { + return ; + } + + if (!data) { + return ; + } + + const handleSubmit = async (values: any) => { + try { + await updateTeam({ + id, + payload: { name: values.name }, + }); + + message.success("Team updated successfully"); + refetch(); + } catch { + message.error("Failed to update team"); + } + }; + + const handleDelete = () => { + if (deleteLoading) return; + + Modal.confirm({ + title: "Are you sure you want to delete this team?", + okText: "Yes", + okType: "danger", + cancelText: "No", + onOk: () => + new Promise((resolve, reject) => { + deleteTeam(id, { + onSuccess: () => { + message.success("Team deleted successfully"); + navigate(-1); + resolve(); + }, + onError: () => { + message.error("Failed to delete team"); + reject(); + }, + }); + }), + }); + }; + + const columns: ColumnsType = [ + { + title: , + key: "no", + width: 60, + align: "center", + render: (_: any, __: any, index: number) => index + 1, + }, + { + title: "Company name", + dataIndex: "name", + key: "name", + }, + ]; + + return ( + +
+ + {data.name} + + + Created at: {moment(data.created_at).format("DD.MM.YYYY HH:mm")} + +
+ + {/* EDIT FORM */} +
+ {/* COMPANIES TABLE */} + + + {/* ACTION BUTTONS */} + + {role !== "Checker" && ( + + )} + + + + ); +}; + +export default TeamMonitoringPreview; diff --git a/src/Components/Teams/TeamMonitoring/TeamMonitoringTable.tsx b/src/Components/Teams/TeamMonitoring/TeamMonitoringTable.tsx new file mode 100644 index 0000000..7724a75 --- /dev/null +++ b/src/Components/Teams/TeamMonitoring/TeamMonitoringTable.tsx @@ -0,0 +1,108 @@ +import { Button, Table } from "antd"; +import { EditOutlined } from "@ant-design/icons"; +import { useNavigate } from "react-router-dom"; +import { + QueryObserverResult, + RefetchOptions, + RefetchQueryFilters, +} from "react-query"; +import tagIcon from "../../../assets/tagIcon.svg"; +import { TTeam } from "../../../types/Team/TTeam"; +import { timeZone } from "../../../App"; +import { useState } from "react"; +import EditTeamMonitorModal from "./EditTeamMonitorModal"; + +const TeamMonitoringTable = ({ + data, + isLoading, + refetch, +}: { + data: TTeam[] | undefined; + isLoading: boolean | undefined; + refetch: ( + options?: (RefetchOptions & RefetchQueryFilters) | undefined + ) => Promise>; +}) => { + const navigate = useNavigate(); + const moment = require("moment-timezone"); + const [editOpen, setEditOpen] = useState(false); + const [selectedId, setSelectedId] = useState(null); + + const openEditModal = (id: number) => { + setSelectedId(id); + setEditOpen(true); + }; + + return ( + <> + {editOpen && selectedId && ( + setEditOpen(false)} + onSuccess={() => { + setEditOpen(false); + refetch(); + }} + /> + )} +
{ + return { + onClick: () => { + navigate(`/teams-monitoring/${record.id}`); + }, + }; + }} + dataSource={data?.map((u, i) => ({ + ...u, + no: i + 1, + action: { id: u.id }, + created: moment(u?.created_at) + .tz(timeZone) + .format("DD.MM.YYYY HH:mm"), + key: u.id, + }))} + size="middle" + columns={[ + { + title: , + dataIndex: "no", + width: "5%", + }, + { + title: "Name", + dataIndex: "name", + }, + { + title: "Created at", + dataIndex: "created", + }, + { + title: "Actions", + key: "actions", + align: "center", + width: "10%", + render: (_: any, record: TTeam) => ( + + ), + }, + ]} + pagination={false} + bordered + /> + + ); +}; + +export default TeamMonitoringTable; diff --git a/src/Components/Teams/AddTeam.tsx b/src/Components/Teams/TeamServices/AddTeam.tsx similarity index 94% rename from src/Components/Teams/AddTeam.tsx rename to src/Components/Teams/TeamServices/AddTeam.tsx index d75dfb6..6bcf8aa 100644 --- a/src/Components/Teams/AddTeam.tsx +++ b/src/Components/Teams/TeamServices/AddTeam.tsx @@ -1,6 +1,6 @@ import { Input, Modal, Form as FormAnt, Select } from "antd"; -import { teamController } from "../../API/LayoutApi/teams"; -import { useUserData } from "../../Hooks/Users"; +import { useUserData } from "../../../Hooks/Users"; +import { teamController } from "../../../API/LayoutApi/teams"; const AddTeam = ({ open, diff --git a/src/Components/Teams/AddUserToTeam.tsx b/src/Components/Teams/TeamServices/AddUserToTeam.tsx similarity index 95% rename from src/Components/Teams/AddUserToTeam.tsx rename to src/Components/Teams/TeamServices/AddUserToTeam.tsx index a3c358c..fdf9974 100644 --- a/src/Components/Teams/AddUserToTeam.tsx +++ b/src/Components/Teams/TeamServices/AddUserToTeam.tsx @@ -1,16 +1,17 @@ import { Input, Modal, Form as FormAnt, Select } from "antd"; -import { userController } from "../../API/LayoutApi/users"; -import { useTeamOne } from "../../Hooks/Teams"; import { message } from "antd"; -import { useRoleData } from "../../Hooks/Role"; -import { common } from "../../Utils/common"; + import { QueryObserverResult, RefetchOptions, RefetchQueryFilters, } from "react-query"; -import { TUser } from "../../types/User/TUser"; +import { TUser } from "../../../types/User/TUser"; +import { common } from "../../../Utils/common"; +import { useRoleData } from "../../../Hooks/Role"; +import { useTeamOne } from "../../../Hooks/Teams"; +import { userController } from "../../../API/LayoutApi/users"; const AddUserToTeam = ({ open, diff --git a/src/Components/Teams/TeamEdit.tsx b/src/Components/Teams/TeamServices/TeamEdit.tsx similarity index 93% rename from src/Components/Teams/TeamEdit.tsx rename to src/Components/Teams/TeamServices/TeamEdit.tsx index 2908d22..4f7cce0 100644 --- a/src/Components/Teams/TeamEdit.tsx +++ b/src/Components/Teams/TeamServices/TeamEdit.tsx @@ -1,6 +1,6 @@ import React, { useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; -import { useTeamOne } from "../../Hooks/Teams"; +import { useTeamOne } from "../../../Hooks/Teams"; import { Form, Spin, @@ -13,18 +13,18 @@ import { Button, Table, } from "antd"; -import { teamController } from "../../API/LayoutApi/teams"; +import { teamController } from "../../../API/LayoutApi/teams"; import { FormOutlined } from "@ant-design/icons"; -import Notfound from "../../Utils/Notfound"; -import { role } from "../../App"; -import { useUserData } from "../../Hooks/Users"; +import Notfound from "../../../Utils/Notfound"; +import { role } from "../../../App"; +import { useUserData } from "../../../Hooks/Users"; import AddUserToTeam from "./AddUserToTeam"; // @ts-ignore -import tagIcon from "../../assets/tagIcon.svg"; +import tagIcon from "../../../assets/tagIcon.svg"; // @ts-ignore -import infoIcon from "../../assets/infoIcon.png"; +import infoIcon from "../../../assets/infoIcon.png"; // @ts-ignore -import infoIconActive from "../../assets/infoIconActive.png"; +import infoIconActive from "../../../assets/infoIconActive.png"; const TabPane = Tabs.TabPane; diff --git a/src/Components/Teams/TeamModal.tsx b/src/Components/Teams/TeamServices/TeamModal.tsx similarity index 100% rename from src/Components/Teams/TeamModal.tsx rename to src/Components/Teams/TeamServices/TeamModal.tsx diff --git a/src/Components/Teams/TeamServices/TeamServices.tsx b/src/Components/Teams/TeamServices/TeamServices.tsx new file mode 100644 index 0000000..339974a --- /dev/null +++ b/src/Components/Teams/TeamServices/TeamServices.tsx @@ -0,0 +1,169 @@ +import { useEffect, useMemo, useState } from "react"; +import { useTeamData } from "../../../Hooks/Teams"; +import TeamTable from "./TeamTable"; +//@ts-ignore +import addicon from "../../../assets/addiconpng.png"; +import AddTeam from "./AddTeam"; +import { Button, Input, Select, Space, Typography, theme } from "antd"; +import { + LeftOutlined, + PlusOutlined, + RightOutlined, + SearchOutlined, +} from "@ant-design/icons"; +import { debounce } from "lodash"; + +const TeamServices = () => { + const [page, setPage] = useState(1); + const [pageSize, setPageSize] = useState(() => { + const saved = localStorage.getItem("general_pageSize"); + return saved ? Number(saved) : 15; + }); + const [search, setSearch] = useState(""); + + const { data, isLoading, refetch } = useTeamData({ + page: page, + page_size: pageSize, + name: search, + }); + + const [open, setOpen] = useState(false); + const showModal = () => { + setOpen(true); + }; + + const pageSizeOptions = [15, 20, 30, 40, 50]; + + const handlePageSizeChange = (value: number) => { + setPageSize(value); + setPage(1); + }; + + useEffect(() => { + localStorage.setItem("general_pageSize", String(pageSize)); + }, [pageSize]); + + const Next = () => { + const a = Number(page) + 1; + setPage(a); + }; + const Previos = () => { + Number(page); + if (page > 1) { + const a = Number(page) - 1; + setPage(a); + } + }; + + const debouncedSearch = useMemo( + () => + debounce((value: string) => { + setSearch(value); + }, 500), + [] + ); + + const handleSearchChange = (e: React.ChangeEvent) => { + const value = e.target.value; + debouncedSearch(value); + }; + + const { token } = theme.useToken(); + + return ( +
+ {open && } +
+
+ } + onChange={handleSearchChange} + /> +
+ +
+ + + + { + let num = e.target.value; + if (Number(num) && num !== "0") { + setPage(Number(num)); + } + }} + /> + + + +
+ ); +}; + +export default TeamServices; diff --git a/src/Components/Teams/TeamTable.tsx b/src/Components/Teams/TeamServices/TeamTable.tsx similarity index 90% rename from src/Components/Teams/TeamTable.tsx rename to src/Components/Teams/TeamServices/TeamTable.tsx index b1e4f4e..506270a 100644 --- a/src/Components/Teams/TeamTable.tsx +++ b/src/Components/Teams/TeamServices/TeamTable.tsx @@ -1,16 +1,18 @@ import { Table, Tag } from "antd"; -import { TTeam } from "../../types/Team/TTeam"; + import { useNavigate } from "react-router-dom"; import { QueryObserverResult, RefetchOptions, RefetchQueryFilters, } from "react-query"; -import { timeZone } from "../../App"; + // @ts-ignore -import tagIcon from "../../assets/tagIcon.svg"; +import tagIcon from "../../../assets/tagIcon.svg"; import { theme } from "antd"; +import { TTeam } from "../../../types/Team/TTeam"; +import { timeZone } from "../../../App"; const TeamTable = ({ data, @@ -34,7 +36,7 @@ const TeamTable = ({ onRow={(record) => { return { onClick: () => { - navigate(`/teams/${record.id}`); + navigate(`/teams-services/${record.id}`); }, }; }} diff --git a/src/Components/Teams/Teams.tsx b/src/Components/Teams/Teams.tsx index cd0d31f..74bb25c 100644 --- a/src/Components/Teams/Teams.tsx +++ b/src/Components/Teams/Teams.tsx @@ -1,151 +1,32 @@ -import { useEffect, useState } from "react"; -import { useTeamData } from "../../Hooks/Teams"; -import TeamTable from "./TeamTable"; -//@ts-ignore -import addicon from "../../assets/addiconpng.png"; -import AddTeam from "./AddTeam"; -import { Button, Input, Select, Space, Typography, theme } from "antd"; -import { LeftOutlined, PlusOutlined, RightOutlined } from "@ant-design/icons"; - -const Team = () => { - const [page, setPage] = useState(1); - const [pageSize, setPageSize] = useState(() => { - const saved = localStorage.getItem("general_pageSize"); - return saved ? Number(saved) : 15; - }); - - const { data, isLoading, refetch } = useTeamData({ - page: page, - page_size: pageSize, - }); - - const [open, setOpen] = useState(false); - const showModal = () => { - setOpen(true); - }; - - const pageSizeOptions = [15, 20, 30, 40, 50]; - - const handlePageSizeChange = (value: number) => { - setPageSize(value); - setPage(1); - }; - - useEffect(() => { - localStorage.setItem("general_pageSize", String(pageSize)); - }, [pageSize]); - - const Next = () => { - const a = Number(page) + 1; - setPage(a); - }; - const Previos = () => { - Number(page); - if (page > 1) { - const a = Number(page) - 1; - setPage(a); - } - }; - - const { token } = theme.useToken(); +import { Tabs, Typography } from "antd"; +import TeamServices from "./TeamServices/TeamServices"; +import TeamMonitoring from "./TeamMonitoring/TeamMonitoring"; + +const Teams = () => { + const items = [ + { + key: "services", + label: "Service Team", + children: , + }, + { + key: "monitoring", + label: "Monitoring Team", + children: , + }, + ]; return (
- {open && } -
+
Teams - {/* */} - -
- - - - { - let num = e.target.value; - if (Number(num) && num !== "0") { - setPage(Number(num)); - } - }} - /> - - - +
); }; -export default Team; +export default Teams; diff --git a/src/Hooks/Tasks/index.ts b/src/Hooks/Tasks/index.ts index e99a756..15937f5 100644 --- a/src/Hooks/Tasks/index.ts +++ b/src/Hooks/Tasks/index.ts @@ -7,10 +7,19 @@ export const useTasks = ({ team, page, page_size, + team_monitoring, }: TTasksGetParams) => { return useQuery( - [`tasks/`, search, status, team, page, page_size], - () => taskController.read({ search, status, team, page, page_size }), + [`tasks/`, search, status, team, page, page_size, team_monitoring], + () => + taskController.read({ + search, + status, + team, + page, + page_size, + team_monitoring, + }), { refetchOnWindowFocus: false } ); }; diff --git a/src/Hooks/Teams/index.ts b/src/Hooks/Teams/index.ts index 88c7f6a..fa0dff2 100644 --- a/src/Hooks/Teams/index.ts +++ b/src/Hooks/Teams/index.ts @@ -1,5 +1,9 @@ -import { useQuery } from "react-query"; -import { TTeamGetParams, teamController } from "../../API/LayoutApi/teams"; +import { useMutation, useQuery, useQueryClient } from "react-query"; +import { + TTeamGetParams, + UpdateTeamMonitorVars, + teamController, +} from "../../API/LayoutApi/teams"; export const useTeamData = ({ name, @@ -23,3 +27,69 @@ export const useTeamOne = (teamId: number | string | undefined): any => { { refetchOnWindowFocus: false } ); }; + +// Team monitor + +export const useTeamsMonitorData = ({ + name, + page, + page_size, +}: TTeamGetParams) => { + return useQuery( + ["teams-monitor", name, page, page_size], + () => teamController.readTeamsMonitor({ name, page, page_size }), + { + refetchOnWindowFocus: false, + } + ); +}; + +export const useCreateTeamMonitor = () => { + const queryClient = useQueryClient(); + + return useMutation(teamController.createTeamMonitor, { + onSuccess: () => { + queryClient.invalidateQueries("teams-monitor"); + }, + onError: (error) => { + console.error("Failed to create team monitor:", error); + }, + }); +}; + +export const useTeamsMonitorGetOne = (id: any) => { + return useQuery(["teams-monitor"], () => teamController.readTeamsGetOne(id), { + refetchOnWindowFocus: false, + }); +}; + +export const useDeleteTeamMonitor = () => { + const queryClient = useQueryClient(); + + return useMutation(teamController.deleteTeamMonitor, { + onSuccess: () => { + queryClient.invalidateQueries("teams-monitor"); + }, + onError: (error) => { + console.error("Delete failed:", error); + }, + }); +}; + +export const useUpdateTeamMonitor = () => { + const queryClient = useQueryClient(); + + return useMutation( + ({ id, payload }: UpdateTeamMonitorVars) => + teamController.updateTeamMonitor(id, payload), + + { + onSuccess: () => { + queryClient.invalidateQueries("teams-monitor"); + }, + onError: (error) => { + console.error("Update team monitor failed:", error); + }, + } + ); +}; diff --git a/src/Utils/sidebar.tsx b/src/Utils/sidebar.tsx index d0dec53..8a8453a 100644 --- a/src/Utils/sidebar.tsx +++ b/src/Utils/sidebar.tsx @@ -4,7 +4,8 @@ import Customer from "../Components/Customers/Customers"; import CustomerEdit from "../Components/Customers/CustomersEdit"; import Service from "../Components/Services/Services"; import ServiceEdit from "../Components/Services/ServiceEdit"; -import TeamEdit from "../Components/Teams/TeamEdit"; +import TeamEdit from "../Components/Teams/TeamServices/TeamEdit"; +import TeamMonitoringPreview from "../Components/Teams/TeamMonitoring/TeamMonitoringPreview"; import Team from "../Components/Teams/Teams"; import User from "../Components/Users/Users"; import UserEdit from "../Components/Users/UserEdit"; @@ -71,9 +72,14 @@ export const superItems: TItems[] = [ key: "/teams/", }, { - path: "/teams/:id/", + path: "/teams-services/:id/", component: , - key: "/team/:id/", + key: "/teams-services/:id/", + }, + { + path: "/teams-monitoring/:id/", + component: , + key: "/teams-monitoring/:id/", }, { path: "/users/", diff --git a/src/types/Company/TCompany.ts b/src/types/Company/TCompany.ts index 864f396..8c3302a 100644 --- a/src/types/Company/TCompany.ts +++ b/src/types/Company/TCompany.ts @@ -6,6 +6,7 @@ export type TCompany = { is_active: boolean; usdot: string; team: { name: string; id: number }; + team_monitoring: { name: string; id: number }; api_key: string; created_at: Date; };