This package provides tools to calculate and visualize a PERT (Program Evaluation and Review Technique) diagram. It includes the following components and utilities:
Pert
: A component to render the PERT diagram.usePert
: A custom hook to retrieve PERT results.- Chart Interaction: Allows interaction with the diagram, enabling the selection of tasks and displaying only the path related to the selected task.
- โ PERT Calculator: Fully functional.
- โ PERT Diagram: Fully functional.
Check out the live demo here.
Install the package via npm:
npm install react-pert
import { Pert, type TaskInput } from "react-pert";
const App = () => {
const tasks: TaskInput[] = [
{ key: "1", duration: 5, text: "A" },
{ key: "2", duration: 4, text: "B" },
{ key: "3", duration: 2, text: "C", dependsOn: ["1"] },
{ key: "4", duration: 3, text: "D", dependsOn: ["2"] },
//...
];
return <Pert tasks={tasks} />;
};
You need to wrap your application with PertProvider
to use the usePert
hook. Here is an example of how you can use it:
- Note: You should put the
Pert
component andusePert
hook in the samePertProvider
to ensure that the PERT data is available to both.
import { PertProvider, usePert, type TaskInput } from "react-pert";
const App = () => {
const tasks: TaskInput[] = [
{ key: "1", duration: 5, text: "A" },
{ key: "2", duration: 4, text: "B" },
{ key: "3", duration: 2, text: "C", dependsOn: ["1"] },
{ key: "4", duration: 3, text: "D", dependsOn: ["2"] },
//...
];
return (
<PertProvider>
<Pert tasks={tasks} />
<PertDetails />
</PertProvider>
);
};
import { usePert } from "react-pert";
const PertDetails = () => {
const { projectDuration, criticalPaths } = usePert();
return (
<div>
<h3>Project Duration : {projectDuration}</h3>
<h3>Critical Paths:</h3>
<div>
{criticalPaths.map((cp, index) => (
<div key={index}>
{cp.map((p, i) => (
<span key={i}>
{p.text}
{i < cp.length - 1 && " โ "}
</span>
))}
</div>
))}
</div>
</div>
);
};
You can use the setSelectedTask
function to select a task in the PERT diagram. This function is available when you import setSelectedTask
from react-pert
.
setSelectedTask: (taskKey: string | null) => void;
import { Pert, PertProvider, setSelectedTask } from "react-pert";
const App = () => {
const tasks = [
{ key: "1", duration: 5, text: "A" },
//...
];
const handleClick = () => {
setSelectedTask("1");
};
const handleClear = () => {
setSelectedTask(null);
};
return (
// PertProvider is optional if you are using only setSelectedTask
<PertProvider>
<Pert tasks={tasks} />
<button onClick={handleClick}>Select Task 1</button>
<button onClick={handleClear}>Clear Selection</button>
</PertProvider>
);
};
You can use the onSelect
prop to get the selected task when a task is selected in the PERT diagram.
onSelect?: (task: Task) => void;
import { Pert } from "react-pert";
const App = () => {
const tasks = [/*...*/];
const handleSelect = (task) => {
console.log("Selected Task:", task);
};
return <Pert tasks={tasks} onSelect={handleSelect} />;
};
You can pass options to the usePert
hook to customize the output data.
const results = usePert({ bounds: true });
- Default:
true
The usePert
hook can be customized using the bounds
option to include or exclude boundary tasks (Start and Finish) in the returned tasks.
const input: TaskInput[] = [
{ key: "1", duration: 5, text: "A" },
{ key: "2", duration: 4, text: "B", dependsOn: ["1"] },
{ key: "3", duration: 2, text: "C", dependsOn: ["2"] },
];
When bounds
is set to true
, the Start and Finish tasks are included:
const output: Task[] = [
{ key: "Start", text: "Start", duration: 0, dependsOn: [] },
{ key: "1", text: "A", duration: 5, dependsOn: ["Start"], ...rest /* other properties */ },
{ key: "2", text: "B", duration: 4, dependsOn: ["1"], ...rest /* other properties */ },
{ key: "3", text: "C", duration: 2, dependsOn: ["2"], ...rest /* other properties */ },
{ key: "Finish", text: "Finish", duration: 0, dependsOn: ["3"] },
];
When bounds
is set to false
, the Start and Finish tasks are excluded:
const output: Task[] = [
{ key: "1", text: "A", duration: 5, dependsOn: [], ...rest /* other properties */,},
{ key: "2", text: "B", duration: 4, dependsOn: ["1"], ...rest /* other properties */ },
{ key: "3", text: "C", duration: 2, dependsOn: ["2"], ...rest /* other properties */ },
];
Attribute | Type | Description |
---|---|---|
tasks |
TaskInput[] |
Array of tasks to be used for the calculation and PERT diagram. |
styles? |
PertStyles |
Optional styles configuration for the PERT chart. |
onSelect? |
(task: Task ) => void |
Optional callback invoked when a task is selected. |
A visual representation of the PERT diagram (currently in development).
Attribute | Type | Description |
---|---|---|
bounds |
boolean |
Determines whether the boundary tasks (Start and Finish) should be included in the returned tasks. Default: true |
- If
true
, the Start and Finish tasks will be included. - If
false
, the Start and Finish tasks will be excluded. - Default:
true
PertDataType
: Contains all PERT data including tasks, levels, links, critical paths, and project duration.
Attribute | Type | Description |
---|---|---|
tasks |
Task[] |
Array of tasks with PERT calculation results. |
levels |
LevelType |
Mapping of task keys to their respective levels. |
links |
LinkType[] |
Array of links representing the dependencies between tasks. |
criticalPaths |
CriticalPath[] |
Array of critical paths in the project. |
projectDuration |
number |
Total duration of the project. |
error? |
string | null |
Current error message, if any. |
Represents a task with input data for PERT calculation.
Attribute | Type | Description |
---|---|---|
key |
string |
Unique identifier for the task. |
text |
string |
Description or name of the task. |
duration |
number |
Duration of the task in some unit (e.g., days). |
dependsOn? |
string[] |
Array of task keys that the current task depends on (optional). |
Represents a task with PERT calculation results.
Attribute | Type | Description |
---|---|---|
key |
string |
Unique identifier for the task. |
text |
string |
Description or name of the task. |
duration |
number |
Duration of the task. |
dependsOn? |
string[] |
Array of task keys the task depends on. |
earlyStart |
number |
The earliest start time for the task. |
earlyFinish |
number |
The earliest finish time for the task. |
lateStart |
number |
The latest start time for the task. |
lateFinish |
number |
The latest finish time for the task. |
level |
number |
The level of the task in the PERT diagram. |
critical |
boolean |
Indicates if the task is on a critical path. |
freeFloat |
number |
The free float time of the task. |
totalFloat |
number |
The total float time of the task. |
index |
number |
Index of the task in the sequence. |
Styles configuration for the PERT chart.
Attribute | Type | Description |
---|---|---|
disableGrid? |
boolean |
Whether to disable grid lines in the chart. |
taskSize? |
number |
Size of the task node in pixels. |
fontFamily? |
string |
Font family for the text in the task nodes. |
fontSize? |
FontSize |
Font size for the text in the task nodes. |
textColor? |
string |
Color of the text inside the task nodes. |
chartBackground? |
string |
Background color of the entire chart. |
taskBackground? |
string |
Background color of the task nodes. |
gridColor? |
string |
Color of the grid lines in the chart. |
borderWidth? |
number |
Width of the border for task nodes. |
selectedBorderWidth? |
number |
Width of the border for selected task nodes. |
hoverBorderWidth? |
number |
Width of the border when hovering over task nodes. |
borderColor? |
string |
Color of the border for task nodes. |
selectedBorderColor? |
string |
Color of the border for selected task nodes. |
criticalColor? |
string |
Color for critical path elements (e.g., tasks or links). |
arrowColor? |
string |
Color of the arrows (links) between task nodes. |
arrowWidth? |
number |
Width of the arrows (links) between task nodes. |
gap? |
{ x?: number; y?: number } |
Gap between task nodes in the chart. |
Type | Description |
---|---|
"sm" , "md" , "lg" , "xl" , "2xl" , "3xl" , string & {} , number |
Font size options for text in the task nodes. |
Represents a mapping of task keys to their respective levels in the PERT diagram.
Attribute | Type | Description |
---|---|---|
key |
number |
The level number in the PERT diagram. |
value |
string[] |
Array of task keys at the specific level. |
Represents a link between two tasks in the PERT diagram.
Attribute | Type | Description |
---|---|---|
from |
string |
The task key from which the link originates. |
to |
string |
The task key to which the link leads. |
critical |
boolean |
Indicates if the link is part of a critical path. |
Represents a critical path in the PERT diagram.
Type | Description | |
---|---|---|
CriticalPath |
PathItem[] |
An array of tasks (PathItem ) forming the critical path. |
Attribute | Type | Description |
---|---|---|
text |
string |
Description or name of the task. |
key |
string |
Task key identifier. |
We welcome contributions! If you encounter any bugs or have feature requests, please open an issue or submit a pull request.
This package is open-source and licensed under the MIT License.
Enjoy building with PERT Diagram!