Applied the same fix for other pages
This commit is contained in:
@@ -22,16 +22,16 @@ export const getServerSideProps = withIronSessionSsr(({req, res}) => {
|
||||
redirect: {
|
||||
destination: "/login",
|
||||
permanent: false,
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
if (shouldRedirectHome(user) || user.type !== "developer") {
|
||||
if (shouldRedirectHome(user) || !["developer", "admin", "corporate", "agent"].includes(user.type)) {
|
||||
return {
|
||||
redirect: {
|
||||
destination: "/",
|
||||
permanent: false,
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -5,22 +5,10 @@ import Modal from "@/components/Modal";
|
||||
import useTickets from "@/hooks/useTickets";
|
||||
import useUser from "@/hooks/useUser";
|
||||
import useUsers from "@/hooks/useUsers";
|
||||
import {
|
||||
Ticket,
|
||||
TicketStatus,
|
||||
TicketStatusLabel,
|
||||
TicketType,
|
||||
TicketTypeLabel,
|
||||
TicketWithCorporate,
|
||||
} from "@/interfaces/ticket";
|
||||
import {Ticket, TicketStatus, TicketStatusLabel, TicketType, TicketTypeLabel, TicketWithCorporate} from "@/interfaces/ticket";
|
||||
import {sessionOptions} from "@/lib/session";
|
||||
import {shouldRedirectHome} from "@/utils/navigation.disabled";
|
||||
import {
|
||||
createColumnHelper,
|
||||
flexRender,
|
||||
getCoreRowModel,
|
||||
useReactTable,
|
||||
} from "@tanstack/react-table";
|
||||
import {createColumnHelper, flexRender, getCoreRowModel, useReactTable} from "@tanstack/react-table";
|
||||
import clsx from "clsx";
|
||||
import {withIronSessionSsr} from "iron-session/next";
|
||||
import moment from "moment";
|
||||
@@ -39,19 +27,16 @@ export const getServerSideProps = withIronSessionSsr(({ req, res }) => {
|
||||
redirect: {
|
||||
destination: "/login",
|
||||
permanent: false,
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
if (
|
||||
shouldRedirectHome(user) ||
|
||||
["admin", "developer", "agent"].includes(user.type)
|
||||
) {
|
||||
if (shouldRedirectHome(user) || !["admin", "developer", "agent"].includes(user.type)) {
|
||||
return {
|
||||
redirect: {
|
||||
destination: "/",
|
||||
permanent: false,
|
||||
}
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -72,10 +57,7 @@ const TypesClassNames: { [key in TicketType]: string } = {
|
||||
help: "bg-mti-blue-light",
|
||||
};
|
||||
|
||||
const escapedURL = process.env.NEXT_PUBLIC_WEBSITE_URL || ''.replace(
|
||||
/[.*+?^${}()|[\]\\]/g,
|
||||
"\\$&"
|
||||
);
|
||||
const escapedURL = process.env.NEXT_PUBLIC_WEBSITE_URL || "".replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
||||
const fromHomepage = [new RegExp(`^${escapedURL}`), /\/contact$/];
|
||||
|
||||
type Source = "webpage" | "platform" | "";
|
||||
@@ -84,7 +66,7 @@ const SOURCE_OPTIONS = [
|
||||
{value: "", label: "All"},
|
||||
{value: "webpage", label: "Webpage"},
|
||||
{value: "platform", label: "Platform"},
|
||||
]
|
||||
];
|
||||
|
||||
export default function Tickets() {
|
||||
const [filteredTickets, setFilteredTickets] = useState<Ticket[]>([]);
|
||||
@@ -102,28 +84,21 @@ export default function Tickets() {
|
||||
const {tickets, reload} = useTickets();
|
||||
|
||||
const sortByDate = (a: Ticket, b: Ticket) => {
|
||||
return moment((dateSorting === "desc" ? b : a).date).diff(
|
||||
moment((dateSorting === "desc" ? a : b).date)
|
||||
);
|
||||
return moment((dateSorting === "desc" ? b : a).date).diff(moment((dateSorting === "desc" ? a : b).date));
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
const filters = [];
|
||||
if (user?.type === "agent")
|
||||
filters.push((x: Ticket) => x.assignedTo === user.id);
|
||||
if (user?.type === "agent") filters.push((x: Ticket) => x.assignedTo === user.id);
|
||||
if (typeFilter) filters.push((x: Ticket) => x.type === typeFilter);
|
||||
if (statusFilter) filters.push((x: Ticket) => x.status === statusFilter);
|
||||
if (assigneeFilter)
|
||||
filters.push((x: Ticket) => x.assignedTo === assigneeFilter);
|
||||
if (assigneeFilter) filters.push((x: Ticket) => x.assignedTo === assigneeFilter);
|
||||
if (sourceFilter) {
|
||||
if (sourceFilter === "webpage")
|
||||
filters.push((x: Ticket) => fromHomepage.some((r) => r.test(x.reportedFrom)));
|
||||
if (sourceFilter === "platform")
|
||||
filters.push((x: Ticket) => !fromHomepage.some((r) => r.test(x.reportedFrom)));
|
||||
if (sourceFilter === "webpage") filters.push((x: Ticket) => fromHomepage.some((r) => r.test(x.reportedFrom)));
|
||||
if (sourceFilter === "platform") filters.push((x: Ticket) => !fromHomepage.some((r) => r.test(x.reportedFrom)));
|
||||
}
|
||||
setFilteredTickets(
|
||||
[...filters.reduce((d, f) => d.filter(f), tickets)].sort(sortByDate)
|
||||
);
|
||||
setFilteredTickets([...filters.reduce((d, f) => d.filter(f), tickets)].sort(sortByDate));
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [tickets, typeFilter, statusFilter, assigneeFilter, dateSorting, user, sourceFilter]);
|
||||
|
||||
const columns = [
|
||||
@@ -134,14 +109,7 @@ export default function Tickets() {
|
||||
columnHelper.accessor("type", {
|
||||
header: "Type",
|
||||
cell: (info) => (
|
||||
<span
|
||||
className={clsx(
|
||||
"rounded-lg p-1 px-2 text-white",
|
||||
TypesClassNames[info.getValue()]
|
||||
)}
|
||||
>
|
||||
{TicketTypeLabel[info.getValue()]}
|
||||
</span>
|
||||
<span className={clsx("rounded-lg p-1 px-2 text-white", TypesClassNames[info.getValue()])}>{TicketTypeLabel[info.getValue()]}</span>
|
||||
),
|
||||
}),
|
||||
columnHelper.accessor("reporter", {
|
||||
@@ -155,36 +123,22 @@ export default function Tickets() {
|
||||
columnHelper.accessor("date", {
|
||||
id: "date",
|
||||
header: (
|
||||
<button
|
||||
className="flex items-center gap-2"
|
||||
onClick={() =>
|
||||
setDateSorting((prev) => (prev === "asc" ? "desc" : "asc"))
|
||||
}
|
||||
>
|
||||
<button className="flex items-center gap-2" onClick={() => setDateSorting((prev) => (prev === "asc" ? "desc" : "asc"))}>
|
||||
<span>Date</span>
|
||||
{dateSorting === "desc" && <BsArrowDown />}
|
||||
{dateSorting === "asc" && <BsArrowUp />}
|
||||
</button>
|
||||
) as any,
|
||||
cell: (info) => (
|
||||
<span className="whitespace-nowrap">{moment(info.getValue()).format("DD/MM/YYYY - HH:mm")}</span>
|
||||
),
|
||||
cell: (info) => <span className="whitespace-nowrap">{moment(info.getValue()).format("DD/MM/YYYY - HH:mm")}</span>,
|
||||
}),
|
||||
columnHelper.accessor("subject", {
|
||||
header: "Subject",
|
||||
cell: (info) =>
|
||||
info.getValue().substring(0, 12) +
|
||||
(info.getValue().length > 12 ? "..." : ""),
|
||||
cell: (info) => info.getValue().substring(0, 12) + (info.getValue().length > 12 ? "..." : ""),
|
||||
}),
|
||||
columnHelper.accessor("status", {
|
||||
header: "Status",
|
||||
cell: (info) => (
|
||||
<span
|
||||
className={clsx(
|
||||
"rounded-lg p-1 px-2 text-white",
|
||||
StatusClassNames[info.getValue()]
|
||||
)}
|
||||
>
|
||||
<span className={clsx("rounded-lg p-1 px-2 text-white", StatusClassNames[info.getValue()])}>
|
||||
{TicketStatusLabel[info.getValue()]}
|
||||
</span>
|
||||
),
|
||||
@@ -200,8 +154,7 @@ export default function Tickets() {
|
||||
];
|
||||
|
||||
const getAssigneeValue = () => {
|
||||
if (user && user.type === "agent")
|
||||
return { value: user.id, label: `${user.name} - ${user.email}` };
|
||||
if (user && user.type === "agent") return {value: user.id, label: `${user.name} - ${user.email}`};
|
||||
|
||||
if (assigneeFilter) {
|
||||
const assigneeUser = users.find((x) => x.id === assigneeFilter);
|
||||
@@ -229,8 +182,7 @@ export default function Tickets() {
|
||||
onClose={() => {
|
||||
reload();
|
||||
setSelectedTicket(undefined);
|
||||
}}
|
||||
>
|
||||
}}>
|
||||
{selectedTicket && (
|
||||
<TicketDisplay
|
||||
user={user!}
|
||||
@@ -259,9 +211,7 @@ export default function Tickets() {
|
||||
|
||||
<div className="flex w-full items-center gap-4">
|
||||
<div className="flex w-full flex-col gap-3">
|
||||
<label className="text-mti-gray-dim text-base font-normal">
|
||||
Status
|
||||
</label>
|
||||
<label className="text-mti-gray-dim text-base font-normal">Status</label>
|
||||
<Select
|
||||
options={Object.keys(TicketStatusLabel).map((x) => ({
|
||||
value: x,
|
||||
@@ -275,45 +225,31 @@ export default function Tickets() {
|
||||
}
|
||||
: undefined
|
||||
}
|
||||
onChange={(value) =>
|
||||
setStatusFilter((value?.value as TicketStatus) ?? undefined)
|
||||
}
|
||||
onChange={(value) => setStatusFilter((value?.value as TicketStatus) ?? undefined)}
|
||||
isClearable
|
||||
placeholder="Status..."
|
||||
/>
|
||||
</div>
|
||||
<div className="flex w-full flex-col gap-3">
|
||||
<label className="text-mti-gray-dim text-base font-normal">
|
||||
Type
|
||||
</label>
|
||||
<label className="text-mti-gray-dim text-base font-normal">Type</label>
|
||||
<Select
|
||||
options={Object.keys(TicketTypeLabel).map((x) => ({
|
||||
value: x,
|
||||
label: TicketTypeLabel[x as keyof typeof TicketTypeLabel],
|
||||
}))}
|
||||
value={
|
||||
typeFilter
|
||||
? { value: typeFilter, label: TicketTypeLabel[typeFilter] }
|
||||
: undefined
|
||||
}
|
||||
onChange={(value) =>
|
||||
setTypeFilter((value?.value as TicketType) ?? undefined)
|
||||
}
|
||||
value={typeFilter ? {value: typeFilter, label: TicketTypeLabel[typeFilter]} : undefined}
|
||||
onChange={(value) => setTypeFilter((value?.value as TicketType) ?? undefined)}
|
||||
isClearable
|
||||
placeholder="Type..."
|
||||
/>
|
||||
</div>
|
||||
<div className="flex w-full flex-col gap-3">
|
||||
<label className="text-mti-gray-dim text-base font-normal">
|
||||
Assignee
|
||||
</label>
|
||||
<label className="text-mti-gray-dim text-base font-normal">Assignee</label>
|
||||
<Select
|
||||
options={[
|
||||
{value: "me", label: "Assigned to me"},
|
||||
...users
|
||||
.filter((x) =>
|
||||
["admin", "developer", "agent"].includes(x.type)
|
||||
)
|
||||
.filter((x) => ["admin", "developer", "agent"].includes(x.type))
|
||||
.map((u) => ({
|
||||
value: u.id,
|
||||
label: `${u.name} - ${u.email}`,
|
||||
@@ -322,26 +258,19 @@ export default function Tickets() {
|
||||
disabled={user.type === "agent"}
|
||||
value={getAssigneeValue()}
|
||||
onChange={(value) =>
|
||||
value
|
||||
? setAssigneeFilter(
|
||||
value.value === "me" ? user.id : value.value
|
||||
)
|
||||
: setAssigneeFilter(undefined)
|
||||
value ? setAssigneeFilter(value.value === "me" ? user.id : value.value) : setAssigneeFilter(undefined)
|
||||
}
|
||||
placeholder="Assignee..."
|
||||
isClearable
|
||||
/>
|
||||
</div>
|
||||
<div className="flex w-full flex-col gap-3">
|
||||
<label className="text-mti-gray-dim text-base font-normal">
|
||||
Source
|
||||
</label>
|
||||
<label className="text-mti-gray-dim text-base font-normal">Source</label>
|
||||
<Select
|
||||
options={SOURCE_OPTIONS}
|
||||
disabled={user.type === "agent"}
|
||||
value={SOURCE_OPTIONS.find((x) => x.value === sourceFilter)}
|
||||
onChange={(value) => setSourceFilter(value?.value as Source)
|
||||
}
|
||||
onChange={(value) => setSourceFilter(value?.value as Source)}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -352,12 +281,7 @@ export default function Tickets() {
|
||||
<tr key={headerGroup.id}>
|
||||
{headerGroup.headers.map((header) => (
|
||||
<th className="px-4 py-4 text-left" key={header.id}>
|
||||
{header.isPlaceholder
|
||||
? null
|
||||
: flexRender(
|
||||
header.column.columnDef.header,
|
||||
header.getContext()
|
||||
)}
|
||||
{header.isPlaceholder ? null : flexRender(header.column.columnDef.header, header.getContext())}
|
||||
</th>
|
||||
))}
|
||||
</tr>
|
||||
@@ -368,17 +292,13 @@ export default function Tickets() {
|
||||
<tr
|
||||
className={clsx(
|
||||
"even:bg-mti-purple-ultralight/40 hover:bg-mti-purple-ultralight cursor-pointer rounded-lg py-2 odd:bg-white",
|
||||
"transition duration-300 ease-in-out"
|
||||
"transition duration-300 ease-in-out",
|
||||
)}
|
||||
onClick={() => setSelectedTicket(row.original)}
|
||||
key={row.id}
|
||||
>
|
||||
key={row.id}>
|
||||
{row.getVisibleCells().map((cell) => (
|
||||
<td className="w-fit items-center px-4 py-2" key={cell.id}>
|
||||
{flexRender(
|
||||
cell.column.columnDef.cell,
|
||||
cell.getContext()
|
||||
)}
|
||||
{flexRender(cell.column.columnDef.cell, cell.getContext())}
|
||||
</td>
|
||||
))}
|
||||
</tr>
|
||||
|
||||
Reference in New Issue
Block a user