mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-26 00:14:50 +00:00
moved directory structure
This commit is contained in:
1
utilities/page/todo/__init__.py
Normal file
1
utilities/page/todo/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from __future__ import unicode_literals
|
||||
50
utilities/page/todo/todo.css
Normal file
50
utilities/page/todo/todo.css
Normal file
@@ -0,0 +1,50 @@
|
||||
.todoitem {
|
||||
padding-bottom: 3px;
|
||||
min-height: 45px;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.todoitem .label {
|
||||
width: 50px;
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
margin-right: 11px;
|
||||
margin-top: 3px;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.todoitem .close {
|
||||
margin-left: 5px;
|
||||
font-size: 17px;
|
||||
}
|
||||
|
||||
.todoitem .close-span {
|
||||
display: inline-block;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.todoitem .description {
|
||||
padding: 3px 0px;
|
||||
display: inline-block;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
#todo-list, #assigned-todo-list {
|
||||
float: left;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.todo-separator {
|
||||
border-bottom: 1px solid #DEB85F;
|
||||
margin-bottom: 5px;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.todo-content {
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
.todo-layout {
|
||||
background-color: #FFFDC9;
|
||||
min-height: 300px;
|
||||
}
|
||||
16
utilities/page/todo/todo.html
Normal file
16
utilities/page/todo/todo.html
Normal file
@@ -0,0 +1,16 @@
|
||||
<div class="layout-wrapper layout-wrapper-background">
|
||||
<div class="appframe-area"></div>
|
||||
<div class="layout-main todo-layout">
|
||||
<div>
|
||||
<div id="todo-list">
|
||||
<h4>My List</h4><br>
|
||||
<div class="todo-content"></div>
|
||||
</div>
|
||||
<div id="assigned-todo-list">
|
||||
<h4>Assigned to others</h4><br>
|
||||
<div class="todo-content"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="clear: both"></div>
|
||||
</div>
|
||||
</div>
|
||||
205
utilities/page/todo/todo.js
Normal file
205
utilities/page/todo/todo.js
Normal file
@@ -0,0 +1,205 @@
|
||||
// ERPNext - web based ERP (http://erpnext.com)
|
||||
// Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
//
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
wn.provide('erpnext.todo');
|
||||
|
||||
erpnext.todo.refresh = function() {
|
||||
wn.call({
|
||||
method: 'utilities.page.todo.todo.get',
|
||||
callback: function(r,rt) {
|
||||
var todo_list = $('#todo-list div.todo-content');
|
||||
var assigned_todo_list = $('#assigned-todo-list div.todo-content');
|
||||
todo_list.empty();
|
||||
assigned_todo_list.empty();
|
||||
|
||||
var nothing_to_do = function() {
|
||||
$('#todo-list div.todo-content')
|
||||
.html('<div class="help-box">Nothing to do :)</div>');
|
||||
}
|
||||
|
||||
var nothing_delegated = function() {
|
||||
$('#assigned-todo-list div.todo-content')
|
||||
.html('<div class="help-box">Nothing assigned to other users. \
|
||||
Use "Assign To" in a form to delegate work.</div>');
|
||||
}
|
||||
|
||||
if(r.message) {
|
||||
for(var i in r.message) {
|
||||
new erpnext.todo.ToDoItem(r.message[i]);
|
||||
}
|
||||
if (!todo_list.html()) { nothing_to_do(); }
|
||||
if (!assigned_todo_list.html()) { nothing_delegated(); }
|
||||
} else {
|
||||
nothing_to_do();
|
||||
nothing_delegated();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
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.fullname = '';
|
||||
if(todo.assigned_by) {
|
||||
var assigned_by = wn.boot.user_info[todo.assigned_by]
|
||||
todo.fullname = repl("[By %(fullname)s] ", {
|
||||
fullname: (assigned_by ? assigned_by.fullname : todo.assigned_by),
|
||||
});
|
||||
}
|
||||
|
||||
var parent_list = "#todo-list";
|
||||
if(todo.owner !== user) {
|
||||
parent_list = "#assigned-todo-list";
|
||||
var owner = wn.boot.user_info[todo.owner];
|
||||
todo.fullname = repl("[To %(fullname)s] ", {
|
||||
fullname: (owner ? owner.fullname : todo.owner),
|
||||
});
|
||||
}
|
||||
parent_list += " div.todo-content";
|
||||
|
||||
if(todo.reference_name && todo.reference_type) {
|
||||
todo.link = repl('<br><a href="#!Form/%(reference_type)s/%(reference_name)s">\
|
||||
%(reference_type)s: %(reference_name)s</a>', todo);
|
||||
} else if(todo.reference_type) {
|
||||
todo.link = repl('<br><a href="#!List/%(reference_type)s">\
|
||||
%(reference_type)s</a>', todo);
|
||||
} else {
|
||||
todo.link = '';
|
||||
}
|
||||
if(!todo.description) todo.description = '';
|
||||
|
||||
todo.desc = wn.markdown(todo.description);
|
||||
|
||||
$(parent_list).append(repl('\
|
||||
<div class="todoitem">\
|
||||
<span class="label %(labelclass)s">%(priority)s</span>\
|
||||
<span class="description">\
|
||||
<span class="help" style="margin-right: 7px">%(userdate)s</span>\
|
||||
%(fullname)s%(desc)s\
|
||||
<span class="popup-on-click"><a href="#"> [edit]</a></span>\
|
||||
<span class="ref_link">%(link)s</span>\
|
||||
</span>\
|
||||
<span class="close-span"><a href="#" class="close">×</a></span>\
|
||||
</div>\
|
||||
<div class="todo-separator"></div>', todo));
|
||||
$todo = $(parent_list + ' div.todoitem:last');
|
||||
|
||||
if(todo.checked) {
|
||||
$todo.find('.description').css('text-decoration', 'line-through');
|
||||
}
|
||||
|
||||
if(!todo.reference_type)
|
||||
$todo.find('.ref_link').toggle(false);
|
||||
|
||||
$todo.find('.popup-on-click')
|
||||
.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:'Text', fieldname:'description', label:'Description',
|
||||
reqd:1, description:'Use <a href="#markdown-reference">markdown</a> to \
|
||||
format content'},
|
||||
{fieldtype:'Date', fieldname:'date', label:'Event Date', 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();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
wn.pages.todo.onload = function(wrapper) {
|
||||
// create app frame
|
||||
wrapper.appframe = new wn.ui.AppFrame($(wrapper).find('.appframe-area'), 'To Do');
|
||||
wrapper.appframe.add_button('Refresh', erpnext.todo.refresh, 'icon-refresh');
|
||||
wrapper.appframe.add_button('Add', function() {
|
||||
erpnext.todo.make_dialog({
|
||||
date:get_today(), priority:'Medium', checked:0, description:''});
|
||||
}, 'icon-plus');
|
||||
|
||||
// load todos
|
||||
erpnext.todo.refresh();
|
||||
}
|
||||
64
utilities/page/todo/todo.py
Normal file
64
utilities/page/todo/todo.py
Normal file
@@ -0,0 +1,64 @@
|
||||
# ERPNext - web based ERP (http://erpnext.com)
|
||||
# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
from __future__ import unicode_literals
|
||||
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` where (owner=%s or assigned_by=%s)
|
||||
order by field(priority, 'High', 'Medium', 'Low') asc, date asc""",
|
||||
(webnotes.session['user'], webnotes.session['user']), as_dict=1)
|
||||
|
||||
@webnotes.whitelist()
|
||||
def edit(arg=None):
|
||||
import markdown2
|
||||
args = webnotes.form_dict
|
||||
|
||||
d = Document('ToDo', args.get('name') or None)
|
||||
d.description = args['description']
|
||||
d.date = args['date']
|
||||
d.priority = args['priority']
|
||||
d.checked = args.get('checked', 0)
|
||||
if not d.owner: 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', name)
|
||||
if d and d.name and d.owner != webnotes.session['user']:
|
||||
notify_assignment(d)
|
||||
webnotes.conn.sql("delete from `tabToDo` 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)
|
||||
|
||||
28
utilities/page/todo/todo.txt
Normal file
28
utilities/page/todo/todo.txt
Normal file
@@ -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'
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user