import Layout from "@/components/High/Layout"; import { sessionOptions } from "@/lib/session"; import { redirect, serialize } from "@/utils"; import { requestUser } from "@/utils/api"; import { shouldRedirectHome } from "@/utils/navigation.disabled"; import { withIronSessionSsr } from "iron-session/next"; import Head from "next/head"; import Link from "next/link"; import { BsChevronLeft, BsTrash } from "react-icons/bs"; import { ToastContainer } from "react-toastify"; import { v4 as uuidv4 } from 'uuid'; import Tip from "@/components/ApprovalWorkflows/Tip"; import WorkflowForm from "@/components/ApprovalWorkflows/WorkflowForm"; import Button from "@/components/Low/Button"; import Input from "@/components/Low/Input"; import Select from "@/components/Low/Select"; import { ApprovalWorkflow } from "@/interfaces/approval.workflow"; import { Entity } from "@/interfaces/entity"; import { CorporateUser, TeacherUser, User } from "@/interfaces/user"; import { getEntities } from "@/utils/entities.be"; import { getEntitiesUsers } from "@/utils/users.be"; import { LayoutGroup, motion } from "framer-motion"; import { useEffect, useState } from "react"; import { MdFormatListBulletedAdd } from "react-icons/md"; 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("/") const userEntitiesWithLabel = await getEntities(user.entities.map(entity => entity.id)); return { props: serialize({ user, userEntitiesWithLabel, userEntitiesTeachers: await getEntitiesUsers(userEntitiesWithLabel.map(entity => entity.id), { type: "teacher" }) as TeacherUser[], userEntitiesCorporates: await getEntitiesUsers(userEntitiesWithLabel.map(entity => entity.id), { type: "corporate" }) as CorporateUser[], }), }; }, sessionOptions); interface Props { user: User, userEntitiesWithLabel: Entity[], userEntitiesTeachers: TeacherUser[], userEntitiesCorporates: CorporateUser[], } export default function Home({ user, userEntitiesWithLabel, userEntitiesTeachers, userEntitiesCorporates }: Props) { const [workflows, setWorkflows] = useState([]); const [selectedWorkflowId, setSelectedWorkflowId] = useState(undefined); const [entityId, setEntityId] = useState(null); const [entityTeachers, setEntityTeachers] = useState([]); const [entityCorporates, setEntityCorporates] = useState([]); useEffect(() => { if (entityId) { setEntityTeachers( userEntitiesTeachers.filter(teacher => teacher.entities.some(entity => entity.id === entityId) ) ); setEntityCorporates( userEntitiesCorporates.filter(corporate => corporate.entities.some(entity => entity.id === entityId) ) ); } else { setEntityTeachers([]); setEntityCorporates([]); } }, [entityId, userEntitiesTeachers, userEntitiesCorporates]); const currentWorkflow = workflows.find(wf => wf.id === selectedWorkflowId); const ENTITY_OPTIONS = userEntitiesWithLabel.map(entity => ({ label: entity.label, value: entity.id, filter: (x: ApprovalWorkflow) => x.entityId === entity.id, })); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); console.log("Form submitted! Values:", workflows); }; const handleAddNewWorkflow = () => { const newId = uuidv4(); const newWorkflow: ApprovalWorkflow = { id: newId, name: "", entityId: "", modules: [], status: "pending", steps: [ { key: Date.now(), completed: false, editView: true, stepType: "form-intake", stepNumber: 1, firstStep: true, assignees: [null] }, { key: Date.now() + 1, completed: false, editView: true, stepType: "approval-by", stepNumber: 2, finalStep: true, assignees: [null] }, ], }; setWorkflows((prev) => [...prev, newWorkflow]); setSelectedWorkflowId(newId); }; const onWorkflowChange = (updatedWorkflow: ApprovalWorkflow) => { setWorkflows(prev => prev.map(wf => (wf.id === updatedWorkflow.id ? updatedWorkflow : wf)) ); } const handleSelectWorkflow = (id: string) => { setSelectedWorkflowId(id); }; const handleDeleteWorkflow = (id: string) => { if (!confirm(`Are you sure you want to delete this Approval Workflow?`)) return; const updatedWorkflows = workflows.filter(wf => wf.id !== id); setWorkflows(updatedWorkflows); if (selectedWorkflowId === id) { setSelectedWorkflowId(updatedWorkflows.find(wf => wf.id)?.id); } }; const handleResetWorkflow = (id: string) => { setWorkflows(prev => prev.filter(wf => wf.id !== id)); handleAddNewWorkflow(); } return ( <> Configure Workflows | EnCoach {user && (

{"Configure Approval Workflows"}

{workflows.length !== 0 &&
}
{workflows.map((workflow) => ( ))}
{currentWorkflow && ( <>
{ const updatedWorkflow = { ...currentWorkflow, name: updatedName, }; onWorkflowChange(updatedWorkflow); }} />