2013-11-01 14:13:51 +08:00

1370 lines
43 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Ext.override(Ext.Component, {
x_setDisabled: function () {
this.setDisabled(!this.x_state['Enabled']);
},
x_setVisible: function () {
this.setVisible(!this.x_state['Hidden']);
}
});
// 验证一个表单是否有效,会递归查询表单中每个字段
// 如果表单隐藏或者字段隐藏,则不进行有效性校验
Ext.override(Ext.container.Container, {
x_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.items) {
var validResult = f.x_isValid();
if (!validResult[0]) {
valid = false;
if (firstInvalidField == null) {
firstInvalidField = validResult[1];
}
}
}
}
});
}
return [valid, firstInvalidField];
},
x_reset: function () {
this.items.each(function (f) {
if (f.isXType('field')) {
f.reset();
} else if (f.items) {
validResult = this.x_reset();
}
});
}
});
Ext.override(Ext.panel.Panel, {
x_setCollapse: function () {
var collapsed = this.x_state['Collapsed'];
if (collapsed) {
this.collapse();
} else {
this.expand();
}
},
x_isCollapsed: function () {
var collapsed = false;
var state = this.getState();
if (state && state.collapsed) {
collapsed = true;
}
return collapsed;
},
x_setTitle: function () {
this.setTitle(this.x_state['Title']);
}
});
Ext.override(Ext.form.FieldSet, {
x_setCollapse: function () {
var collapsed = this.x_state['Collapsed'];
if (collapsed) {
this.collapse();
} else {
this.expand();
}
},
x_isCollapsed: function () {
var collapsed = false;
var state = this.getState();
if (state && state.collapsed) {
collapsed = true;
}
return collapsed;
},
x_setTitle: function () {
this.setTitle(this.x_state['Title']);
}
});
if (Ext.menu.CheckItem) {
Ext.override(Ext.menu.CheckItem, {
x_setChecked: function () {
this.setChecked(this.x_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');
}),
*/
/* 这会导致在文本输入框中按回车键无法触发type=submit的表单回发事件
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();
}
},
*/
x_setValue: function (value) {
if (typeof (value) === 'undefined') {
value = this.x_state['Text'];
}
this.setValue(value);
},
x_setLabel: function (text) {
if (this.label && this.label.update) {
this.label.update(text || this.x_state['Label']);
}
}
});
}
if (Ext.form.field.Time) {
Ext.override(Ext.form.field.Time, {
// Time 继承自 ComboBox这个函数被覆盖了因此需要重新定义
x_setValue: function (value) {
if (typeof (value) === 'undefined') {
value = this.x_state['Text'];
}
this.setValue(value);
}
});
}
if (Ext.form.field.HtmlEditor) {
Ext.override(Ext.form.field.HtmlEditor, {
x_setValue: function (text) {
if (typeof (text) === 'undefined') {
text = this.x_state['Text'];
}
this.setValue(text);
}
});
}
if (Ext.form.field.Checkbox) {
Ext.override(Ext.form.field.Checkbox, {
x_setValue: function () {
this.setValue(this.x_state['Checked']);
}
});
}
if (Ext.form.RadioGroup) {
Ext.override(Ext.form.RadioGroup, {
x_setValue: function (value) {
value = value || this.x_state['SelectedValue'];
var selectedObj = {};
selectedObj[this.name] = value;
this.setValue(selectedObj);
//Ext.form.CheckboxGroup.prototype.x_setValue.apply(this, [value]);
}
});
}
if (Ext.form.CheckboxGroup) {
Ext.override(Ext.form.CheckboxGroup, {
x_reloadData: function (name, isradiogroup) {
var container = this.ownerCt;
var newConfig = Ext.apply(this.initialConfig, {
"x_state": this.x_state,
"items": X.util.resolveCheckBoxGroup(name, this.x_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);
}
}
},
/*
x_toBeDeleted: function () {
var tobedeleted = this.items.items[0];
if (tobedeleted && tobedeleted.inputValue === 'tobedeleted') {
tobedeleted.destroy();
this.items.remove(tobedeleted);
}
},
*/
// 选中项
x_setValue: function (values) {
// valueArray["value1", "value2", "value3"]
var values = values || this.x_state['SelectedValueArray'];
var selectedObj = {};
this.items.each(function (item) {
var itemSelected = false;
if (values.indexOf(item.inputValue) >= 0) {
itemSelected = true;
}
selectedObj[item.name] = itemSelected;
});
this.setValue(selectedObj);
},
// 返回 ["value1", "value2", "value3"]
x_getSelectedValues: function () {
var selectedValues = [];
var values = this.getValue();
Ext.Object.each(values, function (key, value) {
selectedValues.push(value);
});
return selectedValues;
}
});
}
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'] }),
x_setValue: function (value) {
// value 可以是空字符串
if (typeof (value) === 'undefined') {
value = this.x_state['SelectedValue'];
}
this.setValue(value);
},
x_loadData: function (data) {
data = data || this.x_state['X_Items'];
if (data) {
this.store.loadData(X.simulateTree.transform(data));
}
},
x_getTextByValue: function (value, data) {
data = data || this.x_state['X_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, {
x_setTooltip: function () {
this.setTooltip(this.x_state['ToolTip']);
},
x_toggle: function () {
this.toggle(this.x_state['Pressed']);
},
x_setText: function () {
this.setText(this.x_state['Text']);
}
});
}
if (Ext.grid.column.RowNumberer) {
X.originalRowNumbererRenderer = Ext.grid.column.RowNumberer.prototype.renderer;
Ext.override(Ext.grid.column.RowNumberer, {
renderer: function () {
var number = X.originalRowNumbererRenderer.apply(this, arguments);
if (this.x_paging) {
var pagingBar = X(this.x_paging_grid).x_getPaging();
if (pagingBar) {
number += pagingBar.x_pageIndex * pagingBar.x_pageSize;
}
}
return number;
}
});
}
/*
if (Ext.data.Store) {
Ext.override(Ext.data.Store, {
// true to clear all modified record information each time the store is loaded or when a record is removed (defaults to false).
pruneModifiedRecords: true
});
}
*/
if (Ext.grid.Panel) {
Ext.override(Ext.grid.Panel, {
x_getData: function () {
var $this = this, data = this.x_state['X_Rows']['Values'];
//////////////////////////////////////////////////
var tpls = this.x_getTpls(this.x_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, '');
});
// 不要改变 X_Rows -> Values 的原始数据因为这个值会被POST到后台
var newdata = [], newdataitem;
Ext.Array.each(data, function (row, rowIndex) {
newdataitem = [];
Ext.Array.each(row, function (item, index) {
if (item.substr(0, 7) === "#@TPL@#") {
var clientId = $this.id + '_' + item.substr(7);
newdataitem.push('<div id="' + clientId + '_container">' + tplsHash[clientId] + '</div>');
} else {
newdataitem.push(item);
}
});
newdata.push(newdataitem);
});
//////////////////////////////////////////////////
return newdata;
},
x_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;
},
x_updateTpls: function (tpls) {
tpls = this.x_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;
}
});
},
x_getPaging: function () {
var toolbar = this.getDockedItems('toolbar[dock="bottom"]');
return toolbar.length ? toolbar[0] : undefined;
},
x_loadData: function () {
var datas = this.x_getData();
var pagingBar = this.x_getPaging();
if (pagingBar) {
var pagingDatas = [];
if (pagingBar.x_databasePaging) {
pagingDatas = datas;
} else {
for (var i = pagingBar.x_startRowIndex; i <= pagingBar.x_endRowIndex; i++) {
pagingDatas.push(datas[i]);
}
}
datas = pagingDatas;
}
var store = this.getStore();
// 已经设置 Ext.data.Store 的 pruneModifiedRecords ,在重新加载数据时都会清除所有已经改变的数据
// 所以无需 rejectChanges
// 拒绝之前对表格的编辑,因为接下来就要重新加载数据
//store.rejectChanges();
// 重新加载数据前清空之前的改变
//this.x_newAddedRows = [];
//this.x_deletedRows = [];
store.loadData(datas);
this.x_initRecordIDs();
},
// 初始化所有记录的ID列表
x_initRecordIDs: function () {
var $this = this;
this.x_recordIDs = [];
this.getStore().each(function (record, index) {
$this.x_recordIDs.push(record.id);
});
},
// 展开所有的行扩展列
x_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);
}
}
}
},
// 隐藏所有的行扩展列
x_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下允许选中表格中的文本
/*
x_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');
}
},
*/
// 获取选中的行数,或者单元格数(单元格编辑模式)
x_getSelectedCount: function () {
var selectedCount = 0;
var sm = this.getSelectionModel();
if (sm.hasSelection()) {
if (sm.getCount) {
selectedCount = sm.getCount();
} else {
// 单元格编辑模式,只可能选中一个单元格
selectedCount = 1;
}
}
return selectedCount;
},
// 选中某些行
x_selectRows: function (rows) {
rows = rows || this.x_state['SelectedRowIndexArray'] || [];
var sm = this.getSelectionModel();
if (sm.select) {
sm.deselectAll(true);
Ext.Array.each(rows, function (row, index) {
// select( records, [keepExisting], [suppressEvent] )
sm.select(row, true, true);
});
}
},
// 选中全部行
x_selectAllRows: function() {
var sm = this.getSelectionModel();
if (sm.selectAll) {
sm.selectAll(true);
}
},
// 获取选中的行
x_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;
},
// 选中单元格AllowCellEditing
x_selectCell: function (cell) {
cell = cell || this.x_state['SelectedCell'] || [];
var sm = this.getSelectionModel();
if (sm.select) {
if (cell.length === 2) {
sm.select(cell[0], cell[1]);
} else {
sm.clearSelections();
}
}
},
// 获取选中的单元格AllowCellEditing
x_getSelectedCell: function () {
var selectedCell = [];
var sm = this.getSelectionModel();
if (sm.getSelectedCell) {
selectedCell = sm.getSelectedCell();
if (!selectedCell) {
selectedCell = [];
}
}
return selectedCell;
},
// 获取隐藏列的名称列表
x_getHiddenColumns: function () {
var hiddens = [], columns = this.columns;
Ext.Array.each(columns, function (column, index) {
if (column.isHidden()) {
hiddens.push(column.id);
}
});
return hiddens;
},
// 隐藏需要隐藏的列,显示不需要隐藏的列
x_updateColumnsHiddenStatus: function (hiddens) {
hiddens = hiddens || this.x_state['HiddenColumns'] || [];
var columns = this.columns;
Ext.Array.each(columns, function (column, index) {
if (hiddens.indexOf(column.id) !== -1) {
column.setVisible(false);
} else {
column.setVisible(true);
}
});
},
// 初始化排序列头
x_initSortHeaders: function() {
var gridEl = Ext.get(this.id), columns = this.x_getColumns();
// 为所有可排序列添加手型光标
Ext.Array.each(columns, function (item, index) {
if (item['sortable']) {
Ext.get(item.id).addCls('cursor-pointer');
}
});
},
// 设置表格标题栏的排序图标
x_setSortIcon: function (sortColumnID, sortDirection) {
var gridEl = Ext.get(this.id), columns = this.x_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());
}
},
// 获取表格列
x_getColumns: function () {
/*
var columns = [];
var configColumns = this.getColumnModel().config;
Ext.Array.each(configColumns, function (item, index) {
// expander也属于表格列的一种类型否则设置x_setSortIcon会出错
if (item.id !== 'numberer' && item.id !== 'checker') { // && item.id !== 'expander'
columns.push(item);
}
});
*/
return this.columns;
},
// 这个方法用不到了现在对States的更新会导致Values的改变进而促使表格的重新加载
/*
x_setRowStates: function (states) {
var gridEl = Ext.get(this.id), columns = this.x_getColumns(), states = states || this.x_state['X_States'] || [];
function setCheckBoxStates(columnIndex, stateColumnIndex) {
var checkboxRows = gridEl.select('.x-grid-body .x-grid-row .x-grid-td-' + columns[columnIndex].id + ' .box-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['x_persistState']) {
if (column['x_persistStateType'] === 'checkbox') {
setCheckBoxStates(index, stateColumnIndex);
stateColumnIndex++;
}
}
});
},
*/
// 获取列状态目前只有CheckBoxField用到
x_getStates: function () {
var gridEl = Ext.get(this.id), columns = this.x_getColumns(), states = [];
function getCheckBoxStates(columnIndex) {
var checkboxRows = gridEl.select('.x-grid-row .x-grid-cell-' + columns[columnIndex].id + ' .box-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['x_persistState']) {
if (column['x_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;
},
// 提交客户端改变
x_commitChanges: function () {
this.getStore().commitChanges();
//this.x_newAddedRows = [];
//this.x_deletedRows = [];
this.x_initRecordIDs();
},
// 从Store中删除选中的行或者单元格
x_deleteSelected: function () {
var $this = this;
var store = this.getStore();
var sm = this.getSelectionModel();
if (sm.getSelections) {
var selections = sm.getSelections();
Ext.Array.each(selections, function (record, index) {
store.remove(record);
});
} else if (sm.getSelectedCell) {
var selectedCell = sm.getSelectedCell();
store.removeAt(selectedCell[0]);
}
},
// 添加一条新纪录
x_addNewRecord: function (defaultObj, appendToEnd) {
var i, count, store = this.getStore();
var recordType = store.recordType;
var newRecord = new recordType(defaultObj);
this.stopEditing();
if (appendToEnd) {
store.add(newRecord);
// 新增客户端改变的行索引
//this.x_newAddedRows.push(store.getCount() - 1);
} else {
store.insert(0, newRecord);
// 新增客户端改变的行索引
//for (i = 0, count = this.x_newAddedRows.length; i < count; i++) {
// this.x_newAddedRows[i]++;
//}
//this.x_newAddedRows.push(0);
}
this.startEditing(0, 0);
},
// 获取新增的行索引(在修改后的列表中)
x_getNewAddedRows: function () {
var $this = this;
var newAddedRows = [];
this.getStore().each(function (record, index) {
if ($this.x_recordIDs.indexOf(record.id) < 0) {
newAddedRows.push(index);
}
});
return newAddedRows;
},
// 获取删除的行索引(在原始的列表中)
x_getDeletedRows: function () {
var currentRecordIDs = [], deletedRows = [];
this.getStore().each(function (record, index) {
currentRecordIDs.push(record.id);
});
// 快速判断是否存在行被删除的情况
if (currentRecordIDs.join('') === this.x_recordIDs.join('')) {
return deletedRows;
}
Ext.Array.each(this.x_recordIDs, function (recordID, index) {
if (currentRecordIDs.indexOf(recordID) < 0) {
deletedRows.push(index);
}
});
return deletedRows;
},
// 获取用户修改的单元格值
x_getModifiedData: function () {
var i, j, count, columns = this.x_getColumns(), columnMap = {};
Ext.Array.each(columns, function (column, index) {
columnMap[column.id] = column;
});
function checkColumnEditable(columnID) {
var column = columnMap[columnID];
if (column && (column.editor || column.xtype === 'checkcolumn')) {
return true;
}
return false;
}
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 = this.x_recordIDs.indexOf(recordID);
if (rowIndexOriginal < 0) {
// 删除那些不能编辑的列
for (var columnID in rowData) {
if (!checkColumnEditable(columnID)) {
delete rowData[columnID];
}
}
// 新增数据行
modifiedRows.push([rowIndex, -1, rowData]);
} else {
var rowModifiedObj = {};
for (var columnID in modifiedRecord.modified) {
if (checkColumnEditable(columnID)) {
newData = rowData[columnID];
rowModifiedObj[columnID] = newData;
}
}
// 修改现有数据行
modifiedRows.push([rowIndex, rowIndexOriginal, rowModifiedObj]);
}
}
// 结果按照 rowIndex 升序排序
return modifiedRows.sort(function (a, b) { return a[0] - b[0]; });
}
});
}
if (Ext.tree.Panel) {
Ext.override(Ext.tree.Panel, {
x_loadData: function () {
var datas = this.x_state['X_Nodes'];
var nodes = this.x_tranformData(datas);
var root = this.getRootNode();
if (root) {
root.removeAll();
}
this.setRootNode({
//id: this.id + '_root',
expanded: true,
children: nodes
});
},
x_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 - EnablePostBack
// 16 - AutoPostBack
// 17 - CommandName
// 18 - CommandArgument
// 19 - Nodes
node.text = data[0];
node.leaf = !!data[1];
node.id = data[2];
node.disabled = !data[3];
if (!!data[4]) {
node.checked = !!data[5];
if (!!data[16]) {
node.x_autopostback = true;
}
}
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.x_clientclick = data[14];
}
node.x_enablepostback = !!data[15];
node.x_commandname = data[17];
node.x_commandargument = data[18];
if (data[19] && data[19].length > 0) {
node.children = that.x_tranformData(data[19]);
}
/*
node.listeners = {};
if (!data[3]) {
node.listeners.beforeclick = function () {
return false;
};
}
if (!!data[4] && !!data[17]) {
node.listeners.checkchange = function (node, checked) {
var args = 'Check$' + node.id + '$' + checked;
__doPostBack(that.name, args);
};
}
var clickScript = '';
if (data[15]) {
clickScript += data[15] + ';';
}
if (!!data[16]) {
clickScript += "__doPostBack('" + that.name + "', 'Command$" + node.id + "$" + data[18] + "$" + data[19] + "');";
}
if (clickScript) {
node.listeners.click = new Function('node', clickScript);
}
if (data[20] && data[20].length > 0) {
node.children = that.x_tranformData(data[20]);
}
*/
nodes.push(node);
}
return nodes;
},
x_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.x_getExpandedNodes(node.childNodes));
}
}
return expandedNodes;
},
x_getCheckedNodes: function () {
var checkedIDs = [], checkedArray = this.getChecked();
Ext.Array.each(checkedArray, function (node, index) {
checkedIDs.push(node.getId());
});
return checkedIDs;
},
x_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;
},
x_selectNodes: function () {
var nodeIDs = this.x_state['SelectedNodeIDArray'] || [];
var model = this.getSelectionModel(), store = this.getStore(), nodes = [];
Ext.Array.each(nodeIDs, function (nodeID, index) {
nodes.push(store.getNodeById(nodeID));
});
model.deselectAll(true);
model.select(nodes);
}
});
}
if (Ext.PagingToolbar) {
// We don't use this Class in current version.
Ext.override(Ext.PagingToolbar, {
x_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, {
x_autoPostBackTabsContains: function (tabId) {
var tabs = this.x_state['X_AutoPostBackTabs'];
return tabs.indexOf(tabId) !== -1;
},
x_setActiveTab: function () {
var tabIndex = this.x_state['ActiveTabIndex'];
this.setActiveTab(tabIndex);
},
x_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 = X(tabId).tab;
if (tab) {
tab.hide();
}
},
showTab: function (tabId) {
var tab = X(tabId).tab;
if (tab) {
tab.show();
}
},
addTab: function (id, url, title, closable) {
var options = {};
if (typeof (id) === 'string') {
Ext.apply(options, {
'id': id,
'title': title,
'closable': closable,
'url': url
});
} else {
// 如果id不是字符串则id为对象并且只有一个参数
Ext.apply(options, id);
}
Ext.apply(options, {
'x_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\>'
});
var tab = this.add(options);
this.setActiveTab(tab);
return tab;
},
getTab: function (tabId) {
return X(tabId);
},
removeTab: function (tabId) {
this.remove(tabId);
}
});
}
if (Ext.Window) {
Ext.override(Ext.Window, {
// 此函数为了兼容考虑,请使用 x_hide 函数
box_hide: function () {
this.x_hide();
},
box_hide_refresh: function () {
this.x_hide_refresh();
},
box_hide_postback: function (argument) {
this.x_hide_postback(argument);
},
box_show: function (iframeUrl, windowTitle) {
this.x_show(iframeUrl, windowTitle);
},
x_hide: function () {
X.wnd.hide(this, this.x_property_target, this.x_iframe, this.id + '_Hidden', this.x_property_guid);
},
x_hide_refresh: function () {
this.x_hide();
window.location.reload();
},
x_hide_postback: function (argument) {
// 如果argument为undefined则传入__doPostBack应为空字符串
argument = argument || '';
this.x_hide();
__doPostBack(this.name, argument);
},
x_show: function (iframeUrl, windowTitle) {
X.wnd.show(this, iframeUrl, windowTitle, this.x_property_left, this.x_property_top, this.x_property_position, this.id + '_Hidden');
},
x_maximize: function () {
X.wnd.maximize(this, this.x_property_target, this.x_property_guid);
},
x_minimize: function () {
X.wnd.minimize(this, this.x_property_target, this.x_property_guid);
},
x_restore: function () {
X.wnd.restore(this, this.x_property_target, this.x_property_guid);
}
});
}
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) {
X.originalIsValidHandleChild = Ext.dd.DragDrop.prototype.isValidHandleChild;
Ext.dd.DragDrop.prototype.isValidHandleChild = function (node) {
if (!node || !node.nodeName) {
return false;
}
return X.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
};
};
}
*/
// 修正IE7/IE8下Date.parse('2015-10-01')出错的问题
// http://jibbering.com/faq/#parseDate
/*
(function () {
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;
}
})();
*/