diff --git a/src/demo/approval_workflows.json b/src/demo/approval_workflows.json index ddf0e155..dd4f1fdf 100644 --- a/src/demo/approval_workflows.json +++ b/src/demo/approval_workflows.json @@ -2,6 +2,7 @@ { "id": "kajhfakscbka-asacaca-acawesae", "name": "English Exam 1st Quarter 2025", + "entityId": "ae64d98e-18e4-4978-b600-c542a5b43c2d", "modules": [ "reading", "writing" @@ -70,6 +71,7 @@ { "id": "aaaaaakscbka-asacaca-acawesae", "name": "English Exam 2nd Quarter 2025", + "entityId": "85fc76e6-da50-45f6-a1ed-0fe3802ecf02", "modules": [ "reading", "writing", diff --git a/src/interfaces/approval.workflow.ts b/src/interfaces/approval.workflow.ts index a896541d..7ca5fcd8 100644 --- a/src/interfaces/approval.workflow.ts +++ b/src/interfaces/approval.workflow.ts @@ -4,6 +4,7 @@ import { CorporateUser, MasterCorporateUser, TeacherUser, userTypeLabels } from export interface ApprovalWorkflow { id: string, name: string, + entityId: string, modules: Module[], status: ApprovalWorkflowStatus, steps: WorkflowStep[], diff --git a/src/pages/approval-workflows/create.tsx b/src/pages/approval-workflows/create.tsx index e82cfdbb..716b6fb0 100644 --- a/src/pages/approval-workflows/create.tsx +++ b/src/pages/approval-workflows/create.tsx @@ -1,7 +1,7 @@ import Layout from "@/components/High/Layout"; import useUser from "@/hooks/useUser"; import { sessionOptions } from "@/lib/session"; -import { redirect } from "@/utils"; +import { redirect, serialize } from "@/utils"; import { requestUser } from "@/utils/api"; import { shouldRedirectHome } from "@/utils/navigation.disabled"; import { withIronSessionSsr } from "iron-session/next"; @@ -17,6 +17,11 @@ import Input from "@/components/Low/Input"; import { ApprovalWorkflow } from "@/interfaces/approval.workflow"; import { useState } from "react"; import { MdFormatListBulletedAdd } from "react-icons/md"; +import { User } from "@/interfaces/user"; +import Select from "@/components/Low/Select"; +import { getUserWithEntity } from "@/utils/users.be"; +import { getEntities } from "@/utils/entities.be"; +import { Entity } from "@/interfaces/entity"; export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { const user = await requestUser(req, res) @@ -26,17 +31,31 @@ export const getServerSideProps = withIronSessionSsr(async ({ req, res }) => { return redirect("/") return { - props: { user }, + props: serialize({ + user, + userEntitiesWithLabel: await getEntities(user.entities.map(entity => entity.id)), + }), }; }, sessionOptions); -export default function Home() { - const { user } = useUser({ redirectTo: "/login" }); +interface Props { + user: User, + userEntitiesWithLabel: Entity[], +} +export default function Home({ user, userEntitiesWithLabel }: Props) { const [workflows, setWorkflows] = useState([]); - const [selectedWorkflowId, setSelectedWorkflowId] = useState(null); + const [selectedWorkflowId, setSelectedWorkflowId] = useState(undefined); + const [entityId, setEntityId] = useState(undefined); + 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(); // Handle form submission logic @@ -48,10 +67,11 @@ export default function Home() { 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 }, + { key: Date.now(), completed: false, editView: true, stepType: "form-intake", stepNumber: 1, firstStep: true }, { key: Date.now() + 1, completed: false, editView: true, stepType: "approval-by", stepNumber: 2, finalStep: true }, ], }; @@ -74,7 +94,7 @@ export default function Home() { setWorkflows(prev => prev.filter(wf => wf.id !== id)); if (selectedWorkflowId === id) { - setSelectedWorkflowId(null); + setSelectedWorkflowId(undefined); } }; @@ -138,7 +158,7 @@ export default function Home() {
{currentWorkflow && ( <> -
+
+ x.value === entityFilter)} + onChange={(value) => setEntityFilter((value?.value as string) ?? undefined)} + isClearable + placeholder="Entity..." + /> +
@@ -271,13 +327,12 @@ export default function ApprovalWorkflows() { {table.getRowModel().rows.map((row) => ( - - {/* - Might be an overkill way to add rounded borders to the rows, but couldn't figure out another way... - border round and margin does not seem to work properly on tr - Another way to do it was with grid but that puts the same width in all rows, which is inconvenient - Regardless, it works and all calcs are pretty simple so shouldnt be too inefficient - */} + window.location.href = `/approval-workflows/${row.original.id}`} + style={{ cursor: "pointer" }} + className="hover:bg-purple-100" + > {row.getVisibleCells().map((cell, cellIndex) => { const lastCellIndex = row.getVisibleCells().length - 1; @@ -290,7 +345,7 @@ export default function ApprovalWorkflows() { } return ( - + {flexRender(cell.column.columnDef.cell, cell.getContext())} ); @@ -298,6 +353,7 @@ export default function ApprovalWorkflows() { ))} +
diff --git a/src/resources/entityPermissions.ts b/src/resources/entityPermissions.ts index b9c6c165..76e1b169 100644 --- a/src/resources/entityPermissions.ts +++ b/src/resources/entityPermissions.ts @@ -65,7 +65,8 @@ export type RolePermission = "view_student_record" | "download_student_record" | "pay_entity" | - "view_payment_record" + "view_payment_record" | + "view_approval_workflows" export const DEFAULT_PERMISSIONS: RolePermission[] = [ "view_students", @@ -74,7 +75,8 @@ export const DEFAULT_PERMISSIONS: RolePermission[] = [ "view_classrooms", "view_entity_roles", "view_statistics", - "download_statistics_report" + "download_statistics_report", + "view_approval_workflows" ] export const ADMIN_PERMISSIONS: RolePermission[] = [