No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 
 
 

212 líneas
5.4 KiB

  1. // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. // License: See license.txt
  3. frappe.provide("frappe.activity");
  4. import { Chart } from 'node_modules/frappe-charts/dist/frappe-charts.esm.js';
  5. frappe.pages['activity'].on_page_load = function(wrapper) {
  6. var me = this;
  7. frappe.ui.make_app_page({
  8. parent: wrapper,
  9. single_column: true
  10. });
  11. me.page = wrapper.page;
  12. me.page.set_title(__("Activity"));
  13. frappe.model.with_doctype("Communication", function() {
  14. me.page.list = new frappe.views.Activity({
  15. doctype: 'Communication',
  16. parent: wrapper
  17. });
  18. });
  19. frappe.activity.render_heatmap(me.page);
  20. me.page.main.on("click", ".activity-message", function() {
  21. var link_doctype = $(this).attr("data-link-doctype"),
  22. link_name = $(this).attr("data-link-name"),
  23. doctype = $(this).attr("data-doctype"),
  24. docname = $(this).attr("data-docname");
  25. if (doctype && docname) {
  26. if (link_doctype && link_name) {
  27. frappe.route_options = {
  28. scroll_to: { "doctype": doctype, "name": docname }
  29. }
  30. }
  31. frappe.set_route(["Form", link_doctype || doctype, link_name || docname]);
  32. }
  33. });
  34. // Build Report Button
  35. if(frappe.boot.user.can_get_report.indexOf("Feed")!=-1) {
  36. this.page.add_menu_item(__('Build Report'), function() {
  37. frappe.set_route("List", "Feed", "Report");
  38. }, 'fa fa-th')
  39. }
  40. this.page.add_menu_item(__('Activity Log'), function() {
  41. frappe.route_options = {
  42. "user": frappe.session.user
  43. }
  44. frappe.set_route("List", "Activity Log", "Report");
  45. }, 'fa fa-th');
  46. };
  47. frappe.pages['activity'].on_page_show = function() {
  48. frappe.breadcrumbs.add("Desk");
  49. }
  50. frappe.activity.last_feed_date = false;
  51. frappe.activity.Feed = Class.extend({
  52. init: function(row, data) {
  53. this.scrub_data(data);
  54. this.add_date_separator(row, data);
  55. if(!data.add_class)
  56. data.add_class = "label-default";
  57. data.link = "";
  58. if (data.link_doctype && data.link_name) {
  59. data.link = frappe.format(data.link_name, {fieldtype: "Link", options: data.link_doctype},
  60. {label: __(data.link_doctype) + " " + __(data.link_name)});
  61. } else if (data.feed_type==="Comment" && data.comment_type==="Comment") {
  62. // hack for backward compatiblity
  63. data.link_doctype = data.reference_doctype;
  64. data.link_name = data.reference_name;
  65. data.reference_doctype = "Communication";
  66. data.reference_name = data.name;
  67. data.link = frappe.format(data.link_name, {fieldtype: "Link", options: data.link_doctype},
  68. {label: __(data.link_doctype) + " " + __(data.link_name)});
  69. } else if (data.reference_doctype && data.reference_name) {
  70. data.link = frappe.format(data.reference_name, {fieldtype: "Link", options: data.reference_doctype},
  71. {label: __(data.reference_doctype) + " " + __(data.reference_name)});
  72. }
  73. $(row)
  74. .append(frappe.render_template("activity_row", data))
  75. .find("a").addClass("grey");
  76. },
  77. scrub_data: function(data) {
  78. data.by = frappe.user.full_name(data.owner);
  79. data.avatar = frappe.avatar(data.owner);
  80. data.icon = "fa fa-flag";
  81. // color for comment
  82. data.add_class = {
  83. "Comment": "label-danger",
  84. "Assignment": "label-warning",
  85. "Login": "label-default"
  86. }[data.comment_type || data.communication_medium] || "label-info"
  87. data.when = comment_when(data.creation);
  88. data.feed_type = data.comment_type || data.communication_medium;
  89. },
  90. add_date_separator: function(row, data) {
  91. var date = frappe.datetime.str_to_obj(data.creation);
  92. var last = frappe.activity.last_feed_date;
  93. if((last && frappe.datetime.obj_to_str(last) != frappe.datetime.obj_to_str(date)) || (!last)) {
  94. var diff = frappe.datetime.get_day_diff(frappe.datetime.get_today(), frappe.datetime.obj_to_str(date));
  95. var pdate;
  96. if(diff < 1) {
  97. pdate = 'Today';
  98. } else if(diff < 2) {
  99. pdate = 'Yesterday';
  100. } else {
  101. pdate = frappe.datetime.global_date_format(date);
  102. }
  103. data.date_sep = pdate;
  104. data.date_class = pdate=='Today' ? "date-indicator blue" : "date-indicator";
  105. } else {
  106. data.date_sep = null;
  107. data.date_class = "";
  108. }
  109. frappe.activity.last_feed_date = date;
  110. }
  111. });
  112. frappe.activity.render_heatmap = function(page) {
  113. var me = this;
  114. $('<div class="heatmap-container" style="text-align:center">\
  115. <div class="heatmap" style="display:inline-block;"></div></div>\
  116. <hr style="margin-bottom: 0px;">').prependTo(page.main);
  117. frappe.call({
  118. method: "frappe.desk.page.activity.activity.get_heatmap_data",
  119. callback: function(r) {
  120. if(r.message) {
  121. var heatmap = new Chart(".heatmap", {
  122. type: 'heatmap',
  123. height: 100,
  124. start: new Date(moment().subtract(1, 'year').toDate()),
  125. countLabel: "actions",
  126. discreteDomains: 0,
  127. data: {}
  128. });
  129. heatmap.update(r.message);
  130. }
  131. }
  132. })
  133. }
  134. frappe.views.Activity = class Activity extends frappe.views.BaseList {
  135. constructor(opts) {
  136. super(opts);
  137. this.show();
  138. }
  139. setup_defaults() {
  140. super.setup_defaults();
  141. this.page_title = __('Activity');
  142. this.doctype = 'Communication';
  143. this.method = 'frappe.desk.page.activity.activity.get_feed';
  144. }
  145. setup_filter_area() {
  146. //
  147. }
  148. setup_sort_selector() {
  149. }
  150. setup_side_bar() {
  151. }
  152. get_args() {
  153. return {
  154. start: this.start,
  155. page_length: this.page_length
  156. };
  157. }
  158. update_data(r) {
  159. let data = r.message || [];
  160. if (this.start === 0) {
  161. this.data = data;
  162. } else {
  163. this.data = this.data.concat(data);
  164. }
  165. }
  166. render() {
  167. this.data.map(value => {
  168. const row = $('<div class="list-row">').data("data", value).appendTo(this.$result).get(0);
  169. new frappe.activity.Feed(row, value);
  170. });
  171. }
  172. };