/** * jQuery EasyUI 1.3.6 * Copyright (c) 2009-2014 www.jeasyui.com. All rights reserved. * * Licensed under the GPL or commercial licenses * To use it on other terms please contact author: info@jeasyui.com * http://www.gnu.org/licenses/gpl.txt * http://www.jeasyui.com/license_commercial.php * * jQuery EasyUI comboselector Plugin Extensions 1.0 beta * jQuery EasyUI comboselector 插件扩展 * jquery.comboselector.js * 二次开发 流云 * 最近更新:2014-05-05 * * 依赖项: * 1、jquery.jdirk.js v1.0 beta late * 2、jeasyui.extensions.js v1.0 beta late * 3、jeasyui.extensions.combo.js v1.0 beta late * 4、jeasyui.extensions.menu.js v1.0 beta late * 5、jeasyui.extensions.panel.js v1.0 beta late * 6、jeasyui.extensions.window.js v1.0 beta late * 7、jeasyui.extensions.dialog.js v1.0 beta late * 8、jeasyui.extensions.datagrid.js v1.0 beta late * 9、jeasyui.extensions.gridselector.js v1.0 beta late * * Copyright (c) 2013-2014 ChenJianwei personal All rights reserved. * http://www.chenjianwei.org */ (function ($, undefined) { function create(target) { var state = $.data(target, "comboselector"), opts = state.options, idField = state.idField = opts.valueField || opts.idField, valueField = state.valueField = opts.valueField || idField, t = $(target).addClass("comboselector-f").combo($.extend({}, opts, { onShowPanel: function () { t.combo("panel").hide(); var grid = opts.selectorTypes[opts.selector]; state.dialog = grid.method($.extend({}, opts, { width: $.isNumeric(opts.panelWidth) ? opts.panelWidth : grid.width, height: $.isNumeric(opts.panelHeight) ? opts.panelHeight : grid.height, selected: t.combo(opts.multiple ? "getValues" : "getValue"), singleSelect: opts.multiple ? false : true, idField: idField, url: opts.url, data: opts.data, //data: opts.url ? undefined : state.data, buttons: [ { index: 101.5, text: "清除", iconCls: "icon-standard-cancel", handler: function (d) { t.combo("clear"); d.close(); } } ], onEnter: function (val) { if (val) { var isArray = $.util.likeArrayNotString(val), values = isArray ? $.array.map(val, function (value) { return value[idField]; }) : [val[idField]]; setValues(target, values); } else { t.combo("clear"); } }, onClose: function () { var state = $.data(target, "combo"); if (state && state.options) { t.combo("hidePanel"); } }, onLoadSuccess: function (data) { state.data = data ? ($.util.likeArrayNotString(data) ? data : data.rows) : []; if ($.isFunction(opts.onLoadSuccess)) { opts.onLoadSuccess.apply(this, arguments); } }, onLoadError: function () { $.fn.datagrid.defaults.onLoadError.apply(this, arguments); if ($.isFunction(opts.onLoadError)) { opts.onLoadError.apply(this, arguments); } }, onBeforeLoad: function (param) { $.fn.datagrid.defaults.onBeforeLoad.apply(this, arguments); if ($.isFunction(opts.onBeforeLoad)) { opts.onBeforeLoad.apply(this, arguments); } } })); var dopts = state.dialog.dialog("options"); if ((!$.util.isUtilTop && !dopts.topMost) || $.util.isUtilTop) { var textbox = t.combo("textbox"), offset = textbox.offset(); state.dialog.dialog("move", $.extend(offset, { top: offset.top + textbox.outerHeight() + 2 })) } if ($.isFunction(opts.onShowPanel)) { opts.onShowPanel.apply(this, arguments); } }, onHidePanel: function () { if (state.dialog) { var dia = state.dialog, dopts = dia.dialog("options"); state.dialog = null; if (!dopts.closed) { dia.dialog("close"); } } if ($.isFunction(opts.onHidePanel)) { opts.onHidePanel.apply(this, arguments); } }, onDestroy: function () { if (state.dialog) { state.dialog.dialog("destroy"); state.dialog = null; } if ($.isFunction(opts.onDestroy)) { opts.onDestroy.apply(this, arguments); } }, onChange: function (newValue, oldValue) { if ($.isFunction(opts.onChange)) { opts.onChange.apply(this, arguments); } } })); state.data = opts.data ? opts.data : []; opts.originalValue = opts.value; opts.originalText = opts.text; if (opts.lazyLoad) { initValue(); } else { $[opts.method](opts.url, $.extend({}, opts.queryParams || {}, { page: opts.pageNumber || $.fn.datagrid.defaults.pageNumber, rows: opts.rows || $.fn.datagrid.defaults.pageSize }), function (data) { state.data = data ? ($.util.likeArrayNotString(data) ? data : data.rows) : []; initValue(); }); } t.combo("validate"); function initValue() { if (state.data && state.data.length) { if (opts.value) { setValues(target, $.util.likeArrayNotString(opts.value) ? opts.value : [opts.value]); } } else { if (opts.text) { setText(target, opts.text); } else { if (opts.value) { setValues(target, $.util.likeArrayNotString(opts.value) ? opts.value : [opts.value]); } } } }; }; function setValues(target, values) { var t = $(target), state = $.data(target, "comboselector"), opts = state.options, array = $.util.likeArrayNotString(values) ? values : [values], getText = function (value) { var row = $.array.first(state.data, function (val) { return val[state.idField] == value; }); return row ? row[opts.textField] : null; }, hasTextField = $.util.likeArrayNotString(state.data) && opts.textField, text = hasTextField ? $.array.map(array, function (val) { return getText(val); }).join(opts.separator) : $.array.join(array, opts.separator); t.combo("setValues", array).combo("setText", text || array.join(opts.separator)); }; function setText(target, text) { $(target).combo("setText", text).comboselector("options").text = text; }; function reset(target) { var t = $(target), opts = t.comboselector("options"); t.comboselector("setValue", opts.originalValue).comboselector("setText", opts.originalText); }; function loadData(target, data) { var t = $(target), state = $.data(target, "comboselector"); if (state.dialog) { state.dialog.find(".grid-selector").datagrid("loadData", data); } else { state.data = data; } }; var selectorTypes = { grid: { method: $.easyui.showGridSelector, width: 580, height: 360 }, dblgrid: { method: $.easyui.showDblGridSelector, width: 900, height: 580 }, tree: { method: $.easyui.showTreeSelector, width: 900, height: 580 }, treegrid: { method: $.easyui.showTreeGridSelector, width: 580, height: 360 }, treewithgrid: { method: $.easyui.showTreeWithGridSelector, width: 580, height: 360 } }; $.fn.comboselector = function (options, param) { if (typeof options == "string") { var method = $.fn.comboselector.methods[options]; if (method) { return method(this, param); } else { return this.combo(options, param); } } options = options || {}; return this.each(function () { var state = $.data(this, "comboselector"); if (state) { $.extend(state.options, options); } else { $.data(this, "comboselector", { options: $.extend({}, $.fn.comboselector.defaults, $.fn.comboselector.parseOptions(this), options) }); create(this); } }); }; $.fn.comboselector.parseOptions = function (target) { return $.extend({}, $.fn.combo.parseOptions(target), $.fn.datagrid.parseOptions(target), $.parser.parseOptions(target, ["text", "selector", "iconCls", { extToolbar: "boolean" }]) ); }; $.fn.comboselector.methods = { options: function (jq) { var opts = jq.combo("options"), copts = $.data(jq[0], 'comboselector').options; return $.extend(copts, { originalValue: opts.originalValue, originalText: opts.originalText, disabled: opts.disabled, readonly: opts.readonly }); }, setValues: function (jq, values) { return jq.each(function () { setValues(this, values); }); }, setValue: function (jq, value) { return jq.each(function () { setValues(this, [value]); }); }, setText: function (jq, text) { return jq.each(function () { setText(this, text); }); }, loadData: function (jq, data) { return jq.each(function () { loadData(this, data); }); }, getData: function (jq) { return $.data(jq[0], "comboselector").data; }, reset: function (jq) { return jq.each(function () { reset(this); }); } }; $.fn.comboselector.defaults = $.extend({}, $.fn.combo.defaults, { // 表示弹出的表格选择框的类型;这是一个 String 类型值,可选的值有: // grid : // dblgrid : // tree : // treegrid: // treewithgrid: selector: "grid", text: null, extToolbar: false, panelWidth: "auto", panelHeight: "auto", autoShowPanel: false, iconCls: "icon-standard-application-form-magnify", // 表示 grid-selector 中的数据是否为懒加载; // 如果该值设置为 true,则是在鼠标点击打开 grid-selector 后,表格中的数据才实际被加载;否则将是在控件被初始化时即刻加载数据; // boolean 类型值,默认为 true。 lazyLoad: true, url: null, data: null, selectorTypes: selectorTypes, onLoadSuccess: function (data) { }, onLoadError: function () { }, onBeforeLoad: function (param) { } }); if ($.fn.datagrid) { $.extend($.fn.datagrid.defaults.editors, { comboselector: { init: function (container, options) { var box = $("").appendTo(container).comboselector(options); box.comboselector("textbox").addClass("datagrid-editable-input"); return box; }, destroy: function (target) { $(target).comboselector("destroy"); }, getValue: function (target) { var t = $(target), opts = t.comboselector("options"); return t.comboselector(opts.multiple ? "getValues" : "getValue"); }, setValue: function (target, value) { var t = $(target), opts = t.comboselector("options"); if (value) { if (opts.multiple) { if ($.util.likeArrayNotString(value)) { t.comboselector("setValues", value); } else if (typeof value == "string") { t.comboselector("setValues", value.split(opts.separator)); } else { t.comboselector("setValue", value); } } else { t.comboselector("setValue", value); } } else { t.comboselector("clear"); } }, resize: function (target, width) { $(target).comboselector("resize", width); }, setFocus: function (target) { $(target).comboselector("textbox").focus(); } } }); } $.parser.plugins.push("comboselector"); if ($.fn.form && $.isArray($.fn.form.comboList)) { $.fn.form.comboList.push("comboselector"); //$.array.insert($.fn.form.comboList, 0, "comboselector"); } })(jQuery);