25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

desktop.js 5.8 KiB

12 년 전
12 년 전
11 년 전
11 년 전
12 년 전
12 년 전
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. frappe.provide('frappe.desktop');
  2. frappe.pages['desktop'].onload = function(wrapper) {
  3. // setup dialog
  4. // load desktop
  5. frappe.desktop.refresh();
  6. }
  7. frappe.pages['desktop'].refresh = function(wrapper) {
  8. frappe.ui.toolbar.add_dropdown_button("File", __("All Applications"), function() {
  9. frappe.desktop.show_all_modules();
  10. }, 'icon-th');
  11. };
  12. frappe.desktop.refresh = function() {
  13. frappe.desktop.render();
  14. $("#icon-grid").sortable({
  15. update: function() {
  16. new_order = [];
  17. $("#icon-grid .case-wrapper").each(function(i, e) {
  18. new_order.push($(this).attr("data-name"));
  19. });
  20. frappe.defaults.set_default("_desktop_items", new_order);
  21. }
  22. });
  23. }
  24. frappe.desktop.render = function() {
  25. $("#icon-grid").empty();
  26. document.title = "Desktop";
  27. var add_icon = function(m) {
  28. var module = frappe.get_module(m);
  29. if(!module || (module.type!=="module" && !module.link && !module.onclick) || module.is_app) {
  30. return;
  31. }
  32. if(module._id && $("#module-icon-" + module._id).length) {
  33. // icon already exists!
  34. return;
  35. }
  36. module.app_icon = frappe.ui.app_icon.get_html(m);
  37. $module_icon = $(repl('<div id="module-icon-%(_id)s" class="case-wrapper" \
  38. data-name="%(name)s" data-link="%(link)s">\
  39. <div id="module-count-%(_id)s" class="circle" style="display: None">\
  40. <span class="circle-text"></span>\
  41. </div>\
  42. %(app_icon)s\
  43. <div class="case-label">%(_label)s</div>\
  44. </div>', module)).click(module.link ? function() {
  45. var link = $(this).attr("data-link");
  46. if(link) {
  47. if(link.substr(0, 1)==="/") {
  48. window.open(link.substr(1))
  49. }
  50. frappe.set_route(link);
  51. }
  52. } : module.onclick).css({
  53. cursor:"pointer"
  54. }).appendTo("#icon-grid");
  55. }
  56. // modules
  57. var modules_list = frappe.user.get_desktop_items();
  58. var user_list = frappe.user.get_user_desktop_items();
  59. $.each(modules_list, function(i, m) {
  60. var module = frappe.modules[m];
  61. if(module) {
  62. if(!in_list(["Setup", "Core"], m) && user_list.indexOf(m)!==-1)
  63. add_icon(m);
  64. }
  65. })
  66. // setup
  67. if(user_roles.indexOf('System Manager')!=-1)
  68. add_icon('Setup')
  69. if(user_roles.indexOf('Administrator')!=-1)
  70. add_icon('Core')
  71. // all applications
  72. frappe.modules["All Applications"] = {
  73. icon: "icon-th",
  74. label: "All Applications",
  75. _label: __("All Applications"),
  76. _id: "all_applications",
  77. color: "#4aa3df",
  78. link: "",
  79. onclick: function() {
  80. frappe.desktop.show_all_modules();
  81. }
  82. }
  83. add_icon("All Applications");
  84. // notifications
  85. frappe.desktop.show_pending_notifications();
  86. $(document).on("notification-update", function() {
  87. frappe.desktop.show_pending_notifications();
  88. });
  89. $(document).trigger("desktop-render");
  90. }
  91. frappe.desktop.show_all_modules = function() {
  92. if(!frappe.desktop.all_modules_dialog) {
  93. var d = new frappe.ui.Dialog({
  94. title: '<i class="icon-th text-muted"></i> '+ __("All Applications")
  95. });
  96. var desktop_items = frappe.user.get_desktop_items(true);
  97. var user_desktop_items = frappe.user.get_user_desktop_items();
  98. $('<input class="form-control desktop-app-search" \
  99. type="text" placeholder="' + __("Search Filter") +'>')
  100. .appendTo(d.body)
  101. .on("keyup", function() {
  102. var val = $(this).val();
  103. $(d.body).find(".list-group-item").each(function() {
  104. $(this).toggle($(this).attr("data-label").toLowerCase().indexOf(val)!==-1);
  105. })
  106. });
  107. $('<hr><p class="text-right text-muted text-small">'+__("Checked items shown on desktop")+'</p>')
  108. .appendTo(d.body);
  109. $wrapper = $('<div class="list-group">').appendTo(d.body);
  110. // list of applications (frappe.user.get_desktop_items())
  111. var items = keys(frappe.modules).sort();
  112. $.each(items, function(i, m) {
  113. var module = frappe.get_module(m);
  114. if(module.link && desktop_items.indexOf(m)!==-1) {
  115. module.app_icon = frappe.ui.app_icon.get_html(m, true);
  116. module.label = __(module.label);
  117. $(repl('<div class="list-group-item" data-label="%(name)s">\
  118. <div class="row">\
  119. <div class="col-xs-2"><a href="#%(link)s">%(app_icon)s</a></div>\
  120. <div class="col-xs-10" style="padding-top: 14px;">\
  121. %(label)s\
  122. <input class="pull-right" type="checkbox" data-name="%(name)s" />\
  123. </div>\
  124. </div>\
  125. </div>', module)).appendTo($wrapper);
  126. }
  127. });
  128. // check shown items
  129. $wrapper.find('[type="checkbox"]')
  130. .on("click", function() {
  131. var user_desktop_items = [];
  132. $wrapper.find('[type="checkbox"]:checked').each(function(i,ele) {
  133. user_desktop_items.push($(ele).attr("data-name"));
  134. })
  135. frappe.defaults.set_default("_user_desktop_items", user_desktop_items);
  136. frappe.desktop.refresh();
  137. })
  138. .prop("checked", false);
  139. $.each(user_desktop_items, function(i, m) {
  140. $wrapper.find('[data-label="'+m+'"] [type="checkbox"]').prop("checked", true);
  141. })
  142. frappe.desktop.all_modules_dialog = d;
  143. }
  144. $(frappe.desktop.all_modules_dialog.body).find(".desktop-app-search").val("").trigger("keyup");
  145. frappe.desktop.all_modules_dialog.show();
  146. }
  147. frappe.desktop.show_pending_notifications = function() {
  148. if (!frappe.boot.notification_info.module_doctypes) {
  149. return;
  150. }
  151. var modules_list = frappe.user.get_desktop_items();
  152. $.each(modules_list, function(i, module) {
  153. var module_doctypes = frappe.boot.notification_info.module_doctypes[module];
  154. var sum = 0;
  155. if(module_doctypes) {
  156. if(frappe.boot.notification_info.open_count_doctype) {
  157. $.each(module_doctypes, function(j, doctype) {
  158. sum += (frappe.boot.notification_info.open_count_doctype[doctype] || 0);
  159. });
  160. }
  161. } else if(frappe.boot.notification_info.open_count_module
  162. && frappe.boot.notification_info.open_count_module[module]!=null) {
  163. sum = frappe.boot.notification_info.open_count_module[module];
  164. }
  165. if (frappe.modules[module]) {
  166. var notifier = $("#module-count-" + frappe.get_module(module)._id);
  167. if(notifier.length) {
  168. notifier.toggle(sum ? true : false);
  169. notifier.find(".circle-text").html(sum || "");
  170. }
  171. }
  172. });
  173. }