#!/usr/bin/perl -w # # simple-todo.cgi (cc-sa) Marc Majcher, 2004 # # Hacky banged out version of a simple todo list manager. Does no # error checking, file locking, or anything, but that's a snap to # add, if the mood strikes you. Works fine for a single user, though. use strict; use CGI qw(:standard); use DB_File; use Date::Manip; my $todo_db = '/home/majcher/data/sample-todo.db'; my $cgi = 'todo.cgi'; my $action = param('action') || ''; my $date_today = ParseDate("today"); my $message = ''; print "Content-type: text/html\n\n"; ### Perform actions if ($action eq 'add') { my $id = time.$$; store_item($id, param('description'), ParseDate(param('duedate')), param('priority'), 0); $message .= "Added item \"" . param('description') . "\" for " . UnixDate(param('duedate'), "%a %b %e %Y") . "."; } elsif ($action eq 'done') { my $id = param('id'); my ($description, $duedate, $priority, $done) = get_item($id); store_item($id, $description, $duedate, $priority, 1); $message .= qq(Marked item "$description" as done.); } elsif ($action eq 'repri') { my $id = param('id'); my ($description, $duedate, $priority, $done) = get_item($id); store_item($id, $description, $duedate, param('priority'), 0); $message .= qq(Set priority for "$description" to ).param('priority')."."; } elsif ($action eq 'delete') { my $id = param('id'); my ($description, $duedate, $priority, $done) = get_item($id); delete_item($id); $message .= qq(Item "$description" deleted.); } ### Create item table my $todo_rows = ''; my %items; my $id; for $id (item_keys()) { my ($description, $duedate, $priority, $done) = get_item($id); next if ($done); # next if ($duedate >= $date_today); $items{$id}{description} = $description; $items{$id}{duedate} = $duedate; $items{$id}{priority} = $priority; } for $id (sort { $items{$a}{priority} <=> $items{$b}{priority} || Date_Cmp($items{$a}{duedate}, $items{$b}{duedate}) } keys %items) { my $description = $items{$id}{description}; my $duedate = UnixDate($items{$id}{duedate}, "%a %b %e %Y"); my $priority = $items{$id}{priority}; my $pri_links; for my $pri (1..3) { if ($pri == $items{$id}{priority}) { $pri_links .= "$pri "; } else { $pri_links .= qq($pri ); } } $todo_rows .= < $pri_links $description $duedate Done X ROW } ### Print everything out print < Simple To Do List
Enter new todo item:
To do by:       Priority: 1 - 2 - 3      
$message
$todo_rows