import Layout from "@/components/High/Layout"; import Select from "@/components/Low/Select"; import useApprovalWorkflows from "@/hooks/useApprovalWorkflows"; import useUser from "@/hooks/useUser"; import useUsers from "@/hooks/useUsers"; import { ApprovalWorkflow, ApprovalWorkflowStatus, ApprovalWorkflowStatusLabel } from "@/interfaces/approval.workflow"; import { sessionOptions } from "@/lib/session"; import { redirect } from "@/utils"; import { requestUser } from "@/utils/api"; import { shouldRedirectHome } from "@/utils/navigation.disabled"; import { createColumnHelper, flexRender, getCoreRowModel, useReactTable } from "@tanstack/react-table"; import axios from "axios"; import clsx from "clsx"; import { withIronSessionSsr } from "iron-session/next"; import Head from "next/head"; import Link from "next/link"; import { useEffect, useState } from "react"; import { BsTrash } from "react-icons/bs"; import { FaRegEdit } from "react-icons/fa"; import { toast, ToastContainer } from "react-toastify"; const columnHelper = createColumnHelper(); export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { const user = await requestUser(req, res) if (!user) return redirect("/login") if (shouldRedirectHome(user) || !["admin", "developer", "teacher", "corporate", "mastercorporate"].includes(user.type)) return redirect("/") return { props: { user }, }; }, sessionOptions); const StatusClassNames: { [key in ApprovalWorkflowStatus]: string } = { approved: "bg-green-100 text-green-800 border border-green-300 before:content-[''] before:w-2 before:h-2 before:bg-green-500 before:rounded-full before:inline-block before:mr-2", pending: "bg-orange-100 text-orange-800 border border-orange-300 before:content-[''] before:w-2 before:h-2 before:bg-orange-500 before:rounded-full before:inline-block before:mr-2", rejected: "bg-red-100 text-red-800 border border-red-300 before:content-[''] before:w-2 before:h-2 before:bg-red-500 before:rounded-full before:inline-block before:mr-2", }; type CustomStatus = ApprovalWorkflowStatus | "all" | "pending"; const STATUS_OPTIONS = [ { label: "All", value: "all", filter: (x: ApprovalWorkflow) => true, }, { label: "Approved", value: "approved", filter: (x: ApprovalWorkflow) => x.status === "approved", }, { label: "Pending", value: "pending", filter: (x: ApprovalWorkflow) => x.status === "pending", }, { label: "Rejected", value: "rejected", filter: (x: ApprovalWorkflow) => x.status === "rejected", }, ]; export default function ApprovalWorkflows() { const [filteredApprovalWorkflows, setFilteredApprovalWorkflows] = useState([]); /* const [selectedApprovalWorkflow, setSelectedApprovalWorkflow] = useState(); */ const [statusFilter, setStatusFilter] = useState("all"); const { user } = useUser({ redirectTo: "/login" }); const { approvalWorkflows/* , reload */ } = useApprovalWorkflows(); useEffect(() => { const filters = []; if (statusFilter) { const filter = STATUS_OPTIONS.find((x) => x.value === statusFilter)?.filter; if (filter) filters.push(filter); } setFilteredApprovalWorkflows([...filters.reduce((d, f) => d.filter(f), approvalWorkflows)]); // eslint-disable-next-line react-hooks/exhaustive-deps }, [approvalWorkflows, statusFilter]); const deleteApprovalWorkflow = (id: string, name: string) => { if (!confirm(`Are you sure you want to delete this Approval Workflow?`)) return; axios .delete(`/api/approval-workflows/${id}`) .then(() => toast.success(`Deleted ${name} Approval Workflow.`)) .catch((reason) => { if (reason.response.status === 404) { toast.error("Approval Workflow not found!"); return; } if (reason.response.status === 403) { toast.error("You do not have permission to delete an Approval Workflow!"); return; } toast.error("Something went wrong, please try again later."); }) /* .finally(reload); */ }; const editApprovalWorkflow = (id: string) => { }; const columns = [ /* columnHelper.accessor("id", { header: "ID", cell: (info) => info.getValue(), }), */ columnHelper.accessor("name", { header: "Name", cell: (info) => info.getValue(), }), columnHelper.accessor("module", { header: "Module", cell: (info) => info.getValue(), }), columnHelper.accessor("status", { header: "Status", cell: (info) => ( {ApprovalWorkflowStatusLabel[info.getValue()]} ), }), columnHelper.accessor("approvers", { header: "Approvers", cell: (info) => info.getValue(), }), columnHelper.accessor("step", { header: "Step", cell: (info) => info.getValue(), }), { header: "Actions", id: "actions", cell: ({ row }: { row: { original: ApprovalWorkflow } }) => { return (
); }, }, ]; const table = useReactTable({ data: filteredApprovalWorkflows, columns: columns, getCoreRowModel: getCoreRowModel(), }); return ( <> Approval Workflows Panel | EnCoach {user && (

Approval Workflows