diff --git a/src/components/ApprovalWorkflows/RequestedBy.tsx b/src/components/ApprovalWorkflows/RequestedBy.tsx index 84ea0cea..0f13ae32 100644 --- a/src/components/ApprovalWorkflows/RequestedBy.tsx +++ b/src/components/ApprovalWorkflows/RequestedBy.tsx @@ -1,3 +1,4 @@ +import Image from "next/image"; import React from "react"; import { FaRegUser } from "react-icons/fa"; @@ -16,9 +17,11 @@ export default function RequestedBy({ name, profileImage }: Props) {

Requested by

{name}

- {name}
diff --git a/src/components/ApprovalWorkflows/WorkflowEditableStepComponent.tsx b/src/components/ApprovalWorkflows/WorkflowEditableStepComponent.tsx index b20c96bc..47a66601 100644 --- a/src/components/ApprovalWorkflows/WorkflowEditableStepComponent.tsx +++ b/src/components/ApprovalWorkflows/WorkflowEditableStepComponent.tsx @@ -39,7 +39,7 @@ export default function WorkflowEditableStepComponent({ return (
- + {/* Vertical Bar connecting steps */} {!finalStep && ( diff --git a/src/components/ApprovalWorkflows/WorkflowStepComponent.tsx b/src/components/ApprovalWorkflows/WorkflowStepComponent.tsx index 3f9a04e5..e7fc77ed 100644 --- a/src/components/ApprovalWorkflows/WorkflowStepComponent.tsx +++ b/src/components/ApprovalWorkflows/WorkflowStepComponent.tsx @@ -1,25 +1,81 @@ -import { WorkflowStep } from "@/interfaces/approval.workflow"; +import { getUserTypeLabel, WorkflowStep } from "@/interfaces/approval.workflow"; import WorkflowStepNumber from "./WorkflowStepNumber"; +import clsx from "clsx"; +import { RiThumbUpLine } from "react-icons/ri"; +import { FaWpforms } from "react-icons/fa6"; export default function WorkflowStepComponent({ stepType, stepNumber, completed, - editView = false, + completedBy, finalStep, - isSelected = false, - requestedBy, - onDelete, + currentStep, + selected = false, + assignees, + assigneesType, + onClick, }: WorkflowStep) { return ( -
-
- +
+
+ {/* Vertical Bar connecting steps */} {!finalStep && ( -
+
+ )} +
+ +
+ {stepType === "approval-by" ? ( + + ) : ( + + ) + } +
+ +
+ {stepType === "form-intake" ? ( + <> +

Form: Intake

+ {completed && ( +

+ Completed by {completedBy} +

+ )} + {!completed && ( +

+ In progress... +

+ )} + + ) : ( + stepType === "approval-by" && ( + <> +

Approval: {getUserTypeLabel(assigneesType)}

+ {completed ? ( +

+ Approved by {completedBy} +

+ ) : !completed && currentStep ? ( +

+ In progress... +

+ ) : ( +

+ Waiting for previous steps... +

+ )} + + ) )}
diff --git a/src/components/ApprovalWorkflows/WorkflowStepNumber.tsx b/src/components/ApprovalWorkflows/WorkflowStepNumber.tsx index 393f19b9..588ed60c 100644 --- a/src/components/ApprovalWorkflows/WorkflowStepNumber.tsx +++ b/src/components/ApprovalWorkflows/WorkflowStepNumber.tsx @@ -1,25 +1,25 @@ -import { ApprovalWorkflowStatus, ApprovalWorkflowStatusLabel } from "@/interfaces/approval.workflow"; +import { WorkflowStep } from "@/interfaces/approval.workflow"; import clsx from "clsx"; -import React from "react"; -import { RiProgress5Line } from "react-icons/ri"; +import { IoCheckmarkDoneSharp, IoCheckmarkSharp } from "react-icons/io5"; -interface Props { - number: number; - isSelected?: boolean; -} - -export default function WorkflowStepNumber({ number, isSelected = false }: Props) { +export default function WorkflowStepNumber({ stepNumber, selected = false, completed, finalStep }: WorkflowStep) { return (
- {number} + {completed && finalStep ? ( + + ) : completed && !finalStep ? ( + + ) : ( + {stepNumber} + )}
); }; \ No newline at end of file diff --git a/src/demo/approval_workflows.json b/src/demo/approval_workflows.json index b56a6920..af95a5c8 100644 --- a/src/demo/approval_workflows.json +++ b/src/demo/approval_workflows.json @@ -18,7 +18,8 @@ "Prof. X", "Prof. Y", "Prof. Z" - ] + ], + "assigneesType": "teacher" }, { "stepType": "approval-by", @@ -29,7 +30,8 @@ "Prof. X", "Prof. Y", "Prof. Z" - ] + ], + "assigneesType": "teacher" }, { "stepType": "approval-by", @@ -39,7 +41,8 @@ "Prof. X", "Prof. Y", "Prof. Z" - ] + ], + "assigneesType": "teacher" }, { "stepType": "approval-by", @@ -49,17 +52,19 @@ "Prof. X", "Prof. Y", "Prof. Z" - ] + ], + "assigneesType": "teacher" }, { "stepType": "approval-by", "stepNumber": 5, "completed": false, "assignees": [ - "Prof. X", - "Prof. Y", - "Prof. Z" - ] + "Dir. X", + "Dir. Y", + "Dir. Z" + ], + "assigneesType": "corporate" } ] } diff --git a/src/interfaces/approval.workflow.ts b/src/interfaces/approval.workflow.ts index 51fd4239..845e071f 100644 --- a/src/interfaces/approval.workflow.ts +++ b/src/interfaces/approval.workflow.ts @@ -1,4 +1,5 @@ import {Module} from "."; +import { CorporateUser, MasterCorporateUser, TeacherUser, userTypeLabels } from "./user"; export interface ApprovalWorkflow { id: string, @@ -10,20 +11,30 @@ export interface ApprovalWorkflow { export type StepType = "form-intake" | "approval-by"; +type AssigneesType = TeacherUser["type"] | CorporateUser["type"] | MasterCorporateUser["type"]; + export interface WorkflowStep { key?: number, - stepType: StepType, + stepType?: StepType, stepNumber: number, - completed: boolean, + completed?: boolean, completedBy?: string, assignees?: string[], + assigneesType?: AssigneesType, editView?: boolean, firstStep?: boolean, + currentStep?: boolean, finalStep?: boolean, - isSelected?: boolean, + selected?: boolean, requestedBy?: string, //requestedBy: TeacherUser | CorporateUser | MasterCorporateUser, onDelete?: () => void; + onClick?: React.MouseEventHandler +} + +export function getUserTypeLabel(type: AssigneesType | undefined): string { + if (type) return userTypeLabels[type]; + return ''; } export type ApprovalWorkflowStatus = "approved" | "pending" | "rejected"; diff --git a/src/interfaces/user.ts b/src/interfaces/user.ts index b1ed48bc..e61ceece 100644 --- a/src/interfaces/user.ts +++ b/src/interfaces/user.ts @@ -170,4 +170,14 @@ export interface Code { export type Type = "student" | "teacher" | "corporate" | "admin" | "developer" | "agent" | "mastercorporate"; export const userTypes: Type[] = ["student", "teacher", "corporate", "admin", "developer", "agent", "mastercorporate"]; +export const userTypeLabels: Record = { + student: "Student", + teacher: "Teacher", + corporate: "Corporate", + admin: "Admin", + developer: "Developer", + agent: "Agent", + mastercorporate: "Master Corporate", +}; + export type WithUser = T extends { participants: string[] } ? Omit & { participants: User[] } : T; diff --git a/src/pages/approval-workflows/[id].tsx b/src/pages/approval-workflows/[id].tsx index 30e2abe1..3b8e154d 100644 --- a/src/pages/approval-workflows/[id].tsx +++ b/src/pages/approval-workflows/[id].tsx @@ -1,6 +1,6 @@ import Layout from "@/components/High/Layout"; import useUser from "@/hooks/useUser"; -import { ApprovalWorkflow } from "@/interfaces/approval.workflow"; +import { ApprovalWorkflow, WorkflowStep } from "@/interfaces/approval.workflow"; import { sessionOptions } from "@/lib/session"; import { redirect } from "@/utils"; import { requestUser } from "@/utils/api"; @@ -17,6 +17,10 @@ import approvalWorkflowsData from '../../demo/approval_workflows.json'; // to te import RequestedBy from "@/components/ApprovalWorkflows/RequestedBy"; import StartedOn from "@/components/ApprovalWorkflows/StartedOn"; import Status from "@/components/ApprovalWorkflows/Status"; +import { useState } from "react"; +import Button from "@/components/Low/Button"; +import WorkflowEditableStepComponent from "@/components/ApprovalWorkflows/WorkflowEditableStepComponent"; +import WorkflowStepComponent from "@/components/ApprovalWorkflows/WorkflowStepComponent"; export const getServerSideProps = withIronSessionSsr(async ({ req, res, params }) => { const user = await requestUser(req, res); @@ -27,24 +31,31 @@ export const getServerSideProps = withIronSessionSsr(async ({ req, res, params } const { id } = params as { id: string }; - const approvalWorkflow = approvalWorkflowsData.find(workflow => workflow.id === id); // await getApprovalWorkflow(id); - if (!approvalWorkflow) + const workflow = approvalWorkflowsData.find(workflow => workflow.id === id); // await getApprovalWorkflow(id); + + if (!workflow) return redirect("/approval-workflows") return { - props: { user, approvalWorkflow }, + props: { user, workflow }, }; }, sessionOptions); -export default function Home({ approvalWorkflow }: { approvalWorkflow: ApprovalWorkflow }) { +export default function Home({ workflow }: { workflow: ApprovalWorkflow }) { const { user } = useUser({ redirectTo: "/login" }); - + const steps = workflow.steps; + + const [selectedIndex, setSelectedIndex] = useState(steps.length - 1); + + const handleStepClick = (index: number) => { + setSelectedIndex(index); + }; return ( <> - {approvalWorkflow.name} | EnCoach + {workflow.name} | EnCoach -

{approvalWorkflow.name}

+

{workflow.name}

@@ -79,6 +90,23 @@ export default function Home({ approvalWorkflow }: { approvalWorkflow: ApprovalW />
+
+ {steps.map((step, index) => ( + !step.completed) === index} + selected={index === selectedIndex} // Determine selected state + onClick={() => handleStepClick(index)} // Add click handler + /> + ))} +
)}