You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
  2. // MIT License. See license.txt
  3. wn.provide('wn.core.pages.todo');
  4. wn.core.pages.todo.refresh = function() {
  5. return wn.call({
  6. method: 'core.page.todo.todo.get',
  7. callback: function(r,rt) {
  8. var todo_list = $('#todo-list div.todo-content');
  9. var assigned_todo_list = $('#assigned-todo-list div.todo-content');
  10. todo_list.empty();
  11. assigned_todo_list.empty();
  12. var nothing_to_do = function() {
  13. $('#todo-list div.todo-content')
  14. .html('<div class="alert alert-success">Nothing to do :)</div>');
  15. }
  16. if(r.message) {
  17. for(var i in r.message) {
  18. new wn.core.pages.todo.ToDoItem(r.message[i]);
  19. }
  20. if (!todo_list.html()) { nothing_to_do(); }
  21. } else {
  22. nothing_to_do();
  23. }
  24. }
  25. });
  26. }
  27. wn.core.pages.todo.ToDoItem = Class.extend({
  28. init: function(todo) {
  29. label_map = {
  30. 'High': 'label-danger',
  31. 'Medium': 'label-info',
  32. 'Low':''
  33. }
  34. todo.labelclass = label_map[todo.priority];
  35. todo.userdate = dateutil.str_to_user(todo.date) || '';
  36. todo.fullname = '';
  37. if(todo.assigned_by) {
  38. var assigned_by = wn.boot.user_info[todo.assigned_by]
  39. todo.fullname = repl("[By %(fullname)s] ".bold(), {
  40. fullname: (assigned_by ? assigned_by.fullname : todo.assigned_by),
  41. });
  42. }
  43. var parent_list = "#todo-list";
  44. if(todo.owner !== user) {
  45. var owner = wn.boot.user_info[todo.owner];
  46. todo.fullname = repl("[To %(fullname)s] ".bold(), {
  47. fullname: (owner ? owner.fullname : todo.owner),
  48. });
  49. }
  50. parent_list += " div.todo-content";
  51. if(todo.reference_name && todo.reference_type) {
  52. todo.link = repl('<a href="#!Form/%(reference_type)s/%(reference_name)s">\
  53. %(reference_type)s: %(reference_name)s</a>', todo);
  54. } else if(todo.reference_type) {
  55. todo.link = repl('<br><a href="#!List/%(reference_type)s">\
  56. %(reference_type)s</a>', todo);
  57. } else {
  58. todo.link = '';
  59. }
  60. if(!todo.description) todo.description = '';
  61. todo.description_display = todo.description.replace(/\n\n/g, "<br>").trim();
  62. $(parent_list).append(repl('\
  63. <div class="todoitem">\
  64. <div class="label %(labelclass)s">%(priority)s</div>\
  65. <div class="popup-on-click"><a href="#">[edit]</a></div>\
  66. <div class="todo-date-fullname">\
  67. <div class="todo-date">%(userdate)s</div>\
  68. %(fullname)s:\
  69. </div>\
  70. <div class="description">%(description_display)s\
  71. <span class="ref_link">%(link)s</span>\
  72. </div>\
  73. <div class="close-span"><a href="#" class="close">&times;</a></div>\
  74. </div>\
  75. <div class="todo-separator"></div>', todo));
  76. $todo = $(parent_list + ' div.todoitem:last');
  77. if(todo.checked) {
  78. $todo.find('.description').css('text-decoration', 'line-through');
  79. }
  80. if(!todo.reference_type)
  81. $todo.find('.ref_link').toggle(false);
  82. $todo.find('.popup-on-click')
  83. .data('todo', todo)
  84. .click(function() {
  85. wn.core.pages.todo.make_dialog($(this).data('todo'));
  86. return false;
  87. });
  88. $todo.find('.close')
  89. .data('name', todo.name)
  90. .click(function() {
  91. $(this).parent().css('opacity', 0.5);
  92. wn.call({
  93. method:'core.page.todo.todo.delete',
  94. args: {name: $(this).data('name')},
  95. callback: function() {
  96. wn.core.pages.todo.refresh();
  97. }
  98. });
  99. return false;
  100. })
  101. }
  102. });
  103. wn.core.pages.todo.make_dialog = function(det) {
  104. if(!wn.core.pages.todo.dialog) {
  105. var dialog = new wn.ui.Dialog({
  106. width: 480,
  107. title: 'To Do',
  108. fields: [
  109. {fieldtype:'Text', fieldname:'description', label:'Description',
  110. reqd:1},
  111. {fieldtype:'Date', fieldname:'date', label:'Event Date', reqd:1},
  112. {fieldtype:'Check', fieldname:'checked', label:'Completed'},
  113. {fieldtype:'Select', fieldname:'priority', label:'Priority', reqd:1, 'options':['Medium','High','Low'].join('\n')},
  114. {fieldtype:'Button', fieldname:'save', label:'Save (Ctrl+S)'}
  115. ]
  116. });
  117. dialog.fields_dict.save.input.onclick = function() {
  118. wn.core.pages.todo.save(this);
  119. }
  120. wn.core.pages.todo.dialog = dialog;
  121. }
  122. if(det) {
  123. wn.core.pages.todo.dialog.set_values({
  124. date: det.date,
  125. priority: det.priority,
  126. description: det.description,
  127. checked: det.checked
  128. });
  129. wn.core.pages.todo.dialog.det = det;
  130. }
  131. wn.core.pages.todo.dialog.show();
  132. }
  133. wn.core.pages.todo.save = function(btn) {
  134. var d = wn.core.pages.todo.dialog;
  135. var det = d.get_values();
  136. if(!det) {
  137. return;
  138. }
  139. det.name = d.det.name || '';
  140. return wn.call({
  141. method:'core.page.todo.todo.edit',
  142. args: det,
  143. btn: btn,
  144. callback: function() {
  145. wn.core.pages.todo.dialog.hide();
  146. wn.core.pages.todo.refresh();
  147. }
  148. });
  149. }
  150. wn.pages.todo.onload = function(wrapper) {
  151. // create app frame
  152. wn.ui.make_app_page({
  153. parent: wrapper,
  154. single_column: true,
  155. title: "To Do"
  156. });
  157. $(wrapper)
  158. .css({"background-color": "#FFFDC9", "min-height": "300px"})
  159. .find(".layout-main").html('<div id="todo-list">\
  160. <div class="todo-content"></div>\
  161. </div>');
  162. wrapper.appframe.add_module_icon("To Do");
  163. wrapper.appframe.add_button('Refresh', wn.core.pages.todo.refresh, 'icon-refresh');
  164. wrapper.appframe.add_button('Add', function() {
  165. wn.core.pages.todo.make_dialog({
  166. date:get_today(), priority:'Medium', checked:0, description:''});
  167. }, 'icon-plus');
  168. wrapper.appframe.add_ripped_paper_effect(wrapper);
  169. // show report button for System Manager
  170. if(wn.boot.profile.roles.indexOf("System Manager") !== -1) {
  171. wrapper.appframe.add_button("Report", function() { wn.set_route("query-report", "todo"); },
  172. "icon-table");
  173. }
  174. // load todos
  175. wn.core.pages.todo.refresh();
  176. // save on click
  177. wrapper.save_action = function() {
  178. if(wn.core.pages.todo.dialog && wn.core.pages.todo.dialog.display) {
  179. wn.core.pages.todo.dialog.fields_dict.save.input.click();
  180. }
  181. };
  182. }