Dan's ProjectTask Library

A 15th century nobleman completing a task on his checklist.

A Flexible .NET Project Management Library

Plan it. Schedule it. Track it. Transform it.

 

Current Status: In-Testing for version 25.2800.0000.

 

Introduction

ProjectTask is a powerful, stand-alone .NET Standard 2.0 class library built to support flexible, event-driven project management, across any methodology, whether it's MSF (Microsoft Solutions Framework), XP (Extreme Programming / Extreme Productivity), Agile, SCRUM, Kanban, or good old-fashioned Waterfall.

With full support for JSON serialization, dependency handling, and hierarchical task structures, this library is designed to be embedded into a wide variety of planning and scheduling applications. Whether you're managing a sprawling enterprise program or organizing a weekend hackathon, ProjectTask can adapt to your needs.

... and by the way, tasks and projects are interchangeable, meaning that you can seamlessly convert between them without data loss just by changing the item type.

 

Features

Following are only some of the features you can find in this library.

 

Some History

Before task management was a buzzword, I was hand-rolling an early predecessor of this library in Microsoft QuickC circa 1990, using structs, pointers, and address arithmetic. Object-oriented design? You better believe it, even without C++.

From those humble beginnings to today’s .NET ecosystem, the ProjectTask library embodies decades of iteration across multiple applications, tools, and programming eras.

Trivia: The original version was written in ANSI-C on the ancestor of Visual Studio, QuickC, long before Agile was agile!

 

Example Usage

Check out the example project in the the Source / ProjectTaskExample folder of this this repository to see how to accomplish any of the following.

using ProjectTask;

// Configure the base data.
// This only needs to be done once per session,
// or can be read from the database or data file.
// Task states.
ActiveProjectContext.TaskStates.Add(
 ("TODO", ProjectTaskStateEnum.Queued),
 ("InProgress", ProjectTaskStateEnum.Active),
 ("Completed", ProjectTaskStateEnum.Closed));

//	Task types.
ActiveProjectContext.TaskTypes.Add(
 ("Project", ProjectTaskTypeEnum.Project),
 ("Task", ProjectTaskTypeEnum.Task));

//	Set the default type and status.
ActiveProjectContext.DefaultItemType =
 ActiveProjectContext.TaskTypes["Task"];
ActiveProjectContext.DefaultItemStatus =
 ActiveProjectContext.TaskStates["TODO"];

// General runtime example.
TaskItem root = new TaskItem("Main Project", "Project");
TaskItem subTask = root.Tasks.Add("Design Module");

// This task will start after the Requirements Gathering task is done.
// Since Requirements Gathering doesn't yet exist, it will be created.
subTask.Dependencies.Add(
 "Requirements Gathering",
 DependencyTypeEnum.StartOnCompletion);



 

Concepts and Design Philosophy

The following forethought and considerations go into the construction and maintenance of this library.

 

Contributing

If you've got ideas, issues, or improvements, contributions are welcomed. Fork the repository, start a feature branch, and send over a pull request.

 

Acknowledgements

Thanks to decades of previous system users, inspiration, late-night debugging, and the enduring spirit of old-school development environments.

"Who says you couldn’t do OOP in C? You just had more elbow room for getting it done right."

-Daniel Patterson