667 lines
22 KiB
JavaScript
667 lines
22 KiB
JavaScript
/**
|
||
* jQuery ligerUI 1.3.3
|
||
*
|
||
* http://ligerui.com
|
||
*
|
||
* Author daomi 2015 [ gd_star@163.com ]
|
||
*
|
||
*/
|
||
(function ($)
|
||
{
|
||
|
||
$.fn.ligerPopupEdit = function (options)
|
||
{
|
||
return $.ligerui.run.call(this, "ligerPopupEdit", arguments);
|
||
};
|
||
|
||
$.fn.ligerGetPopupEditManager = function ()
|
||
{
|
||
return $.ligerui.run.call(this, "ligerGetPopupEditManager", arguments);
|
||
};
|
||
|
||
$.ligerDefaults.PopupEdit = {
|
||
valueFieldID: null, //生成的value input:hidden 字段名
|
||
css: null, //附加css
|
||
onButtonClick: null, //利用这个参数来调用其他函数,比如打开一个新窗口来选择值
|
||
nullText: null, //不能为空时的提示
|
||
disabled: false, //是否无效
|
||
method: 'post', //获取数据http方式
|
||
async: true,
|
||
cancelable: true,
|
||
width: 200,
|
||
heigth: null,
|
||
render: null, //显示函数
|
||
split: ';',
|
||
data: [],
|
||
grid: null, //在可查询、可分页列表的弹出框 中选择值
|
||
condition: null, // 条件字段,比如 {fields:[{ name : 'Title' ,op : 'like', vt : 'string',type:'text' }]}
|
||
valueField: 'id', //值字段
|
||
textField: 'text', //显示字段
|
||
parms: null,
|
||
onSelect: null, //选择事件,可阻止
|
||
onSelected: null, //选择后事件
|
||
valueFieldCssClass: null,
|
||
searchClick: null //弹窗查询搜索按钮自定义函数
|
||
};
|
||
|
||
|
||
//扩展方法
|
||
$.ligerMethos.PopupEdit = $.ligerMethos.PopupEdit || {};
|
||
|
||
$.ligerui.controls.PopupEdit = function (element, options)
|
||
{
|
||
$.ligerui.controls.PopupEdit.base.constructor.call(this, element, options);
|
||
};
|
||
$.ligerui.controls.PopupEdit.ligerExtend($.ligerui.controls.Input, {
|
||
__getType: function ()
|
||
{
|
||
return 'PopupEdit';
|
||
},
|
||
_extendMethods: function ()
|
||
{
|
||
return $.ligerMethos.PopupEdit;
|
||
},
|
||
_init: function ()
|
||
{
|
||
$.ligerui.controls.PopupEdit.base._init.call(this);
|
||
},
|
||
_render: function ()
|
||
{
|
||
var g = this, p = this.options;
|
||
g.inputText = null;
|
||
//文本框初始化
|
||
if (this.element.tagName.toLowerCase() == "input")
|
||
{
|
||
this.element.readOnly = true;
|
||
g.inputText = $(this.element);
|
||
g.textFieldID = this.element.id;
|
||
}
|
||
if (g.inputText[0].name == undefined) g.inputText[0].name = g.textFieldID;
|
||
//隐藏域初始化
|
||
g.valueField = null;
|
||
if (p.valueFieldID)
|
||
{
|
||
g.valueField = $("#" + p.valueFieldID + ":input");
|
||
if (g.valueField.length == 0) g.valueField = $('<input type="hidden"/>');
|
||
if (g.valueField[0].name == undefined) g.valueField[0].id = g.valueField[0].name = p.valueFieldID;
|
||
}
|
||
else
|
||
{
|
||
g.valueField = $('<input type="hidden"/>');
|
||
g.valueField[0].id = g.valueField[0].name = g.textFieldID + "_val";
|
||
}
|
||
if (g.valueField[0].name == undefined) g.valueField[0].name = g.valueField[0].id;
|
||
if (p.valueFieldCssClass)
|
||
{
|
||
g.valueField.addClass(p.valueFieldCssClass);
|
||
}
|
||
//开关
|
||
g.link = $('<div class="l-trigger"><div class="l-trigger-icon"></div></div>');
|
||
//外层
|
||
g.wrapper = g.inputText.wrap('<div class="l-text l-text-popup"></div>').parent();
|
||
g.wrapper.append('<div class="l-text-l"></div><div class="l-text-r"></div>');
|
||
g.wrapper.append(g.link);
|
||
g.wrapper.append(g.valueField);
|
||
//修复popup控件没有data-ligerid的问题
|
||
g.valueField.attr("data-ligerid", g.id);
|
||
g.inputText.addClass("l-text-field");
|
||
//开关 事件
|
||
g.link.hover(function ()
|
||
{
|
||
if (p.disabled) return;
|
||
this.className = "l-trigger-hover";
|
||
}, function ()
|
||
{
|
||
if (p.disabled) return;
|
||
this.className = "l-trigger";
|
||
}).mousedown(function ()
|
||
{
|
||
if (p.disabled) return;
|
||
this.className = "l-trigger-pressed";
|
||
}).mouseup(function ()
|
||
{
|
||
if (p.disabled) return;
|
||
this.className = "l-trigger-hover";
|
||
}).click(function ()
|
||
{
|
||
if (p.disabled) return;
|
||
if (g.trigger('buttonClick') == false) return false;
|
||
});
|
||
g.inputText.click(function ()
|
||
{
|
||
if (p.disabled) return;
|
||
}).blur(function ()
|
||
{
|
||
if (p.disabled) return;
|
||
g.wrapper.removeClass("l-text-focus");
|
||
}).focus(function ()
|
||
{
|
||
if (p.disabled) return;
|
||
g.wrapper.addClass("l-text-focus");
|
||
});
|
||
g.wrapper.hover(function ()
|
||
{
|
||
if (p.disabled) return;
|
||
g.wrapper.addClass("l-text-over");
|
||
}, function ()
|
||
{
|
||
if (p.disabled) return;
|
||
g.wrapper.removeClass("l-text-over");
|
||
});
|
||
|
||
g.set(p);
|
||
g.setTextByVal(g.getValue());
|
||
//alert(g.getValue());
|
||
},
|
||
destroy: function ()
|
||
{
|
||
if (this.wrapper) this.wrapper.remove();
|
||
this.options = null;
|
||
$.ligerui.remove(this);
|
||
},
|
||
clear: function ()
|
||
{
|
||
var g = this, p = this.options;
|
||
g.inputText.val("");
|
||
g.valueField.val("");
|
||
},
|
||
_setCss: function (css)
|
||
{
|
||
if (css)
|
||
{
|
||
this.wrapper.addClass(css);
|
||
}
|
||
},
|
||
//取消选择
|
||
_setCancelable: function (value)
|
||
{
|
||
var g = this, p = this.options;
|
||
if (!value && g.unselect)
|
||
{
|
||
g.unselect.remove();
|
||
g.unselect = null;
|
||
}
|
||
if (!value && !g.unselect) return;
|
||
g.unselect = $('<div class="l-trigger l-trigger-cancel"><div class="l-trigger-icon"></div></div>').hide();
|
||
g.wrapper.hover(function ()
|
||
{
|
||
g.unselect.show();
|
||
}, function ()
|
||
{
|
||
g.unselect.hide();
|
||
})
|
||
if (!p.disabled && p.cancelable)
|
||
{
|
||
g.wrapper.append(g.unselect);
|
||
}
|
||
g.unselect.hover(function ()
|
||
{
|
||
this.className = "l-trigger-hover l-trigger-cancel";
|
||
}, function ()
|
||
{
|
||
this.className = "l-trigger l-trigger-cancel";
|
||
}).click(function ()
|
||
{
|
||
g.clear();
|
||
});
|
||
},
|
||
_setDisabled: function (value)
|
||
{
|
||
if (value)
|
||
{
|
||
this.wrapper.addClass('l-text-disabled');
|
||
} else
|
||
{
|
||
this.wrapper.removeClass('l-text-disabled');
|
||
}
|
||
},
|
||
_setWidth: function (value)
|
||
{
|
||
var g = this;
|
||
if (value > 20)
|
||
{
|
||
g.wrapper.css({ width: value });
|
||
g.inputText.css({ width: value - 20 });
|
||
}
|
||
},
|
||
_setHeight: function (value)
|
||
{
|
||
var g = this;
|
||
if (value > 10)
|
||
{
|
||
g.wrapper.height(value);
|
||
g.inputText.height(value - 2);
|
||
}
|
||
},
|
||
getData: function ()
|
||
{
|
||
var g = this, p = this.options;
|
||
var data = [];
|
||
var v = $(g.valueField).val(), t = $(g.inputText).val();
|
||
var values = v ? v.split(p.split) : null, texts = t ? t.split(p.split) : null;
|
||
$(values).each(function (i)
|
||
{
|
||
var o = {};
|
||
o[p.textField] = texts[i];
|
||
o[p.valueField] = values[i];
|
||
data.push(o);
|
||
});
|
||
return data;
|
||
},
|
||
_getText: function ()
|
||
{
|
||
return $(this.inputText).val();
|
||
},
|
||
_getValue: function ()
|
||
{
|
||
return $(this.valueField).val();
|
||
},
|
||
getValue: function ()
|
||
{
|
||
return this._getValue();
|
||
},
|
||
getText: function ()
|
||
{
|
||
return this._getText();
|
||
},
|
||
//设置值到 隐藏域
|
||
setValue: function (value, text)
|
||
{
|
||
if (value == '') return;
|
||
var g = this, p = this.options;
|
||
if (arguments.length >= 2)
|
||
{
|
||
g.setValue(value);
|
||
g.setText(text);
|
||
return;
|
||
}
|
||
g.valueField.val(value);
|
||
//g.setTextByVal(value);
|
||
},
|
||
//根据值设置文本 value:数值或文本
|
||
setTextByVal: function (value)
|
||
{
|
||
value = (typeof (value) != "string") ? value.toString : value;
|
||
if (value == '') return;
|
||
|
||
var g = this, text = [], p = this.options, gridData = [];
|
||
if (g.valueField.val() != value) g.valueField.val(value);
|
||
|
||
var gridparms = p.grid;
|
||
if ($.isFunction(gridparms)) gridparms = gridparms();
|
||
var gridOptions = $.extend({
|
||
parms: p.parms
|
||
}, gridparms);
|
||
|
||
if (p.data.length > 0)
|
||
{
|
||
gridData = p.data.Rows;
|
||
} else if (gridOptions.url)
|
||
{
|
||
g.loadServerData(gridOptions.url, value);
|
||
return;
|
||
} else
|
||
{
|
||
gridData = gridOptions.data.Rows;
|
||
}
|
||
|
||
|
||
var values = value.split(p.split);
|
||
|
||
$(gridData).each(function (i, rowdata)
|
||
{
|
||
if ($.inArray(rowdata[p.valueField], values) != -1)
|
||
{
|
||
text.push(rowdata[p.textField]);
|
||
}
|
||
});
|
||
text = text.join(p.split);
|
||
g.setText(text);
|
||
},
|
||
loadServerData: function (param, value)
|
||
{
|
||
var g = this, p = this.options, gdata = [];
|
||
if ($.isFunction(param)) param = param();
|
||
var ajaxOptions = {
|
||
type: p.method,
|
||
url: param,
|
||
async: p.async,
|
||
//data: [],
|
||
dataType: 'json',
|
||
success: function (data)
|
||
{
|
||
//g.trigger('success', [data, g]);
|
||
gridData = $.extend(true, {}, data);
|
||
p.data = gridData;
|
||
gridData = data.Rows;
|
||
var values = value.split(p.split);
|
||
var text = [];
|
||
|
||
$(gridData).each(function (i, rowdata)
|
||
{
|
||
if ($.inArray(rowdata[p.valueField], values) != -1)
|
||
{
|
||
text.push(rowdata[p.textField]);
|
||
}
|
||
});
|
||
text = text.join(p.split);
|
||
g.setText(text);
|
||
return;
|
||
},
|
||
error: function (XMLHttpRequest, textStatus, errorThrown)
|
||
{
|
||
return;
|
||
}
|
||
|
||
}
|
||
$.ajax(ajaxOptions);
|
||
|
||
},
|
||
//设置值到 文本框
|
||
setText: function (text)
|
||
{
|
||
var g = this, p = this.options;
|
||
if (p.render)
|
||
{
|
||
g.inputText.val(p.render(text));
|
||
}
|
||
else
|
||
{
|
||
g.inputText.val(text);
|
||
}
|
||
},
|
||
addValue: function (value, text)
|
||
{
|
||
var g = this, p = this.options;
|
||
if (!value) return;
|
||
var v = g.getValue(), t = g.getText();
|
||
if (!v)
|
||
{
|
||
g.setValue(value);
|
||
g.setText(text);
|
||
} else
|
||
{
|
||
var arrV = [], arrT = [], old = v.split(p.split), value = value.split(p.split), text = text.split(p.split);
|
||
for (var i = 0, l = value.length; i < l; i++)
|
||
{
|
||
if ($.inArray(value[i], old) == -1)
|
||
{
|
||
arrV.push(value[i]);
|
||
arrT.push(text[i]);
|
||
}
|
||
}
|
||
if (arrV.length)
|
||
{
|
||
g.setValue(v + p.split + arrV.join(p.split));
|
||
g.setText(t + p.split + arrT.join(p.split));
|
||
}
|
||
}
|
||
},
|
||
removeValue: function (value, text)
|
||
{
|
||
var g = this, p = this.options;
|
||
if (!value) return;
|
||
var v = g.getValue(), t = g.getText();
|
||
if (!v) return;
|
||
var oldV = v.split(p.split), oldT = t.split(p.split), value = value.split(p.split);
|
||
for (var i = 0, index = -1, l = value.length; i < l; i++)
|
||
{
|
||
if ((index = $.inArray(value[i], oldV)) != -1)
|
||
{
|
||
oldV.splice(index, 1);
|
||
oldT.splice(index, 1);
|
||
}
|
||
}
|
||
g.setValue(oldV.join(p.split));
|
||
g.setText(oldT.join(p.split));
|
||
},
|
||
_setGrid: function (value)
|
||
{
|
||
if (!value) return;
|
||
var g = this, p = this.options;
|
||
var gridOptions = $.extend({
|
||
parms: p.parms
|
||
}, p.grid);
|
||
|
||
this.bind('buttonClick', function ()
|
||
{
|
||
function getLastSelected()
|
||
{
|
||
try{
|
||
return g.getData();
|
||
} catch (e)
|
||
{
|
||
return null;
|
||
}
|
||
}
|
||
if (!g.popupFn)
|
||
{
|
||
var options = {
|
||
grid: gridOptions,
|
||
condition: p.condition,
|
||
valueField: p.valueField,
|
||
textField: p.textField,
|
||
split: p.split,
|
||
searchClick : p.searchClick,
|
||
lastSelected: getLastSelected(),
|
||
onSelect: function (e)
|
||
{
|
||
if (g.trigger('select', e) == false) return;
|
||
if (p.grid.checkbox)
|
||
{
|
||
g.addValue(e.value, e.text);
|
||
g.removeValue(e.remvoeValue, e.remvoeText);
|
||
} else
|
||
{
|
||
g.setValue(e.value);
|
||
g.setText(e.text);
|
||
}
|
||
g.trigger('selected', e);
|
||
},
|
||
selectInit: function (rowdata)
|
||
{
|
||
var value = g.getValue();
|
||
if (!value) return false;
|
||
if (!p.valueField || !rowdata[p.valueField]) return false;
|
||
return $.inArray(rowdata[p.valueField].toString(), value.split(p.split)) != -1;
|
||
}
|
||
};
|
||
g.popupFn = $.ligerui.getPopupFn(options, g);
|
||
}
|
||
g.popupFn();
|
||
});
|
||
}
|
||
});
|
||
|
||
|
||
|
||
//创建一个可查询、可分页列表的选取弹出框 需要dialog,grid,form等插件的支持
|
||
$.ligerui.getPopupFn = function (p,master)
|
||
{
|
||
p = $.extend({
|
||
title: '选择数据', //窗口标题
|
||
width: 700, //窗口宽度
|
||
height: 320, //列表高度
|
||
top: null,
|
||
left: null,
|
||
split: ';',
|
||
valueField: null, //接收表格的value字段名
|
||
textField: null, //接收表格的text字段名
|
||
grid: null, //表格的参数 同ligerGrid
|
||
condition: null, //搜索表单的参数 同ligerForm
|
||
onSelect: function (p) { }, //选取函数
|
||
searchClick : p.searchClick,
|
||
selectInit: function (rowdata) { return false } //选择初始化
|
||
}, p);
|
||
if (!p.grid) return;
|
||
var win, grid, condition, lastSelected = p.lastSelected || [];
|
||
return function ()
|
||
{
|
||
show();
|
||
return false;
|
||
};
|
||
function show()
|
||
{
|
||
function getGridHeight(height)
|
||
{
|
||
height = height || p.height;
|
||
height -= conditionPanel.height();
|
||
return height;
|
||
}
|
||
if (win)
|
||
{
|
||
grid._showData();
|
||
win.show();
|
||
grid.refreshSize();
|
||
lastSelected = grid.selected.concat();
|
||
return;
|
||
}
|
||
var panle = $("<div></div>");
|
||
var conditionPanel = $("<div></div>");
|
||
var gridPanel = $("<div></div>");
|
||
panle.append(conditionPanel).append(gridPanel);
|
||
|
||
if (p.condition)
|
||
{
|
||
var conditionParm = $.extend({
|
||
labelWidth: 60,
|
||
space: 20
|
||
}, p.condition);
|
||
setTimeout(function ()
|
||
{
|
||
condition = conditionPanel.ligerForm(conditionParm);
|
||
}, 50);
|
||
} else
|
||
{
|
||
conditionPanel.remove();
|
||
}
|
||
var gridParm = $.extend({
|
||
columnWidth: 120,
|
||
alternatingRow: false,
|
||
frozen: true,
|
||
rownumbers: true
|
||
}, p.grid, {
|
||
width: "100%",
|
||
height: getGridHeight(),
|
||
isChecked: p.selectInit,
|
||
isSelected: p.selectInit,
|
||
inWindow: false
|
||
});
|
||
//grid
|
||
grid = gridPanel.ligerGrid(gridParm);
|
||
//搜索按钮
|
||
if (p.condition)
|
||
{
|
||
|
||
setTimeout(function ()
|
||
{
|
||
var containerBtn1 = $('<li style="margin-right:9px"><div></div></li>');
|
||
$("ul:first", conditionPanel).append(containerBtn1).after('<div class="l-clear"></div>');
|
||
$("div", containerBtn1).ligerButton({
|
||
text: '搜索',
|
||
click: function ()
|
||
{
|
||
var rules = condition.toConditions();
|
||
if (p.searchClick)
|
||
{
|
||
p.searchClick({
|
||
grid: grid,
|
||
rules: rules
|
||
});
|
||
} else
|
||
{
|
||
if (grid.get('url'))
|
||
{
|
||
grid.setParm(grid.conditionParmName || 'condition', $.ligerui.toJSON(rules));
|
||
grid.reload();
|
||
} else
|
||
{
|
||
grid.loadData($.ligerFilter.getFilterFunction(rules));
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}, 100);
|
||
}
|
||
//dialog
|
||
win = $.ligerDialog.open({
|
||
title: p.title,
|
||
width: p.width,
|
||
height: 'auto',
|
||
top: p.top,
|
||
left: p.left,
|
||
target: panle,
|
||
isResize: true,
|
||
cls: 'l-selectorwin',
|
||
onContentHeightChange: function (height)
|
||
{
|
||
grid.set('height', getGridHeight(height));
|
||
return false;
|
||
},
|
||
onStopResize: function ()
|
||
{
|
||
grid.refreshSize();
|
||
},
|
||
buttons: [
|
||
{ text: '选择', onclick: function (item, dialog) { toSelect(); dialog.hide(); } },
|
||
{ text: '取消', onclick: function (item, dialog) { dialog.hide(); } }
|
||
]
|
||
});
|
||
|
||
if (master)
|
||
{
|
||
master.includeControls = master.includeControls || [];
|
||
master.includeControls.push(win);
|
||
}
|
||
grid.refreshSize();
|
||
}
|
||
function exist(value, data)
|
||
{
|
||
for (var i = 0; data && data[i]; i++)
|
||
{
|
||
var item = data[i];
|
||
if (item[p.valueField] == value) return true;
|
||
}
|
||
return false;
|
||
}
|
||
function toSelect()
|
||
{
|
||
var selected = grid.selected || [];
|
||
var value = [], text = [], data = [];
|
||
$(selected).each(function (i, rowdata)
|
||
{
|
||
p.valueField && value.push(rowdata[p.valueField]);
|
||
p.textField && text.push(rowdata[p.textField]);
|
||
var o = $.extend(true, {}, this);
|
||
grid.formatRecord(o, true);
|
||
data.push(o);
|
||
});
|
||
var unSelected = [];
|
||
$(lastSelected).each(function (i, item)
|
||
{
|
||
if (!exist(item[p.valueField], selected) && exist(item[p.valueField], grid.rows))
|
||
{
|
||
unSelected.push(item);
|
||
}
|
||
});
|
||
var removeValue = [], removeText = [], removeData = [];
|
||
$(unSelected).each(function (i, rowdata)
|
||
{
|
||
p.valueField && removeValue.push(rowdata[p.valueField]);
|
||
p.textField && removeText.push(rowdata[p.textField]);
|
||
var o = $.extend(true, {}, this);
|
||
grid.formatRecord(o, true);
|
||
removeData.push(o);
|
||
});
|
||
p.onSelect({
|
||
value: value.join(p.split),
|
||
text: text.join(p.split),
|
||
data: data,
|
||
remvoeValue: removeValue.join(p.split),
|
||
remvoeText: removeText.join(p.split),
|
||
removeData: removeData
|
||
});
|
||
}
|
||
};
|
||
|
||
})(jQuery); |