/** * yvan.yvsearch.js * @author luoyifan * 2019-07-14 11:14:00 */ 'use strict'; (function ($) { function init(target, context) { var state = $.data(target, 'yvsearch'); var option = state.options; var $dom = $(target); option = $.extend({}, option); delete option.name; delete option.widget; delete option.xtype; delete option.required; var jqxOpt = { width: option.width, height: option.height, }; $dom.jqxInput(jqxOpt); state.realValue = option.value; $dom.addClass('yvgrid-searchbox'); $dom.on('click', function (event) { var $me = $(this); var width = $me.outerWidth(); if (width - event.offsetX < 25) { //查询按钮 $me.yvsearch('open', undefined, event); } else if (width - event.offsetX < 50) { //清空按钮 $me.yvsearch('clear', event); } }); $dom.on('mousemove', function (event) { var $me = $(this); var width = $me.outerWidth(); if (width - event.offsetX < 20) { //查询按钮 $me.removeClass('yvgrid-searchbox-hilight1'); $me.addClass('yvgrid-searchbox-hilight2'); } else if (width - event.offsetX < 44) { //清空按钮 $me.removeClass('yvgrid-searchbox-hilight2'); $me.addClass('yvgrid-searchbox-hilight1'); } else { $me.removeClass('yvgrid-searchbox-hilight1'); $me.removeClass('yvgrid-searchbox-hilight2'); } }); $dom.on('mouseout', function (event) { var $me = $(this); $me.removeClass('yvgrid-searchbox-hilight1'); $me.removeClass('yvgrid-searchbox-hilight2'); }); $dom.on('keydown', function (event) { if (event.keyCode === 13) { $(this).yvsearch('open', undefined, event); } }); $dom.on('blur', function (event) { var state = $.data(this, 'yvsearch'); //离开焦点时,吧值还原 if (!state.isWidgetOpen) { $(target).jqxInput('val', state.realValue || ''); } }); } $.fn.yvsearch = function (options, param) { if (typeof options == 'string') { var method = $.fn.yvsearch.methods[options]; if (method) { var args = [this]; for (var i = 1; i < arguments.length; i++) { args.push(arguments[i]); } return method.apply(this, args); } else { console.error('not found method:' + options); } } options = options || {}; return this.each(function () { var state = $.data(this, 'yvsearch'); if (state) { $.extend(state.options, options); } else { $.data(this, 'yvsearch', { options: $.extend({}, $.fn.yvsearch.defaults, options) }); } init(this); }); }; $.fn.yvsearch.methods = { getQuery: function ($dom) { return $dom.jqxInput('val'); }, getValue: function ($dom) { var state = $.data($dom[0], 'yvsearch'); if (!state || !state.realValue) { return ''; } return state.realValue; }, setValue: function (jq, value) { return jq.each(function () { var state = $.data(this, 'yvsearch'); state.realValue = value; return $(this).jqxInput('val', value); }); }, focus: function ($dom) { setTimeout(function () { $dom.focus(); }, 200); }, confirm: function (jq, row) { return jq.each(function () { var $me = $(this); var state = $.data(this, 'yvsearch'); var option = state.options; if ($.type(option.onChange) === 'function') { option.onChange.call(this, row); } option = $.extend({}, option.widget); $me.yvsearch('close'); var successOpt = option['success'] || option.bind; if (!successOpt) { //没有配置,只写自己 if (option.name && row.hasOwnProperty(option.name)) { $me.yvsearch('setValue', row[option.name]); return true; } } if ($.type(successOpt) === "function") { //是函数,调函数 return successOpt.call(this, row); } //字符串或数组,直接调用数组 if ($.type(successOpt) === "string") { successOpt = [successOpt]; } var obj = {}; if ($.type(successOpt) === 'array') { //数组,根据名字逐个写入 $.each(successOpt, function (index, name) { obj[name] = row[name]; }); } else if ($.type(successOpt) === 'object') { //对象,根据映射关系写入 var vs = successOpt; for (var prop in vs) { if (!vs.hasOwnProperty(prop)) continue; if (!row.hasOwnProperty(vs[prop])) { console.error('弹出框没有属性' + vs[prop], row); continue; } obj[prop] = row[vs[prop]]; } } $me.up('yvgrid').yvgrid('setEditRow', obj, this); $me.yvsearch('saveValue'); if ($.type(option['afterConfirm']) === 'function') { option['afterConfirm'](obj); } }); }, restore: function (jq) { return jq.each(function () { var state = $.data(this, 'yvsearch'); $(this).jqxInput('val', state.realValue || ''); }); }, clear: function (jq) { return jq.each(function () { var state = $.data(this, 'yvsearch'); var option = state.options; if ($.type(option.onChange) === 'function') { option.onChange.call(this, {}); } var widget = $.extend({}, option.widget); $(this).yvsearch('setValue', ''); var obj = {}; if ($.type(widget.clear) === "function") { var ret = widget.clear(); if (!ret) { //没有返回任何数据, 就是纯调用 return; } widget.clear = ret; } if ($.type(widget.clear) === "object") { //清空对象就是目标本身 obj = $.extend({}, widget.clear); } else if ($.type(widget.clear) === "array") { //按数组内容清空 $.each(widget.bind, function (index, name) { obj[name] = ''; }); } else if ($.type(widget.bind) === 'object') { //bind 对象,按名字清空 for (var prop in widget.bind) { obj[prop] = ''; } } else if ($.type(widget.bind) === 'array') { //按数组内容清空 $.each(widget.bind, function (index, name) { obj[name] = ''; }); } //目前 yvsearch 只会出现在 yvgrid 中,只处理 yvgrid 的清空 $(this).up('yvgrid').yvgrid('setEditRow', obj, this); }); }, close: function (jq) { return jq.each(function () { var state = $.data(this, 'yvsearch'); if (state.dlgId) { $('.dlg_' + state.dlgId).window('close'); } }); }, }; $.fn.power.defaults.xtype.yvsearch = function ($targetDOM, option, context) { if (option.name) { var $dom = $("").appendTo($targetDOM); } else { $dom = $("").appendTo($targetDOM); } return $dom.yvsearch(option, context); }; $.fn.yvsearch.defaults = {}; })(jQuery);