Add entityId to workflow. Allow filter workflows based on entityId. Restrict creation of workflows based on user entities.

This commit is contained in:
Joao Correia
2025-01-22 16:39:18 +00:00
parent 8f8d5e5640
commit 4895f00184
5 changed files with 124 additions and 29 deletions

View File

@@ -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<ApprovalWorkflow[]>([]);
const [selectedWorkflowId, setSelectedWorkflowId] = useState<string | null>(null);
const [selectedWorkflowId, setSelectedWorkflowId] = useState<string | undefined>(undefined);
const [entityId, setEntityId] = useState<string | undefined>(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<HTMLFormElement>) => {
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() {
<form onSubmit={handleSubmit}>
{currentWorkflow && (
<>
<div className="mb-8 flex flex-row">
<div className="mb-8 flex flex-row gap-6">
<Input
type="text"
name={currentWorkflow.name}
@@ -153,12 +173,26 @@ export default function Home() {
onWorkflowChange(updatedWorkflow);
}}
/>
<Select
options={ENTITY_OPTIONS}
onChange={(selectedEntity) => {
if (selectedEntity?.value) {
const updatedWorkflow = {
...currentWorkflow,
entityId: selectedEntity.value,
};
onWorkflowChange(updatedWorkflow);
}
}}
isClearable
placeholder="Entity..."
/>
<Button
color="purple"
variant="solid"
onClick={() => handleDeleteWorkflow(currentWorkflow.id)}
type="button"
className="min-w-fit text-lg font-medium flex items-center gap-2 text-left ml-4"
className="min-w-fit text-lg font-medium flex items-center gap-2 text-left"
>
Delete Workflow
<BsTrash className="size-6" />