import { Component, Watch } from 'vue-property-decorator';
import { VueLifeCycleProcessing } from '../../../decorators';
import { IPSAppCodeList, IPSDEGridColumn, IPSDEGridFieldColumn } from '@ibiz/dynamic-model-api';
import { AppGridBase } from '../app-common-control/app-grid-base';
/**
* 透视表
*
* @export
* @class AppPivotTable
* @class AppPivotTable
* @extends {Vue}
*/
@Component({})
@VueLifeCycleProcessing()
export class AppPivotTable extends AppGridBase {
/**
* 选中数据字符串
*
* @type {string}
* @memberof AppPivotTable
*/
public selectedData?: string;
/**
* 监听静态参数变化
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppPivotTable
*/
public onStaticPropsChange(newVal: any, oldVal: any) {
this.selectedData = newVal.selectedData;
super.onStaticPropsChange(newVal, oldVal);
}
/**
* 选中值变化
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppPivotTable
*/
@Watch('selectedData')
public onValueChange(newVal: any, oldVal: any) {
this.selections = [];
if(this.selectedData){
const refs: any = this.$refs;
if (refs[this.gridRefName]) {
refs[this.gridRefName].clearSelection();
JSON.parse(this.selectedData).forEach((selection:any)=>{
let selectedItem = this.items.find((item:any)=>{
return Object.is(item.srfkey, selection.srfkey);
});
if(selectedItem){
this.rowClick(selectedItem);
}
});
}
}
}
/**
* 表格数据加载
*
* @param {*} [arg={}]
* @memberof AppPivotTable
*/
public async load(opt: any = {}, pageReset: boolean = false) {
if(!this.fetchAction){
this.$throw((this.$t('app.grid.notconfig.fetchaction') as string),'load');
return;
}
if(pageReset){
this.curPage = 1;
}
const arg: any = {...opt};
const page: any = {};
if (this.isEnablePagingBar) {
Object.assign(page, { page: this.curPage-1, size: this.limit });
}
// 设置排序
if (!this.isNoSort && !Object.is(this.minorSortDir, '') && !Object.is(this.minorSortPSDEF, '')) {
const sort: string = this.minorSortPSDEF+","+this.minorSortDir;
Object.assign(page, { sort: sort });
}
Object.assign(arg, page);
const parentdata: any = {};
this.ctrlEvent({ controlname: this.name , action: "beforeload", data: parentdata });
Object.assign(arg, parentdata);
let tempViewParams:any = parentdata.viewparams?parentdata.viewparams:{};
Object.assign(tempViewParams,JSON.parse(JSON.stringify(this.viewparams)));
Object.assign(arg,{viewparams:tempViewParams});
let tempContext:any = JSON.parse(JSON.stringify(this.context));
this.onControlRequset('load', tempContext, arg);
const post: Promise<any> = this.service.search(this.fetchAction, tempContext, arg, this.showBusyIndicator);
post.then(async (response: any) => {
this.onControlResponse('load', response);
if (!response.status || response.status !== 200) {
this.$throw(response,'load');
return;
}
const data: any = response.data;
this.totalRecord = response.total;
this.items = await this.formatGridData(JSON.parse(JSON.stringify(data)));
this.gridItemsModel = [];
this.items.forEach(()=>{this.gridItemsModel.push(this.getGridRowModel())});
this.items.forEach((item:any)=>{
Object.assign(item,this.getActionState(item));
});
this.ctrlEvent({ controlname: this.name , action: "load", data: this.items });
// 设置默认选中
let _this = this;
setTimeout(() => {
//在导航视图中,如已有选中数据,则右侧展开已选中数据的视图,如无选中数据则默认选中第一条
if(_this.isSelectFirstDefault){
if(_this.selections && _this.selections.length > 0){
if(_this.items.length == 0) {
let models: Array<any> = this.service.getMode().getDataItems();
if(models?.length>0) {
let emptyItem: any = {};
models.forEach((model: any) => {
emptyItem[model.name] = null;
});
this.ctrlEvent({ controlname: _this.name, action: "selectionchange", data: [emptyItem] });
}
}
_this.selections.forEach((select: any)=>{
const index = _this.items.findIndex((item:any) => Object.is(item.srfkey,select.srfkey));
if(index != -1){
_this.rowClick(_this.items[index]);
}
})
}else{
_this.rowClick(this.items[0]);
}
}
if(_this.selectedData){
const table: any = (this.$refs as any)[this.gridRefName];
if (table) {
table.clearSelection();
JSON.parse(_this.selectedData).forEach((selection:any)=>{
let selectedItem = _this.items.find((item:any)=>{
return Object.is(item.srfkey, selection.srfkey);
});
if(selectedItem){
_this.rowClick(selectedItem);
}
});
}
}
}, 300);
if(this.aggMode && Object.is(this.aggMode, "ALL")) {
this.getAggData();
}
}).catch((response: any) => {
this.onControlResponse('load', response);
this.$throw(response,'load');
});
}
/**
* 表格数据代码表翻译
*
* @public
* @param {any} data 表格数据
* @memberof AppPivotTable
*/
public async formatGridData(data:any){
let columnsInstanceArr: Array<IPSDEGridColumn> = this.controlInstance.getPSDEGridColumns() || [];
let codelistColumns:Array<any> = [];
if(columnsInstanceArr && columnsInstanceArr.length>0) {
for(const columnInstance of columnsInstanceArr) {
const codelist: IPSAppCodeList = (columnInstance as IPSDEGridFieldColumn).getPSAppCodeList() as IPSAppCodeList;
if(codelist && codelist.codeName){
let codeListColumn = {
name: columnInstance.name.toLowerCase(),
srfkey: codelist.codeName,
codelistType: codelist.codeListType,
}
if(codelist.orMode && Object.is('STR', codelist.orMode)){
Object.assign(codeListColumn,{
renderMode: 'string',
textSeparator: codelist.textSeparator,
valueSeparator: codelist.valueSeparator,
})
} else if(codelist.orMode && Object.is('NUM', codelist.orMode)){
Object.assign(codeListColumn,{
renderMode: 'number',
textSeparator: codelist.textSeparator,
valueSeparator: ',',
})
} else {
Object.assign(codeListColumn,{
renderMode: 'other',
textSeparator: '、',
valueSeparator: ',',
})
}
codelistColumns.push(codeListColumn);
}
}
}
let _this = this;
if(codelistColumns.length >0){
for (const codelist of codelistColumns) {
let items = await _this.codeListService.getDataItems({ type: codelist.codelistType, tag: codelist.srfkey, context: this.context });
data.forEach((row:any)=>{
row[codelist.name] = _this.getCodeListItemValue(items, row[codelist.name]);
});
}
}
return data;
}
/**
* 代码表转化
*
* @public
* @param {any} items 代码表所有数据
* @param {any} value 当前数据当前项代码表值
* @memberof AppPivotTable
*/
public getCodeListItemValue(items: any, value: any){
if(items && items.length >0){
for(let i=0;i<items.length;i++){
if(items[i].value === value){
return items[i].text;
}
}
return value;
}else{
return value;
}
}
/**
* 绘制透视表内容
*
* @param h
* @memberof AppPivotTable
*/
public renderGridContent(h: any){
const style = {
'height' : this.isEnablePagingBar && this.items.length > 0 ? 'calc(100% - 50px)' : '100%',
'overflow': 'auto'
}
return (
<div style={style}>
{/* <app-vue-pivottable datas={this.items} allColumns={this.allColumns}></app-vue-pivottable> */}
暂未支持
</div>
);
}
}