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.

11 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. frappe.provide('frappe.desktop');
  2. frappe.pages['desktop'].on_page_load = function(wrapper) {
  3. // load desktop
  4. frappe.desktop.set_background();
  5. frappe.desktop.refresh(wrapper);
  6. };
  7. $.extend(frappe.desktop, {
  8. refresh: function(wrapper) {
  9. if (wrapper) {
  10. this.wrapper = $(wrapper);
  11. }
  12. this.render();
  13. this.make_sortable();
  14. },
  15. render: function() {
  16. var me = this;
  17. frappe.utils.set_title("Desktop");
  18. this.wrapper.html(frappe.render_template("desktop_icon_grid", {
  19. // all visible icons
  20. desktop_items: this.get_desktop_items(),
  21. // user visible icons
  22. user_desktop_items: this.get_user_desktop_items(),
  23. }));
  24. this.setup_icon_click();
  25. // notifications
  26. this.show_pending_notifications();
  27. $(document).on("notification-update", function() {
  28. me.show_pending_notifications();
  29. });
  30. $(document).trigger("desktop-render");
  31. },
  32. get_desktop_items: function(global) {
  33. var me = this;
  34. frappe.modules["All Applications"] = {
  35. icon: "octicon octicon-three-bars",
  36. label: "All Applications",
  37. _label: __("All Applications"),
  38. _id: "all_applications",
  39. color: "#4aa3df",
  40. link: "",
  41. force_show: true,
  42. onclick: function() {
  43. me.all_applications.show();
  44. }
  45. }
  46. var desktop_items = [].concat(frappe.user.get_desktop_items(global));
  47. remove_from_list(desktop_items, "Setup");
  48. if(user_roles.indexOf('System Manager')!=-1) {
  49. desktop_items.push('Setup');
  50. }
  51. remove_from_list(desktop_items, "Core");
  52. if(user_roles.indexOf('Administrator')!=-1) {
  53. desktop_items.push('Core');
  54. }
  55. return desktop_items;
  56. },
  57. get_user_desktop_items: function() {
  58. var me = this;
  59. var user_desktop_items = [].concat(frappe.user.get_user_desktop_items());
  60. for (var m in frappe.modules) {
  61. var module = frappe.modules[m];
  62. if (module.force_show && user_desktop_items.indexOf(m)===-1) {
  63. user_desktop_items.push(m);
  64. }
  65. }
  66. // filter valid icons
  67. var out = [];
  68. for (var i=0, l=user_desktop_items.length; i < l; i++) {
  69. var m = user_desktop_items[i];
  70. var module = frappe.get_module(m);
  71. if (module) {
  72. module.app_icon = frappe.ui.app_icon.get_html(m);
  73. out.push(m);
  74. }
  75. }
  76. return out;
  77. },
  78. setup_icon_click: function() {
  79. this.wrapper.on("click", ".app-icon", function() {
  80. var parent = $(this).parent();
  81. var link = parent.attr("data-link");
  82. if(link) {
  83. if(link.substr(0, 1)==="/" || link.substr(0, 4)==="http") {
  84. window.open(link, "_blank");
  85. } else {
  86. frappe.set_route(link);
  87. }
  88. return false;
  89. } else {
  90. module = frappe.get_module(parent.attr("data-name"));
  91. if (module && module.onclick) {
  92. module.onclick();
  93. return false;
  94. }
  95. }
  96. });
  97. },
  98. make_sortable: function() {
  99. if (frappe.dom.is_touchscreen()) {
  100. return;
  101. }
  102. new Sortable($("#icon-grid").get(0), {
  103. onUpdate: function(event) {
  104. new_order = [];
  105. $("#icon-grid .case-wrapper").each(function(i, e) {
  106. new_order.push($(this).attr("data-name"));
  107. });
  108. frappe.defaults.set_default("_desktop_items", new_order);
  109. }
  110. });
  111. },
  112. set_background: function() {
  113. frappe.ui.set_user_background(frappe.boot.user.background_image, null,
  114. frappe.boot.user.background_style);
  115. },
  116. all_applications: {
  117. show: function() {
  118. if(!this.dialog) {
  119. this.make_dialog();
  120. }
  121. $(this.dialog.body).find(".desktop-app-search").val("").trigger("keyup");
  122. this.dialog.show();
  123. },
  124. make_dialog: function() {
  125. this.dialog = new frappe.ui.Dialog({
  126. title: __("All Applications")
  127. });
  128. this.dialog.$wrapper.addClass("all-applications-dialog");
  129. this.dialog_body = $(this.dialog.body);
  130. $(frappe.render_template("all_applications_dialog", {
  131. all_modules: keys(frappe.modules).sort(),
  132. desktop_items: frappe.desktop.get_desktop_items(true),
  133. user_desktop_items: frappe.desktop.get_user_desktop_items()
  134. })).appendTo(this.dialog_body);
  135. this.bind_events();
  136. },
  137. bind_events: function() {
  138. var me = this;
  139. this.dialog_body.find(".desktop-app-search").on("keyup", function() {
  140. var val = ($(this).val() || "").toLowerCase();
  141. me.dialog_body.find(".list-group-item").each(function() {
  142. $(this).toggle($(this).attr("data-label").toLowerCase().indexOf(val)!==-1
  143. || $(this).attr("data-name").toLowerCase().indexOf(val)!==-1);
  144. })
  145. });
  146. this.dialog_body.find('input[type="checkbox"]').on("click", function() {
  147. me.save_user_desktop_items();
  148. });
  149. },
  150. save_user_desktop_items: function() {
  151. var user_desktop_items = [];
  152. this.dialog_body.find('input[type="checkbox"]:checked').each(function(i, element) {
  153. user_desktop_items.push($(element).attr("data-name"));
  154. });
  155. frappe.defaults.set_default("_user_desktop_items", user_desktop_items);
  156. frappe.desktop.refresh();
  157. }
  158. },
  159. show_pending_notifications: function() {
  160. if (!frappe.boot.notification_info.module_doctypes) {
  161. return;
  162. }
  163. var modules_list = frappe.user.get_desktop_items();
  164. for (var i=0, l=modules_list.length; i < l; i++) {
  165. var module = modules_list[i];
  166. var module_doctypes = frappe.boot.notification_info.module_doctypes[module];
  167. var sum = 0;
  168. if(module_doctypes) {
  169. if(frappe.boot.notification_info.open_count_doctype) {
  170. for (var j=0, k=module_doctypes.length; j < k; j++) {
  171. var doctype = module_doctypes[j];
  172. sum += (frappe.boot.notification_info.open_count_doctype[doctype] || 0);
  173. }
  174. }
  175. } else if(frappe.boot.notification_info.open_count_module
  176. && frappe.boot.notification_info.open_count_module[module]!=null) {
  177. sum = frappe.boot.notification_info.open_count_module[module];
  178. }
  179. if (frappe.modules[module]) {
  180. var notifier = $("#module-count-" + frappe.get_module(module)._id);
  181. if(notifier.length) {
  182. notifier.toggle(sum ? true : false);
  183. notifier.find(".circle-text").html(sum || "");
  184. }
  185. }
  186. }
  187. }
  188. });