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 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
преди 12 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
  2. // MIT License. See license.txt
  3. // todo
  4. // - basic search in documents
  5. wn.pages['finder'].onload = function(wrapper) {
  6. wn.ui.make_app_page({
  7. parent: wrapper,
  8. title: wn._('Finder'),
  9. single_column: true
  10. });
  11. wrapper.appframe.add_module_icon("Finder");
  12. var $body = $(wrapper).find(".layout-main").addClass("row");
  13. var start = 0,
  14. doctype = null,
  15. module = null;
  16. var get_col = function(colsize, icon, label, panel_class) {
  17. return $('<div class="col-sm-'+colsize+'">\
  18. <div class="panel panel-'+panel_class+'">\
  19. <div class="panel-heading"><i class="icon-'+icon+'"></i> \
  20. <span class="col-heading">'+label+'</span>\
  21. <span class="pull-right"></span>\
  22. </div>\
  23. <div class="list-group">\
  24. </div>\
  25. </div>\
  26. </div>').appendTo($body);
  27. }
  28. var $modules = get_col(3, "briefcase", wn._("Modules"), "default").find(".list-group");
  29. var $doctypes = get_col(3, "folder-close", wn._("Document Types"), "default").find(".list-group");
  30. var $list = get_col(6, "file", wn._("Documents"), "info");
  31. var $doctype_label = $list.find(".col-heading")
  32. var $list_link = $list.find(".panel-heading .pull-right")
  33. .append('<a class="list-link"><i class="icon-list"></i></a>')
  34. .find(".list-link")
  35. .click(function() { wn.set_route("List", doctype); })
  36. .toggle(false);
  37. var $new_link = $list.find(".panel-heading .pull-right")
  38. .append(' <a class="new-link"><i class="icon-plus"></i></a>')
  39. .find(".new-link")
  40. .click(function() { new_doc(doctype); })
  41. .toggle(false);
  42. $list = $list.find(".list-group");
  43. var reset_module = function() {
  44. $doctypes.empty();
  45. $('<div class="list-group-item row-select text-muted text-center">'+
  46. wn._("Select Module")+'</div>').appendTo($doctypes);
  47. module = null;
  48. reset_doctype();
  49. }
  50. var reset_doctype = function() {
  51. $list.empty();
  52. $new_link.toggle(false);
  53. $list_link.toggle(false);
  54. $doctype_label.html(wn._("Documents"));
  55. $('<div class="list-group-item row-select text-muted text-center">'+
  56. wn._("Select Document Type")+'</div>').appendTo($list);
  57. start=0;
  58. }
  59. reset_module();
  60. // modules
  61. $.each(keys(wn.boot.notification_info.module_doctypes).sort(), function(i, module) {
  62. $($r('<a class="list-group-item row-select module-link" \
  63. data-module="%(module)s">%(module)s\
  64. <span class="pull-right"><i class="icon-chevron-right"></i></span></a>',
  65. {module: module})).appendTo($modules);
  66. });
  67. $modules.on("click", ".module-link", function() {
  68. // list doctypes
  69. reset_module();
  70. // select module
  71. $modules.find(".list-group-item.active").removeClass("active");
  72. $(this).addClass("active");
  73. // show doctypes
  74. $doctypes.find(".row-select").remove();
  75. module = $(this).attr("data-module");
  76. $.each(wn.boot.notification_info.module_doctypes[module].sort(), function(i, doctype) {
  77. $($r('<a class="list-group-item doctype-link" \
  78. data-doctype="%(doctype)s">%(doctype)s\
  79. <span class="pull-right"><i class="icon-chevron-right"></i></a>',
  80. {doctype: doctype})).appendTo($doctypes)
  81. });
  82. });
  83. $doctypes.on("click", ".doctype-link", function() {
  84. reset_doctype();
  85. // select doctype
  86. $doctypes.find(".list-group-item.active").removeClass("active");
  87. $(this).addClass("active");
  88. doctype = $(this).attr("data-doctype");
  89. // label
  90. $doctype_label.html(wn._(doctype));
  91. // new link
  92. $new_link.toggle(!!wn.model.can_create(doctype));
  93. $list_link.toggle(!!wn.model.can_read(doctype));
  94. render_list();
  95. })
  96. $list.on("click", ".btn-more", function() {
  97. start = start+20;
  98. render_list();
  99. });
  100. $list.on("click", ".btn-search", function() {
  101. filter_list();
  102. })
  103. $list.on("keypress", ".input-search", function(e) {
  104. if(e.which===13)
  105. filter_list();
  106. })
  107. var filter_list = function() {
  108. start = 0;
  109. $list.find(".document-item, .row-empty").remove();
  110. render_list();
  111. }
  112. var render_list = function() {
  113. // remove more btn if any
  114. $list.find(".row-more, .row-select").remove();
  115. // loading indicator...
  116. add_list_row('<i class="icon-refresh icon-spin text-muted"></i>')
  117. .addClass("row-loading text-center")
  118. var args = {
  119. doctype: doctype,
  120. fields: ["name", "modified", "owner"],
  121. limit_start: start || 0,
  122. limit_page_length: 20
  123. };
  124. if($(".input-search").val()) {
  125. args.filters = [[doctype, "name", "like", "%" + $(".input-search").val() + "%"]]
  126. }
  127. wn.call({
  128. method: "webnotes.widgets.reportview.get",
  129. args: args,
  130. callback: function(r) {
  131. $list.find(".row-loading").remove();
  132. if(!$list.find(".input-search").length) {
  133. // make search
  134. $('<div class="list-group-item">\
  135. <div class="input-group">\
  136. <input type="text" class="form-control input-search">\
  137. <span class="input-group-btn">\
  138. <button class="btn btn-default btn-search" type="button">\
  139. <i class="icon-search"></i></button>\
  140. </span>\
  141. </div>\
  142. </div>').appendTo($list);
  143. }
  144. if(r.message.values) {
  145. $.each(r.message.values, function(i, v) {
  146. $($r('<a class="list-group-item document-item" \
  147. data-name="%(name)s" href="#Form/%(doctype)s/%(name)s">%(name)s\
  148. <span class="text-muted text-small">%(owner)s</span>\
  149. <span class="text-muted pull-right">%(modified)s</span></a>', {
  150. doctype: doctype,
  151. name: v[1],
  152. owner: v[0],
  153. modified: comment_when(v[2])
  154. })).appendTo($list);
  155. })
  156. if(r.message.values.length==20) {
  157. add_list_row('More...').addClass("row-more text-center btn-more text-muted");
  158. }
  159. } else {
  160. add_list_row('<i class="icon-ban-circle"></i>').addClass("text-center text-muted row-empty");
  161. }
  162. }
  163. })
  164. }
  165. var add_list_row = function(html) {
  166. return $('<a class="list-group-item">'+html+'</a>').appendTo($list);
  167. }
  168. }