2015-05-19 14:45:47 +08:00
F . originalComponentHide = Ext . Component . prototype . hide ;
Ext . override ( Ext . Component , {
// override
hide : function ( ) {
var me = this ;
if ( me . tab && me . tab . isXType ( 'tab' ) ) {
// tabpanel 单独处理
} else {
// 除了 tabpanel 的其他面板
if ( me . body ) {
// 检查当前组件内的表单是否改变(包含组件内 iframe 页面,递归查找所有 iframe)
if ( F . util . preventPageClose ( me . body ) ) {
return false ;
}
}
}
return F . originalComponentHide . apply ( me , arguments ) ;
} ,
f _setDisabled : function ( ) {
this . setDisabled ( ! this . f _state [ 'Enabled' ] ) ;
} ,
f _setVisible : function ( ) {
this . setVisible ( ! this . f _state [ 'Hidden' ] ) ;
} ,
f _setWidth : function ( ) {
this . setWidth ( this . f _state [ 'Width' ] ) ;
} ,
f _setHeight : function ( ) {
this . setHeight ( this . f _state [ 'Height' ] ) ;
}
} ) ;
// 1. tabpanel 单独处理,选项卡右上角的关闭按钮
F . originalTabBarCloseTab = Ext . tab . Bar . prototype . closeTab ;
Ext . override ( Ext . tab . Bar , {
// override
closeTab : function ( toClose ) {
var me = this , card = toClose . card ;
if ( card . body ) {
// 检查当前组件内的表单是否改变(包含组件内 iframe 页面,递归查找所有 iframe)
if ( F . util . preventPageClose ( card . body ) ) {
return false ;
}
}
return F . originalTabBarCloseTab . apply ( me , arguments ) ;
}
} ) ;
// 2. tabpanel 单独处理,选项卡的右键菜单
F . originalTabPanelRemove = Ext . tab . Panel . prototype . remove ;
Ext . override ( Ext . tab . Panel , {
// override
remove : function ( comp ) {
var me = this , c = me . getComponent ( comp ) ;
if ( c && c . body ) {
// 检查当前组件内的表单是否改变(包含组件内 iframe 页面,递归查找所有 iframe)
if ( F . util . preventPageClose ( c . body ) ) {
return false ;
}
}
return F . originalTabPanelRemove . apply ( me , arguments ) ;
}
} ) ;
// 验证一个表单是否有效,会递归查询表单中每个字段
// 如果表单隐藏或者字段隐藏,则不进行有效性校验
Ext . override ( Ext . container . Container , {
f _isValid : function ( ) {
var valid = true ;
var firstInvalidField = null ;
if ( ! this . hidden ) {
this . items . each ( function ( f ) {
if ( ! f . hidden ) {
if ( f . isXType ( 'field' ) || f . isXType ( 'checkboxgroup' ) ) {
if ( ! f . validate ( ) ) {
valid = false ;
if ( firstInvalidField == null ) {
firstInvalidField = f ;
}
}
} else if ( f . isXType ( 'container' ) && f . items . length ) {
var validResult = f . f _isValid ( ) ;
if ( ! validResult [ 0 ] ) {
valid = false ;
if ( firstInvalidField == null ) {
firstInvalidField = validResult [ 1 ] ;
}
}
}
}
} ) ;
}
return [ valid , firstInvalidField ] ;
} ,
f _reset : function ( ) {
var me = this ;
if ( me . items && me . items . length ) {
me . items . each ( function ( item ) {
if ( item . isXType ( 'field' ) ) {
item . reset ( ) ;
} else if ( item . isXType ( 'container' ) && item . items . length ) {
item . f _reset ( ) ;
}
} ) ;
}
} ,
// 当前面板内的表单字段是否改变
f _isDirty : function ( ) {
var me = this , dirty = false ;
if ( me . items && me . items . length ) {
me . items . each ( function ( item ) {
if ( item . isXType ( 'field' ) ) {
if ( item . isDirty ( ) ) {
dirty = true ;
return false ;
}
} else if ( item . isXType ( 'container' ) && item . items . length ) {
if ( item . f _isDirty ( ) ) {
dirty = true ;
return false ;
}
}
} ) ;
}
return dirty ;
} ,
// 当前面板内的表单字段
f _clearDirty : function ( ) {
var me = this ;
if ( me . items && me . items . length ) {
me . items . each ( function ( item ) {
if ( item . isXType ( 'field' ) ) {
item . resetOriginalValue ( ) ;
} else if ( item . isXType ( 'container' ) && item . items . length ) {
item . f _clearDirty ( )
}
} ) ;
}
}
} ) ;
//F.originalPanelClose = Ext.panel.Panel.prototype.close;
Ext . override ( Ext . panel . Panel , {
//// override
//close: function () {
// // 检查当前组件内的表单是否改变(包含组件内 iframe 页面,递归查找所有 iframe)
// if (F.util.preventPageClose(this.body)) {
// return false;
// }
// return F.originalPanelClose.apply(this, arguments);
//},
f _setCollapse : function ( ) {
var collapsed = this . f _state [ 'Collapsed' ] ;
if ( collapsed ) {
this . collapse ( ) ;
} else {
this . expand ( ) ;
}
} ,
f _isCollapsed : function ( ) {
/ *
var collapsed = false ;
var state = this . getState ( ) ;
if ( state && state . collapsed ) {
collapsed = true ;
}
return collapsed ;
* /
return ! ! this . getCollapsed ( ) ;
} ,
f _setTitle : function ( ) {
this . setTitle ( this . f _state [ 'Title' ] ) ;
} ,
f _getActiveIndex : function ( ) {
var activeIndex = - 1 ;
this . items . each ( function ( item , index ) {
if ( item . f _isCollapsed && ! item . f _isCollapsed ( ) ) {
activeIndex = index ;
return false ;
}
} ) ;
return activeIndex ;
}
} ) ;
Ext . override ( Ext . form . FieldSet , {
f _setCollapse : function ( ) {
var collapsed = this . f _state [ 'Collapsed' ] ;
if ( collapsed ) {
this . collapse ( ) ;
} else {
this . expand ( ) ;
}
} ,
f _isCollapsed : function ( ) {
/ *
var collapsed = false ;
var state = this . getState ( ) ;
if ( state && state . collapsed ) {
collapsed = true ;
}
return collapsed ;
* /
return ! ! this . getCollapsed ( ) ;
} ,
f _setTitle : function ( ) {
this . setTitle ( this . f _state [ 'Title' ] ) ;
}
} ) ;
if ( Ext . menu . CheckItem ) {
Ext . override ( Ext . menu . CheckItem , {
f _setChecked : function ( ) {
this . setChecked ( this . f _state [ 'Checked' ] , true ) ;
}
} ) ;
}
if ( Ext . form . field . Base ) {
Ext . override ( Ext . form . field . Base , {
// Add functionality to Field's initComponent to enable the change event to bubble
/ *
initComponent : Ext . form . Field . prototype . initComponent . createSequence ( function ( ) {
this . enableBubble ( 'change' ) ;
} ) ,
* /
/ * 这 会 导 致 在 文 本 输 入 框 中 按 回 车 键 , 无 法 触 发 t y p e = s u b m i t 的 表 单 回 发 事 件
listeners : {
specialkey : function ( field , e ) {
if ( e . getKey ( ) == e . ENTER ) {
e . stopEvent ( ) ;
}
}
} ,
* /
/ *
// When show or hide the field, also hide the label.
hide : function ( ) {
Ext . form . Field . superclass . hide . call ( this ) ;
//this.callOverridden();
//var label = Ext.get(this.el.findParent('div[class=x-form-item]')).first('label[for=' + this.id + ']');
var labelAndField = this . el . findParentNode ( 'div[class*=x-form-item]' , 10 , true ) ;
if ( labelAndField ) {
if ( this . hideMode == 'display' ) {
labelAndField . setVisibilityMode ( Ext . Element . DISPLAY ) ;
} else {
labelAndField . setVisibilityMode ( Ext . Element . VISIBILITY ) ;
}
labelAndField . hide ( ) ;
}
} ,
show : function ( ) {
Ext . form . Field . superclass . show . call ( this ) ;
//this.callOverridden();
//var label = Ext.get(this.el.findParent('div[class=x-form-item]')).first('label[for=' + this.id + ']');
var labelAndField = this . el . findParentNode ( 'div[class*=x-form-item]' , 10 , true ) ;
if ( labelAndField ) {
if ( this . hideMode == 'display' ) {
labelAndField . setVisibilityMode ( Ext . Element . DISPLAY ) ;
} else {
labelAndField . setVisibilityMode ( Ext . Element . VISIBILITY ) ;
}
labelAndField . show ( ) ;
}
} ,
* /
f _setValue : function ( value ) {
if ( typeof ( value ) === 'undefined' ) {
value = this . f _state [ 'Text' ] ;
}
this . setValue ( value ) ;
} ,
f _setLabel : function ( text ) {
/ *
if ( this . label && this . label . update ) {
this . label . update ( text || this . f _state [ 'Label' ] ) ;
}
* /
var text = text || this . f _state [ 'Label' ] ;
if ( this . setFieldLabel ) {
this . setFieldLabel ( text ) ;
}
2016-01-10 01:19:30 -05:00
} ,
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
f _setReadOnly : function ( readonly ) {
var me = this ;
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
if ( typeof ( readonly ) === 'undefined' ) {
readonly = me . f _state [ 'Readonly' ] ;
2015-05-19 14:45:47 +08:00
}
2016-01-10 01:19:30 -05:00
if ( me . setReadOnly ) {
me . setReadOnly ( readonly ) ;
}
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
if ( readonly ) {
me . el . addCls ( 'f-readonly' ) ;
} else {
me . el . removeCls ( 'f-readonly' ) ;
2015-05-19 14:45:47 +08:00
}
}
} ) ;
}
2016-01-10 01:19:30 -05:00
if ( Ext . form . Label ) {
Ext . override ( Ext . form . Label , {
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
f _setReadOnly : function ( readonly ) {
var me = this ;
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
if ( typeof ( readonly ) === 'undefined' ) {
readonly = me . f _state [ 'Readonly' ] ;
}
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
if ( me . setReadOnly ) {
me . setReadOnly ( readonly ) ;
}
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
if ( readonly ) {
me . el . addCls ( 'f-readonly' ) ;
} else {
me . el . removeCls ( 'f-readonly' ) ;
}
2015-05-19 14:45:47 +08:00
}
} ) ;
2016-01-10 01:19:30 -05:00
2015-05-19 14:45:47 +08:00
}
2016-01-10 01:19:30 -05:00
2015-05-19 14:45:47 +08:00
if ( Ext . form . CheckboxGroup ) {
Ext . override ( Ext . form . CheckboxGroup , {
2016-01-10 01:19:30 -05:00
f _setReadOnly : function ( readonly ) {
var me = this ;
if ( typeof ( readonly ) === 'undefined' ) {
readonly = me . f _state [ 'Readonly' ] ;
}
if ( me . setReadOnly ) {
me . setReadOnly ( readonly ) ;
}
if ( readonly ) {
me . el . addCls ( 'f-readonly' ) ;
} else {
me . el . removeCls ( 'f-readonly' ) ;
}
} ,
2015-05-19 14:45:47 +08:00
f _reloadData : function ( name , isradiogroup ) {
var container = this . ownerCt ;
var newConfig = Ext . apply ( this . initialConfig , {
"f_state" : this . f _state ,
"items" : F . util . resolveCheckBoxGroup ( name , this . f _state , isradiogroup )
} ) ;
if ( container ) {
var originalIndex = container . items . indexOf ( this ) ;
container . remove ( this , true ) ;
if ( isradiogroup ) {
container . insert ( originalIndex , Ext . create ( 'Ext.form.RadioGroup' , newConfig ) ) ;
} else {
container . insert ( originalIndex , Ext . create ( 'Ext.form.CheckboxGroup' , newConfig ) ) ;
}
container . doLayout ( ) ;
} else {
this . destroy ( ) ;
if ( isradiogroup ) {
Ext . create ( 'Ext.form.RadioGroup' , newConfig ) ;
} else {
Ext . create ( 'Ext.form.CheckboxGroup' , newConfig ) ;
}
}
} ,
/ *
f _toBeDeleted : function ( ) {
var tobedeleted = this . items . items [ 0 ] ;
if ( tobedeleted && tobedeleted . inputValue === 'tobedeleted' ) {
tobedeleted . destroy ( ) ;
this . items . remove ( tobedeleted ) ;
}
} ,
* /
// 选中项
f _setValue : function ( values ) {
// valueArray: ["value1", "value2", "value3"]
var values = values || this . f _state [ 'SelectedValueArray' ] ;
var selectedObj = { } ;
this . items . each ( function ( item ) {
var itemSelected = false ;
if ( Ext . Array . indexOf ( values , item . inputValue ) >= 0 ) {
itemSelected = true ;
}
selectedObj [ item . name ] = itemSelected ;
} ) ;
this . setValue ( selectedObj ) ;
} ,
// 返回 ["value1", "value2", "value3"]
f _getSelectedValues : function ( ) {
var selectedValues = [ ] ;
var values = this . getValue ( ) ;
Ext . Object . each ( values , function ( key , value ) {
selectedValues . push ( value ) ;
} ) ;
return selectedValues ;
}
} ) ;
}
2016-01-10 01:19:30 -05:00
if ( Ext . form . field . Time ) {
Ext . override ( Ext . form . field . Time , {
// Time 继承自 ComboBox, 这个函数被覆盖了, 因此需要重新定义
f _setValue : function ( value ) {
if ( typeof ( value ) === 'undefined' ) {
value = this . f _state [ 'Text' ] ;
}
this . setValue ( value ) ;
}
} ) ;
}
if ( Ext . form . field . HtmlEditor ) {
Ext . override ( Ext . form . field . HtmlEditor , {
f _setValue : function ( text ) {
if ( typeof ( text ) === 'undefined' ) {
text = this . f _state [ 'Text' ] ;
}
this . setValue ( text ) ;
}
} ) ;
}
if ( Ext . form . field . Checkbox ) {
Ext . override ( Ext . form . field . Checkbox , {
f _setValue : function ( ) {
this . setValue ( this . f _state [ 'Checked' ] ) ;
}
} ) ;
}
if ( Ext . form . RadioGroup ) {
Ext . override ( Ext . form . RadioGroup , {
f _setValue : function ( value ) {
value = value || this . f _state [ 'SelectedValue' ] ;
var selectedObj = { } ;
selectedObj [ this . name ] = value ;
this . setValue ( selectedObj ) ;
//Ext.form.CheckboxGroup.prototype.f_setValue.apply(this, [value]);
}
} ) ;
}
2015-05-19 14:45:47 +08:00
if ( Ext . form . field . ComboBox ) {
Ext . override ( Ext . form . field . ComboBox , {
// Load data from local cache.
// mode: "local",
// triggerAction: "all",
displayField : "text" ,
valueField : "value" ,
//tpl: "<tpl for=\".\"><div class=\"x-combo-list-item <tpl if=\"!enabled\">x-combo-list-item-disable</tpl>\">{prefix}{text}</div></tpl>",
// These variables are in the Ext.form.ComboBox.prototype, therefore all instance will refer to the same store instance.
//store: new Ext.data.ArrayStore({ fields: ['value', 'text', 'enabled', 'prefix'] }),
f _setValue : function ( value ) {
// value 可以是空字符串
if ( typeof ( value ) === 'undefined' ) {
if ( this . multiSelect ) {
value = this . f _state [ 'SelectedValueArray' ] ;
} else {
value = this . f _state [ 'SelectedValue' ] ;
}
//value = this.f_state['SelectedValue'];
}
this . setValue ( value ) ;
} ,
f _loadData : function ( data ) {
data = data || this . f _state [ 'F_Items' ] ;
if ( data ) {
this . store . loadData ( F . simulateTree . transform ( data ) ) ;
}
} ,
f _getTextByValue : function ( value , data ) {
data = data || this . f _state [ 'F_Items' ] ;
value += '' ; // 把Value转换为字符串
for ( var i = 0 , count = data . length ; i < count ; i ++ ) {
var item = data [ i ] ;
if ( item [ 0 ] === value ) {
return item [ 1 ] ;
}
}
return '' ;
}
} ) ;
}
if ( Ext . button . Button ) {
Ext . override ( Ext . button . Button , {
f _setTooltip : function ( ) {
this . setTooltip ( this . f _state [ 'ToolTip' ] ) ;
} ,
f _toggle : function ( ) {
this . toggle ( this . f _state [ 'Pressed' ] ) ;
} ,
f _setText : function ( ) {
this . setText ( this . f _state [ 'Text' ] ) ;
}
} ) ;
}
if ( Ext . grid . column . RowNumberer ) {
F . originalRowNumbererRenderer = Ext . grid . column . RowNumberer . prototype . renderer ;
Ext . override ( Ext . grid . column . RowNumberer , {
renderer : function ( ) {
var number = F . originalRowNumbererRenderer . apply ( this , arguments ) ;
if ( this . f _paging ) {
var pagingBar = F ( this . f _paging _grid ) . f _getPaging ( ) ;
if ( pagingBar ) {
number += pagingBar . f _pageIndex * pagingBar . f _pageSize ;
}
}
return number ;
}
} ) ;
}
if ( Ext . grid . Panel ) {
Ext . override ( Ext . grid . Panel , {
f _getData : function ( ) {
2016-01-10 01:19:30 -05:00
var $this = this , rows = this . f _state [ 'F_Rows' ] ;
2015-05-19 14:45:47 +08:00
//////////////////////////////////////////////////
var tpls = this . f _getTpls ( this . f _tpls ) ;
// 将Grid1_ctl37与对应的outHTML放在哈希表中
var tplsHash = { } ;
var e = document . createElement ( 'div' ) ;
e . innerHTML = tpls ;
Ext . Array . each ( e . childNodes , function ( item , index ) {
tplsHash [ item . id ] = item . outerHTML . replace ( /\r?\n\s*/ig , '' ) ;
} ) ;
/ *
// 将服务器返回的字符串转换为实际的JavaScript类型
function resolveActualDataItem ( fieldValue , fieldIndex ) {
var fieldType = $this . f _fields [ fieldIndex ] . type ;
if ( fieldType ) {
if ( fieldType === 'date' ) {
fieldValue = new Date ( fieldValue ) ;
} else if ( fieldType === 'boolean' ) {
if ( fieldValue == 'true' || fieldValue == '1' ) {
fieldValue = true ;
} else {
fieldValue = false ;
}
} else if ( fieldType === 'float' ) {
fieldValue = parseFloat ( fieldValue ) ;
} else if ( fieldType === 'int' ) {
fieldValue = parseInt ( fieldValue , 10 ) ;
}
}
return fieldValue ;
}
* /
// 不要改变 F_Rows.Values 的原始数据, 因为这个值会被POST到后台
2016-01-10 01:19:30 -05:00
/ *
2015-05-19 14:45:47 +08:00
var newdata = [ ] , newdataitem ;
Ext . Array . each ( data , function ( row , rowIndex ) {
newdataitem = [ ] ;
Ext . Array . each ( row , function ( item , index ) {
if ( typeof ( item ) === 'string' && item . substr ( 0 , 7 ) === "#@TPL@#" ) {
var clientId = $this . id + '_' + item . substr ( 7 ) ;
newdataitem . push ( '<div id="' + clientId + '_container">' + tplsHash [ clientId ] + '</div>' ) ;
} else {
//newdataitem.push(resolveActualDataItem(item, index));
newdataitem . push ( item ) ;
}
} ) ;
newdata . push ( newdataitem ) ;
} ) ;
2016-01-10 01:19:30 -05:00
* /
var newdata = [ ] ;
Ext . Array . each ( rows , function ( row , rowIndex ) {
var newdataitem = [ ] ;
// row['0'] -> Values
Ext . Array . each ( row [ '0' ] , function ( item , cellIndex ) {
var newcellvalue = item ;
if ( typeof ( item ) === 'string' && item . substr ( 0 , 7 ) === "#@TPL@#" ) {
var clientId = $this . id + '_' + item . substr ( 7 ) ;
newcellvalue = '<div id="' + clientId + '_container">' + tplsHash [ clientId ] + '</div>' ;
}
newdataitem . push ( newcellvalue ) ;
} ) ;
// idProperty
var rowId = row [ '6' ] ;
if ( typeof ( rowId ) === 'undefined' ) {
// 如果未定义 id, 要生成一个 id, 用来记录选中的行( 否则在行调整顺序后, 选中的行就乱了)
rowId = 'fineui_row_' + rowIndex ;
}
newdataitem . push ( rowId ) ;
newdata . push ( newdataitem ) ;
} ) ;
2015-05-19 14:45:47 +08:00
//////////////////////////////////////////////////
return newdata ;
} ,
f _getTpls : function ( paramTpls ) {
var tpls ;
if ( typeof ( paramTpls ) !== 'undefined' ) {
// 1. 如果Tpls存在于函数参数中
tpls = paramTpls ;
this [ 'data-last-tpls' ] = tpls ;
} else {
var tplsNode = Ext . get ( this . id + '_tpls' ) ;
if ( tplsNode ) {
// 2. 如果Tpls存在于页面节点中
tpls = tplsNode . dom . innerHTML ;
// 获取模板列的内容之后,必须要删除原有的节点,因为会在表格中创建完全相同的新节点
tplsNode . remove ( ) ;
// 将模板列内容保存到表格实例中
this [ 'data-last-tpls' ] = tpls ;
} else {
// 3. 从缓存中读取
// 从表格实例中读取模板列内容
tpls = this [ 'data-last-tpls' ] ;
}
}
return tpls ;
} ,
f _updateTpls : function ( tpls ) {
tpls = this . f _getTpls ( tpls ) ;
var e = document . createElement ( 'div' ) ;
e . innerHTML = tpls ;
Ext . Array . each ( e . childNodes , function ( item , index ) {
var nodeId = item . id ;
var tplContainer = Ext . get ( nodeId + '_container' ) ;
// 对于内存分页,模板列的内容可能还没有渲染到页面中
if ( tplContainer ) {
tplContainer . dom . innerHTML = item . outerHTML ;
}
} ) ;
} ,
f _getPaging : function ( ) {
var toolbar = this . getDockedItems ( 'toolbar[dock="bottom"][xtype="simplepagingtoolbar"]' ) ;
return toolbar . length ? toolbar [ 0 ] : undefined ;
} ,
f _loadData : function ( ) {
var datas = this . f _getData ( ) ;
var pagingBar = this . f _getPaging ( ) ;
if ( pagingBar ) {
var pagingDatas = [ ] ;
if ( pagingBar . f _databasePaging ) {
pagingDatas = datas ;
} else {
for ( var i = pagingBar . f _startRowIndex ; i <= pagingBar . f _endRowIndex ; i ++ ) {
pagingDatas . push ( datas [ i ] ) ;
}
}
datas = pagingDatas ;
}
var store = this . getStore ( ) ;
// 已经设置 Ext.data.Store 的 pruneModifiedRecords ,在重新加载数据时都会清除所有已经改变的数据
// 所以无需 rejectChanges
// 拒绝之前对表格的编辑,因为接下来就要重新加载数据
//store.rejectChanges();
// 重新加载数据前清空之前的改变
//this.f_newAddedRows = [];
//this.f_deletedRows = [];
store . loadData ( datas ) ;
if ( this . f _cellEditing ) {
2016-01-10 01:19:30 -05:00
this . f _cellEditing . cancelEdit ( ) ;
2015-05-19 14:45:47 +08:00
store . commitChanges ( ) ;
this . f _initRecordIDs ( ) ;
}
} ,
// 初始化所有记录的ID列表
f _initRecordIDs : function ( ) {
var $this = this ;
this . f _recordIDs = [ ] ;
this . getStore ( ) . each ( function ( record , index ) {
$this . f _recordIDs . push ( record . id ) ;
} ) ;
} ,
// 展开所有的行扩展列
f _expandAllRows : function ( ) {
var expander = this . getPlugin ( this . id + '_rowexpander' ) ;
if ( expander ) {
var store = this . getStore ( ) ;
for ( var i = 0 , count = store . getCount ( ) ; i < count ; i ++ ) {
var record = store . getAt ( i ) ;
if ( ! expander . recordsExpanded [ record . internalId ] ) {
expander . toggleRow ( i , record ) ;
}
}
}
} ,
// 隐藏所有的行扩展列
f _collapseAllRows : function ( ) {
var expander = this . getPlugin ( this . id + '_rowexpander' ) ;
if ( expander ) {
var store = this . getStore ( ) ;
for ( var i = 0 , count = store . getCount ( ) ; i < count ; i ++ ) {
var record = store . getAt ( i ) ;
if ( expander . recordsExpanded [ record . internalId ] ) {
expander . toggleRow ( i , record ) ;
}
}
}
} ,
// http://evilcroco.name/2010/10/making-extjs-grid-content-selectable/
// IE下允许选中表格中的文本
/ *
f _enableTextSelection : function ( ) {
var elems = Ext . DomQuery . select ( "div[unselectable=on]" , this . el . dom ) ;
for ( var i = 0 , len = elems . length ; i < len ; i ++ ) {
Ext . get ( elems [ i ] ) . set ( { 'unselectable' : 'off' } ) . removeCls ( 'x-unselectable' ) ;
}
} ,
* /
// 获取选中的行数,或者单元格数(单元格编辑模式)
f _getSelectedCount : function ( ) {
var selectedCount = 0 ;
var sm = this . getSelectionModel ( ) ;
if ( sm . hasSelection ( ) ) {
if ( sm . getCount ) {
selectedCount = sm . getCount ( ) ;
} else {
// 单元格编辑模式,只可能选中一个单元格
selectedCount = 1 ;
}
}
return selectedCount ;
} ,
// 选中某些行
f _selectRows : function ( rows ) {
2016-01-10 01:19:30 -05:00
var me = this ;
rows = rows || me . f _state [ 'SelectedRowIDArray' ] || [ ] ;
var sm = me . getSelectionModel ( ) ;
var store = me . getStore ( ) ;
if ( rows . length && sm . select ) {
2015-05-19 14:45:47 +08:00
sm . deselectAll ( true ) ;
Ext . Array . each ( rows , function ( row , index ) {
// select( records, [keepExisting], [suppressEvent] )
2016-02-29 01:22:26 -05:00
// 有可能存在指定的行找不到的情况
var rowInstance = store . getById ( row ) ;
if ( rowInstance ) {
sm . select ( rowInstance , true , true ) ;
}
2015-05-19 14:45:47 +08:00
} ) ;
}
} ,
// 选中全部行
f _selectAllRows : function ( ) {
var sm = this . getSelectionModel ( ) ;
if ( sm . selectAll ) {
sm . selectAll ( true ) ;
}
} ,
// 获取选中的行
f _getSelectedRows : function ( ) {
2016-01-10 01:19:30 -05:00
var me = this , selectedRows = [ ] ;
var sm = me . getSelectionModel ( ) ;
2015-05-19 14:45:47 +08:00
if ( sm . getSelection ) {
var selection = sm . getSelection ( ) ;
2016-01-10 01:19:30 -05:00
var store = me . getStore ( ) ;
2015-05-19 14:45:47 +08:00
Ext . Array . each ( selection , function ( record , index ) {
2016-02-29 05:40:15 -05:00
// 晕倒:新增行的 record.getId() 居然为 undedined, 没办法!
2016-01-10 01:19:30 -05:00
selectedRows . push ( record . getId ( ) ) ;
2015-05-19 14:45:47 +08:00
} ) ;
}
return selectedRows ;
} ,
// 选中单元格( AllowCellEditing)
2016-01-10 01:19:30 -05:00
f _selectCell : function ( rowId , columnId ) {
var me = this ;
var cell = rowId ;
if ( typeof ( cell ) === 'undefined' ) {
cell = me . f _state [ 'SelectedCell' ] || [ ] ;
} else if ( ! Ext . isArray ( cell ) ) {
cell = [ rowId , columnId ] ;
}
2016-02-29 01:22:26 -05:00
if ( cell && cell . length === 2 ) {
2016-01-10 01:19:30 -05:00
// 支持[行索引,列索引],也支持[行Id,列Id]
var row = cell [ 0 ] ;
var column = cell [ 1 ] ;
2016-02-29 01:22:26 -05:00
// 如果未定义,则直接返回
if ( ! row || ! column ) {
return ;
}
2016-01-10 01:19:30 -05:00
if ( typeof ( row ) === 'string' ) {
row = me . f _getRow ( row ) ;
}
if ( typeof ( column ) === 'string' ) {
column = me . f _getColumn ( column ) ;
}
2016-02-29 01:22:26 -05:00
var sm = me . getSelectionModel ( ) ;
2016-01-10 01:19:30 -05:00
sm . setCurrentPosition ( {
row : row ,
column : column
} ) ;
}
2015-05-19 14:45:47 +08:00
} ,
// 获取选中的单元格( AllowCellEditing)
f _getSelectedCell : function ( ) {
2016-01-10 01:19:30 -05:00
var me = this , selectedCell = [ ] , currentPos ;
var sm = me . getSelectionModel ( ) ;
2015-05-19 14:45:47 +08:00
if ( sm . getCurrentPosition ) {
currentPos = sm . getCurrentPosition ( ) ;
if ( currentPos ) {
2016-01-10 01:19:30 -05:00
selectedCell = [ currentPos . record . getId ( ) , currentPos . columnHeader . id ] ;
2015-05-19 14:45:47 +08:00
}
}
return selectedCell ;
} ,
// 获取隐藏列的名称列表
f _getHiddenColumns : function ( ) {
var hiddens = [ ] , columns = this . f _getColumns ( ) ;
Ext . Array . each ( columns , function ( column , index ) {
var columnId = column . id ;
// 行扩展列需要单独处理, id属性不是 expander
if ( ! column . dataIndex && column . innerCls && column . innerCls . indexOf ( 'row-expander' ) > 0 ) {
columnId = 'expander' ;
}
if ( column . isHidden ( ) ) {
hiddens . push ( columnId ) ;
}
} ) ;
return hiddens ;
} ,
// 隐藏需要隐藏的列,显示不需要隐藏的列
f _updateColumnsHiddenStatus : function ( hiddens ) {
hiddens = hiddens || this . f _state [ 'HiddenColumns' ] || [ ] ;
var columns = this . f _getColumns ( ) ;
Ext . Array . each ( columns , function ( column , index ) {
var columnId = column . id ;
// 行扩展列需要单独处理, id属性不是 expander
if ( ! column . dataIndex && column . innerCls && column . innerCls . indexOf ( 'row-expander' ) > 0 ) {
columnId = 'expander' ;
}
if ( Ext . Array . indexOf ( hiddens , columnId ) !== - 1 ) {
column . setVisible ( false ) ;
} else {
column . setVisible ( true ) ;
}
} ) ;
} ,
// 初始化排序列头
f _initSortHeaders : function ( ) {
var gridEl = Ext . get ( this . id ) , columns = this . f _getColumns ( ) ;
// 为所有可排序列添加手型光标
Ext . Array . each ( columns , function ( item , index ) {
if ( item [ 'sortable' ] ) {
Ext . get ( item . id ) . addCls ( 'cursor-pointer' ) ;
}
} ) ;
} ,
// 设置表格标题栏的排序图标
f _setSortIcon : function ( sortColumnID , sortDirection ) {
var gridEl = Ext . get ( this . id ) , columns = this . f _getColumns ( ) , headers = gridEl . select ( '.x-column-header' ) ;
// 清空所有可排序列的排序箭头
headers . removeCls ( [ 'x-column-header-sort-DESC' , 'x-column-header-sort-ASC' ] ) ;
// 为所有可排序列添加手型光标
Ext . Array . each ( columns , function ( item , index ) {
if ( item [ 'sortable' ] ) {
Ext . get ( item . id ) . addCls ( 'cursor-pointer' ) ;
}
} ) ;
// 设置当前列的排序箭头
if ( sortColumnID ) {
Ext . get ( sortColumnID ) . addCls ( 'x-column-header-sort-' + sortDirection . toUpperCase ( ) ) ;
}
} ,
// 获取表格列
f _getColumns : function ( ) {
/ *
var columns = [ ] ;
var configColumns = this . getColumnModel ( ) . config ;
Ext . Array . each ( configColumns , function ( item , index ) {
// expander也属于表格列的一种类型, 否则设置f_setSortIcon会出错
if ( item . id !== 'numberer' && item . id !== 'checker' ) { // && item.id !== 'expander'
columns . push ( item ) ;
}
} ) ;
* /
// columns 属性不包含行扩展列
//return this.columns;
// this.columnManager.columns 返回相同内容
return this . headerCt . getGridColumns ( ) ;
} ,
// 这个方法用不到了, 现在对States的更新会导致Values的改变, 进而促使表格的重新加载
/ *
f _setRowStates : function ( states ) {
var gridEl = Ext . get ( this . id ) , columns = this . f _getColumns ( ) , states = states || this . f _state [ 'f_states' ] || [ ] ;
function setCheckBoxStates ( columnIndex , stateColumnIndex ) {
var checkboxRows = gridEl . select ( '.x-grid-body .x-grid-row .x-grid-td-' + columns [ columnIndex ] . id + ' .f-grid-checkbox' ) ;
checkboxRows . each ( function ( row , rows , index ) {
if ( states [ index ] [ stateColumnIndex ] ) {
if ( row . hasCls ( 'box-grid-checkbox-unchecked-disabled' ) ) {
row . removeCls ( 'box-grid-checkbox-unchecked-disabled' ) ;
} else {
row . removeCls ( 'box-grid-checkbox-unchecked' ) ;
}
} else {
if ( row . hasCls ( 'box-grid-checkbox-disabled' ) ) {
row . addCls ( 'box-grid-checkbox-unchecked-disabled' )
} else {
row . addCls ( 'box-grid-checkbox-unchecked' )
}
}
} ) ;
}
var stateColumnIndex = 0 ;
Ext . Array . each ( columns , function ( column , index ) {
if ( column [ 'f_persistState' ] ) {
if ( column [ 'f_persistStateType' ] === 'checkbox' ) {
setCheckBoxStates ( index , stateColumnIndex ) ;
stateColumnIndex ++ ;
}
}
} ) ;
} ,
* /
// 获取列状态( 目前只有CheckBoxField用到)
f _getStates : function ( ) {
var gridEl = Ext . get ( this . id ) , columns = this . f _getColumns ( ) , states = [ ] ;
function getCheckBoxStates ( columnIndex ) {
var checkboxRows = gridEl . select ( '.x-grid-row .x-grid-cell-' + columns [ columnIndex ] . id + ' .f-grid-checkbox' ) ;
var columnStates = [ ] ;
checkboxRows . each ( function ( row , index ) {
if ( row . hasCls ( 'unchecked' ) ) {
columnStates . push ( false ) ;
} else {
columnStates . push ( true ) ;
}
} ) ;
return columnStates ;
}
Ext . Array . each ( columns , function ( column , index ) {
if ( column [ 'f_persistState' ] ) {
if ( column [ 'f_persistStateType' ] === 'checkbox' ) {
states . push ( getCheckBoxStates ( index ) ) ;
}
}
} ) ;
// 把列状态列表转换为行状态列表,与后台数据保持一致
var i , resolvedStates = [ ] , rowState , rowCount ;
if ( states . length > 0 ) {
rowCount = states [ 0 ] . length ;
for ( i = 0 ; i < rowCount ; i ++ ) {
rowState = [ ] ;
Ext . Array . each ( states , function ( state , index ) {
rowState . push ( state [ i ] ) ;
} ) ;
resolvedStates . push ( rowState ) ;
}
}
return resolvedStates ;
} ,
// 提交客户端改变
f _commitChanges : function ( ) {
if ( this . f _cellEditing ) {
2016-01-10 01:19:30 -05:00
this . f _cellEditing . cancelEdit ( ) ;
2015-05-19 14:45:47 +08:00
this . getStore ( ) . commitChanges ( ) ;
this . f _initRecordIDs ( ) ;
}
} ,
2016-02-29 05:40:15 -05:00
// 获取选中的行
f _getSelectedRows : function ( ) {
var selectedRows = [ ] ;
var sm = this . getSelectionModel ( ) ;
if ( sm . getSelection ) {
var selection = sm . getSelection ( ) ;
var store = this . getStore ( ) ;
Ext . Array . each ( selection , function ( record , index ) {
selectedRows . push ( store . indexOf ( record ) ) ;
} ) ;
}
return selectedRows ;
} ,
// 仅内部使用( f_deleteSelectedRows)
f _getSelectedRowsIndex : function ( ) {
var selectedRows = [ ] ;
var sm = this . getSelectionModel ( ) ;
if ( sm . getSelection ) {
var selection = sm . getSelection ( ) ;
var store = this . getStore ( ) ;
Ext . Array . each ( selection , function ( record , index ) {
selectedRows . push ( store . indexOf ( record ) ) ;
} ) ;
}
return selectedRows ;
} ,
// 仅内部使用( f_deleteSelectedRows)
f _getSelectedCellIndex : function ( ) {
var selectedCell = [ ] , currentPos ;
var sm = this . getSelectionModel ( ) ;
if ( sm . getCurrentPosition ) {
currentPos = sm . getCurrentPosition ( ) ;
if ( currentPos ) {
selectedCell = [ currentPos . row , currentPos . columnHeader . f _columnIndex ] ;
}
}
return selectedCell ;
} ,
2015-05-19 14:45:47 +08:00
// 从Store中删除选中的行( 或者单元格)
2016-01-10 01:19:30 -05:00
f _deleteSelectedRows : function ( ) {
2016-02-29 05:40:15 -05:00
var $this = this ;
var store = this . getStore ( ) ;
2015-05-19 14:45:47 +08:00
2016-02-29 05:40:15 -05:00
var sm = this . getSelectionModel ( ) ;
2015-05-19 14:45:47 +08:00
if ( sm . getSelection ) {
2016-02-29 05:40:15 -05:00
var rows = this . f _getSelectedRowsIndex ( ) ;
Ext . Array . each ( rows , function ( rowIndex , index ) {
store . removeAt ( rowIndex ) ;
2015-05-19 14:45:47 +08:00
} ) ;
} else if ( sm . getSelectedCell ) {
2016-02-29 05:40:15 -05:00
var selectedCell = this . f _getSelectedCellIndex ( ) ;
2015-05-19 14:45:47 +08:00
if ( selectedCell . length ) {
2016-02-29 05:40:15 -05:00
store . removeAt ( selectedCell [ 0 ] ) ;
2015-05-19 14:45:47 +08:00
}
}
} ,
2016-01-10 01:19:30 -05:00
f _generateNewId : function ( ) {
var newid = 'fineui_' + F . f _objectIndex ;
F . f _objectIndex ++ ;
return newid ;
} ,
2015-05-19 14:45:47 +08:00
// 添加一条新纪录
2016-01-10 01:19:30 -05:00
f _addNewRecord : function ( defaultObj , appendToEnd , editColumnId ) {
var me = this , store = me . getStore ( ) ;
2015-05-19 14:45:47 +08:00
var newRecord = defaultObj ; //new Ext.data.Model(defaultObj);
2016-01-10 01:19:30 -05:00
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
// 如果设置了 id, 则 extjs 认为这不是一个 phantom( 幻影) , 而是一个真实存在的数据, rejectChanges 就不能去除这条数据了
/ *
// 自动生成ID
if ( typeof ( newRecord . _ _id ) === 'undefined' ) {
newRecord . _ _id = me . f _generateNewId ( ) ;
}
* /
2016-02-29 05:40:15 -05:00
// 清空当前选中的单元格
me . getSelectionModel ( ) . setCurrentPosition ( ) ;
2016-01-10 01:19:30 -05:00
2016-02-29 05:40:15 -05:00
// 取消正在编辑
me . f _cellEditing . cancelEdit ( ) ;
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
var newAddedRecords ;
//var rowIndex = 0;
2015-05-19 14:45:47 +08:00
if ( appendToEnd ) {
2016-01-10 01:19:30 -05:00
newAddedRecords = store . add ( newRecord ) ;
//rowIndex = store.getCount() - 1;
2015-05-19 14:45:47 +08:00
} else {
2016-01-10 01:19:30 -05:00
newAddedRecords = store . insert ( 0 , newRecord ) ;
//rowIndex = 0;
2015-05-19 14:45:47 +08:00
}
2016-01-10 01:19:30 -05:00
var newAddedRecord = newAddedRecords [ 0 ] ;
// phantom: True when the record does not yet exist in a server-side database (see setDirty). Any record which has a real database pk set as its id property is NOT a phantom -- it's real.
// 如果设置了 id 属性,则 extjs 认为这不是一个 phantom( 幻影) , 而是一个真实存在的数据, 然后通过 getStore().getModifiedRecords() 就得不到这条记录了。
// 所以需要设置 setDirty
//newAddedRecord.setDirty(true);
var column ;
if ( typeof ( editColumnId ) === 'undefined' ) {
column = me . f _firstEditableColumn ( ) ;
} else {
column = me . f _getColumn ( editColumnId ) ;
}
me . f _cellEditing . startEdit ( newAddedRecord , column ) ;
} ,
f _startEdit : function ( rowId , columnId ) {
var me = this ;
me . f _cellEditing . startEdit ( me . f _getRow ( rowId ) , me . f _getColumn ( columnId ) ) ;
} ,
2015-05-19 14:45:47 +08:00
//// 获取新增的行索引(在修改后的列表中)
//f_getNewAddedRows: function () {
// var $this = this;
// var newAddedRows = [];
// this.getStore().each(function (record, index) {
// if (Ext.Array.indexOf($this.f_recordIDs, record.id) < 0) {
// newAddedRows.push(index);
// }
// });
// return newAddedRows;
//},
2016-01-10 01:19:30 -05:00
/ *
2015-05-19 14:45:47 +08:00
// 获取删除的行索引(在原始的列表中)
f _getDeletedRows : function ( ) {
2016-01-10 01:19:30 -05:00
var me = this , currentRecordIDs = [ ] , deletedRows = [ ] ;
me . getStore ( ) . each ( function ( record , index ) {
2015-05-19 14:45:47 +08:00
currentRecordIDs . push ( record . id ) ;
} ) ;
// 快速判断是否存在行被删除的情况
2016-01-10 01:19:30 -05:00
if ( currentRecordIDs . join ( '' ) === me . f _recordIDs . join ( '' ) ) {
return [ ] ; // 没有行被删除
}
// 内存分页,特殊处理
var originalIndexPlus = 0 ;
var pagingBar = me . f _getPaging ( ) ;
if ( pagingBar && ! pagingBar . f _databasePaging ) {
originalIndexPlus = pagingBar . f _pageIndex * pagingBar . f _pageSize ;
2015-05-19 14:45:47 +08:00
}
2016-01-10 01:19:30 -05:00
Ext . Array . each ( me . f _recordIDs , function ( recordID , index ) {
2015-05-19 14:45:47 +08:00
if ( Ext . Array . indexOf ( currentRecordIDs , recordID ) < 0 ) {
2016-01-10 01:19:30 -05:00
//deletedRows.push(index + originalIndexPlus);
deletedRows . push ( {
index : - 1 ,
originalIndex : index + originalIndexPlus ,
id : recordID ,
status : 'deleted'
} ) ;
2015-05-19 14:45:47 +08:00
}
} ) ;
return deletedRows ;
} ,
2016-01-10 01:19:30 -05:00
* /
f _firstEditableColumn : function ( ) {
var me = this , columns = me . f _getColumns ( ) ;
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
for ( var i = 0 , count = columns . length ; i < count ; i ++ ) {
var column = columns [ i ] ;
if ( me . f _columnEditable ( column ) ) {
return column ;
2015-05-19 14:45:47 +08:00
}
}
2016-01-10 01:19:30 -05:00
return undefined ;
2015-05-19 14:45:47 +08:00
} ,
f _columnEditable : function ( columnID ) {
2016-01-10 01:19:30 -05:00
var me = this , columns = me . f _getColumns ( ) ;
var column = columnID ;
if ( typeof ( columnID ) === 'string' ) {
column = me . f _getColumn ( column ) ;
}
if ( column && column . f _editable ) {
return true ;
/ *
if ( ( column . getEditor && column . getEditor ( ) ) || column . xtype === 'checkcolumn' ) {
return true ;
2015-05-19 14:45:47 +08:00
}
2016-01-10 01:19:30 -05:00
* /
2015-05-19 14:45:47 +08:00
}
2016-01-10 01:19:30 -05:00
2015-05-19 14:45:47 +08:00
return false ;
} ,
2016-01-10 01:19:30 -05:00
f _getColumn : function ( columnID ) {
var me = this , columns = me . f _getColumns ( ) ;
for ( var i = 0 , count = columns . length ; i < count ; i ++ ) {
var column = columns [ i ] ;
if ( column . id === columnID ) {
return column ;
}
}
return undefined ;
} ,
f _getRow : function ( rowId ) {
var me = this , store = me . getStore ( ) ;
return store . getById ( rowId ) ;
} ,
f _getCellValue : function ( rowId , columnId ) {
var me = this ;
var row = me . f _getRow ( rowId ) ;
if ( row && row . data ) {
return row . data [ columnId ] ;
}
return undefined ;
} ,
f _updateCellValue : function ( rowId , columnId , newvalue ) {
var me = this ;
var row = me . f _getRow ( rowId ) ;
if ( row && row . set ) {
row . set ( columnId , newvalue ) ;
}
} ,
/ *
2015-05-19 14:45:47 +08:00
// 获取用户修改的单元格值
f _getModifiedData : function ( ) {
var me = this , i , j , count , columns = this . f _getColumns ( ) ;
2016-01-10 01:19:30 -05:00
// 内存分页,特殊处理
var originalIndexPlus = 0 ;
var pagingBar = me . f _getPaging ( ) ;
if ( pagingBar && ! pagingBar . f _databasePaging ) {
originalIndexPlus = pagingBar . f _pageIndex * pagingBar . f _pageSize ;
2015-05-19 14:45:47 +08:00
}
var modifiedRows = [ ] ;
var store = this . getStore ( ) ;
var modifiedRecords = store . getModifiedRecords ( ) ;
var rowIndex , rowData , newData , modifiedRecord , recordID , rowIndexOriginal ;
for ( i = 0 , count = modifiedRecords . length ; i < count ; i ++ ) {
modifiedRecord = modifiedRecords [ i ] ;
recordID = modifiedRecord . id ;
rowIndex = store . indexOf ( modifiedRecord ) ;
rowData = modifiedRecord . data ;
if ( rowIndex < 0 ) {
continue ;
}
// 本行数据在原始数据集合中的行索引
rowIndexOriginal = Ext . Array . indexOf ( this . f _recordIDs , recordID ) ;
if ( rowIndexOriginal < 0 ) {
var newRowData = { } ;
// 删除那些不能编辑的列
for ( var columnID in rowData ) {
if ( this . f _columnEditable ( columnID ) ) {
//delete rowData[columnID];
var rowDataColumn = rowData [ columnID ] ;
// 如果是日期对象,则转化为字符串
if ( F . util . isDate ( rowDataColumn ) ) {
rowDataColumn = F . util . resolveGridDateToString ( me . f _fields , columnID , rowDataColumn ) ;
}
newRowData [ columnID ] = rowDataColumn ;
}
}
// 新增数据行
modifiedRows . push ( [ rowIndex , - 1 , newRowData ] ) ;
} else {
var rowModifiedObj = { } ;
for ( var columnID in modifiedRecord . modified ) {
if ( this . f _columnEditable ( columnID ) ) {
newData = rowData [ columnID ] ;
// 如果是日期对象,则转化为字符串
if ( F . util . isDate ( newData ) ) {
newData = F . util . resolveGridDateToString ( me . f _fields , columnID , newData ) ;
}
rowModifiedObj [ columnID ] = newData ;
}
}
// 修改现有数据行
2016-01-10 01:19:30 -05:00
modifiedRows . push ( [ rowIndex , rowIndexOriginal + originalIndexPlus , rowModifiedObj ] ) ;
2015-05-19 14:45:47 +08:00
}
}
// 结果按照 rowIndex 升序排序
return modifiedRows . sort ( function ( a , b ) { return a [ 0 ] - b [ 0 ] ; } ) ;
2016-01-10 01:19:30 -05:00
} ,
* /
// 获取用户修改的单元格值
f _getModifiedData : function ( ) {
var me = this , i , j , count , columns = me . f _getColumns ( ) ;
// 内存分页,特殊处理
var originalIndexPlus = 0 ;
var pagingBar = me . f _getPaging ( ) ;
if ( pagingBar && ! pagingBar . f _databasePaging ) {
originalIndexPlus = pagingBar . f _pageIndex * pagingBar . f _pageSize ;
}
var modifiedRows = [ ] ;
var store = me . getStore ( ) ;
var modifiedRecords = store . getModifiedRecords ( ) ;
for ( i = 0 , count = modifiedRecords . length ; i < count ; i ++ ) {
var modifiedRecord = modifiedRecords [ i ] ;
var recordID = modifiedRecord . id ;
var rowId = modifiedRecord . getId ( ) ; // getId() is not the same as id property
var rowIndex = store . indexOf ( modifiedRecord ) ;
var rowData = modifiedRecord . data ;
if ( rowIndex < 0 ) {
continue ;
}
// 本行数据在原始数据集合中的行索引
var rowIndexOriginal = Ext . Array . indexOf ( me . f _recordIDs , recordID ) ;
if ( rowIndexOriginal < 0 ) {
var newRowData = { } ;
//for (var columnID in rowData) {
Ext . Object . each ( rowData , function ( columnID , value ) {
//if (me.f_columnEditable(columnID)) {
//delete rowData[columnID];
var column = me . f _getColumn ( columnID ) ;
if ( column && ( column . f _columnType === 'rendercheckfield' || column . f _columnType === 'renderfield' ) ) {
var newData = rowData [ columnID ] ;
// 如果是日期对象,则转化为字符串
if ( F . util . isDate ( newData ) ) {
newData = F . util . resolveGridDateToString ( me . f _fields , columnID , newData ) ;
}
newRowData [ columnID ] = newData ;
}
//}
} ) ;
// 新增数据行
//modifiedRows.push([rowIndex, -1, newRowData]);
modifiedRows . push ( {
index : rowIndex ,
originalIndex : - 1 ,
id : rowId ,
values : newRowData ,
status : 'newadded'
} ) ;
} else {
var rowModifiedObj = { } ;
Ext . Object . each ( modifiedRecord . modified , function ( columnID , value ) {
//for (var columnID in modifiedRecord.modified) {
// 不删除非可编辑列,比如[总成绩(不可编辑)]列不可编辑,但是可以通过代码更改
//if (me.f_columnEditable(columnID)) {
var newData = rowData [ columnID ] ;
// 如果是日期对象,则转化为字符串
if ( F . util . isDate ( newData ) ) {
newData = F . util . resolveGridDateToString ( me . f _fields , columnID , newData ) ;
}
rowModifiedObj [ columnID ] = newData ;
//}
} ) ;
// 修改现有数据行
//modifiedRows.push([rowIndex, rowIndexOriginal + originalIndexPlus, rowModifiedObj]);
modifiedRows . push ( {
index : rowIndex ,
originalIndex : rowIndexOriginal + originalIndexPlus ,
id : rowId ,
values : rowModifiedObj ,
status : 'modified'
} ) ;
}
}
// 删除的行
//modifiedRows = modifiedRows.concat(me.f_getDeletedRows());
var removedRecords = store . getRemovedRecords ( ) ;
Ext . Array . each ( removedRecords , function ( record , index ) {
var recordOriginalIndex = Ext . Array . indexOf ( me . f _recordIDs , record . id ) ;
modifiedRows . push ( {
index : - 1 ,
originalIndex : recordOriginalIndex + originalIndexPlus ,
id : record . getId ( ) ,
status : 'deleted'
} ) ;
} ) ;
// 结果按照 originalIndex 升序排序
return modifiedRows . sort ( function ( a , b ) { return a . originalIndex - b . originalIndex ; } ) ;
2015-05-19 14:45:47 +08:00
}
} ) ;
}
if ( Ext . tree . Panel ) {
Ext . override ( Ext . tree . Panel , {
f _loadData : function ( ) {
var datas = this . f _state [ 'F_Nodes' ] ;
var nodes = this . f _tranformData ( datas ) ;
var root = this . getRootNode ( ) ;
if ( root ) {
root . removeAll ( ) ;
}
this . setRootNode ( {
//id: this.id + '_root',
expanded : true ,
children : nodes
} ) ;
} ,
f _tranformData : function ( datas ) {
var that = this , i = 0 , nodes = [ ] ;
for ( i = 0 ; i < datas . length ; i ++ ) {
var data = datas [ i ] , node = { } ;
// 0 - Text
// 1 - Leaf
// 2 - NodeID
// 3 - Enabled
// 4 - EnableCheckBox
// 5 - Checked
// 6 - Expanded
// 7 - NavigateUrl
// 8 - Target
// 9 - href
// 10 - Icon
// 11 - IconUrl
// 12 - iconUrl
// 13 - ToolTip
// 14 - OnClientClick
// 15 - EnableClickEvent
// 16 - CommandName
// 17 - CommandArgument
// 18 - EnableCheckEvent
// 19 - EnableExpandEvent
// 20 - EnableCollapseEvent
2016-01-10 01:19:30 -05:00
// 21 - CssClass
// 22 - Nodes
2015-05-19 14:45:47 +08:00
node . text = data [ 0 ] ;
node . leaf = ! ! data [ 1 ] ;
node . id = data [ 2 ] ;
node . disabled = ! data [ 3 ] ;
if ( ! ! data [ 4 ] ) {
// node.checked === undefined, no checkbox
node . checked = ! ! data [ 5 ] ;
}
if ( ! data [ 1 ] ) {
node . expanded = ! ! data [ 6 ] ;
}
if ( data [ 9 ] ) {
node . href = data [ 9 ] ;
node . hrefTarget = data [ 8 ] ;
}
if ( data [ 12 ] ) {
node . icon = data [ 12 ] ;
}
node . qtip = data [ 13 ] ;
if ( data [ 14 ] ) {
node . f _clientclick = data [ 14 ] ;
}
node . f _enableclickevent = ! ! data [ 15 ] ;
node . f _commandname = data [ 16 ] ;
node . f _commandargument = data [ 17 ] ;
node . f _enablecheckevent = ! ! data [ 18 ] ;
node . f _enableexpandevent = ! ! data [ 19 ] ;
node . f _enablecollapseevent = ! ! data [ 20 ] ;
2016-01-10 01:19:30 -05:00
if ( data [ 21 ] ) {
node . cls = data [ 21 ] ;
}
2015-05-19 14:45:47 +08:00
2016-01-10 01:19:30 -05:00
if ( data [ 22 ] && data [ 22 ] . length > 0 ) {
node . children = that . f _tranformData ( data [ 22 ] ) ;
2015-05-19 14:45:47 +08:00
}
nodes . push ( node ) ;
}
return nodes ;
} ,
f _getExpandedNodes : function ( nodes ) {
var i = 0 , that = this , expandedNodes = [ ] ;
for ( ; i < nodes . length ; i ++ ) {
var node = nodes [ i ] ;
if ( node . isExpanded ( ) ) {
expandedNodes . push ( node . getId ( ) ) ;
}
if ( node . hasChildNodes ( ) ) {
expandedNodes = expandedNodes . concat ( that . f _getExpandedNodes ( node . childNodes ) ) ;
}
}
return expandedNodes ;
} ,
f _getCheckedNodes : function ( ) {
var checkedIDs = [ ] , checkedArray = this . getChecked ( ) ;
Ext . Array . each ( checkedArray , function ( node , index ) {
checkedIDs . push ( node . getId ( ) ) ;
} ) ;
return checkedIDs ;
} ,
f _getSelectedNodes : function ( ) {
var selectedNodeIDs = [ ] ;
var sm = this . getSelectionModel ( ) ;
if ( sm . getSelection ) {
var selection = sm . getSelection ( ) ;
Ext . Array . each ( selection , function ( node , index ) {
selectedNodeIDs . push ( node . getId ( ) ) ;
} ) ;
}
return selectedNodeIDs ;
} ,
f _selectNodes : function ( ) {
var nodeIDs = this . f _state [ 'SelectedNodeIDArray' ] || [ ] ;
var model = this . getSelectionModel ( ) , store = this . getStore ( ) , nodes = [ ] , node ;
Ext . Array . each ( nodeIDs , function ( nodeID , index ) {
node = store . getNodeById ( nodeID ) ;
if ( node ) {
nodes . push ( node ) ;
}
} ) ;
model . deselectAll ( true ) ;
model . select ( nodes ) ;
}
} ) ;
}
if ( Ext . PagingToolbar ) {
// We don't use this Class in current version.
Ext . override ( Ext . PagingToolbar , {
f _hideRefresh : function ( ) {
var index = this . items . indexOf ( this . refresh ) ;
this . items . get ( index - 1 ) . hide ( ) ;
this . refresh . hide ( ) ;
}
} ) ;
}
if ( Ext . tab . Panel ) {
Ext . override ( Ext . tab . Panel , {
f _autoPostBackTabsContains : function ( tabId ) {
var tabs = this . f _state [ 'F_AutoPostBackTabs' ] ;
return tabs . indexOf ( tabId ) !== - 1 ;
} ,
f _setActiveTab : function ( ) {
var tabIndex = this . f _state [ 'ActiveTabIndex' ] ;
this . setActiveTab ( tabIndex ) ;
} ,
f _getActiveTabIndex : function ( ) {
return this . items . indexOf ( this . getActiveTab ( ) ) ;
} ,
/ *
activateNextTab : function ( c ) {
if ( c == this . activeTab ) {
var next = this . stack . next ( ) ;
if ( next ) {
this . setActiveTab ( next ) ;
}
if ( next = this . items . find ( function ( t ) { return t . tabEl . style . display !== 'none' ; } ) ) {
// Find the first visible tab and set it active tab.
this . setActiveTab ( next ) ;
} else {
this . setActiveTab ( null ) ;
}
}
} ,
* /
hideTab : function ( tabId ) {
var tab = F ( tabId ) . tab ;
if ( tab ) {
tab . hide ( ) ;
}
} ,
showTab : function ( tabId ) {
var tab = F ( tabId ) . tab ;
if ( tab ) {
tab . show ( ) ;
}
} ,
addTab : function ( id , url , title , closable ) {
var options = {
'cls' : 'f-tab'
} , tab ;
if ( typeof ( id ) === 'string' ) {
Ext . apply ( options , {
'id' : id ,
'title' : title ,
'closable' : closable ,
'url' : url
} ) ;
} else {
// 如果id不是字符串, 则id为对象并且只有一个参数
Ext . apply ( options , id ) ;
}
tab = this . getTab ( options . id ) ;
if ( ! tab ) {
Ext . apply ( options , {
'f_dynamic_added_tab' : true ,
'html' : '<iframe id="' + options . id + '" name="' + options . id + '" src="' + options . url + '" frameborder="0" style="height:100%;width:100%;overflow:auto;"\></iframe\>'
} ) ;
tab = this . add ( options ) ;
}
this . setActiveTab ( tab ) ;
return tab ;
} ,
getTab : function ( tabId ) {
return F ( tabId ) ;
} ,
removeTab : function ( tabId ) {
this . remove ( tabId ) ;
}
} ) ;
}
if ( Ext . WindowManager ) {
Ext . override ( Ext . WindowManager , {
// 确保窗体的遮罩层覆盖整个窗口
getMaskBox : function ( ) {
this . mask . maskTarget = Ext . getBody ( ) ;
return this . callParent ( arguments ) ;
}
} ) ;
}
if ( Ext . window . Window ) {
Ext . override ( Ext . window . Window , {
/ *
hide : function ( ) {
this . callParent ( arguments ) ;
if ( this . modal ) {
Ext . select ( '.x-mask' ) . setStyle ( { top : 0 , left : 0 , width : '100%' , height : '100%' } ) ;
}
} ,
show : function ( ) {
this . callParent ( arguments ) ;
if ( this . modal ) {
Ext . select ( '.x-mask' ) . setStyle ( { top : 0 , left : 0 , width : '100%' , height : '100%' } ) ;
}
} ,
* /
// @private
onWindowResize : function ( ) {
var me = this ;
if ( me . maximized ) {
// 改变浏览器大小可以自动调整窗体控件的大小(窗体控件最大化时)
F . wnd . fixMaximize ( me ) ;
} else {
me . callParent ( ) ;
}
} ,
/ *
bof _hide : function ( ) {
this . f _hide ( ) ;
} ,
bof _hide _refresh : function ( ) {
this . f _hide _refresh ( ) ;
} ,
bof _hide _postback : function ( argument ) {
this . f _hide _postback ( argument ) ;
} ,
bof _show : function ( iframeUrl , windowTitle ) {
this . f _show ( iframeUrl , windowTitle ) ;
} ,
* /
f _setWidth : function ( ) {
var panel = F . wnd . getGhostPanel ( this ) ;
panel . setWidth ( this . f _state [ 'Width' ] ) ;
} ,
f _setHeight : function ( ) {
var panel = F . wnd . getGhostPanel ( this ) ;
panel . setHeight ( this . f _state [ 'Height' ] ) ;
} ,
f _setTitle : function ( ) {
var panel = F . wnd . getGhostPanel ( this ) ;
panel . setTitle ( this . f _state [ 'Title' ] ) ;
} ,
f _hide : function ( ) {
F . wnd . hide ( this , this . f _iframe , this . id + '_Hidden' ) ;
} ,
f _hide _refresh : function ( ) {
this . f _hide ( ) ;
window . location . reload ( ) ;
} ,
f _hide _postback : function ( argument ) {
var me = this ;
me . f _hide ( ) ;
if ( me . f _property _enable _ajax === false ) {
2016-01-10 01:19:30 -05:00
F . controlEnableAjax = false ;
2015-05-19 14:45:47 +08:00
}
// 如果argument为undefined, 则传入 __doPostBack 的 argument 应该为空字符串
argument = argument || '' ;
_ _doPostBack ( me . name , 'Close$' + argument ) ;
} ,
f _hide _executescript : function ( scripts ) {
var me = this ;
me . f _hide ( ) ;
if ( scripts ) {
with ( window ) {
new Function ( scripts ) ( ) ;
}
}
} ,
f _show : function ( iframeUrl , windowTitle , width , height ) {
var me = this ;
if ( typeof ( iframeUrl ) === 'undefined' ) {
iframeUrl = me . f _iframe _url ;
}
if ( typeof ( windowTitle ) === 'undefined' ) {
windowTitle = me . title ;
}
F . wnd . show ( me , iframeUrl , windowTitle , me . f _property _left , me . f _property _top , me . f _property _position , me . id + '_Hidden' , width , height ) ;
} ,
f _maximize : function ( ) {
F . wnd . maximize ( this ) ;
} ,
f _minimize : function ( ) {
F . wnd . minimize ( this ) ;
} ,
f _restore : function ( ) {
F . wnd . restore ( this ) ;
}
} ) ;
}
if ( Ext . grid . plugin . RowExpander ) {
Ext . override ( Ext . grid . plugin . RowExpander , {
// 将行扩展列的 td CSS类改为 x-grid-cell-row-expander
getHeaderConfig : function ( ) {
var config = this . callParent ( arguments ) ;
config . tdCls = Ext . baseCSSPrefix + 'grid-cell-row-expander' ;
return config ;
}
} ) ;
}
// 修正IE7下, 窗口出现滚动条时, 点击Window控件标题栏有时node为null的问题
/ *
if ( Ext . dd . DragDrop ) {
F . originalIsValidHandleChild = Ext . dd . DragDrop . prototype . isValidHandleChild ;
Ext . dd . DragDrop . prototype . isValidHandleChild = function ( node ) {
if ( ! node || ! node . nodeName ) {
return false ;
}
return F . originalIsValidHandleChild . apply ( this , [ node ] ) ;
} ;
}
* /
// 修正在IE下, Grid的模版列中出现文本输入框或者下拉列表时, 第一次不能选中的问题
// 已经有网友发现这个问题: http://www.sencha.com/forum/archive/index.php/t-49653.html
// This is what caused my self-rendered-Html-Elements to "flicker" as described in my other thread.
// The Dropdown receives the Click, opens and stays open for the Millisecond until
// Ext calls back and gives focus to the Cell, causing my Drop-Down to close again.
/ *
if ( Ext . grid . GridPanel ) {
Ext . grid . GridView . prototype . focusCell = function ( row , col , hscroll ) {
this . syncFocusEl ( this . ensureVisible ( row , col , hscroll ) ) ;
var focusEl = this . focusEl ;
focusEl . focus ( ) ;
} ;
}
* /
// 修正Chrome下多表头样式错位
// 增加 !Ext.isChrome 的判断, 在Chrome下DIV的宽度不包括边框的宽度
/ *
if ( Ext . ux . grid && Ext . ux . grid . ColumnHeaderGroup ) {
Ext . ux . grid . ColumnHeaderGroup . prototype . getGroupStyle = function ( group , gcol ) {
var width = 0 , hidden = true ;
for ( var i = gcol , len = gcol + group . colspan ; i < len ; i ++ ) {
if ( ! this . cm . isHidden ( i ) ) {
var cw = this . cm . getColumnWidth ( i ) ;
if ( typeof cw == 'number' ) {
width += cw ;
}
hidden = false ;
}
}
return {
width : ( Ext . isBorderBox || ( Ext . isWebKit && ! Ext . isSafari2 && ! Ext . isChrome ) ? width : Math . max ( width - this . borderWidth , 0 ) ) + 'px' ,
hidden : hidden
} ;
} ;
}
* /
2016-01-10 01:19:30 -05:00
2015-05-19 14:45:47 +08:00
( function ( ) {
2016-01-10 01:19:30 -05:00
// 修正IE7/IE8下Date.parse('2015-10-01')出错的问题
// http://jibbering.com/faq/#parseDate
2015-05-19 14:45:47 +08:00
function parseISO8601 ( dateStr ) {
var isoExp = /(\d{2,4})-(\d\d?)-(\d\d?)/ ,
date = new Date ( NaN ) , month ,
parts = isoExp . exec ( dateStr ) ;
if ( parts ) {
month = + parts [ 2 ] ;
date . setFullYear ( parts [ 1 ] , month - 1 , parts [ 3 ] ) ;
if ( month != date . getMonth ( ) + 1 ) {
date . setTime ( NaN ) ;
}
}
return date ;
}
var originalParse = Date . parse ;
Date . parse = function ( dateStr ) {
var date = originalParse ( dateStr ) ;
if ( isNaN ( date ) ) {
date = parseISO8601 ( dateStr ) ;
}
return date ;
}
2016-01-10 01:19:30 -05:00
if ( Ext . form . field . ComboBox ) {
var originalComboSetValue = Ext . form . field . ComboBox . prototype . setValue ;
Ext . form . field . ComboBox . prototype . setValue = function ( value , doSelect ) {
// value可能是数字( 可编辑单元格, 列的FieldType可能是Int)
if ( typeof ( value ) === 'number' || typeof ( value ) === 'boolean' ) {
value += '' ;
}
return originalComboSetValue . apply ( this , [ value , doSelect ] ) ;
} ;
}
2015-05-19 14:45:47 +08:00
} ) ( ) ;
2016-01-10 01:19:30 -05:00
2015-05-19 14:45:47 +08:00