You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

301 lines
8.9 KiB

import { Space, Table, Tooltip } from "antd";
import moment from "moment";
import { useCompanyData } from "../../Hooks/Companies";
import { useCustomerData } from "../../Hooks/Customers";
import { useUserData } from "../../Hooks/Users";
import { updateController } from "../../API/LayoutApi/update";
import {
QueryObserverResult,
RefetchOptions,
RefetchQueryFilters,
} from "react-query";
import { TUpdate } from "../../types/Update/TUpdate";
import { useEffect, useState } from "react";
// @ts-ignore
import tagIcon from "../../assets/tagIcon.png";
// @ts-ignore
import pin from "../../assets/pinicon.png";
// @ts-ignore
import unpin from "../../assets/unpinicon.png";
// @ts-ignore
import zippy from "../../assets/zippyicon.svg";
// @ts-ignore
import evo from "../../assets/evoicon.png";
// @ts-ignore
import zeelog from "../../assets/zeelogicon.svg";
// @ts-ignore
import ontime from "../../assets/ontimeicon.svg";
// @ts-ignore
import tt from "../../assets/tticon.svg";
const UpdateTable = ({
data = [],
isLoading,
refetch,
}: {
data: TUpdate[] | undefined;
isLoading?: boolean;
refetch: <TPageData>(
options?: (RefetchOptions & RefetchQueryFilters<TPageData>) | undefined
) => Promise<QueryObserverResult<TUpdate[], unknown>>;
}) => {
const CompanyData = useCompanyData({});
const CustomerData = useCustomerData({});
const AdminData = useUserData({});
const [isTextSelected, setIsTextSelected] = useState(false);
useEffect(() => {
const handleSelectionChange = () => {
const selection = window.getSelection();
setIsTextSelected(selection !== null && selection.toString() !== "");
};
document.addEventListener("selectionchange", handleSelectionChange);
return () => {
document.removeEventListener("selectionchange", handleSelectionChange);
};
}, []);
const Row = (record: TUpdate, event: any) => {
if (isTextSelected) {
return;
}
if (event.target.classList.contains("ant-table-cell")) {
document.location.replace(`/#/updates/${record.id}`);
}
};
const getImageSource = (source: string) => {
switch (source) {
case "Zippy":
return zippy;
case "EVO":
return evo;
case "Ontime":
return ontime;
case "Zeelog":
return zeelog;
case "TT":
return tt;
default:
return tt;
}
};
return (
<div>
<Table
onRow={(record) => ({
onClick: (event) => Row(record, event),
})}
dataSource={data?.map((u, i) => ({
no: i + 1,
...u,
company_name: CompanyData?.data?.find(
(company: any) => company.id === u.company_id
)?.name,
customer_name: CustomerData?.data?.find(
(customer: any) => customer.id === u.customer_id
)?.name,
in_charge_name: AdminData?.data?.find(
(admin: any) => admin.id === u.provider_id
)?.username,
executor_name: AdminData?.data?.find(
(admin: any) => admin.id === u.executor_id
)?.username,
created: moment(u?.created_at, "YYYY-MM-DD HH:mm:ss").format(
"DD.MM.YYYY HH:mm"
),
action: { ...u },
}))}
columns={[
{
title: <img src={tagIcon} alt="" />,
dataIndex: "no",
width: "4%",
},
{
title: "Company",
dataIndex: "company",
ellipsis: {
showTitle: false,
},
width: "10%",
render: (text: any, record: any) => (
<Tooltip placement="topLeft" title={text?.name}>
<div style={{ display: "flex", alignItems: "center" }}>
{text?.source && (
<img
src={getImageSource(text?.source)}
alt=""
style={{ width: 20, height: 20, marginRight: 10 }}
/>
)}
{text?.name}
</div>
</Tooltip>
),
},
{
title: "Driver",
dataIndex: "customer",
ellipsis: {
showTitle: false,
},
width: "10%",
render: (item: { name: string }) => (
<Tooltip placement="topLeft" title={item?.name}>
{item?.name}
</Tooltip>
),
},
{
title: "Created by",
dataIndex: "provider ",
ellipsis: {
showTitle: false,
},
responsive: ["xl"],
width: "10%",
render: (note: string) => (
<Tooltip placement="topLeft" title={note}>
{note}
</Tooltip>
),
},
{
title: "Completed by",
dataIndex: "executor",
ellipsis: {
showTitle: false,
},
responsive: ["lg"],
width: "10%",
render: (note: string) => (
<Tooltip placement="topLeft" title={note}>
{note}
</Tooltip>
),
},
{
title: "Status",
dataIndex: "status",
ellipsis: {
showTitle: false,
},
width: "10%",
render: (status: string) => (
<span>
{status === "Done" && <p className="status-done">Done</p>}
{status === "Checking" && (
<p className="status-in-progress">Checking</p>
)}
{status === "New" && <p className="status-new">New</p>}
{status === "Setup" && <p className="status-setup">Setup</p>}
{status === "Paper" && <p className="status-paper">Paper</p>}
</span>
),
},
{
title: "Note",
dataIndex: "note",
width: "10%",
ellipsis: {
showTitle: false,
},
render: (note: string) => (
<Tooltip placement="topLeft" title={note}>
{note}
</Tooltip>
),
},
{
title: "Solution",
dataIndex: "solution",
width: "10%",
responsive: ["lg"],
ellipsis: {
showTitle: false,
},
render: (note: string) => (
<Tooltip placement="topLeft" title={note}>
{note}
</Tooltip>
),
},
{
title: "Created at",
dataIndex: "created",
ellipsis: {
showTitle: false,
},
responsive: ["xxl"],
width: "10%",
render: (note: string) => (
<Tooltip placement="topLeft" title={note}>
{note}
</Tooltip>
),
},
{
title: "Actions",
dataIndex: "action",
width: "8%",
render: (record: TUpdate) => {
return (
<div className="notedit">
{record.status !== "Done" && (
<Space>
{record.is_pinned ? (
<button
className="btn-unpin"
onClick={(e) => {
const updateData = {
is_pinned: false,
};
updateController
.updatePatch(updateData, record.id)
.then(() => {
refetch();
});
}}
>
<img src={unpin} alt="" />
</button>
) : (
<button
className="btn-pin"
style={{ paddingTop: 2 }}
onClick={(e) => {
const updateData = {
is_pinned: true,
};
updateController
.updatePatch(updateData, record.id)
.then(() => {
refetch();
});
}}
>
<img src={pin} alt="" />
</button>
)}
</Space>
)}
</div>
);
},
},
]}
rowClassName={(record, index) =>
index % 2 === 0 ? "odd-row" : "even-row"
}
loading={isLoading}
size="small"
/>
</div>
);
};
export default UpdateTable;