<template>
	<div :data-init="dataInit">
			<el-table v-if="needLoading && timestamp" ref="table"
				v-loading="loading"
				:data="tableData"
				:height="height"
				:max-height="maxHeight"
				:size="size"
				:fit="fit"
				:show-header="showHeader"
				:highlight-current-row="highlightCurrentRow"
				:stripe="stripe"
				:border="border"
				:default-sort="defaultSort"
				:default-expand-all="defaultExpandAll"
				:empty-text="emptyText"
				:show-summary="showSummary"
				:sum-text="sumText"
				:summary-method="summaryMethod"
				:span-method="spanMethod"
				:select-on-indeterminate="selectOnIndeterminate"
				:tooltip-effect="tooltipEffect"
				:header-row-class-name="headerRowClassName"
				:header-row-style="headerRowStyle"
				:header-cell-class-name="headerCellClassName"
				:header-cell-style="headerCellStyle"
				:row-class-name="rowClassName"
				:row-style="rowStyle"
				:row-key="rowKey"
				:cell-style="cellStyle"
    			:cell-class-name="cellClassName"
				:expand-row-keys="expandRowKeys"
				:lazy="lazy"
				:indent="indent"
				:load="load"
				:tree-props="treeProps"
				:element-loading-text="elementLoadingText"
    			:element-loading-spinner="elementLoadingSpinner"
    			:element-loading-background="elementLoadingBackground"
				@select="select"
				@select-all="selectAll"
				@selection-change="selectionChange"
				@current-change="currentChange"
				@cell-mouse-enter="cellMouseEnter"
				@cell-mouse-leave="cellMouseLeave"
				@cell-click="cellClick"
				@cell-dblclick="cellDblclick"
				@row-click="rowClick"
				@row-dblclick="rowDblclick"
				@row-contextmenu="rowContextmenu"
				@header-click="headerClick"
				@header-contextmenu="headerContextmenu"
				@sort-change="sortChange"
				@filter-change="filterChange"
				@expand-change="expandChange"
				@header-dragend="headerDragend">
				<slot></slot>
			</el-table>
			<el-table v-if="!needLoading && timestamp" ref="table"
				:data="tableData"
				:height="height"
				:max-height="maxHeight"
				:size="size"
				:fit="fit"
				:show-header="showHeader"
				:highlight-current-row="highlightCurrentRow"
				:stripe="stripe"
				:border="border"
				:default-sort="defaultSort"
				:default-expand-all="defaultExpandAll"
				:empty-text="emptyText"
				:show-summary="showSummary"
				:sum-text="sumText"
				:summary-method="summaryMethod"
				:span-method="spanMethod"
				:select-on-indeterminate="selectOnIndeterminate"
				:tooltip-effect="tooltipEffect"
				:header-row-class-name="headerRowClassName"
				:header-row-style="headerRowStyle"
				:header-cell-class-name="headerCellClassName"
				:header-cell-style="headerCellStyle"
				:row-class-name="rowClassName"
				:row-style="rowStyle"
				:row-key="rowKey"
				:cell-style="cellStyle"
    			:cell-class-name="cellClassName"
				:expand-row-keys="expandRowKeys"
				:lazy="lazy"
				:indent="indent"
				:load="load"
				:tree-props="treeProps"
				@select="select"
				@select-all="selectAll"
				@selection-change="selectionChange"
				@current-change="currentChange"
				@cell-click="cellClick"
				@cell-dblclick="cellDblclick"
				@cell-mouse-enter="cellMouseEnter"
				@cell-mouse-leave="cellMouseLeave"
				@row-click="rowClick"
				@row-dblclick="rowDblclick"
				@row-contextmenu="rowContextmenu"
				@header-click="headerClick"
				@header-contextmenu="headerContextmenu"
				@sort-change="sortChange"
				@filter-change="filterChange"
				@expand-change="expandChange"
				@header-dragend="headerDragend">
				<slot></slot>
			</el-table>
			<div v-show="showPagination || tableData.length !== 0" style="margin-top: 20px">
				<el-pagination ref="pagination" :class="{'el-pagination__rightwrapper': rightWrapper}"
					:background="background"
					:small="small"
					:disabled="disabled"
					:current-page="currentPage"
					:page-sizes="pageSizes"
					:page-size="pageSize"
					:layout="pagerLayout"
					:total="total"
					:page-count="pagecount"
					:pager-count="pagerCount"
					:popper-class="popperClass"
					:prev-text="prevText"
					:next-text="nextText"
					:hide-on-single-page="hideOnSinglePage"					
					@prev-click="prevClick"
					@next-click="nextClick"
					@size-change="handleSizeChange"
					@current-change="handleCurrentChange">
				</el-pagination>
			</div>
	</div>
</template>
<script type="text/javascript">
import { initMessageKey } from '@/util/isc-common/messageManage.js'
import { Table, TableColumn, Pagination } from 'element-ui'
export default {
data () {
	return {
			currentTable: [],
			currentPage: 1,
			pageSize: 10,
			total: 0,
			selections: [],
			firstInit: true,
			sortName: '',
			sortOrder: '',
			message: null,
			loading: false,
			timestamp: new Date().getTime()
	}
},
components: {
	'el-table': Table,
	'el-pagination': Pagination
},
mounted() {
	this.tableAttrInit();
},
methods : {
	tableAttrInit(currentPageflag) {
		if (this.defaultSort) {
			if (this.defaultSort.prop) {
				this.sortName = this.defaultSort.prop;
			}
			if (this.defaultSort.order) {
				this.sortOrder = this.defaultSort.order;
			}
		}
		if('client' == this.pagingSide && currentPageflag) {
			// 客户端分页时刷新数据使页码停留在当前位置
		}else {
			if (this.pagination) {
				if (this.limitDefault) {
					this.pageSize = this.limitDefault;
				}
				if (this.offsetDefault || 0 == this.offsetDefault) {
					this.offset = this.offsetDefault;
				} else {
					this.currentPage = 1;
				}
			}
		}
		
		if (this.dataInit) {
			this.message = initMessageKey(this.dataInit);
			if ('client' === this.pagingSide && this.firstInit) {
				const execBefore = this.message[2];
				const execAfter = this.message[1];
				if(execBefore && typeof execBefore == "string"){
					this.$parentPage[execBefore+'_POIN_ORIG'] = this.$parentPage[execBefore];
					this.$parentPage[this.message[2]] = (messageObj) => {
						this.$parentPage[execBefore+'_POIN_ORIG'](messageObj);
						// add @2019-07-31
						if (!messageObj.closeFlag) {
							this.beforeSendMessage(messageObj);
						}
					}
				}
				if(execAfter && typeof execAfter == "string"){
					this.$parentPage[execAfter+'_POIN_ORIG'] = this.$parentPage[execAfter];
					this.$parentPage[this.message[1]] = (response, responseData, messageObj, error) => {
						this.$parentPage[execAfter+'_POIN_ORIG'](response, responseData, messageObj, error);
						// add @2019-07-31
						if (!messageObj.closeFlag) {
							this.afterSendMessage(response, responseData, messageObj, error);
						}
					}
				}
				this.firstInit = false;
			}
		}
	},
	refresh(currentPageflag) {
		//edit by 陆静@2021-08-23  currentPageflag:true表示刷新停留在当前页
		this.timestamp = new Date().getTime();
		this.tableAttrInit(currentPageflag);
		// 表格绑定通讯 刷新触发请求;表格未绑定通讯,刷新如需请求后台,btnNeedReMsg须为true
		if (this.dataInit || this.btnNeedReMsg) {
			this.sendMessage(currentPageflag);
		}
	},
	sendMessage(currentPageflag) {
		//add by 陆静@2021-08-23  currentPageflag:true表示刷新停留在当前页
		this.message[0].currentPageflag = currentPageflag || false;
		//此种情况仅适用于服务端分页,客户端分页暂不设置为1
   		if (this.message && this.$parentPage && this.$parentPage.poin_initManage) {
   			this.$parentPage.poin_initManage(this.message[0],this.message[1],this.message[2]);
   		}
	},
	beforeSendMessage(messageObj) {
		if (this.needLoading) {
			this.loading = true;
		}
	},
	afterSendMessage(response, responseData, messageObj, error) {
		if (this.needLoading) {
			this.loading = false;
		}
	},
	checkOffset() {
		if ('pageIndex' == this.offsetMeaning) {
			return this.currentPage - 1;
		} else if ('pageNum' == this.offsetMeaning) {
			return this.currentPage;
		} else {
			return Math.floor((this.currentPage - 1) * this.pageSize);
		}
	},
	handleSizeChange(val) {
	//改变每页分页条数
	    this.pageSize = val;
	    if (this.message && this.pagination && 'server' === this.pagingSide && this.$parentPage && this.$parentPage.poin_initManage) {
   			//当每页条数改变,currentPage需重置为1(这里在通讯的拼包中实现)
			//此种情况仅适用于服务端分页,客户端分页暂不设置为1
			if (this.message[0].isTPaging) {
			    this.message[0].isTPaging = false
		    }
			this.$parentPage.poin_initManage(this.message[0],this.message[1],this.message[2]);
   		}
		this.timestamp = new Date().getTime();
   		this.$emit('size-change', val);
	},
	handleCurrentChange(val) {
	//改变页码
	   	this.currentPage = val;
	   	if (this.message && this.pagination && 'server' === this.pagingSide && this.$parentPage && this.$parentPage.poin_initManage) {
   			//给通讯中增加isTPaging字段,并设置为true,用于服务端分页(区别点击分页按钮,还是其他情况触发的通讯)
			if (!this.message[0].isTPaging) {
			    this.message[0].isTPaging = true
		    }
			this.$parentPage.poin_initManage(this.message[0],this.message[1],this.message[2]);
   		}
		this.timestamp = new Date().getTime();
   		this.$emit('current-page-change', val);
	},
	select(selection, row) {
		this.$emit('select', selection, row);
	},
	selectAll(selection) {
		this.$emit('select-all', selection);
	},
	selectionChange(selection) {
		this.selections = selection;
		this.$emit('selection-change', selection);
	},
	currentChange(currentRow, oldCurrentRow) {
		this.$emit('current-change', currentRow, oldCurrentRow);
	},
	cellClick(row, column, cell, event) {
		this.$emit('cell-click', row, column, cell, event);
	},
	cellDblclick(row, column, cell, event) {
		this.$emit('cell-dblclick', row, column, cell, event);
	},
	cellMouseEnter(row, column, cell, event) {
		this.$emit('cell-mouse-enter', row, column, cell, event);
	},
	cellMouseLeave(row, column, cell, event) {
		this.$emit('cell-mouse-leave', row, column, cell, event);
	},
	rowClick(row, event, column) {
		this.$emit('row-click', row, event, column);
	},
	rowDblclick(row, event, column) {
		this.$emit('row-dblclick', row, event, column);
	},
	rowContextmenu(row, event) {
		this.$emit('row-contextmenu', row, event);
	},
	headerClick(column, event) {
		this.$emit('header-click', column, event);
	},
	headerContextmenu(column, event) {
		this.$emit('header-contextmenu', column, event);
	},
	headerDragend(newWidth, oldWidth, column, event) {
		this.$emit('header-dragend', newWidth, oldWidth, column, event);
	},
	sortChange({ column, prop, order }) {
		this.sortName = prop;
   		this.sortOrder = order;
   		
		this.$emit('sort-change', { column, prop, order });
	},
	filterChange(filters) {
		this.$emit('filter-change', filters);
	},
	expandChange(row, expandedRows) {
		this.$emit('expand-change', row, expandedRows);
	},
	prevClick(currentPage) {
		this.$emit('prev-change', currentPage);
	},
	nextClick(currentPage) {
		this.$emit('next-change', currentPage);
	},
	clearSelection() {
		this.$refs.table.clearSelection();
	},
	toggleRowSelection(row, selected) {
		this.$refs.table.toggleRowSelection(row, selected);
	},
	toggleAllSelection() {
		this.$refs.table.toggleAllSelection();
	},
	toggleRowExpansion(row, expanded) {
		this.$refs.table.toggleRowExpansion(row, expanded);
	},
	setCurrentRow(row) {
		this.$refs.table.setCurrentRow(row);
	},
	clearSort() {
		this.$refs.table.clearSort();
	},
	clearFilter(columnKeys) {
		this.$refs.table.clearFilter(columnKeys);
	},
	doLayout() {
		this.$refs.table.doLayout();
	},
	sort(prop, order) {
		this.$refs.table.sort(prop, order);
	}
},
computed: {
	tableData() {
		if (this.pagination && 'client' === this.pagingSide){
			
				if (this.data && this.data instanceof Array) {
					this.currentTable = this.data.slice((this.currentPage - 1) * this.pageSize,this.currentPage * this.pageSize);
					this.total = this.data.length;
					return this.currentTable;
				} else {
					return [];
				}
		} else {
			if (this.data && this.data instanceof Array) {
				return this.data;
			} else {
				return [];
			}
		}
	},
	showPagination() {
		if (this.pagination) {
			return this.total
		}
		return false
	},
	limit: {
		get() {
			return this.pageSize;
		},
		set(newValue) {
			this.pageSize = newValue;
		}
	},
	offset: {
		get() {
			if (this.pagination) {
				return (1 == this.currentPage && (0 == this.offsetDefault || this.offsetDefault)) ? this.offsetDefault : this.checkOffset();
			}	
		},
		set(newValue) {
			if ('pageIndex' == this.offsetMeaning) {
				this.currentPage = newValue + 1;
			} else if ('pageNum' == this.offsetMeaning) {
				this.currentPage = newValue;
			} else {
				if (this.pageSize == 0) {
					this.currentPage = 0;
				} else {
					this.currentPage = newValue/this.pageSize + 1;
				}
			}
		}
	},
	pagecount: {
		get() {
			if (typeof this.total === 'number') {
				if (this.pageSize == 0) {
					return 0;
				} else {
					return this.total/this.pageSize;
				}
			} else {
				return 0;
			}
		},
		set(newValue) {
			if (typeof newValue === 'number' || !isNaN(parseInt(c))) {
				if (0 == this.total) {
					this.total = newValue*this.pageSize;
				}
			} else {
				this.total = 0;
			}
		}
	},
},
props: {
	data: [Array, Object],
	dataInit: String,
	$parentPage: null,
	selfLoad: {
		type: Boolean,
		default: true
	},
	pagination: Boolean,
	pagingSide: String,
	offsetMeaning: String,
	offsetDefault: Number,
	limitDefault: Number,
	rightWrapper: Boolean,
	  size: String,

      width: [String, Number],

      height: [String, Number],

      maxHeight: [String, Number],

      fit: {
        type: Boolean,
        default: true
      },

      stripe: Boolean,

      border: Boolean,

      rowKey: [String, Function],

      context: {},

      showHeader: {
        type: Boolean,
        default: true
      },

      showSummary: Boolean,

      sumText: String,

      summaryMethod: Function,

      rowClassName: [String, Function],

      rowStyle: [Object, Function],

      cellClassName: [String, Function],

      cellStyle: [Object, Function],

      headerRowClassName: [String, Function],

      headerRowStyle: [Object, Function],

      headerCellClassName: [String, Function],

      headerCellStyle: [Object, Function],

      highlightCurrentRow: Boolean,

      currentRowKey: [String, Number],

      emptyText: String,

      expandRowKeys: Array,

      defaultExpandAll: Boolean,

      defaultSort: Object,

      tooltipEffect: String,

      spanMethod: Function,

      selectOnIndeterminate: {
        type: Boolean,
        default: true
      },

	  treeProps: {
        type: Object,
        default() {
          return {
            hasChildren: 'hasChildren',
            children: 'children'
          };
        }
      },
      pagerCount: Number,
      
      pagerLayout: {
      	type: String,
      	default: 'prev, pager, next, total, jumper, sizes'
      },
      
      pageSizes: Array,
      
      popperClass: String,

 	  prevText: String,

	  nextText: String,

	  background: Boolean,
	  
	  small: Boolean,
	  
	  disabled: Boolean,
	  
	  elementLoadingText: '',
	  
	  elementLoadingSpinner: '',
	  
	  elementLoadingBackground: '',
	  
	  needLoading: {
	  	type: Boolean,
	  	default: false
	  },

	  btnNeedReMsg: {
		type: Boolean,
	  	default: false
	  },
	  indent: Number,
	  
	  lazy: Boolean,
	  
	  load: Function,
	  
	  hideOnSinglePage: Boolean
}
}
</script>
<style type="text/css">
</style>