// Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) // // MIT License (MIT) // // Permission is hereby granted, free of charge, to any person obtaining a // copy of this software and associated documentation files (the "Software"), // to deal in the Software without restriction, including without limitation // the rights to use, copy, modify, merge, publish, distribute, sublicense, // and/or sell copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A // PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF // CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE // OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // fields.js // // Fields are divided into 2 types // 1. Standard fields are loaded with the libarary // 2. Special fields are loaded with form.compressed.js // // // + wrapper // + input_area // + display_area // ====================================================================================== var no_value_fields = ['Section Break', 'Column Break', 'HTML', 'Table', 'FlexTable', 'Button', 'Image']; var codeid=0; var code_editors={}; function Field() { this.with_label = 1; } Field.prototype.make_body = function() { var ischk = (this.df.fieldtype=='Check' ? 1 : 0); // parent element if(this.parent) this.wrapper = $a(this.parent, (this.with_label || this.df.fieldtype=="HTML" ? 'div' : 'span')); else this.wrapper = document.createElement((this.with_label || this.df.fieldtype=="HTML" ? 'div' : 'span')); $(this.wrapper).addClass("field-wrapper"); this.label_area = $a(this.wrapper, 'div', '', {margin:'0px 0px 2px 0px', minHeight:'1em'}); var label_wrapper = this.label_area; if(ischk && !this.in_grid) { var label_wrapper = $("
").appendTo(this.label_area).get(0); this.input_area = $a(label_wrapper, 'span', '', {marginRight:'4px'}); this.disp_area = $a(label_wrapper, 'span', '', {marginRight:'4px'}); } // label if(this.with_label) { this.label_span = $a(label_wrapper, 'span', 'small') // error icon this.label_icon = $('').toggle(false) .appendTo(label_wrapper).css('margin-left','7px') .attr("title", "This field is mandatory."); } else { this.label_span = $a(label_wrapper, 'span', '', {marginRight:'4px'}) $dh(label_wrapper); } // make the input areas if(!this.input_area) { this.input_area = $a(this.wrapper, (this.with_label ? 'div' : 'span')); this.disp_area = $a(this.wrapper, (this.with_label ? 'div' : 'span')); } // apply style if(this.in_grid) { if(this.label_area) $dh(this.label_area); } else { this.input_area.className = 'input_area'; $y(this.wrapper,{marginBottom:'9px'}); // set description this.set_description(); } // bind label refresh if(this.onmake)this.onmake(); } Field.prototype.set_max_width = function() { var no_max = ['Code', 'Text Editor', 'Text', 'Small Text', 'Table', 'HTML'] if(this.wrapper && this.layout_cell && this.layout_cell.parentNode.cells && this.layout_cell.parentNode.cells.length==1 && !in_list(no_max, this.df.fieldtype)) { $y(this.wrapper, {paddingRight:'50%'}); } } Field.prototype.set_label = function() { if(this.with_label && this.label_area && this.label!=this.df.label) { this.label_span.innerHTML = this.df.label;this.label = this.df.label; } } Field.prototype.set_description = function(txt) { if(this.df.description || txt) { // parent if(!this.desc_area) { var p = in_list(['Text Editor', 'Code', 'Check'], this.df.fieldtype) ? this.label_area : this.wrapper; this.desc_area = $a(p, 'div', 'help small'); } $(this.desc_area).html(this.df.description || txt); } } // Field Refresh // -------------------------------------------------------------------------------------------- Field.prototype.get_status = function() { // if used in filters if(this.in_filter) this.not_in_form = this.in_filter; if(this.not_in_form) { return 'Write'; } if(!this.df.permlevel) this.df.permlevel = 0; var p = this.perm[this.df.permlevel]; var ret; // permission level if(cur_frm.editable && p && p[WRITE] && !this.df.disabled)ret='Write'; else if(p && p[READ])ret='Read'; else ret='None'; // binary if(this.df.fieldtype=='Binary') ret = 'None'; // no display for binary // hidden if(cint(this.df.hidden)) ret = 'None'; // for submit if(ret=='Write' && cint(cur_frm.doc.docstatus) > 0) ret = 'Read'; // allow on submit var a_o_s = cint(this.df.allow_on_submit); if(a_o_s && (this.in_grid || (this.frm && this.frm.not_in_container))) { a_o_s = null; if(this.in_grid) a_o_s = this.grid.field.df.allow_on_submit; // take from grid if(this.frm && this.frm.not_in_container) { a_o_s = cur_grid.field.df.allow_on_submit;} // take from grid } if(cur_frm.editable && a_o_s && cint(cur_frm.doc.docstatus)>0 && !this.df.hidden) { tmp_perm = wn.perm.get_perm(cur_frm.doctype, cur_frm.docname, 1); if(tmp_perm[this.df.permlevel] && tmp_perm[this.df.permlevel][WRITE]) { ret='Write'; } } // make a field read_only if read_only is checked (disregards write permission) if(cint(this.df.read_only) && ret=="Write") ret = "Read"; return ret; } Field.prototype.set_style_mandatory = function(add) { if(add) { $(this.txt ? this.txt : this.input).addClass('input-mandatory'); if(this.disp_area) $(this.disp_area).addClass('input-mandatory'); } else { $(this.txt ? this.txt : this.input).removeClass('input-mandatory'); if(this.disp_area) $(this.disp_area).removeClass('input-mandatory'); } } Field.prototype.refresh_mandatory = function() { if(this.in_filter)return; // mandatory changes if(this.df.reqd) { if(this.label_area) this.label_area.style.color= "#d22"; this.set_style_mandatory(1); } else { if(this.label_area) this.label_area.style.color= "#222"; this.set_style_mandatory(0); } this.refresh_label_icon() this.set_reqd = this.df.reqd; } Field.prototype.refresh_display = function() { // from permission if(!this.current_status || this.current_status!=this.disp_status) { // status changed if(this.disp_status=='Write') { // write if(this.make_input&&(!this.input)) { // make input if reqd this.make_input(); if(this.txt || this.input) $(this.txt || this.input).addClass("mousetrap"); if(this.onmake_input) this.onmake_input(); } if(this.show) this.show() else { $ds(this.wrapper); } // input or content if(this.input) { // if there, show it! $ds(this.input_area); $dh(this.disp_area); if(this.input.refresh)this.input.refresh(); } else { // no widget $dh(this.input_area); $ds(this.disp_area); } } else if(this.disp_status=='Read') { // read if(this.show) this.show() else { $ds(this.wrapper); } $dh(this.input_area); $ds(this.disp_area); } else { // None - hide all if(this.hide) this.hide(); else $dh(this.wrapper); } this.current_status = this.disp_status; } } Field.prototype.refresh = function() { // get status this.disp_status = this.get_status(); // if there is a special refresh in case of table, then this is not valid if(this.in_grid && this.table_refresh && this.disp_status == 'Write') { this.table_refresh(); return; } this.set_label(); this.refresh_display(); if(this.input) { if(this.input.refresh) this.input.refresh(this.df); } // further refresh if(this.onrefresh) this.onrefresh(); // called by various fields if(this.wrapper) { this.wrapper.fieldobj = this; $(this.wrapper).trigger('refresh'); } if(!this.not_in_form) this.set_input(_f.get_value(this.doctype,this.docname,this.df.fieldname)); this.refresh_mandatory(); this.set_max_width(); } Field.prototype.refresh_label_icon = function() { // mandatory var to_update = false; if(this.df.reqd && this.get_value && is_null(this.get_value())) to_update = true; if(!to_update && this.df.has_error) this.df.has_error = false; if(this.label_icon) this.label_icon.css("display", (to_update ? "inline-block" : "none")); $(this.txt ? this.txt : this.input).toggleClass('field-to-update', to_update); $(this.txt ? this.txt : this.input).toggleClass('field-has-error', this.df.has_error ? true : false); } // Set / display values // -------------------------------------------------------------------------------------------- Field.prototype.set = function(val) { // not in form if(this.not_in_form) return; if((!this.docname) && this.grid) { this.docname = this.grid.add_newrow(); // new row } if(this.validate) val = this.validate(val); cur_frm.set_value_in_locals(this.doctype, this.docname, this.df.fieldname, val); this.value = val; // for return } Field.prototype.set_input = function(val) { this.value = val; if(this.input&&this.input.set_input) { if(val==null)this.input.set_input(''); else this.input.set_input(val); // in widget } var disp_val = val; if(val==null) disp_val = ''; this.set_disp(disp_val); // text } Field.prototype.run_trigger = function() { // update mandatory icon this.refresh_label_icon(); if(this.not_in_form) { return; } if(cur_frm.cscript[this.df.fieldname]) cur_frm.runclientscript(this.df.fieldname, this.doctype, this.docname); cur_frm.refresh_dependency(); } Field.prototype.set_disp_html = function(t) { if(this.disp_area){ $(this.disp_area).addClass('disp_area'); this.disp_area.innerHTML = (t==null ? '' : t); if(!t) $(this.disp_area).addClass('disp_area_no_val'); } } Field.prototype.set_disp = function(val) { this.set_disp_html(val); } // Show in GRID // -------------------------------------------------------------------------------------------- // for grids (activate against a particular record in the table Field.prototype.activate = function(docname) { this.docname = docname; this.refresh(); if(this.input) { var v = _f.get_value(this.doctype, this.docname, this.df.fieldname); this.last_value=v; // set input value if(this.input.onchange && this.input.get_value && this.input.get_value() !=v) { if(this.validate) this.input.set_value(this.validate(v)); else this.input.set_value((v==null)?'':v); if(this.format_input) this.format_input(); } if(this.input.focus){ try{this.input.focus();} catch(e){} // IE Fix - Unexpected call??? } } if(this.txt) { try{this.txt.focus();} catch(e){} // IE Fix - Unexpected call??? this.txt.field_object = this; } } // ====================================================================================== function DataField() { } DataField.prototype = new Field(); DataField.prototype.make_input = function() { var me = this; this.input = $a_input(this.input_area, this.df.fieldtype=='Password' ? 'password' : 'text'); this.get_value= function() { var v = this.input.value; if(this.validate) v = this.validate(v); return v; } this.input.name = this.df.fieldname; $(this.input).change(function() { //me.set_value(me.get_value && me.get_value() || $(this.input).val()); // fix: allow 0 as value me.set_value(me.get_value ? me.get_value() : $(this.input).val()); }); this.set_value = function(val) { if(!me.last_value)me.last_value=''; if(me.validate) { val = me.validate(val); me.input.value = val==undefined ? '' : val; } me.set(val); if(me.format_input) me.format_input(); if(in_list(['Currency','Float','Int'], me.df.fieldtype)) { if(flt(me.last_value)==flt(val)) { me.last_value = val; return; // do not run trigger } } me.last_value = val; me.run_trigger(); } this.input.set_input = function(val) { if(val==null)val=''; me.input.value = val; if(me.format_input)me.format_input(); } } DataField.prototype.validate = function(v) { if(this.df.options == 'Phone') { if(v+''=='')return ''; v1 = '' // phone may start with + and must only have numbers later, '-' and ' ' are stripped v = v.replace(/ /g, '').replace(/-/g, '').replace(/\(/g, '').replace(/\)/g, ''); // allow initial +,0,00 if(v && v.substr(0,1)=='+') { v1 = '+'; v = v.substr(1); } if(v && v.substr(0,2)=='00') { v1 += '00'; v = v.substr(2); } if(v && v.substr(0,1)=='0') { v1 += '0'; v = v.substr(1); } v1 += cint(v) + ''; return v1; } else if(this.df.options == 'Email') { if(v+''=='')return ''; if(!validate_email(v)) { msgprint(this.df.label + ': ' + v + ' is not a valid email id'); return ''; } else return v; } else { return v; } } // ====================================================================================== function ReadOnlyField() { } ReadOnlyField.prototype = new Field(); // ====================================================================================== function HTMLField() { } HTMLField.prototype = new Field(); HTMLField.prototype.with_label = 0; HTMLField.prototype.set_disp = function(val) { if(this.disp_area) this.disp_area.innerHTML = val; } HTMLField.prototype.set_input = function(val) { if(val) this.set_disp(val); } HTMLField.prototype.onrefresh = function() { if(this.df.options) this.set_disp(this.df.options); } // ====================================================================================== var datepicker_active = 0; function DateField() { } DateField.prototype = new Field(); DateField.prototype.make_input = function() { var me = this; this.user_fmt = sys_defaults.date_format; if(!this.user_fmt)this.user_fmt = 'dd-mm-yy'; this.input = $("").appendTo(this.input_area).get(0); $(this.input).datepicker({ dateFormat: me.user_fmt.replace('yyyy','yy'), altFormat:'yy-mm-dd', changeYear: true, beforeShow: function(input, inst) { datepicker_active = 1 }, onClose: function(dateText, inst) { datepicker_active = 0; if(_f.cur_grid_cell) _f.cur_grid_cell.grid.cell_deselect(); } }); var me = this; me.input.onchange = function() { // input as dd-mm-yyyy if(this.value==null)this.value=''; if(!this.not_in_form) me.set(dateutil.user_to_str(me.input.value)); me.run_trigger(); } me.input.set_input = function(val) { if(val==null)val=''; else val=dateutil.str_to_user(val); me.input.value = val; } me.get_value = function() { if(me.input.value) return dateutil.user_to_str(me.input.value); } } DateField.prototype.set_disp = function(val) { var v = dateutil.str_to_user(val); if(v==null)v = ''; this.set_disp_html(v); } DateField.prototype.validate = function(v) { if(!v) return; var me = this; this.clear = function() { msgprint ("Date must be in format " + this.user_fmt); me.input.set_input(''); return ''; } var t = $.map(v.split('-'), function(part) { return cint(part) ? part : null; }); if(t.length!=3) { return this.clear(); } else if(cint(t[1])>12 || cint(t[1])<1) { return this.clear(); } else if(cint(t[2])>31 || cint(t[2])<1) { return this.clear(); } else if(String(cint(t[0])).length!=4) { return this.clear(); } // 4 char for year return v; }; // ====================================================================================== // reference when a new record is created via link function LinkField() { } LinkField.prototype = new Field(); LinkField.prototype.make_input = function() { var me = this; if(me.df.no_buttons) { this.txt = $("") .appendTo(this.input_area).get(0); this.input = this.txt; } else { me.input = me.input_area; $(me.input_area).addClass("input-append link-field"); me.txt = $('') .css({"width": me.in_filter ? "100px" : (me.in_grid ? "35%" : "60%")}) .appendTo(me.input_area).get(0); me.btn = $('').appendTo(me.input_area).get(0); me.btn1 = $('').appendTo(me.input_area).get(0); me.btn2 = $('').appendTo(me.input_area).get(0); me.txt.name = me.df.fieldname; me.setdisabled = function(tf) { me.txt.disabled = tf; } // setup buttons me.setup_buttons(); } me.onrefresh = function() { var can_create = in_list(wn.boot.profile.can_create, me.df.options); var can_read = in_list(wn.boot.profile.can_read, me.df.options); if(!can_create) $(this.btn2).remove(); if(!can_read) $(this.btn1).remove(); } me.onrefresh(); me.txt.field_object = this; // set onchange triggers me.input.set_input = function(val) { if(val==undefined)val=''; me.txt.value = val; } me.get_value = function() { return me.txt.value; } $(me.txt).autocomplete({ source: function(request, response) { wn.call({ method:'webnotes.widgets.search.search_link', args: { 'txt': request.term, 'dt': me.df.options, 'query': me.get_custom_query() }, callback: function(r) { response(r.results); }, }); }, select: function(event, ui) { me.set_input_value(ui.item.value); } }).data('autocomplete')._renderItem = function(ul, item) { return $('
  • ') .data('item.autocomplete', item) .append(repl('%(label)s
    \ %(info)s
    ', item)) .appendTo(ul); }; $(this.txt).change(function() { var val = $(this).val();//me.get_value(); me.set_input_value_executed = false; if(!val) { if(selector && selector.display) return; me.set_input_value(''); } else { // SetTimeout hack! if in put is set via autocomplete, do not validate twice setTimeout(function() { if (!me.set_input_value_executed) { me.set_input_value(val); } }, 1000); } }) } LinkField.prototype.get_custom_query = function() { this.set_get_query(); if(this.get_query) { if(cur_frm) var doc = locals[cur_frm.doctype][cur_frm.docname]; return this.get_query(doc, this.doctype, this.docname); } } LinkField.prototype.setup_buttons = function() { var me = this; // magnifier - search me.btn.onclick = function() { selector.set(me, me.df.options, me.df.label); selector.show(me.txt); } // open if(me.btn1)me.btn1.onclick = function() { if(me.txt.value && me.df.options) { loaddoc(me.df.options, me.txt.value); } } // add button - for inline creation of records me.can_create = 0; if((!me.not_in_form) && in_list(profile.can_create, me.df.options)) { me.can_create = 1; me.btn2.onclick = function() { var on_save_callback = function(new_rec) { if(new_rec) { var d = _f.calling_doc_stack.pop(); // patch for composites locals[d[0]][d[1]][me.df.fieldname] = new_rec; me.refresh(); if(me.grid)me.grid.refresh(); // call script me.run_trigger(); } } _f.calling_doc_stack.push([me.doctype, me.docname]); new_doc(me.df.options); } } else { $(me.btn2).remove(); } } LinkField.prototype.set_input_value = function(val) { var me = this; // SetTimeout hack! if in put is set via autocomplete, do not validate twice me.set_input_value_executed = true; var from_selector = false; if(selector && selector.display) from_selector = true; // refresh mandatory style me.refresh_label_icon(); // not in form, do nothing if(me.not_in_form) { $(this.txt).val(val); return; } // same value, do nothing if(cur_frm) { if(val == locals[me.doctype][me.docname][me.df.fieldname]) { //me.set(val); // one more time, grid bug? me.run_trigger(); // wanted - called as refresh? return; } } // set in locals me.set(val); // deselect cell if in grid if(_f.cur_grid_cell) _f.cur_grid_cell.grid.cell_deselect(); // run trigger if value is cleared if(locals[me.doctype][me.docname][me.df.fieldname] && !val) { me.run_trigger(); return; } // validate only if val is not empty if (val) { me.validate_link(val, from_selector); } } LinkField.prototype.validate_link = function(val, from_selector) { // validate the value just entered var me = this; if(this.df.options=="[Select]") { $(me.txt).val(val); me.run_trigger(); return; } var fetch = ''; if(cur_frm.fetch_dict[me.df.fieldname]) fetch = cur_frm.fetch_dict[me.df.fieldname].columns.join(', '); $c('webnotes.widgets.form.utils.validate_link', { 'value':val, 'options':me.df.options, 'fetch': fetch }, function(r,rt) { if(r.message=='Ok') { // set fetch values if($(me.txt).val()!=val) { if((me.grid && !from_selector) || (!me.grid)) { $(me.txt).val(val); } } if(r.fetch_values) me.set_fetch_values(r.fetch_values); me.run_trigger(); } else { var astr = ''; if(in_list(profile.can_create, me.df.options)) astr = repl('

    Click here to create a new %(dtl)s', {dt:me.df.options, dtl:wn._(me.df.options)}) msgprint(repl('error:%(val)s is not a valid %(dt)s.

    You must first create a new %(dt)s %(val)s and then select its value. To find an existing %(dt)s, click on the magnifying glass next to the field.%(add)s', {val:me.txt.value, dt:wn._(me.df.options), add:astr})); me.txt.value = ''; me.set(''); } } ); } LinkField.prototype.set_fetch_values = function(fetch_values) { var fl = cur_frm.fetch_dict[this.df.fieldname].fields; var changed_fields = []; for(var i=0; i< fl.length; i++) { if(locals[this.doctype][this.docname][fl[i]]!=fetch_values[i]) { locals[this.doctype][this.docname][fl[i]] = fetch_values[i]; if(!this.grid) { refresh_field(fl[i]); // call trigger on the target field changed_fields.push(fl[i]); } } } // run triggers for(i=0; i"+val+""; this.set_disp_html(t); } // ====================================================================================== function IntField() { } IntField.prototype = new DataField(); IntField.prototype.validate = function(v) { if(isNaN(parseInt(v)))return null; return cint(v); }; IntField.prototype.format_input = function() { if(this.input.value==null) this.input.value=''; } // ====================================================================================== function FloatField() { } FloatField.prototype = new DataField(); FloatField.prototype.validate = function(v) { var v= parseFloat(v); if(isNaN(v)) return null; return v; }; FloatField.prototype.format_input = function() { if(this.input.value==null) this.input.value=''; } FloatField.prototype.onmake_input = function() { if(!this.input) return; this.input.onfocus = function() { this.select(); } } // ====================================================================================== function CurrencyField() { } CurrencyField.prototype = new FloatField(); CurrencyField.prototype.format_input = function() { var v = fmt_money(this.input.value); if(this.not_in_form) { if(!flt(this.input.value)) v = ''; // blank in filter } this.input.value = v; } CurrencyField.prototype.validate = function(v) { if(v==null || v=='') return 0; return flt(v,2); } CurrencyField.prototype.set_disp = function(val) { var v = fmt_money(val); this.set_disp_html(v); } // ====================================================================================== function CheckField() { } CheckField.prototype = new Field(); CheckField.prototype.validate = function(v) { var v= parseInt(v); if(isNaN(v))return 0; return v; }; CheckField.prototype.onmake = function() { this.checkimg = $("").appendTo(this.disp_area); } CheckField.prototype.make_input = function() { var me = this; this.input = $a_input(this.input_area,'checkbox'); $y(this.input, {width:"16px", border:'0px', marginTop:'-2px'}); // no specs for checkbox $(this.input).click(function() { me.set(this.checked?1:0); me.run_trigger(); }) this.input.set_input = function(v) { v = parseInt(v); if(isNaN(v)) v = 0; if(v) me.input.checked = true; else me.input.checked=false; } this.get_value= function() { return this.input.checked?1:0; } } CheckField.prototype.set_disp = function(val) { this.checkimg.toggle(val); } // ====================================================================================== function TextField() { } TextField.prototype = new Field(); TextField.prototype.set_disp = function(val) { this.disp_area.innerHTML = replace_newlines(val); } TextField.prototype.make_input = function() { var me = this; if(this.in_grid) return; // do nothing, text dialog will take over this.input = $a(this.input_area, 'textarea'); if(this.df.fieldtype=='Small Text') { $(this.input).css({height: "80px"}); } else if(this.df.width) { $(this.input).css({height: cint(this.df.width) + "px"}); } else { $(this.input).css({height: "160px"}); } this.input.set_input = function(v) { me.input.value = v; } this.input.onchange = function() { me.set(me.input.value); me.run_trigger(); } this.get_value= function() { return this.input.value; } } // text dialog var text_dialog; function make_text_dialog() { var d = new Dialog(520,410,'Edit Text'); d.make_body([ ['Text', 'Enter Text'], ['HTML', 'Description'], ['Button', 'Update'] ]); d.widgets['Update'].onclick = function() { var t = this.dialog; t.field.set(t.widgets['Enter Text'].value); t.hide(); } d.onshow = function() { this.widgets['Enter Text'].style.height = '300px'; var v = _f.get_value(this.field.doctype,this.field.docname,this.field.df.fieldname); this.widgets['Enter Text'].value = v==null?'':v; this.widgets['Enter Text'].focus(); this.widgets['Description'].innerHTML = '' if(this.field.df.description) $a(this.widgets['Description'], 'div', 'help small', '', this.field.df.description); } d.onhide = function() { if(_f.cur_grid_cell) _f.cur_grid_cell.grid.cell_deselect(); } text_dialog = d; } TextField.prototype.table_refresh = function() { if(!this.text_dialog) make_text_dialog(); text_dialog.set_title('Enter text for "'+ this.df.label +'"'); text_dialog.field = this; text_dialog.show(); } // Select // ====================================================================================== function SelectField() { } SelectField.prototype = new Field(); SelectField.prototype.make_input = function() { var me = this; var opt=[]; if(this.in_filter && (!this.df.single_select)) { // multiple select this.input = $a(this.input_area, 'select'); this.input.multiple = true; this.input.style.height = '4em'; this.input.lab = $a(this.input_area, 'div', {fontSize:'9px',color:'#999'}); this.input.lab.innerHTML = '(Use Ctrl+Click to select multiple or de-select)' } else { // Single select this.input = $a(this.input_area, 'select'); this.input.onchange = function() { if(me.validate) me.validate(); me.set(sel_val(this)); me.run_trigger(); } if(this.df.options == 'attach_files:') { this.file_attach = true; $(this.input).css({"width": "70%"}); $("") .click(function() { cur_frm.attachments.new_attachment(); }) .appendTo(this.input_area); } } // set as single (to be called from report builder) this.set_as_single = function() { var i = this.input; i.multiple = false; i.style.height = null; if(i.lab)$dh(i.lab) } // refresh options list this.refresh_options = function(options) { if(options) me.df.options = options; if(this.file_attach) this.set_attach_options(); if(typeof me.df.options=="object") me.options_list = me.df.options || [""]; else me.options_list = me.df.options?me.df.options.split('\n'):['']; // add options if(me.in_filter && me.options_list[0]!='') { me.options_list = add_lists([''], me.options_list); } $(this.input).empty().add_options(me.options_list); } // refresh options this.onrefresh = function() { this.refresh_options(); if(this.not_in_form) { this.input.value = ''; return; } if(_f.get_value) var v = _f.get_value(this.doctype,this.docname,this.df.fieldname); else { if(this.options_list && this.options_list.length) var v = this.options_list[0]; else var v = null; } this.input.set_input(v); } this.input.set_input=function(v) { if(!v) { if(!me.input.multiple) { if(me.docname) { // if called from onload without docname being set on fields if(me.options_list && me.options_list.length) { me.set(me.options_list[0]); me.input.value = me.options_list[0]; } else { me.input.value = ''; } } } } else { if(me.options_list) { if(me.input.multiple) { for(var i=0; i