fix step numbering bug from previous commit and prepare non editable workflow view

This commit is contained in:
Joao Correia
2025-01-21 00:10:14 +00:00
parent 01222b3a13
commit 48187fc7f2
3 changed files with 55 additions and 29 deletions

View File

@@ -1,13 +1,10 @@
import { WorkflowStep } from "@/interfaces/approval.workflow";
import Option from "@/interfaces/option"; import Option from "@/interfaces/option";
import { useState } from "react"; import { useState } from "react";
import { BsTrash } from "react-icons/bs"; import { BsTrash } from "react-icons/bs";
import { FaWpforms } from "react-icons/fa6";
import { LuGripHorizontal } from "react-icons/lu"; import { LuGripHorizontal } from "react-icons/lu";
import WorkflowStepNumber from "./WorkflowStepNumber"; import WorkflowStepNumber from "./WorkflowStepNumber";
import WorkflowStepSelects from "./WorkflowStepSelects"; import WorkflowStepSelects from "./WorkflowStepSelects";
import { WorkflowStep } from "@/interfaces/approval.workflow";
export type StepType = "form-intake" | "approval-by";
const teacherOptions: Option[] = [ const teacherOptions: Option[] = [
// fetch from database? // fetch from database?
@@ -17,18 +14,13 @@ const directorOptions: Option[] = [
// fetch from database? // fetch from database?
] ]
export default function WorkflowStepComponent({ export default function WorkflowEditableStepComponent({
stepType, stepType,
stepNumber, stepNumber,
completed = false, completed = false,
editView = false, finalStep,
finalStep = false,
isSelected = false,
requestedBy,
onDelete, onDelete,
}: WorkflowStep) { }: WorkflowStep) {
// disable selectability of step if in editView
const effectiveIsSelected = editView ? false : isSelected;
const [leftValue, setLeftValue] = useState<Option | null>(null); const [leftValue, setLeftValue] = useState<Option | null>(null);
const [rightValue, setRightValue] = useState<Option | null>(null); const [rightValue, setRightValue] = useState<Option | null>(null);
@@ -37,19 +29,17 @@ export default function WorkflowStepComponent({
let leftPlaceholder = ""; let leftPlaceholder = "";
let rightPlaceholder = ""; let rightPlaceholder = "";
if (editView) {
if (stepType === "approval-by") { if (stepType === "approval-by") {
// Show the selects only if it's an 'approval-by' step and in edit mode // Show the selects only if it's an 'approval-by' step and in edit mode
showSelects = true; showSelects = true;
leftPlaceholder = "Approval by"; leftPlaceholder = "Approval by";
rightPlaceholder = finalStep ? "2nd Director" : "2nd Teacher"; rightPlaceholder = finalStep ? "2nd Director" : "2nd Teacher";
} }
}
return ( return (
<div className="flex w-full"> <div className="flex w-full">
<div className="flex flex-col items-center"> <div className="flex flex-col items-center">
<WorkflowStepNumber number={stepNumber} isSelected={isSelected} /> <WorkflowStepNumber number={stepNumber} />
{/* Vertical Bar connecting steps */} {/* Vertical Bar connecting steps */}
{!finalStep && ( {!finalStep && (
@@ -62,7 +52,6 @@ export default function WorkflowStepComponent({
: <div className="ml-3 mt-2" style={{ width: 25, height: 25 }}></div> : <div className="ml-3 mt-2" style={{ width: 25, height: 25 }}></div>
} }
{/* Only show selects if editView === true and stepType === 'approval-by' */}
{showSelects && ( {showSelects && (
<div className="ml-10"> <div className="ml-10">
<WorkflowStepSelects <WorkflowStepSelects
@@ -92,7 +81,7 @@ export default function WorkflowStepComponent({
</div> </div>
)} )}
{editView && stepNumber !== 1 && !finalStep && ( {stepNumber !== 1 && !finalStep && (
<div className="ml-4 mt-2"> <div className="ml-4 mt-2">
<button <button
data-tip="Delete" data-tip="Delete"

View File

@@ -4,7 +4,7 @@ import { useEffect, useState } from "react";
import { FaRegCheckCircle } from "react-icons/fa"; import { FaRegCheckCircle } from "react-icons/fa";
import { IoIosAddCircleOutline } from "react-icons/io"; import { IoIosAddCircleOutline } from "react-icons/io";
import Button from "../Low/Button"; import Button from "../Low/Button";
import WorkflowStepComponent from "./WorkflowStep"; import WorkflowEditableStepComponent from "./WorkflowEditableStepComponent";
import { ApprovalWorkflow, WorkflowStep } from "@/interfaces/approval.workflow"; import { ApprovalWorkflow, WorkflowStep } from "@/interfaces/approval.workflow";
const teacherOptions: Option[] = [ const teacherOptions: Option[] = [
@@ -41,23 +41,34 @@ export default function WorkflowForm({ workflow, onWorkflowChange }: Props) {
onWorkflowChange(updatedWorkflow); onWorkflowChange(updatedWorkflow);
}, [steps]); }, [steps]);
const renumberSteps = (steps: WorkflowStep[]): WorkflowStep[] => {
return steps.map((step, index) => ({
...step,
stepNumber: index + 1,
}));
};
const addStep = () => { const addStep = () => {
setSteps((prev) => { setSteps((prev) => {
const newStep: WorkflowStep = { const newStep: WorkflowStep = {
key: stepCounter, key: stepCounter,
stepType: "approval-by", stepType: "approval-by",
stepNumber: steps.length - 1, stepNumber: steps.length,
completed: false, completed: false,
}; };
setStepCounter((count) => count + 1); setStepCounter((count) => count + 1);
return [...prev.slice(0, -1), newStep, lastStep]; const updatedSteps = [...prev.slice(0, -1), newStep, lastStep];
return renumberSteps(updatedSteps);
}); });
}; };
const handleDelete = (key: number | undefined) => { const handleDelete = (key: number | undefined) => {
if (key) { if (key) {
setSteps((prev) => prev.filter((step) => step.key !== key)); setSteps((prev) => {
const updatedSteps = prev.filter((step) => step.key !== key);
return renumberSteps(updatedSteps);
});
} }
}; };
@@ -73,8 +84,7 @@ export default function WorkflowForm({ workflow, onWorkflowChange }: Props) {
const [final] = newOrder.splice(finalIndex, 1); const [final] = newOrder.splice(finalIndex, 1);
newOrder.push(final); newOrder.push(final);
} }
setSteps(renumberSteps(newOrder));
setSteps(newOrder);
}; };
return ( return (
@@ -110,7 +120,7 @@ export default function WorkflowForm({ workflow, onWorkflowChange }: Props) {
layout layout
drag={!(step.firstStep || step.finalStep)} drag={!(step.firstStep || step.finalStep)}
> >
<WorkflowStepComponent <WorkflowEditableStepComponent
key={step.key} key={step.key}
completed={false} completed={false}
editView editView

View File

@@ -0,0 +1,27 @@
import { WorkflowStep } from "@/interfaces/approval.workflow";
import WorkflowStepNumber from "./WorkflowStepNumber";
export default function WorkflowStepComponent({
stepType,
stepNumber,
completed,
editView = false,
finalStep,
isSelected = false,
requestedBy,
onDelete,
}: WorkflowStep) {
return (
<div className="flex w-full">
<div className="flex flex-col items-center">
<WorkflowStepNumber number={stepNumber} isSelected={isSelected} />
{/* Vertical Bar connecting steps */}
{!finalStep && (
<div className="w-1 h-10 bg-mti-purple-dark"></div>
)}
</div>
</div>
);
};