You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

906 lines
28 KiB

4 years ago
define(['system/views/pages/page', 'text!./pagecnt.tpl'], function (BasePage, template) {
let PAGE_STATE = ['ONE', 'MULTI'];
/**
* 列表页类定义
* @param id
* @param node 节点信息
* @constructor
*/
function Page(id, node, biz) {
let self = this;
//通过绑定控制界面显示
self.opts = {
showWest: true,
showEast: true,
showNorth: true,
showSouth: false,
showDetail: false,
showTree: false,
treeTitle: '',
header: '加载中……',
body: '加载中……',
footer: '加载中……'
};
self.pageState = PAGE_STATE[1]
//网格列表
self.grids = [];
self.showChild = false;
//继承Page类构造函数
BasePage.call(self, id, node, template, self.opts, biz);
//挂载业务状态事件
if (self.biz) {
self.biz.on('onStateChanged', function (s, e) {
if (s.isEdit()) {
self.toDetail();
}
});
}
}
//继承Page类方法
// Page.prototype = new BasePage();
inherits(Page, BasePage);
/**
* Override
* 界面显示后
*/
Page.prototype.initCompleted = function () {
this.super('initCompleted');
let $detailPanel = this.getElement('.edp-page .page-body-south');
let self = this;
$detailPanel.panel({
onResize: function (w, h) {
self.resizeGrid($detailPanel);
}
});
$(window).resize(function () {
setTimeout(function(){
let tabId = Store.tabPrefix + self.node.id;
self.$container = $('#' + tabId)
self.$layout = self.getElement('.easyui-layout');
self.resize();
}, 100);
});
//if (self.node.addonWhere) {
// _.extend(self.biz.dsMaster.fixQuery, self.node.addonWhere);
// self.biz.opRouter("refresh");
//}
//this.getElement('#detail-tab').children().first().tabs('disableTab', 2);
$('#detail-tab').children().first().tabs('disableTab', 2);
$('#detail-tab').children().first().tabs('disableTab', 3);
$('#detail-tab').children().first().tabs('disableTab', 4);
$('#detail-tab').children().first().tabs('disableTab', 5);
$('#detail-tab').children().first().tabs('disableTab', 6);
$('#detail-tab').children().first().tabs('disableTab', 8);
$('#detail-tab').children().first().tabs('disableTab', 9);
$('#detail-tab').children().first().tabs('disableTab', 10);
$('#detail-tab').children().first().tabs('disableTab', 11);
$('#detail-tab').children().first().tabs('disableTab', 12);
$('#detail-tab').children().first().tabs('disableTab', 13);
$('#detail-tab').children().first().tabs('disableTab', 14);
}
/**
* Override
* 用于初始化界面
* @return
*/
Page.prototype.init = function () {
this.fillHeader(); //工具栏
this.fillBody(); //数据区
this.fillFooter(); //页脚
this.fillMenu(); //附加菜单
};
/**
* PageAll分为上中下左右五部分
* 此处是上-工具栏
*/
Page.prototype.fillHeader = function () {
let self = this,
tpl = '<div class="page-widget-toolbar" ms-widget="toolbar, $, {0}" ></div>';
//注册工具条
let mainToolBar = {
opts: {
listBtn: {
disable: true
}
},
data: self.biz,
actions: {
click: function (opCode) {
//如果界面没有执行操作,则执行业务
self.opRouter(opCode);
}
}
};
self.register('toolbar', 'toolbar_main', mainToolBar);
self.opts.header = Store.format(tpl, 'toolbar_main');
};
/**
* PageAll分为上中下左右五部分
* 此处是中-数据区
*/
Page.prototype.fillBody = function () {
let self = this,
dsMaster = self.biz.dsMaster;
let $body = $('<div class="easyui-layout page-body" data-options="fit:true" >');
let treeTitle = self.biz.getTreeTitle()
if (treeTitle !== null && treeTitle != undefined) {
//树模块
let $treediv = $('<div class="page-body-west" data-options="region:\'west\',split:true,collapsible:false,title:\'' + treeTitle + '\'">')
.append(self.getTree());
$body.append($treediv)
}
//表格 & 编辑面板
let $centerdiv = $('<div class="page-body-center" data-options="region:\'center\',split:true">')
.append(self.getMainGrid())
.append(self.getMainEditPanel())
.append(self.getMiddlePanel());
//查询组件
let $northdiv = $('<div class="page-body-north" data-options="region:\'north\',split:true">')
.append(self.getQueryPanel());
$body.append($centerdiv).append($northdiv);
//明细部分
let $detail = $('<div class="page-body-south" data-options="region:\'south\',split:true">')
.append($(self.createTab(dsMaster)).attr('id', 'detail-tab'));
$body.append($detail);
self.opts.body = $body[0].outerHTML;
};
/**
* PageAll分为上中下左右五部分
* 此处是中-页脚
*/
Page.prototype.fillFooter = function () {
};
/**
* 上下文菜单
*/
Page.prototype.fillMenu = function () {
let self = this;
//明细菜单
let menu = {
actions: {
onItemClick: function (opCode, ds, adapter) {
self.opRouter.apply(self, arguments);
},
bind: function (fn) {
self.grids.forEach(function (gd) {
if (self.vm[gd]) {
self.vm[gd].addContextMenu(fn);
}
});
}
}
};
self.register('contextmenu', 'mainmenu', menu);
};
/********************生成组件*********************************/
/**
* Widget-Tree
*/
Page.prototype.getTree = function () {
let self = this,
dsMaster = self.biz.dsMaster,
treeName = 'tree_' + dsMaster.name,
tpl = '<div class="page-widget-tree" ms-widget="tree, $, {0}" >加载中……</div>';
//注册树组件
let treeArgs = {
actions: {
onClick: function (event, treeNode) {
let moduleCode = treeNode.value;
let colName = treeNode.colName;
self.biz.treeSelected(moduleCode, colName, treeNode);
}
}
};
self.register('tree', treeName, treeArgs);
return Store.format(tpl, treeName);
};
/**
* Widget-Master-Grid
*/
Page.prototype.getMainGrid = function () {
let self = this,
dsMaster = self.biz.dsMaster,
gridName = 'grid_' + dsMaster.name,
tpl = '<div class="page-widget-grid" ms-visible="!layout.showDetail" ms-widget="grid, $,' +
' {0}">加载中……</div>';
//注册主表表格
let mainGrid = {
opts: {
editable: false,
pageSize: self.biz.funcRes.pageSize ? parseInt(self.biz.funcRes.pageSize) : Store.gloablPageSize,
showCheckColumn: dsMaster.isShowSelCol,
showDelColumn:false
},
data: dsMaster,
actions: {
onDblClick: function (e, args) {
self.doOp('view');
},
activeCellChanged: function (e, args) {
self.checkCurrent(args.grid, dsMaster);
}
}
}
self.register('grid', gridName, mainGrid);
self.grids.push(gridName);
return Store.format(tpl, gridName);
};
/**
* Widget-Master-EditPanel
*/
Page.prototype.getMainEditPanel = function () {
let self = this,
dsMaster = self.biz.dsMaster,
panleName = 'ep_' + dsMaster.name,
tpl = '<div id="master-editpanel" class="page-widget-editpanel" ms-visible="layout.showDetail" ms-widget="editpanel, $, {0}"></div>';
//注册编辑面板
let args = {
data: dsMaster,
opts: {
showSettingBtn: '0'
},
//TODO 添加last panel enter action
actions: {
onLastPanelEneterd: function () {
let gridName = 'grid_' + self.biz.dsMaster.getDetails()[0].name;
if (self.vm[gridName].actions.onActiveFirstCell) {
self.vm[gridName].actions.onActiveFirstCell();
}
}
}
};
self.register('editpanel', panleName, args);
return Store.format(tpl, panleName);
};
/* *
* Middle self fill panel
*/
Page.prototype.getMiddlePanel = function() {
let middlePanel = this.biz.middlePanel;
if (!middlePanel || !middlePanel.show) return '';
let height = middlePanel.height || 60;
let tpl = '<div class="Store-page-middle-section" ms-visible="layout.showDetail" style="width: 100%;border-top: 1px solid transparent;height: '+height+'px;display: none;">'+
middlePanel.content + '</div>';
return tpl;
};
/*
* 设置middlePanel内容
*/
Page.prototype.setMiddlePanel = function() {
let el = this.getElement('.edp-page-middle-section');
el.html(this.biz.middlePanel.content);
el.height(this.biz.middlePanel.height);
};
/*
* 控制middlepanel的显示与隐藏
*/
Page.prototype.showMiddlePanel = function(show) {
let el = this.getElement('.edp-page-middle-section');
if (show) {
el.show();
} else {
el.hide();
}
this.resize();
};
/**
* Widget-QueryPanel
*/
Page.prototype.getQueryPanel = function () {
let self = this,
dsMaster = self.biz.dsMaster,
qpName = 'qp_' + dsMaster.name,
tpl = '<div class="page-widget-querypanel" ms-widget="querypanel, $, {0}"></div>';
//注册查询组件
let queryPanel = {
source: dsMaster,
opts: {
showSettingBtn: '0'
},
data: self.biz.funcQueryProject,
//data: dsMaster,
actions: {
querySchemeChanged: function () {
if (!self.$layout) return;
self.resize();
}
}
};
self.register('querypanel', qpName, queryPanel);
return Store.format(tpl, qpName);
};
/**
* Widget-TabControl
* @param ds
* @returns {string}
*/
Page.prototype.createTab = function (ds) {
let tabs = [],
self = this,
tpl = '<div class="page-widget-tab" ms-widget="tabs, $, {0}">加载中……</div>';
//生成tab
let tabName = 'tab_' + ds.name;
let details = ds.getDetails();
if (details.length > 0) {
for (let i = 0, len = details.length; i < len; i++) {
let d = details[i];
if (!d.isShow) {
continue;
}
tabs.push(self.createTabItem(d));
}
if (tabs.length == 0) {
return '';
}
if (ds == self.biz.dsMaster) {
self.hasChild = true;
}
let tabsArgs = {
opts: {},
data: {
tabs: tabs
},
actions: {
onAddClick: function () {
let row = self.vm[tabName].getSelectedTabData();
//只有满足三个条件才能增加新行
//1、编辑状态
//2、数据源允许新增
//3、当前行为空或者当前行提交成功
if (self.biz.isEdit() &&
row.dataSrc.allowInsert &&
(!row.dataSrc.currentRow || row.dataSrc.currentRow.validate())) {
row.dataSrc.addRow();
}
},
onDeleteClick: function () {
let row = self.vm[tabName].getSelectedTabData();
//只有满足三个条件才能增加删行
//1、编辑状态
//2、数据源允许删除
//3、当前行为不为空
self.biz.columnDeleteButtonClick(row);
},
onClearClick: function () {
let row = self.vm[tabName].getSelectedTabData();
//只有满足二个条件才能增加删行
//1、编辑状态
//2、数据源允许删除
if (self.biz.isEdit() &&
row.dataSrc.allowDel) {
Store.messager.confirm(Store.MSG.DELETEALL_CONFIRM, function (isOk) {
if (isOk) {
row.dataSrc.deleteAll();
}
});
}
}
}
};
self.register('tabs', tabName, tabsArgs);
return Store.format(tpl, tabName);
}
return '';
}
/**
* Widget-TabItem
* @param ds
* @returns {{title: *, content: string, closable: boolean, iconCls: string, dataSrc: *}}
*/
Page.prototype.createTabItem = function (ds) {
let self = this;
//生成标签
let tabOpts = {
title: ds.uiObjName,
content: '',
closable: false,
iconCls: 'icon-window',
dataSrc: ds
};
let $divTabItem = $('<div class="page-tabitem"></div>');
if(ds.name === 'dsDetailBd') {
let $headdiv = $('<div class="page-tabitem-half"></div>')
.append(self.getDetailEditPanel(ds)).append($('<div id="bdDesc" class="page-tabitem">'+
'通常情况下,不足月时保底按整月进行处理;如果不足月时保底不按整月进行处理,则需要设置该月的保底明细。<br/>'+
'结算对账时,优先使用合同中设置的保底明细,如果该结算期间没有设置保底明细,则取 保底额/保底月数 作为该月的保底额。</div>'));
$divTabItem.append($headdiv);
//$divTabItem.append($divDetail);
}else {
let details = self.getViewDetails(ds);
if (details.length > 0) {
//分上中下三部分
let $divHead = $('<div class="page-tabitem-half"></div>')
.append(self.getDetailGrid(ds));
let $divDetail = $('<div class="page-tabitem-half"></div>')
.append('<div class="page-tabitem-sep"></div>')
.append(self.createTab(ds));
//组合到div
$divTabItem.append($divHead);
$divTabItem.append($divDetail);
} else {
let $headdiv = $('<div class="page-tabitem-full"></div>')
.append(self.getDetailGrid(ds));
$divTabItem.append($headdiv);
}
}
tabOpts.content = $divTabItem[0].outerHTML;
return tabOpts;
}
Page.prototype.getDetailEditPanel = function (ds) {
let self = this,
panleName = 'ep_' + ds.name,
tpl = '<div class="page-widget-editpanel" ms-widget="editpanel, $, {0}"></div>';
//注册编辑面板
let args = {
data: ds,
opts: {
showSettingBtn: '0'
},
//TODO 添加last panel enter action
actions: {
onLastPanelEneterd: function () {
let gridName = 'grid_' + self.biz.dsMaster.getDetails()[0].name;
if (self.vm[gridName].actions.onActiveFirstCell) {
self.vm[gridName].actions.onActiveFirstCell();
}
}
}
};
self.register('editpanel', panleName, args);
return Store.format(tpl, panleName);
};
/**
* Widget-Detail-Grid
* @param ds
*/
Page.prototype.getDetailGrid = function (ds) {
let gridName = 'grid_' + ds.name,
self = this,
tpl = '<div class="page-widget-grid" ms-widget="grid, $, {0}">加载中……</div>';
//注册网格
let gridArgs = {
opts: {
editable: false,
// enableAddRow: true,
enablePager: false,
showCheckColumn: ds.isShowSelCol,
showDelColumn:true
},
data: ds,
actions: {
activeCellChanged: function (e, args) {
self.checkCurrent(args.grid, ds);
},
onColumndeleteButtonClick: function(row) {
self.biz.columnDeleteButtonClick(row);
}
}
}
self.register('grid', gridName, gridArgs);
ds.on('onCurrentChanged', self.loadDetailDetail);
self.grids.push(gridName);
return Store.format(tpl, gridName);
};
Page.prototype.loadDetailDetail = function (ds, args) {
let relations = ds.getDetailRelations();
for (let i = 0; relations.length > i; i++) {
let r = relations[i];
//如果旧行不为空,则保存数据
if (args.oldRow) {
args.oldRow[r.detail.name] = r.detail.snapData();
r.updateRelationValue(args.oldRow);
}
//如果新行不为空,检查是否有明细数据,有则填充,无则通过服务器获取
//如果新行为空,则只清空明细
if (args.newRow) {
let rowData = args.newRow[r.detail.name];
if (rowData) {
r.detail.resetData(rowData);
delete args.newRow[r.detail.name];
continue;
} else {
r.detail.searchByMaster(ds.currentRow);
}
} else {
r.detail.clear();
}
}
};
Page.prototype.getViewDetails = function (ds) {
let details = ds.getDetails(),
result = [];
for (let i = 0, len = details.length; i < len; i++) {
let d = details[i];
if (d.isShow) {
result.push(d);
}
}
return result;
};
/***********调用Biz方法********************/
/**
* 更新业务类是否显示明细
* @return
*/
Page.prototype.bizShowDetail = function (value) {
this.biz.setShowDetail(value);
};
Page.prototype.bizLoadDetails = function () {
this.biz.loadDetails();
}
Page.prototype.bizUpdateCurrent = function () {
this.biz.dsMaster.updateRow();
// this.biz.loadDetails();
}
/**
* 界面按钮操作无需业务处理
* @param {[type]} opCode [description]
* @return {String} 是否执行过业务操作
*/
Page.prototype.doOp = function (opCode) {
let self = this;
let isHandled = false;
switch (opCode) {
case 'detail':
self.toDetail();
self.bizLoadDetails();
isHandled = true;
break;
case 'list':
this.toList();
isHandled = true;
break;
case 'refresh':
if (this.isDetail()) {
this.bizUpdateCurrent();
isHandled = true;
}
break;
case 'child':
this.toggleShowChild();
break;
case 'view':
if (self.isDetail()) {
this.toList();
isHandled = true;
} else {
self.toDetail();
self.bizLoadDetails();
isHandled = true;
}
break;
}
return isHandled;
};
/**
* 检查当前行是否改变如果改变则通知业务类和更新当前行
* @param {[type]} grid [description]
* @param {[type]} dataSrc [description]
* @return {[type]} [description]
*/
Page.prototype.checkCurrent = function (grid, dataSrc) {
let cell = grid.getActiveCell();
if (cell) {
let dataRow = grid.getDataItem(cell.row);
if (dataRow !== dataSrc.currentRow) {
let oldRow = dataSrc.currentRow;
dataSrc.setCurrentRow(dataRow);
}
} else {
if (dataSrc.currentRow !== null) {
dataSrc.setCurrentRow(null);
}
}
};
Page.prototype.setLayoutState = function (newState) {
let self = this;
this.pageState = newState;
self.opts.showDetail = newState === PAGE_STATE[0];
self.setShowChild(newState === PAGE_STATE[0]);
self.updateOpEnable(false);
self.resize();
};
Page.prototype.setShowChild = function (value) {
let self = this;
self.showChild = value && self.hasChild;
//兼容问题Biz使用showDetail表示是否显示明细
self.bizShowDetail(value);
};
/**
* 切换到查询列表页,只有按钮才会使用
* @return {[type]} [description]
*/
Page.prototype.toList = function () {
this.setLayoutState(PAGE_STATE[1]);
};
/**
* 切换到详情页-编辑界面
* @return {[type]} [description]
*/
Page.prototype.toDetail = function () {
this.setLayoutState(PAGE_STATE[0]);
};
Page.prototype.hideBodyPanel = function (region) {
let $body = this.getElement('.edp-page .page-body')
if (!$body || $body.length === 0) {
return
}
let $region = $body.layout('panel', region);
if ($region) {
$region.panel('close');
}
}
Page.prototype.showBodyPanel = function (region) {
let $body = this.getElement('.edp-page .page-body')
if (!$body || $body.length === 0) {
return
}
let $region = $body.layout('panel', region);
if ($region) {
$region.panel('open');
}
}
Page.prototype.resize = function () {
let self = this,
$body = self.getElement('.edp-page .page-body');
if (self.pageState == PAGE_STATE[1]) {
self.showBodyPanel('north');
self.showBodyPanel('west');
//$body.layout('resize');//重新計算Layout大小
let h1 = self.getElement('.query-panel-wrapper').height();
h1 += 10
h1 = h1 > 200 ? 200 : h1;
self.getElement('.edp-page .page-body-north').panel('resize', {
height: h1
});
if (h1 === 200) {
$('.edp-page .page-body-north').css('overflow', 'auto');
} else {
$('.edp-page .page-body-north').css('overflow', 'hidden');
}
if (self.showChild) {
self.showBodyPanel('south');
let h = $body.height();
let h2 = h - h1;
self.getElement('.edp-page .page-body-south ').panel('resize', {
height: h2 / 2
});
} else {
self.hideBodyPanel('south');
}
self.vm.toolbar_main.setText('view', Store.MSG.VIEW);
self.vm.toolbar_main.invoke('setIcon', 'view', 'icon-view');
}
if (self.pageState == PAGE_STATE[0]) {
self.hideBodyPanel('north');
self.hideBodyPanel('west');
if (self.showChild) {
$body.layout('resize');//重新計算Layout大小
let h1 = self.getElement('.edp-page .page-body-center .filed-group').height();
let h2 = self.getElement('.edp-page .page-body-center .edp-page-middle-section').height();
let h = $body.height();
if (!h2) {
if (h < h1) {
h1 = h / 2;
} else {
h1 = h1 > 200 ? 200 : h1;
}
} else {
h1 += h2 + 5;
}
self.showBodyPanel('south');
self.getElement('.edp-page .page-body-south').panel('resize', {
height: h - h1
});
} else {
self.hideBodyPanel('south');
}
self.vm.toolbar_main.setText('view', Store.MSG.BACK);
self.vm.toolbar_main.invoke('setIcon', 'view', 'icon-undo');
}
$body.layout('resize');
self.updateGrids();
}
Page.prototype.updateGrids = function () {
let self = this;
//重置grid
self.resizeGrid(self.$layout);
};
Page.prototype.toggleShowChild = function () {
let self = this;
self.setShowChild(!self.showChild);
if (self.showChild) {
this.bizLoadDetails();
} else {
}
self.resize();
};
/****************业务类使用方法******************/
/**
* 是否在列表页
* @return {Boolean} [description]
*/
Page.prototype.isList = function () {
return this.pageState === PAGE_STATE[1];
};
/**
* 是否在详情页
* @return {Boolean} [description]
*/
Page.prototype.isDetail = function () {
return this.pageState === PAGE_STATE[0];
};
/**
* 控制按钮可用
* @param {[type]} opCode [description]
*/
Page.prototype.setButtonEnable = function (opCode) {
this.vm.toolbar_main.setEnable(opCode);
};
/**
* 控制按钮不可用
* @param {[type]} opCode [description]
*/
Page.prototype.setButtonDisabled = function (opCode) {
this.vm.toolbar_main.setDisabled(opCode);
};
/**
* 更新按钮状态
* @param {Boolean} isRecord 是否行处理
* @return {[type]} [description]
*/
Page.prototype.updateOpEnable = function (isRecord) {
this.vm.toolbar_main.update(isRecord);
};
Page.prototype.setEditLimit = function (dataSrc, col, editable) {
let adapter = this.vm['ep_' + dataSrc.name];
if (adapter) {
adapter.setEditorEditable(col.isDataColumn ? col.fieldName : col, editable);
}
};
Page.prototype.selectTab = function (dataSrc, index) {
let adapter = this.vm['tab_' + dataSrc.name];
if (adapter) {
adapter.select(index);
}
};
Page.prototype.setOptions = function (dataSrc, opts) {
let adapter = this.vm['grid_' + dataSrc.name];
if (adapter) {
adapter.setOptions(opts);
}
}
/**
* 设置树的数据-Biz-API
* @param data
*/
Page.prototype.setTreeData = function (data) {
let treeName = 'tree_' + this.biz.dsMaster.name;
if (this.vm[treeName]) {
this.vm[treeName].reset(data);
}
};
// 设置主从从中间从表的高度
Page.prototype.setHeightOfDetailGrid = function(height) {
height = parseFloat(height);
this.getElement('page-tabitem-half:eq(0)').css('height', height + '%');
this.getElement('page-tabitem-half:eq(1)').css('height', (97 - height) + '%');
this.resize();
}
Page.prototype.getExcelData = function(hasData) {
let name = this.biz.dsMaster.name;
let adapter = this.vm['grid_' + name];
if (adapter) {
return adapter.getSchemaData(hasData);
}
return {};
}
return Page;
})