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.
 
 
 
 
 
 

193 line
5.0 KiB

  1. search_fields = {};
  2. // Search Selector 2.0
  3. // -------------------
  4. function setlinkvalue(name) {
  5. //selector.input.set(name);// in local - this will be set onchange
  6. selector.input.set_input(name); // on screen
  7. selector.hide();
  8. }
  9. // Link Selector
  10. // -------------
  11. function makeselector() {
  12. var d = new Dialog(540,440, 'Search');
  13. d.make_body([
  14. ['Data', 'Beginning With', 'Tip: You can use wildcard "%"'],
  15. ['Select', 'Search By'],
  16. ['Button', 'Search'],
  17. ['HTML', 'Help'],
  18. ['HTML', 'Result']
  19. ]);
  20. // search with
  21. var inp = d.widgets['Beginning With'];
  22. var field_sel = d.widgets['Search By'];
  23. var btn = d.widgets['Search'];
  24. // result
  25. d.sel_type = '';
  26. d.values_len = 0;
  27. d.set = function(input, type, label) {
  28. d.sel_type = type; d.input = input;
  29. if(d.style!='Link') {
  30. d.rows['Result'].innerHTML ='';
  31. d.values_len = 0;
  32. }
  33. d.style = 'Link';
  34. d.set_query_description()
  35. if(!d.sel_type)d.sel_type = 'Value';
  36. d.set_title('Select a "'+ d.sel_type +'" for field "'+label+'"');
  37. }
  38. d.set_search = function(dt) {
  39. if(d.style!='Search') {
  40. d.rows['Result'].innerHTML ='';
  41. d.values_len = 0;
  42. }
  43. d.style = 'Search';
  44. if(d.input) { d.input = null; sel_type = null; }
  45. d.sel_type = get_label_doctype(dt);
  46. d.set_title('Quick Search for ' + dt);
  47. }
  48. inp.onkeydown = function(e) {
  49. if(isIE)var kc = window.event.keyCode;
  50. else var kc = e.keyCode;
  51. if(kc==13) if(!btn.disabled)btn.onclick();
  52. }
  53. d.set_query_description = function() {
  54. if(d.input && d.input.query_description) {
  55. d.rows['Help'].innerHTML ='<div class="help_box">' + d.input.query_description + '</div>';
  56. } else {
  57. d.rows['Help'].innerHTML =''
  58. }
  59. }
  60. d.onshow = function() {
  61. if(d.set_doctype!=d.sel_type) {
  62. d.rows['Result'].innerHTML ='';
  63. d.values_len = 0;
  64. }
  65. inp.value = '';
  66. if(d.input && d.input.txt.value) {
  67. inp.value = d.input.txt.value;
  68. }
  69. try{inp.focus();} catch(e){}
  70. if(d.input) d.input.set_get_query();
  71. // temp function to strip labels from search fields
  72. var get_sf_list = function(dt) {
  73. var l = []; var lf = search_fields[dt];
  74. for(var i=0; i<lf.length; i++) l.push(lf[i][1]);
  75. return l;
  76. }
  77. // set fields
  78. $ds(d.rows['Search By']);
  79. if(search_fields[d.sel_type]) {
  80. empty_select(field_sel);
  81. add_sel_options(field_sel, get_sf_list(d.sel_type), 'ID');
  82. } else {
  83. // set default select by
  84. empty_select(field_sel);
  85. add_sel_options(field_sel, ['ID'], 'ID');
  86. $c('webnotes.widgets.search.getsearchfields', {'doctype':d.sel_type}, function(r,rt) {
  87. search_fields[d.sel_type] = r.searchfields;
  88. empty_select(field_sel);
  89. add_sel_options(field_sel, get_sf_list(d.sel_type));
  90. field_sel.selectedIndex = 0;
  91. } );
  92. }
  93. }
  94. d.onhide = function() {
  95. if(page_body.wntoolbar)
  96. page_body.wntoolbar.search_sel.disabled = 0;
  97. if(d.input && d.input.txt) // link, call onchange
  98. d.input.txt.onchange()
  99. }
  100. btn.onclick = function() {
  101. if(this.disabled) return;
  102. this.set_working();
  103. d.set_doctype = d.sel_type;
  104. var q = '';
  105. args = {};
  106. if(d.input && d.input.get_query) {
  107. var doc = {};
  108. args.is_simple = 1;
  109. if(cur_frm) doc = locals[cur_frm.doctype][cur_frm.docname];
  110. var q = d.input.get_query(doc, d.input.doctype, d.input.docname);
  111. if(!q) { return ''; }
  112. }
  113. // for field type, return field name
  114. var get_sf_fieldname = function(v) {
  115. var lf = search_fields[d.sel_type];
  116. // still loading options
  117. if(!lf)
  118. return 'name'
  119. for(var i=0; i<lf.length; i++) if(lf[i][1]==v) return lf[i][0];
  120. }
  121. // build args
  122. $.extend(args, {
  123. 'txt':strip(inp.value)
  124. ,'doctype':d.sel_type
  125. ,'query':q
  126. ,'searchfield':get_sf_fieldname(sel_val(field_sel))
  127. });
  128. // run the query
  129. $c('webnotes.widgets.search.search_widget',
  130. args,
  131. function(r, rtxt) {
  132. btn.done_working();
  133. if(r.coltypes)r.coltypes[0]='Link'; // first column must always be selectable even if it is not a link
  134. d.values_len = r.values.length;
  135. d.set_result(r);
  136. }, function() { btn.done_working(); });
  137. }
  138. d.set_result = function(r) {
  139. d.rows['Result'].innerHTML = '';
  140. var c = $a(d.rows['Result'],'div','comment',{paddingBottom:'4px',marginBottom:'4px',borderBottom:'1px solid #CCC', marginLeft:'4px'});
  141. if(r.values.length==50)
  142. c.innerHTML = 'Showing max 50 results. Use filters to narrow down your search';
  143. else
  144. c.innerHTML = 'Showing '+r.values.length+' resuts.';
  145. var w = $a(d.rows['Result'],'div','',{height:'240px',overflow:'auto',margin:'4px'});
  146. for(var i=0; i<r.values.length; i++) {
  147. var div = $a(w,'div','',{marginBottom:'4px',paddingBottom:'4px',borderBottom:'1px dashed #CCC'});
  148. // link
  149. var l = $a($a(div,'div'),'span','link_type'); l.innerHTML = r.values[i][0]; l.link_name = r.values[i][0]; l.dt = r.coloptions[0];
  150. if(d.input)
  151. l.onclick = function() { setlinkvalue(this.link_name); }
  152. else
  153. l.onclick = function() { loaddoc(this.dt, this.link_name); d.hide(); }
  154. // support
  155. var cl = []
  156. for(var j=1; j<r.values[i].length; j++) cl.push(r.values[i][j]);
  157. var c = $a(div,'div','comment',{marginTop:'2px'}); c.innerHTML = cl.join(', ');
  158. }
  159. }
  160. selector = d;
  161. }