Ext.require([
'erp.util.*'
]);
Ext.define('erp.view.oa.knowledge.KnowledgeSearchGrid',{
extend: 'Ext.grid.Panel',
alias: 'widget.erpSearchGridPanel',
layout : 'auto',
id: 'grid',
emptyText : '无数据',
columnLines : true,
autoScroll : true,
store: [],
columns: new Array(),
searchValue: null,
/**
* @private
* The row indexes where matching strings are found. (used by previous and next buttons)
*/
indexes: [],
/**
* @private
* The row index of the first search, it could change if next or previous buttons are used.
*/
currentIndex: null,
/**
* @private
* The generated regular expression used for searching.
*/
searchRegExp: null,
/**
* @private
* Case sensitive mode.
*/
caseSensitive: false,
/**
* @private
* Regular expression mode.
*/
regExpMode: false,
/**
* @cfg {String} matchCls
* The matched string css classe.
*/
matchCls: 'x-livesearch-match',
defaultStatusText: 'Nothing Found',
bodyStyle:'background-color:#f1f1f1;',
selModel: Ext.create('Ext.selection.CheckboxModel',{
headerWidth: 0
}),
dockedItems: [{
xtype: 'toolbar',
dock: 'top',
style:'background:#CDCDB4;height:45px;font-size:16px;',
bodyStyle: 'background:#CDCDB4; padding:0px;font-size:16px;',
items: [{
xtype: 'textfield',
fieldLabel:'
全文检索:
',
labelSeparator:"",
width:300,
name:'search',
id:'search',
labelStyle:'font-size:16px',
fieldStyle : 'background:#DEDEDE;width:200px;font-size:16px;height:22px',
}, {
xtype: 'button',
margin: '0 0 0 4px',
text: '<',
id:'prev',
tooltip: '上一行',
},{
xtype: 'button',
margin: '0 0 0 4px',
id:'next',
text: '>',
tooltip: '下一行',
}, '-', {
xtype: 'checkbox',
margin: '0 0 0 4px',
id:'regular',
hideLabel:true,
},'正规表达式', {
xtype: 'checkbox',
hideLabel: true,
id:'case',
margin: '0 0 0 4px',
}, '区分大小写','->',
{
xtype: 'textfield',
fieldLabel:'匹配数:
',
labelAlign:'right',
id:'matchs',
emptyText:'未找到匹配值',
labelSeparator:"",
readOnly:true,
fieldStyle : 'background:#CDCDB4 ;border-bottom-style:1px solid;padding:2px 2px;vertical-align:middle;border-top:none;border-right:none;color:#CD661D;border-bottom-style:1px solid;border-left:none; ',
},'-',{
xtype:'button',
id:'previous',
iconCls:'prev',
disabled:true,
},{
xtype:'button',
id:'nextone',
iconCls:'next',
disabled:true,
style:'margin-right:20px;margin-left:5px;'
}],
},{
id : 'pagingtoolbar',
xtype: 'erpDatalistToolbar',
dock: 'bottom',
displayInfo: true
}],
plugins: [Ext.create('Ext.ux.grid.GridHeaderFilters')],
BaseUtil: Ext.create('erp.util.BaseUtil'),
RenderUtil:Ext.create('erp.util.RenderUtil'),
tagsRe: /<[^>]*>/gm,
tagsProtect: '\x0f',
regExpProtect: /\\|\/|\+|\\|\.|\[|\]|\{|\}|\?|\$|\*|\^|\|/gm,
initComponent : function(){
condition = this.BaseUtil.getUrlParam('urlcondition');
condition = (condition == null) ? "" : condition;
condition = condition.replace(/@/,"'%").replace(/@/,"%'");
this.defaultCondition = condition;//固定条件;从url里面获取
caller = this.BaseUtil.getUrlParam('whoami');
this.getCount(caller, condition);
this.callParent(arguments);
} ,
getColumnsAndStore: function(c, d, g, s){
c = c || caller;
d = d || condition;
g = g || page;
s = s || pageSize;
var me = this;
var f = d;
if(me.filterCondition){
if(d == null || d == ''){
f = me.filterCondition;
} else {
f += ' AND ' + me.filterCondition;
}
}
me.BaseUtil.getActiveTab().setLoading(true);//loading...
Ext.Ajax.request({//拿到grid的columns
url : basePath + 'common/datalist.action',
params: {
caller: c,
condition: f,
page: g,
pageSize: s
},
method : 'post',
callback : function(options,success,response){
me.BaseUtil.getActiveTab().setLoading(false);
var res = new Ext.decode(response.responseText);
if(res.exception || res.exceptionInfo){
showError(res.exceptionInfo);
return;
}
var data = res.data != null ? Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']')) : [];//一定要去掉多余逗号,ie对此很敏感
if(me.columns && me.columns.length > 2){
me.store.loadData(data);
if(me.store.data.items.length != data.length){
me.store.add(data);
}
if(me.lastSelected && me.lastSelected.length > 0){//grid刷新后,仍然选中上次选中的record
Ext.each(me.store.data.items, function(item){
if(item.data[keyField] == me.lastSelected[0].data[keyField]){
me.selModel.select(item);
}
});
}
} else {
var store = Ext.create('Ext.data.Store', {
fields: res.fields,
data: data
});
//处理render
var grid = this;
Ext.Array.each(res.columns, function(column, y) {
if(!column.haveRendered && column.renderer != null && column.renderer != ""){
if(!grid.RenderUtil){
grid.RenderUtil = Ext.create('erp.util.RenderUtil');
}
var renderName = column.renderer;
if(contains(column.renderer, ':', true)){
var args = new Array();
Ext.each(column.renderer.split(':'), function(a, index){
if(index == 0){
renderName = a;
} else {
args.push(a);
}
});
if(!grid.RenderUtil.args[renderName]){
grid.RenderUtil.args[renderName] = new Object();
}
grid.RenderUtil.args[renderName][column.dataIndex] = args;
//这里只能用column.dataIndex来标志,不能用x,y,index等,
//grid在render时,checkbox占一列
}
column.renderer = grid.RenderUtil[renderName];
column.haveRendered = true;
}
});
me.reconfigure(store, res.columns);//用这个方法每次都会add一个checkbox列
}
//修改pagingtoolbar信息
Ext.getCmp('pagingtoolbar').afterOnLoad();
//拿到datalist对应的单表的关键词
keyField = res.keyField;//form表主键字段
pfField = res.pfField;//grid表主键字段
url = basePath + res.url;//grid行选择之后iframe嵌入的页面链接
relative = res.relative;
if(res.vastbutton && res.vastbutton == 'erpAddButton'){//[新增]功能
Ext.getCmp('erpAddButton').show();
}
}
});
},
getCount: function(c, d){
c = c || caller;
d = d || condition;
var me = this;
var f = d;
if(me.filterCondition){
if(d == null || d == ''){
f = me.filterCondition;
} else {
f += ' AND ' + me.filterCondition;
}
}
Ext.Ajax.request({//拿到grid的数据总数count
url : basePath + '/common/datalistCount.action',
params: {
caller: c,
condition: f
},
method : 'post',
callback : function(options,success,response){
var res = new Ext.decode(response.responseText);
if(res.exception || res.exceptionInfo){
showError(res.exceptionInfo);
return;
}
dataCount = res.count;
me.getColumnsAndStore(c, d);
}
});
},
listeners: {
'headerfiltersapply': function(grid, filters) {
if(this.allowFilter){
var condition = null;
for(var fn in filters){
var value = filters[fn];
if(!Ext.isEmpty(value)){
if(Ext.isDate(value)){
value = Ext.Date.toString(value);
value = fn + "=to_date('" + value + "','yyyy-MM-dd') ";
} else {
var exp_t = /^(\d{4})\-(\d{2})\-(\d{2}) (\d{2}):(\d{2}):(\d{2})$/,
exp_d = /^(\d{4})\-(\d{2})\-(\d{2})$/;
if(exp_d.test(value)){
value = fn + "=to_date('" + value + "','yyyy-MM-dd') ";
} else if(exp_t.test(value)){
value = fn + "=to_date('" + value + "','yyyy-MM-dd HH24:mi:ss') ";
} else{
value = fn + " LIKE '%" + value + "%' ";
}
}
if(condition == null){
condition = value;
} else {
condition = condition + " AND " + value;
}
}
}
this.filterCondition = condition;
page = 1;
this.getCount();
} else {
this.allowFilter = true;
}
return false;
}
},
reconfigure: function(store, columns){
//改写reconfigure方法
var d = this.headerCt;
if (this.columns.length <= 1 && columns) {//this.columns.length > 1表示grid的columns已存在,没必要remove再add
if(!Ext.isChrome){//ie,firefox下,format出现NaN-NaN-NaN,暂时作string处理
Ext.each(columns, function(c){
if(c.xtype == 'datecolumn'){
c.xtype = "";
c.format = "";
}
});
}
d.suspendLayout = true;
d.removeAll();
d.add(columns);
}
if (store) {
if(!Ext.isChrome){//ie,firefox下,format出现NaN-NaN-NaN
Ext.each(store.fields, function(f){
if(f.type == 'date'){
f.type = "string";
f.format = "";
}
});
}
this.bindStore(store);
} else {
this.getView().refresh();
}
if (columns) {
d.suspendLayout = false;
this.forceComponentLayout();
}
this.fireEvent("reconfigure", this);
},
getSearchValue: function() {
var me = this,
value = Ext.getCmp('search').getValue();
if (value === '') {
return null;
}
if (!me.regExpMode) {
value = value.replace(me.regExpProtect, function(m) {
return '\\' + m;
});
} else {
try {
new RegExp(value);
} catch (error) {
me.statusBar.setStatus({
text: error.message,
iconCls: 'x-status-error'
});
return null;
}
// this is stupid
if (value === '^' || value === '$') {
return null;
}
}
return value;
},
});