added todo
diff --git a/erpnext/utilities/page/todo/todo.js b/erpnext/utilities/page/todo/todo.js
new file mode 100644
index 0000000..2691912
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.js
@@ -0,0 +1,132 @@
+wn.provide('erpnext.todo');
+
+erpnext.todo.refresh = function() {
+ wn.call({
+ method: 'utilities.page.todo.todo.get',
+ callback: function(r,rt) {
+ $('#todo-list').empty();
+ if(r.message) {
+ for(var i in r.message) {
+ new erpnext.todo.ToDoItem(r.message[i]);
+ }
+ } else {
+ $('#todo-list').html('<div class="help-box">Nothing to do :)</div>');
+ }
+ }
+ });
+
+ $('#add-todo').click(function() {
+ erpnext.todo.make_dialog({
+ date:get_today(), priority:'Medium', checked:0, description:''});
+ })
+}
+
+erpnext.todo.ToDoItem = Class.extend({
+ init: function(todo) {
+ label_map = {
+ 'High': 'label-important',
+ 'Medium': 'label-info',
+ 'Low':''
+ }
+ todo.labelclass = label_map[todo.priority];
+ todo.userdate = dateutil.str_to_user(todo.date);
+ $('#todo-list').append(repl('<div class="todoitem">\
+ <span class="description">\
+ <span class="label %(labelclass)s">%(priority)s</span>\
+ <span class="help" style="margin-right: 7px">%(userdate)s</span>\
+ %(description)s</span>\
+ <span class="ref_link">→\
+ <a href="#!Form/%(reference_type)s/%(reference_name)s">\
+ [%(reference_name)s]</a></span>\
+ <a href="#" class="close">×</a>\
+ </div>', todo));
+ $todo = $('div.todoitem:last');
+
+ if(todo.checked) {
+ $todo.find('.description').css('text-decoration', 'line-through');
+ }
+
+ if(!todo.reference_name)
+ $todo.find('.ref_link').toggle(false);
+
+ $todo.find('.description')
+ .data('todo', todo)
+ .click(function() {
+ erpnext.todo.make_dialog($(this).data('todo'));
+ return false;
+ });
+
+ $todo.find('.close')
+ .data('name', todo.name)
+ .click(function() {
+ $(this).parent().css('opacity', 0.5);
+ wn.call({
+ method:'utilities.page.todo.todo.delete',
+ args: {name: $(this).data('name')},
+ callback: function() {
+ erpnext.todo.refresh();
+ }
+ });
+ return false;
+ })
+ }
+});
+
+erpnext.todo.make_dialog = function(det) {
+ if(!erpnext.todo.dialog) {
+ var dialog = new wn.widgets.Dialog();
+ dialog.make({
+ width: 480,
+ title: 'To Do',
+ fields: [
+ {fieldtype:'Date', fieldname:'date', label:'Event Date', reqd:1},
+ {fieldtype:'Text', fieldname:'description', label:'Description', reqd:1},
+ {fieldtype:'Check', fieldname:'checked', label:'Completed'},
+ {fieldtype:'Select', fieldname:'priority', label:'Priority', reqd:1, 'options':['Medium','High','Low'].join('\n')},
+ {fieldtype:'Button', fieldname:'save', label:'Save'}
+ ]
+ });
+
+ dialog.fields_dict.save.input.onclick = function() {
+ erpnext.todo.save(this);
+ }
+ erpnext.todo.dialog = dialog;
+ }
+
+ if(det) {
+ erpnext.todo.dialog.set_values({
+ date: det.date,
+ priority: det.priority,
+ description: det.description,
+ checked: det.checked
+ });
+ erpnext.todo.dialog.det = det;
+ }
+ erpnext.todo.dialog.show();
+
+}
+
+erpnext.todo.save = function(btn) {
+ var d = erpnext.todo.dialog;
+ var det = d.get_values();
+
+ if(!det) {
+ return;
+ }
+
+ det.name = d.det.name || '';
+ wn.call({
+ method:'utilities.page.todo.todo.edit',
+ args: det,
+ btn: btn,
+ callback: function() {
+ erpnext.todo.dialog.hide();
+ erpnext.todo.refresh();
+ }
+ });
+}
+
+pscript.onload_todo = function() {
+ // load todos
+ erpnext.todo.refresh();
+}
\ No newline at end of file