import RequestedBy from "@/components/ApprovalWorkflows/RequestedBy"; import StartedOn from "@/components/ApprovalWorkflows/StartedOn"; import Status from "@/components/ApprovalWorkflows/Status"; import WorkflowForm from "@/components/ApprovalWorkflows/WorkflowForm"; import Layout from "@/components/High/Layout"; import { ApprovalWorkflow, EditableApprovalWorkflow, EditableWorkflowStep, getUserTypeLabelShort } from "@/interfaces/approval.workflow"; import { CorporateUser, DeveloperUser, MasterCorporateUser, TeacherUser, User } from "@/interfaces/user"; import { sessionOptions } from "@/lib/session"; import { findBy, redirect, serialize } from "@/utils"; import { requestUser } from "@/utils/api"; import { getApprovalWorkflow } from "@/utils/approval.workflows.be"; import { getEntityWithRoles } from "@/utils/entities.be"; import { shouldRedirectHome } from "@/utils/navigation.disabled"; import { doesEntityAllow } from "@/utils/permissions"; import { getEntityUsers } from "@/utils/users.be"; import axios from "axios"; import { LayoutGroup, motion } from "framer-motion"; import { withIronSessionSsr } from "iron-session/next"; import Head from "next/head"; import Link from "next/link"; import { useEffect, useState } from "react"; import { BsChevronLeft } from "react-icons/bs"; import { toast, ToastContainer } from "react-toastify"; export const getServerSideProps = withIronSessionSsr(async ({ req, res, params }) => { const user = await requestUser(req, res); if (!user) return redirect("/login") if (shouldRedirectHome(user) || !["admin", "developer", "teacher", "corporate", "mastercorporate"].includes(user.type)) return redirect("/") const { id } = params as { id: string }; const workflow: ApprovalWorkflow | null = await getApprovalWorkflow("active-workflows", id); if (!workflow) return redirect("/approval-workflows"); const entityWithRole = await getEntityWithRoles(workflow.entityId); if (!entityWithRole) return redirect("/approval-workflows"); if (!doesEntityAllow(user, entityWithRole, "edit_workflow")) return redirect("/approval-workflows"); return { props: serialize({ user, workflow, workflowEntityApprovers: await getEntityUsers(workflow.entityId, undefined, { type: { $in: ["teacher", "corporate", "mastercorporate", "developer"] } }) as (TeacherUser | CorporateUser | MasterCorporateUser | DeveloperUser)[], }), }; }, sessionOptions); interface Props { user: User, workflow: ApprovalWorkflow, workflowEntityApprovers: (TeacherUser | CorporateUser | MasterCorporateUser | DeveloperUser)[], } export default function Home({ user, workflow, workflowEntityApprovers }: Props) { const [updatedWorkflow, setUpdatedWorkflow] = useState(null); const [isLoading, setIsLoading] = useState(false); useEffect(() => { const editableSteps: EditableWorkflowStep[] = workflow.steps.map(step => ({ key: step.stepNumber + 999, // just making sure they are unique because new steps that users add will have key=3 key=4 etc stepType: step.stepType, stepNumber: step.stepNumber, completed: step.completed, completedBy: step.completedBy || undefined, completedDate: step.completedDate || undefined, assignees: step.assignees, firstStep: step.firstStep || false, finalStep: step.finalStep || false, onDelete: undefined, })); const editableWorkflow: EditableApprovalWorkflow = { ...workflow, id: workflow._id?.toString() ?? "", requester: user.id, // should it change to the editor? steps: editableSteps, }; setUpdatedWorkflow(editableWorkflow); }, []); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); setIsLoading(true); if (!updatedWorkflow) { setIsLoading(false); return; } for (const step of updatedWorkflow.steps) { if (step.assignees.every(x => !x)) { toast.warning("There is at least one empty step in the workflow."); setIsLoading(false); return; } } const filteredWorkflow: ApprovalWorkflow = { ...updatedWorkflow, steps: updatedWorkflow.steps.map(step => ({ ...step, assignees: step.assignees.filter((assignee): assignee is string => assignee !== null && assignee !== undefined) })) }; axios .put(`/api/approval-workflows/${updatedWorkflow.id}/edit`, filteredWorkflow) .then(() => { toast.success("Approval Workflow edited successfully."); setIsLoading(false); }) .catch((reason) => { if (reason.response.status === 401) { toast.error("Not logged in!"); } else if (reason.response.status === 403) { toast.error("You do not have permission to edit Approval Workflows!"); } else { toast.error("Something went wrong, please try again later."); } setIsLoading(false); console.log("Submitted Values:", filteredWorkflow); return; }) }; const onWorkflowChange = (updatedWorkflow: EditableApprovalWorkflow) => { setUpdatedWorkflow(updatedWorkflow); }; return ( <> Edit Workflow | EnCoach

{workflow.name}

{updatedWorkflow && }
); }