25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

moduleview.js 7.9 KiB

12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
12 yıl önce
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. wn.provide("wn.views.moduleview");
  4. wn.provide("wn.module_page");
  5. wn.views.moduleview.make = function(wrapper, module) {
  6. wrapper.module_view = new wn.views.moduleview.ModuleView(wrapper, module);
  7. wrapper.refresh = function() {
  8. // remake on refresh
  9. if((new Date() - wrapper.module_view.created_on) > (180 * 1000)) {
  10. wrapper.module_view = new wn.views.moduleview.ModuleView(wrapper, module);
  11. }
  12. }
  13. }
  14. wn.views.show_open_count_list = function(element) {
  15. var doctype = $(element).attr("data-doctype");
  16. var condition = wn.boot.notification_info.conditions[doctype];
  17. if(condition) {
  18. wn.route_options = condition;
  19. var route = wn.get_route()
  20. if(route[0]==="List" && route[1]===doctype) {
  21. wn.pages["List/" + doctype].doclistview.refresh();
  22. } else {
  23. wn.set_route("List", doctype);
  24. }
  25. }
  26. }
  27. wn.views.moduleview.ModuleView = Class.extend({
  28. init: function(wrapper, module) {
  29. this.doctypes = [];
  30. this.top_item_total = {};
  31. this.top_item_open = {};
  32. $(wrapper).empty();
  33. wn.ui.make_app_page({
  34. parent: wrapper,
  35. single_column: true,
  36. title: wn._(wn.modules[module] && wn.modules[module].label || module)
  37. });
  38. wrapper.appframe.add_module_icon(module);
  39. wrapper.appframe.set_title_left('<i class="icon-angle-left"></i> Home', function() { wn.set_route(""); });
  40. this.wrapper = wrapper;
  41. this.module = module;
  42. this.make_body();
  43. this.render_static();
  44. this.render_dynamic();
  45. this.created_on = new Date();
  46. var me = this;
  47. $(document).on("notification-update", function() {
  48. me.update_open_count();
  49. });
  50. },
  51. make_body: function() {
  52. var wrapper = this.wrapper;
  53. // make columns
  54. $(wrapper).find(".layout-main").html("<div class='module-top'></div>\
  55. <div class='row'>\
  56. <div class='col-md-6 main-section'></div>\
  57. <div class='col-md-6 side-section'></div>\
  58. </div>")
  59. $(wrapper).on("click", ".badge-important", function() {
  60. wn.views.show_open_count_list(this);
  61. });
  62. $(wrapper).on("click", ".badge-count", function() {
  63. var doctype = $(this).attr("data-doctype-count");
  64. wn.set_route("List", doctype);
  65. });
  66. },
  67. add_section: function(section) {
  68. section._title = wn._(section.title);
  69. if(section.top) {
  70. var module_top = $(this.wrapper).find(".module-top");
  71. var list_group = $('<div class="row">')
  72. .appendTo(module_top);
  73. $('<hr class="row">')
  74. .insertAfter(module_top);
  75. } else {
  76. var list_group = $('<ul class="list-group">\
  77. <li class="list-group-item">\
  78. <h4 class="list-group-item-heading" style="margin-bottom: 0px;">\
  79. <i class="text-muted '+ section.icon+'"></i> '
  80. + wn._(section.title) +'</h4>\
  81. </li>\
  82. </ul>"').appendTo(section.right
  83. ? $(this.wrapper).find(".side-section")
  84. : $(this.wrapper).find(".main-section"));
  85. }
  86. section.list_group = list_group;
  87. },
  88. add_item: function(item, section) {
  89. if(!item.description) item.description = "";
  90. if(item.count==null) item.count = "";
  91. if(!item.icon) item.icon = "";
  92. if(section.top) {
  93. var $parent = $(repl('<div class="col-sm-4">\
  94. <div class="alert alert-info alert-badge"></div></div>'))
  95. .appendTo(section.list_group)
  96. .find(".alert-badge");
  97. this.top_item_total[item.doctype] = 0;
  98. } else {
  99. var $parent = $('<li class="list-group-item">').appendTo(section.list_group);
  100. }
  101. $(repl('%(icon)s<span' +
  102. ((item.doctype && item.description)
  103. ? " data-doctype='"+item.doctype+"'"
  104. : "") + ">%(link)s</span>"
  105. + ((item.description && !section.top)
  106. ? " <span class='text-muted small'>%(description)s</span>"
  107. : "")
  108. + ((section.right || !item.doctype)
  109. ? ''
  110. : '<span data-doctype-count="%(doctype)s" style="margin-left: 2px;"></span>'), item))
  111. .appendTo($parent);
  112. if(!section.top) {
  113. $('<span class="clearfix"></span>').appendTo($parent);
  114. }
  115. },
  116. set_top_item_count: function(doctype, count, open_count) {
  117. return;
  118. var me = this;
  119. if(this.top_item_total[doctype]!=null) {
  120. if(count!=null)
  121. this.top_item_total[doctype] = count;
  122. if(open_count!=null)
  123. this.top_item_open[doctype] = open_count;
  124. var maxtop = Math.max.apply(this, values(this.top_item_total));
  125. $.each(this.top_item_total, function(doctype, item_count) {
  126. $(me.wrapper).find(".module-item-progress[data-doctype='"+ doctype +"']")
  127. .find(".module-item-progress-total")
  128. .css("width", cint(flt(item_count)/maxtop*100) + "%")
  129. })
  130. $.each(this.top_item_open, function(doctype, item_count) {
  131. $(me.wrapper).find(".module-item-progress[data-doctype='"+ doctype +"']")
  132. .find(".module-item-progress-open")
  133. .css("width", cint(flt(item_count)/me.top_item_total[doctype]*100) + "%")
  134. })
  135. }
  136. },
  137. render_static: function() {
  138. // render sections
  139. var me = this;
  140. $.each(wn.module_page[this.module], function(i, section) {
  141. me.add_section(section);
  142. $.each(section.items, function(i, item) {
  143. if(item.doctype) {
  144. me.doctypes.push(item.doctype);
  145. item.icon = '<i class="icon-fixed-width '+ wn.boot.doctype_icons[item.doctype] + '"></i> ';
  146. }
  147. if(item.doctype && !item.route) {
  148. item.route = "List/" + encodeURIComponent(item.doctype);
  149. }
  150. if(item.page && !item.route) {
  151. item.route = item.page;
  152. }
  153. if(item.page) {
  154. item.icon = '<i class="icon-fixed-width '+ wn.boot.doctype_icons[item.page] + '"></i> ';
  155. }
  156. // link
  157. item.link = repl("<a href='#%(route)s'>%(label)s</a>", item);
  158. // doctype permissions
  159. if(item.doctype && !wn.model.can_read(item.doctype)) {
  160. //item.link = item.label;
  161. return;
  162. }
  163. // page permissions
  164. if(item.page && !in_list(wn.boot.allowed_pages, item.page)) {
  165. //item.link = item.label;
  166. return;
  167. }
  168. if((item.country && wn.boot.control_panel.country==item.country)
  169. || !item.country)
  170. me.add_item(item, section)
  171. });
  172. if(section.list_group.find("li").length==1) {
  173. section.list_group.toggle(false);
  174. }
  175. });
  176. },
  177. render_dynamic: function() {
  178. // render reports
  179. var me = this;
  180. return wn.call({
  181. method: "webnotes.widgets.moduleview.get_data",
  182. args: {
  183. module: me.module,
  184. doctypes: me.doctypes
  185. },
  186. callback: function(r) {
  187. if(r.message) {
  188. // reports
  189. if(r.message.reports.length) {
  190. var section = {
  191. title: wn._("Custom Reports"),
  192. right: true,
  193. icon: "icon-list",
  194. }
  195. me.add_section(section);
  196. $.each(r.message.reports, function(i, item) {
  197. if(wn.model.can_read(item.doctype)) {
  198. item.icon = '<i class="icon-fixed-width '
  199. + wn.boot.doctype_icons[item.doctype] + '"></i> ';
  200. if(item.is_query_report) {
  201. item.link = repl("<a href=\"#query-report/%(name)s\">%(name)s</a>",
  202. item);
  203. } else {
  204. item.link = repl("<a href=\"#Report/%(doctype)s/%(name)s\">\
  205. %(name)s</a>", item);
  206. }
  207. me.add_item(item, section);
  208. }
  209. })
  210. }
  211. // counts
  212. if(r.message.item_count) {
  213. $.each(r.message.item_count, function(doctype, count) {
  214. $(me.wrapper).find("[data-doctype-count='"+doctype+"']")
  215. .html(count)
  216. .addClass("badge badge-count pull-right")
  217. .css({cursor:"pointer"});
  218. me.set_top_item_count(doctype, count)
  219. })
  220. }
  221. // open-counts
  222. me.update_open_count();
  223. }
  224. }
  225. });
  226. },
  227. update_open_count: function() {
  228. var me = this;
  229. $(me.wrapper).find(".badge-important").remove();
  230. if(wn.boot.notification_info.open_count_doctype) {
  231. $.each(wn.boot.notification_info.open_count_doctype, function(doctype, count) {
  232. if(count && in_list(me.doctypes, doctype)) {
  233. me.set_top_item_count(doctype, null, count);
  234. $('<span>')
  235. .css({
  236. "cursor": "pointer",
  237. "margin-right": "0px"
  238. })
  239. .addClass("badge badge-important pull-right")
  240. .html(count)
  241. .attr("data-doctype", doctype)
  242. .insertAfter($(me.wrapper)
  243. .find("[data-doctype-count='"+doctype+"']"));
  244. }
  245. })
  246. }
  247. }
  248. });