Merge branch 'master' of github.com:webnotes/wnframework

This commit is contained in:
Anand Doshi 2011-08-24 10:52:04 +05:30
commit d6d36b43b4
10 changed files with 172 additions and 158 deletions

View file

@ -104,7 +104,7 @@ class HTTPRequest:
else:
db_name = getattr(webnotes.defs,'default_db_name','')
webnotes.conn = webnotes.db.Database(user = db_name,password = getattr(webnotes.defs,'db_password',''))
webnotes.conn = webnotes.db.Database(user = db_name,password = getattr(webnotes.defs,'db_password', ''))
webnotes.ac_name = ac_name
# =================================================================================

View file

@ -26,7 +26,7 @@ class Database:
self.transaction_writes = 0
self.testing_tables = []
self.password = self.get_db_password(ac_name, password)
self.password = self.get_db_password(user, password)
self.connect()
if self.user != 'root':
@ -57,7 +57,9 @@ class Database:
return ''
def get_db_login(self, ac_name):
return getattr(defs,'db_name_map').get(ac_name, getattr(defs,'default_db_name'))
if hasattr(defs, 'db_name_map'):
return getattr(defs,'db_name_map').get(ac_name, getattr(defs,'default_db_name'))
else: return ac_name
def connect(self):
"""

View file

@ -18,7 +18,7 @@ class DocList:
self.to_docstatus = 0
if dt and dn:
self.load_from_db(dt, dn)
def load_from_db(self, dt, dn):
"""
Load doclist from dt
@ -34,15 +34,15 @@ class DocList:
doclist = [doc,]
for t in tablefields:
doclist += getchildren(doc.name, t[0], t[1], dt, prefix=prefix)
self.docs = docs
def __iter__(self):
"""
Make this iterable
"""
return self.docs.__iter__()
def from_compressed(self, data, docname):
"""
Expand called from client
@ -50,13 +50,13 @@ class DocList:
from webnotes.model.utils import expand
self.docs = expand(data)
self.objectify(docname)
def objectify(self, docname=None):
"""
Converts self.docs from a list of dicts to list of Documents
"""
from webnotes.model.doc import Document
self.docs = [Document(fielddata=d) for d in self.docs]
if not docname:
self.doc, self.children = self.docs[0], self.docs[1:]
@ -69,21 +69,20 @@ class DocList:
self.doc = d
else:
self.children.append(d)
# catch all if no self.doc
if not self.doc:
self.doc, self.children = self.docs[0], self.docs[1:]
def make_obj(self):
"""
Create a DocType object
"""
if self.obj: return self.obj
from webnotes.model.code import get_obj
self.obj = get_obj(doc=self.doc, doclist=self.children)
return self.obj
def next(self):
"""
Next doc
@ -104,13 +103,13 @@ class DocList:
if (not is_single(self.doc.doctype)) and (not cint(self.doc.fields.get('__islocal'))):
tmp = webnotes.conn.sql("""
SELECT modified FROM `tab%s` WHERE name="%s" for update"""
SELECT modified FROM `tab%s` WHERE name="%s" for update"""
% (self.doc.doctype, self.doc.name))
if tmp and str(tmp[0][0]) != str(self.doc.modified):
webnotes.msgprint("""
Document has been modified after you have opened it.
To maintain the integrity of the data, you will not be able to save your changes.
Document has been modified after you have opened it.
To maintain the integrity of the data, you will not be able to save your changes.
Please refresh this document. [%s/%s]""" % (tmp[0][0], self.doc.modified), raise_exception=1)
def check_permission(self):
@ -119,7 +118,7 @@ class DocList:
"""
if not self.doc.check_perm(verbose=1):
webnotes.msgprint("Not enough permission to save %s" % self.doc.doctype, raise_exception=1)
def check_links(self):
"""
Checks integrity of links (throws exception if links are invalid)
@ -130,11 +129,11 @@ class DocList:
ref[d.doctype] = d.make_link_list()
err_list += d.validate_links(ref[d.doctype])
if err_list:
webnotes.msgprint("""[Link Validation] Could not find the following values: %s.
webnotes.msgprint("""[Link Validation] Could not find the following values: %s.
Please correct and resave. Document Not Saved.""" % ', '.join(err_list), raise_exception=1)
def update_timestamps_and_docstatus(self):
"""
Update owner, creation, modified_by, modified, docstatus
@ -142,17 +141,17 @@ class DocList:
from webnotes.utils import now
ts = now()
user = webnotes.__dict__.get('session', {}).get('user') or 'Administrator'
for d in self.docs:
if self.doc.__islocal:
d.owner = user
d.creation = ts
d.modified_by = user
d.modified = ts
if d.docstatus != 2: # don't update deleted
d.docstatus = self.to_docstatus
def prepare_for_save(self, check_links):
"""
Set owner, modified etc before saving
@ -175,7 +174,7 @@ class DocList:
from webnotes.model.triggers import fire_event
fire_event(self.doc, method)
def save_main(self):
"""
Save the main doc
@ -184,7 +183,7 @@ class DocList:
self.doc.save(cint(self.doc.__islocal))
except NameError, e:
webnotes.msgprint('%s "%s" already exists' % (self.doc.doctype, self.doc.name))
# prompt if cancelled
if webnotes.conn.get_value(self.doc.doctype, self.doc.name, 'docstatus')==2:
webnotes.msgprint('[%s "%s" has been cancelled]' % (self.doc.doctype, self.doc.name))
@ -197,7 +196,7 @@ class DocList:
"""
for d in self.children:
deleted, local = d.fields.get('__deleted',0), d.fields.get('__islocal',0)
if cint(local) and cint(deleted):
pass
@ -206,7 +205,7 @@ class DocList:
d.parent = self.doc.name # rename if reqd
d.parenttype = self.doc.doctype
d.save(new = cint(local))
d.save(new = cint(local))
def save(self, check_links=1):
"""
@ -217,7 +216,7 @@ class DocList:
self.save_main()
self.save_children()
self.run_method('on_update')
def submit(self):
"""
Save & Submit - set docstatus = 1, run "on_submit"
@ -227,7 +226,7 @@ class DocList:
self.to_docstatus = 1
self.save()
self.run_method('on_submit')
def cancel(self):
"""
Cancel - set docstatus 2, run "on_cancel"
@ -239,7 +238,7 @@ class DocList:
self.save_main()
self.save_children()
self.run_method('on_cancel')
def update_after_submit(self):
"""
Update after submit - some values changed after submit
@ -260,11 +259,11 @@ def getlist(doclist, parentfield):
"""
import webnotes.model.utils
return webnotes.model.utils.getlist(doclist, parentfield)
def copy_doclist(doclist, no_copy = []):
"""
Make a copy of the doclist
"""
import webnotes.model.utils
return webnotes.model.utils.copy_doclist(doclist, no_copy)

View file

@ -1,7 +1,7 @@
"""
Model utilities, unclassified functions
"""
def expand(docs):
"""
Expand a doclist sent from the client side. (Internally used by the request handler)
@ -25,12 +25,12 @@ def compress(doclist):
"""
Compress a doclist before sending it to the client side. (Internally used by the request handler)
"""
"""
if doclist and hasattr(doclist[0],'fields'):
docs = [d.fields for d in doclist]
else:
docs = doclist
kl, vl = {}, []
for d in docs:
dt = d['doctype']
@ -38,10 +38,10 @@ def compress(doclist):
fl = d.keys()
forbidden = ['server_code_compiled']
nl = ['doctype','localname','__oldparent','__unsaved']
# add client script for doctype, doctype due to ambiguity
if dt=='DocType': nl.append('__client_script')
for f in fl:
if not (f in nl) and not (f in forbidden):
nl.append(f)
@ -64,21 +64,24 @@ def compress(doclist):
def getlist(doclist, field):
"""
Filter a list of records for a specific field from the full doclist
Example::
# find all phone call details
# find all phone call details
dl = getlist(self.doclist, 'contact_updates')
pl = []
for d in dl:
if d.type=='Phone':
pl.append(d)
"""
l = []
for d in doclist:
if d.parent and (not d.parent.lower().startswith('old_parent:')) and d.parentfield == field:
l.append(d)
l.sort(lambda a, b: a.idx - b.idx)
return l
# Copy doclist
@ -90,31 +93,31 @@ def copy_doclist(doclist, no_copy = []):
Pass fields that are not to be copied in `no_copy`
"""
from webnotes.model.doc import Document
cl = []
# main doc
c = Document(fielddata = doclist[0].fields.copy())
# clear no_copy fields
for f in no_copy:
for f in no_copy:
if c.fields.has_key(f):
c.fields[f] = None
c.name = None
c.save(1)
cl.append(c)
# new parent name
parent = c.name
# children
for d in doclist[1:]:
c = Document(fielddata = d.fields.copy())
c.name = None
# clear no_copy fields
for f in no_copy:
for f in no_copy:
if c.fields.has_key(f):
c.fields[f] = None
@ -138,18 +141,18 @@ def _make_html(doc, link_list):
from webnotes.utils import cstr
out = '<table class="simpletable">'
for k in doc.fields.keys():
if k!='server_code_compiled':
if k!='server_code_compiled':
v = cstr(doc.fields[k])
# link field
if v and (k in link_list.keys()):
dt = link_list[k]
if type(dt)==str and dt.startswith('link:'):
dt = dt[5:]
v = '<a href="index.cgi?page=Form/%s/%s">%s</a>' % (dt, v, v)
v = '<a href="index.cgi?page=Form/%s/%s">%s</a>' % (dt, v, v)
out += '\t<tr><td>%s</td><td>%s</td></tr>\n' % (cstr(k), v)
out += '</table>'
return out
@ -159,13 +162,13 @@ def to_html(doclist):
"""
out = ''
link_lists = {}
for d in doclist:
if not link_lists.get(d.doctype):
link_lists[d.doctype] = d.make_link_list()
out += _make_html(d, link_lists[d.doctype])
return out
def commonify_doclist(doclist, with_comments=1):
@ -184,14 +187,14 @@ def commonify_doclist(doclist, with_comments=1):
return c
def strip_common(d):
for k in common_keys:
for k in common_keys:
if k in d: del d[k]
return d
def make_common_dicts(doclist):
common_dict = {} # one per doctype
# make common dicts for all records
for d in doclist:
if not d['doctype'] in common_dict:
@ -206,15 +209,15 @@ def commonify_doclist(doclist, with_comments=1):
common_dict = make_common_dicts(doclist)
# make docs
final = []
final = []
for d in doclist:
f = strip_common(get_diff_dict(common_dict[d['doctype']], d))
f['doctype'] = d['doctype'] # keep doctype!
# strip name for child records (only an auto generated number!)
if f['doctype'] != doclist[0]['doctype']:
del f['name']
if with_comments:
f['##comment'] = d['doctype'] + ('name' in f and (', ' + f['name']) or '')
final.append(f)
@ -226,10 +229,10 @@ def commonify_doclist(doclist, with_comments=1):
if with_comments:
d['##comment'] = 'These values are common for all ' + d['doctype']
commons.append(strip_common(d))
common_values = make_common(doclist)
return [common_values]+commons+final
def uncommonify_doclist(dl):
"""
Expands an commonified doclist
@ -249,13 +252,13 @@ def uncommonify_doclist(dl):
final.append(d1)
return final
def pprint_doclist(doclist, with_comments = 1):
"""
Pretty Prints a doclist with common keys separated and comments
"""
from webnotes.utils import pprint_dict
dictlist =[pprint_dict(d) for d in commonify_doclist(doclist, with_comments)]
title = '# '+doclist[0]['doctype']+', '+doclist[0]['name']
return title + '\n[\n' + ',\n'.join(dictlist) + '\n]'
@ -268,5 +271,5 @@ def peval_doclist(txt):
return uncommonify_doclist(eval(txt))
else:
return eval(txt)
return uncommonify_doclist(eval(txt))

View file

@ -39,8 +39,11 @@ class IncomingMail:
"""
get utf-8 encoded part content
"""
return unicode(part.get_payload(decode=True),str(charset),"ignore").encode('utf8','replace')
try:
return unicode(part.get_payload(decode=True),str(charset),"ignore").encode('utf8','replace')
except LookupError, e:
return part.get_payload()
def get_attachment(self, part, charset):
"""
Extracts an attachment

View file

@ -19,7 +19,7 @@ class Page:
Loads page info from files in module
"""
# load js
doc.fields['__script'] = module.get_doc_file('page',doc.name,'.js').read()
doc.fields['__script'] = module.get_doc_file('page',doc.name,'.js').read() or doc.script
doc.script = None
# load css

View file

@ -14,7 +14,7 @@ def get_search_criteria_list(dt):
def load_report_list():
webnotes.response['rep_list'] = get_search_criteria_list(form.getvalue('dt'))
# Get, scrub metadata
# ====================================================================
@ -37,20 +37,20 @@ def get_parent_dt(dt):
def get_sql_meta(tl):
std_columns = {
'owner':('Owner', '', '', '100'),
'creation':('Created on', 'Date', '', '100'),
'modified':('Last modified on', 'Date', '', '100'),
'owner':('Owner', '', '', '100'),
'creation':('Created on', 'Date', '', '100'),
'modified':('Last modified on', 'Date', '', '100'),
'modified_by':('Modified By', '', '', '100')
}
meta = {}
for dt in tl:
meta[dt] = std_columns.copy()
# for table doctype, the ID is the parent id
pdt = get_parent_dt(dt)
if pdt:
if pdt:
meta[dt]['parent'] = ('ID', 'Link', pdt, '200')
# get the field properties from DocField
@ -58,10 +58,10 @@ def get_sql_meta(tl):
for r in res:
if r[0]:
meta[dt][r[0]] = (r[1], r[2], r[3], r[4]);
# name
meta[dt]['name'] = ('ID', 'Link', dt, '200')
return meta
# Additional conditions to fulfill match permission rules
@ -80,12 +80,12 @@ def getmatchcondition(dt, ud, ur):
return ''
return ' OR '.join(cond)
def add_match_conditions(q, tl, ur, ud):
sl = []
for dt in tl:
s = getmatchcondition(dt, ud, ur)
if s:
if s:
sl.append(s)
# insert the conditions
@ -94,13 +94,13 @@ def add_match_conditions(q, tl, ur, ud):
condition_end = q.find('ORDER BY')!=-1 and 'ORDER BY' or 'LIMIT'
condition_end = q.find('GROUP BY')!=-1 and 'GROUP BY' or condition_end
if q.find('ORDER BY')!=-1 or q.find('LIMIT')!=-1 or q.find('GROUP BY')!=-1: # if query continues beyond conditions
q = q.split(condition_end)
q = q[0] + condition_st + '(' + ' OR '.join(sl) + ') ' + condition_end + q[1]
else:
q = q + condition_st + '(' + ' OR '.join(sl) + ')'
return q
# execute server-side script from Search Criteria
@ -111,7 +111,7 @@ def exec_report(code, res, colnames=[], colwidths=[], coltypes=[], coloptions=[]
for c in colnames:
col_idx[c] = i
i+=1
# load globals (api)
from webnotes import *
from webnotes.utils import *
@ -127,12 +127,12 @@ def exec_report(code, res, colnames=[], colwidths=[], coltypes=[], coloptions=[]
NEWLINE = '\n'
exec str(code)
if out!=None:
res = out
return res, style, header_html, footer_html, page_template
# ====================================================================
def guess_type(m):
@ -146,7 +146,7 @@ def guess_type(m):
return 'Date'
else:
return 'Data'
def build_description_simple():
colnames, coltypes, coloptions, colwidths = [], [], [], []
@ -155,7 +155,7 @@ def build_description_simple():
coltypes.append(guess_type[m[0]])
coloptions.append('')
colwidths.append('100')
return colnames, coltypes, coloptions, colwidths
# ====================================================================
@ -180,27 +180,27 @@ def build_description_standard(meta, tl):
if (not dt) and merged_meta.get(fn):
# no "AS" given, find type from merged description
desc = merged_meta[fn]
colnames.append(desc[0] or fn)
coltypes.append(desc[1] or '')
coloptions.append(desc[2] or '')
colwidths.append(desc[3] or '100')
elif meta.get(dt,{}).has_key(fn):
# type specified for a multi-table join
# usually from Report Builder
desc = meta[dt][fn]
colnames.append(desc[0] or fn)
coltypes.append(desc[1] or '')
coloptions.append(desc[2] or '')
colwidths.append(desc[3] or '100')
else:
# nothing found
# guess
colnames.append(fn)
coltypes.append(guess_type(f[1]))
coloptions.append('')
@ -214,21 +214,21 @@ def build_description_standard(meta, tl):
def runquery(q='', ret=0, from_export=0):
import webnotes.utils
formatted = cint(form.getvalue('formatted'))
formatted = cint(form.getvalue('formatted'))
# CASE A: Simple Query
# --------------------
if form.getvalue('simple_query') or form.getvalue('is_simple'):
q = form.getvalue('simple_query') or form.getvalue('query')
if not q: q = form.getvalue('simple_query') or form.getvalue('query')
if q.split()[0].lower() != 'select':
raise Exception, 'Query must be a SELECT'
as_dict = cint(form.getvalue('as_dict'))
res = sql(q, as_dict = as_dict, as_list = not as_dict, formatted=formatted)
# build colnames etc from metadata
colnames, coltypes, coloptions, colwidths = [], [], [], []
# CASE B: Standard Query
# -----------------------
else:
@ -236,17 +236,17 @@ def runquery(q='', ret=0, from_export=0):
tl = get_sql_tables(q)
meta = get_sql_meta(tl)
q = add_match_conditions(q, tl, webnotes.user.roles, webnotes.user.get_defaults())
# replace special variables
q = q.replace('__user', session['user'])
q = q.replace('__today', webnotes.utils.nowdate())
res = sql(q, as_list=1, formatted=formatted)
colnames, coltypes, coloptions, colwidths = build_description_standard(meta, tl)
# run server script
# -----------------
style, header_html, footer_html, page_template = '', '', '', ''
@ -254,15 +254,15 @@ def runquery(q='', ret=0, from_export=0):
sc_id = form.getvalue('sc_id')
from webnotes.model.code import get_code
sc_details = webnotes.conn.sql("select module, standard, server_script from `tabSearch Criteria` where name=%s", sc_id)[0]
if sc_details[1]!='No':
if sc_details[1]!='No':
code = get_code(sc_details[0], 'Search Criteria', sc_id, 'py')
else:
code = sc_details[2]
if code:
filter_values = form.has_key('filter_values') and eval(form.getvalue('filter_values','')) or {}
res, style, header_html, footer_html, page_template = exec_report(code, res, colnames, colwidths, coltypes, coloptions, filter_values, q, from_export)
out['colnames'] = colnames
out['coltypes'] = coltypes
out['coloptions'] = coloptions
@ -270,17 +270,17 @@ def runquery(q='', ret=0, from_export=0):
out['header_html'] = header_html
out['footer_html'] = footer_html
out['page_template'] = page_template
if style:
out['style'] = style
# just the data - return
if ret==1:
return res
return res
out['values'] = res
# return num of entries
# return num of entries
qm = form.has_key('query_max') and form.getvalue('query_max') or ''
if qm and qm.strip():
if qm.split()[0].lower() != 'select':
@ -298,31 +298,31 @@ def runquery_csv():
# run query
res = runquery(from_export = 1)
q = form.getvalue('query')
rep_name = form.getvalue('report_name')
if not form.has_key('simple_query'):
# Report Name
if not rep_name:
rep_name = get_sql_tables(q)[0]
if not rep_name: rep_name = 'DataExport'
# Headings
heads = []
rows = [[rep_name], out['colnames']] + out['values']
from cStringIO import StringIO
import csv
f = StringIO()
writer = csv.writer(f)
for r in rows:
writer.writerow(r)
f.seek(0)
out['result'] = f.read()
out['type'] = 'csv'

View file

@ -22,16 +22,16 @@ def getsearchfields():
webnotes.response['searchfields'] = [['name', 'ID', 'Data', '']] + res
def make_query(fields, dt, key, txt, start, length):
return """SELECT %(fields)s
FROM `tab%(dt)s`
return """SELECT %(fields)s
FROM `tab%(dt)s`
WHERE `tab%(dt)s`.`%(key)s` LIKE '%(txt)s' AND `tab%(dt)s`.docstatus != 2
ORDER BY `tab%(dt)s`.`%(key)s`
ORDER BY `tab%(dt)s`.`%(key)s`
DESC LIMIT %(start)s, %(len)s """ % {
'fields': fields,
'dt': dt,
'key': key,
'txt': txt + '%',
'start': start,
'start': start,
'len': length
}
@ -48,7 +48,7 @@ def get_std_fields_list(dt, key):
def build_for_autosuggest(res):
from webnotes.utils import cstr
results = []
for r in res:
info = ''
@ -56,10 +56,10 @@ def build_for_autosuggest(res):
info = ','.join([cstr(t) for t in r[1:]])
if len(info) > 30:
info = info[:30] + '...'
results.append({'id':r[0], 'value':r[0], 'info':info})
return results
def scrub_custom_query(query, key, txt):
if '%(key)s' in query:
query = query.replace('%(key)s', key)
@ -74,7 +74,7 @@ def search_link():
txt = webnotes.form.getvalue('txt')
dt = webnotes.form.getvalue('dt')
query = webnotes.form.getvalue('query')
if query:
res = webnotes.conn.sql(scrub_custom_query(query, 'name', txt))
else:
@ -97,5 +97,5 @@ def search_widget():
query = scrub_custom_query(user_query, key, txt)
else:
query = make_query(', '.join(get_std_fields_list(dt, key)), dt, key, txt, webnotes.form.getvalue('start') or 0, webnotes.form.getvalue('page_len') or 50)
webnotes.widgets.query_builder.runquery(query)

View file

@ -21,8 +21,8 @@ function makeselector() {
['Button', 'Search'],
['HTML', 'Help'],
['HTML', 'Result']
]);
]);
// search with
var inp = d.widgets['Beginning With'];
var field_sel = d.widgets['Search By'];
@ -39,7 +39,7 @@ function makeselector() {
}
d.style = 'Link';
d.set_query_description()
if(!d.sel_type)d.sel_type = 'Value';
d.set_title('Select a "'+ d.sel_type +'" for field "'+label+'"');
}
@ -47,18 +47,18 @@ function makeselector() {
if(d.style!='Search') {
d.rows['Result'].innerHTML ='';
d.values_len = 0;
}
}
d.style = 'Search';
if(d.input) { d.input = null; sel_type = null; }
d.sel_type = get_label_doctype(dt);
d.set_title('Quick Search for ' + dt);
}
inp.onkeydown = function(e) {
inp.onkeydown = function(e) {
if(isIE)var kc = window.event.keyCode;
else var kc = e.keyCode;
if(kc==13) if(!btn.disabled)btn.onclick();
if(kc==13) if(!btn.disabled)btn.onclick();
}
d.set_query_description = function() {
@ -68,18 +68,18 @@ function makeselector() {
d.rows['Help'].innerHTML =''
}
}
d.onshow = function() {
d.onshow = function() {
if(d.set_doctype!=d.sel_type) {
d.rows['Result'].innerHTML ='';
d.values_len = 0;
}
inp.value = '';
inp.value = '';
if(d.input && d.input.txt.value) {
inp.value = d.input.txt.value;
}
try{inp.focus();} catch(e){}
if(d.input) d.input.set_get_query();
// temp function to strip labels from search fields
@ -88,10 +88,10 @@ function makeselector() {
for(var i=0; i<lf.length; i++) l.push(lf[i][1]);
return l;
}
// set fields
$ds(d.rows['Search By']);
if(search_fields[d.sel_type]) {
empty_select(field_sel);
add_sel_options(field_sel, get_sf_list(d.sel_type), 'ID');
@ -121,8 +121,11 @@ function makeselector() {
this.set_working();
d.set_doctype = d.sel_type;
var q = '';
args = {};
if(d.input && d.input.get_query) {
var doc = {};
args.is_simple = 1;
if(cur_frm) doc = locals[cur_frm.doctype][cur_frm.docname];
var q = d.input.get_query(doc, d.input.doctype, d.input.docname);
if(!q) { return ''; }
@ -131,21 +134,25 @@ function makeselector() {
// for field type, return field name
var get_sf_fieldname = function(v) {
var lf = search_fields[d.sel_type];
// still loading options
if(!lf)
return 'name'
for(var i=0; i<lf.length; i++) if(lf[i][1]==v) return lf[i][0];
}
$c('webnotes.widgets.search.search_widget',
args = {
'txt':strip(inp.value)
,'doctype':d.sel_type
,'query':q
,'searchfield':get_sf_fieldname(sel_val(field_sel))
},
for(var i=0; i<lf.length; i++) if(lf[i][1]==v) return lf[i][0];
}
// build args
$.extend(args, {
'txt':strip(inp.value)
,'doctype':d.sel_type
,'query':q
,'searchfield':get_sf_fieldname(sel_val(field_sel))
});
// run the query
$c('webnotes.widgets.search.search_widget',
args,
function(r, rtxt) {
btn.done_working();
if(r.coltypes)r.coltypes[0]='Link'; // first column must always be selectable even if it is not a link
@ -153,7 +160,7 @@ function makeselector() {
d.set_result(r);
}, function() { btn.done_working(); });
}
d.set_result = function(r) {
d.rows['Result'].innerHTML = '';
var c = $a(d.rows['Result'],'div','comment',{paddingBottom:'4px',marginBottom:'4px',borderBottom:'1px solid #CCC', marginLeft:'4px'});
@ -178,8 +185,8 @@ function makeselector() {
for(var j=1; j<r.values[i].length; j++) cl.push(r.values[i][j]);
var c = $a(div,'div','comment',{marginTop:'2px'}); c.innerHTML = cl.join(', ');
}
}
selector = d;
selector = d;
}

View file

@ -1034,11 +1034,11 @@ $ds(d.rows['Search By']);if(search_fields[d.sel_type]){empty_select(field_sel);a
d.onhide=function(){if(page_body.wntoolbar)
page_body.wntoolbar.search_sel.disabled=0;if(d.input&&d.input.txt)
d.input.txt.onchange()}
btn.onclick=function(){if(this.disabled)return;this.set_working();d.set_doctype=d.sel_type;var q='';if(d.input&&d.input.get_query){var doc={};if(cur_frm)doc=locals[cur_frm.doctype][cur_frm.docname];var q=d.input.get_query(doc,d.input.doctype,d.input.docname);if(!q){return'';}}
btn.onclick=function(){if(this.disabled)return;this.set_working();d.set_doctype=d.sel_type;var q='';args={};if(d.input&&d.input.get_query){var doc={};args.is_simple=1;if(cur_frm)doc=locals[cur_frm.doctype][cur_frm.docname];var q=d.input.get_query(doc,d.input.doctype,d.input.docname);if(!q){return'';}}
var get_sf_fieldname=function(v){var lf=search_fields[d.sel_type];if(!lf)
return'name'
for(var i=0;i<lf.length;i++)if(lf[i][1]==v)return lf[i][0];}
$c('webnotes.widgets.search.search_widget',args={'txt':strip(inp.value),'doctype':d.sel_type,'query':q,'searchfield':get_sf_fieldname(sel_val(field_sel))},function(r,rtxt){btn.done_working();if(r.coltypes)r.coltypes[0]='Link';d.values_len=r.values.length;d.set_result(r);},function(){btn.done_working();});}
$.extend(args,{'txt':strip(inp.value),'doctype':d.sel_type,'query':q,'searchfield':get_sf_fieldname(sel_val(field_sel))});$c('webnotes.widgets.search.search_widget',args,function(r,rtxt){btn.done_working();if(r.coltypes)r.coltypes[0]='Link';d.values_len=r.values.length;d.set_result(r);},function(){btn.done_working();});}
d.set_result=function(r){d.rows['Result'].innerHTML='';var c=$a(d.rows['Result'],'div','comment',{paddingBottom:'4px',marginBottom:'4px',borderBottom:'1px solid #CCC',marginLeft:'4px'});if(r.values.length==50)
c.innerHTML='Showing max 50 results. Use filters to narrow down your search';else
c.innerHTML='Showing '+r.values.length+' resuts.';var w=$a(d.rows['Result'],'div','',{height:'240px',overflow:'auto',margin:'4px'});for(var i=0;i<r.values.length;i++){var div=$a(w,'div','',{marginBottom:'4px',paddingBottom:'4px',borderBottom:'1px dashed #CCC'});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];if(d.input)