added todo
diff --git a/erpnext/utilities/page/todo/__init__.py b/erpnext/utilities/page/todo/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/utilities/page/todo/__init__.py
diff --git a/erpnext/utilities/page/todo/todo.css b/erpnext/utilities/page/todo/todo.css
new file mode 100644
index 0000000..9f15852
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.css
@@ -0,0 +1,29 @@
+.todoitem {
+ margin-bottom: 11px;
+ height: 14px;
+}
+
+.todoitem .label {
+ width: 50px;
+ display: inline-block;
+ text-align: center;
+ margin-right: 7px;
+}
+
+.todoitem .close {
+ margin-left: 14px;
+ font-size: 14px;
+ float: left;
+}
+
+.todoitem .ref_link {
+ float: left;
+ margin-left: 14px;
+ display: inline-block;
+ line-height: 18px;
+}
+
+.todoitem .description {
+ cursor: pointer;
+ float: left;
+}
\ No newline at end of file
diff --git a/erpnext/utilities/page/todo/todo.html b/erpnext/utilities/page/todo/todo.html
new file mode 100644
index 0000000..aa46d97
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.html
@@ -0,0 +1,10 @@
+<div class="layout-wrapper" style="min-height: 300px">
+ <a class="close" onclick="window.history.back();">×</a>
+ <h1>To Do</h1>
+ <br>
+ <div id="todo-list">
+ </div>
+ <div style="margin-top: 21px">
+ <button id="add-todo" class="btn btn-small"><i class="icon-plus"></i> Add</button>
+ </div>
+</div>
\ No newline at end of file
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
diff --git a/erpnext/utilities/page/todo/todo.py b/erpnext/utilities/page/todo/todo.py
new file mode 100644
index 0000000..c10809e
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.py
@@ -0,0 +1,46 @@
+import webnotes
+from webnotes.model.doc import Document
+
+@webnotes.whitelist()
+def get(arg=None):
+ """get todo list"""
+ return webnotes.conn.sql("""select name, owner, description, date,
+ priority, checked, reference_type, reference_name, assigned_by
+ from `tabToDo Item` where owner=%s
+ order by field(priority, 'High', 'Medium', 'Low') asc, date asc""",
+ webnotes.session['user'], as_dict=1)
+
+@webnotes.whitelist()
+def edit(arg=None):
+ args = webnotes.form_dict
+
+ d = Document('ToDo Item', args.get('name') or None)
+ d.description = args['description']
+ d.date = args['date']
+ d.priority = args['priority']
+ d.checked = args.get('checked', 0)
+ d.owner = webnotes.session['user']
+ d.save(not args.get('name') and 1 or 0)
+
+ if args.get('name') and d.checked:
+ notify_assignment(d)
+
+ return d.name
+
+@webnotes.whitelist()
+def delete(arg=None):
+ name = webnotes.form_dict['name']
+ d = Document('ToDo Item', name)
+ if d and d.name:
+ notify_assignment(d)
+ webnotes.conn.sql("delete from `tabToDo Item` where name = %s", name)
+
+def notify_assignment(d):
+ doc_type = d.reference_type
+ doc_name = d.reference_name
+ assigned_by = d.assigned_by
+
+ if doc_type and doc_name and assigned_by:
+ from webnotes.widgets.form import assign_to
+ assign_to.notify_assignment(assigned_by, d.owner, doc_type, doc_name)
+
\ No newline at end of file
diff --git a/erpnext/utilities/page/todo/todo.txt b/erpnext/utilities/page/todo/todo.txt
new file mode 100644
index 0000000..7310906
--- /dev/null
+++ b/erpnext/utilities/page/todo/todo.txt
@@ -0,0 +1,28 @@
+# Page, todo
+[
+
+ # These values are common in all dictionaries
+ {
+ 'creation': '2012-02-23 13:59:03',
+ 'docstatus': 0,
+ 'modified': '2012-02-23 13:59:03',
+ 'modified_by': u'Administrator',
+ 'owner': u'Administrator'
+ },
+
+ # These values are common for all Page
+ {
+ 'doctype': 'Page',
+ 'module': u'Utilities',
+ 'name': '__common__',
+ 'page_name': u'todo',
+ 'standard': u'Yes',
+ 'title': u'To Do'
+ },
+
+ # Page, todo
+ {
+ 'doctype': 'Page',
+ 'name': u'todo'
+ }
+]
\ No newline at end of file