A complete example of scheduling a set of work items.
The example here is for two people attempting to paint a bedroom\ in their house. The example demonstrates:
schedule.tasks to get the tasks into the proper format
schedule.resources to get the resources into the proper format
Note This example assumes the code is running in Node. To see an example that runs in the browser, see the reservation example.
// Require schedule
var schedule = require('schedulejs');
// To make schedules easier to read, we'll be using the text parser from later,
// if you manually specify the later schedules, you don't need to require it here
var later = require('later'),
p = later.parse.text;
// Step 1: Define the work items (tasks), property names don't matter at this
// point, we'll fix them up later using schedule.task
var workItems = [
{
name: 'Purchase supplies',
length: 2, // lengths specified in hours
minSchedule: 2, // have to schedule all 2 hours at once
assignedTo: ['Bob', 'Sara'], // both Bob and Sara are needed
availability: 'after 8:00am and before 9:00pm'
//can only complete when paint store is open
},
{
name: 'Remove doors',
length: 0.5,
assignedTo: ['Bob']
},
{
name: 'Clear furniture',
length: 1,
assignedTo: [['Sara', 'Bob']] // either Bob or Sara is needed
},
{
name: 'Protect carpet',
dependsOn: ['Purchase supplies', 'Clear furniture', 'Remove doors'],
length: 2,
assignedTo: [['Bob', 'Sara']]
},
{
name: 'Paint trim',
dependsOn: ['Protect carpet'], // specifying task dependencies
length: 3,
assignedTo: [['Bob', 'Sara']]
},
{
name: 'Paint walls',
dependsOn: ['Protect carpet'],
length: 5,
assignedTo: [['Bob', 'Sara']]
},
{
name: 'Paint doors',
dependsOn: ['Remove doors', 'Protect carpet'],
length: 2,
assignedTo: [['Bob', 'Sara']]
},
{
name: 'Cleanup',
dependsOn: ['Paint trim', 'Paint walls', 'Paint doors'],
length: 1,
assignedTo: [['Bob', 'Sara']]
},
{
name: 'Replace furniture',
dependsOn: ['Paint trim', 'Paint walls', 'Paint doors'],
length: 0.5,
assignedTo: [['Bob', 'Sara']]
},
{
name: 'Install doors',
dependsOn: ['Paint doors', 'Paint trim', 'Paint walls'],
length: 0.5,
assignedTo: ['Bob', 'Sara']
}
];
// Step 2: Define our resources, we'll fix up property names with schedule.resources
var people = [
{
name: 'Bob',
// Bob likes to sleep in a bit on the weekends
availability: 'every weekend after 10:00am and before 6:00pm'
},
{
name: 'Sara',
// Sara gets up earlier but has plans Saturday afternoon so we note that in her availability
availability: 'every weekend after 8:00am and before 6:00pm except on Sat after 1:00pm and before 4:00pm'
}
];
// Step 3: Tasks aren't in the right format, need to create a generator
var t = schedule.tasks()
.id(function(d) { return d.name; })
// our length is in hours, convert to minutes
.duration(function(d) { return d.length * 60; })
// use later.parse.text to parse text into a usable schedule
.schedule(function(d) { return d.availability ? p(d.availability) : undefined; })
// convert minSchedule to minutes
.minSchedule(function(d) { return d.minSchedule ? d.minSchedule * 60 : undefined; })
// resources are the people the tasks have been assigned to
.resources(function(d) { return d.assignedTo; });
var tasks = t(workItems);
// Step 4: Resources aren't in the right format either, need to create a generator
var r = schedule.resources()
.id(function(d) { return d.name; })
.schedule(function(d) { return d.availability ? p(d.availability) : undefined; });
var resources = r(people);
// Step 5: Pick a start date for the schedule and set correct timezone
var start = new Date(2013, 2, 21);
schedule.date.localTime();
// Step 6: Create the schedule
var s = schedule.create(tasks, resources, null, start);