import { EditableApprovalWorkflow, EditableWorkflowStep } from "@/interfaces/approval.workflow"; import Option from "@/interfaces/option"; import { CorporateUser, DeveloperUser, MasterCorporateUser, TeacherUser } from "@/interfaces/user"; import { AnimatePresence, Reorder, motion } from "framer-motion"; import { FaRegCheckCircle, FaSpinner } from "react-icons/fa"; import { IoIosAddCircleOutline } from "react-icons/io"; import Button from "../Low/Button"; import Tip from "./Tip"; import WorkflowEditableStepComponent from "./WorkflowEditableStepComponent"; interface Props { workflow: EditableApprovalWorkflow; onWorkflowChange: (workflow: EditableApprovalWorkflow) => void; entityApprovers: (TeacherUser | CorporateUser | MasterCorporateUser | DeveloperUser)[]; entityAvailableFormIntakers?: (TeacherUser | CorporateUser | MasterCorporateUser | DeveloperUser)[]; isLoading: boolean; isRedirecting?: boolean; } export default function WorkflowForm({ workflow, onWorkflowChange, entityApprovers, entityAvailableFormIntakers, isLoading, isRedirecting }: Props) { const lastStep = workflow.steps[workflow.steps.length - 1]; const renumberSteps = (steps: EditableWorkflowStep[]): EditableWorkflowStep[] => { return steps.map((step, index) => ({ ...step, stepNumber: index + 1, })); }; const addStep = () => { const newStep: EditableWorkflowStep = { key: Date.now(), stepType: "approval-by", stepNumber: workflow.steps.length, completed: false, assignees: [null], firstStep: false, finalStep: false, }; const updatedSteps = [ ...workflow.steps.slice(0, -1), newStep, lastStep ]; onWorkflowChange({ ...workflow, steps: renumberSteps(updatedSteps) }); }; const handleDelete = (key: number | undefined) => { if (!key) return; const updatedSteps = workflow.steps.filter((step) => step.key !== key); onWorkflowChange({ ...workflow, steps: renumberSteps(updatedSteps) }); }; const handleSelectChange = (key: number | undefined, numberOfSelects: number, index: number, selectedOption: Option | null) => { if (!key) return; const updatedSteps = workflow.steps.map((step) => { if (step.key !== key) return step; const assignees = step.assignees ?? []; let newAssignees = [...assignees]; if (numberOfSelects === assignees.length) { // means no new select was added and instead one was changed newAssignees[index] = selectedOption?.value; } else if (numberOfSelects === assignees.length + 1) { // means a new select was added newAssignees.push(selectedOption?.value || null); } return { ...step, assignees: newAssignees }; }); onWorkflowChange({ ...workflow, steps: updatedSteps }); }; const handleReorder = (newOrder: EditableWorkflowStep[]) => { let draggableIndex = 0; const updatedSteps = workflow.steps.map((step) => { if (!step.firstStep && !step.finalStep && !step.completed) { return newOrder[draggableIndex++]; } // Keep static steps as-is return step; }); onWorkflowChange({ ...workflow, steps: renumberSteps(updatedSteps) }); }; return ( <> {workflow.entityId && workflow.name &&