efview-plus
Version:
A high quality Service UI components Library with Vue.js
463 lines (411 loc) • 14.9 kB
JavaScript
import { scrollTop } from '../../utils/assist';
import {deepCopy} from '../../utils/assist';
let common = {};
function Table_getSelection () {
// 分别拿根数据和子数据的已选项
let selectionIndexes = [];
let selectionRowKeys = [];
for (let i in this.objData) {
const objData = this.objData[i];
if (objData._isChecked) selectionIndexes.push(parseInt(i));
if (objData.children && objData.children.length) {
selectionRowKeys = selectionRowKeys.concat(this.getSelectionChildrenRowKeys(objData, selectionRowKeys));
}
}
// 去重的 RowKeys
selectionRowKeys = [...new Set(selectionRowKeys)];
let selection = [];
this.data.forEach((item, index) => {
if (selectionIndexes.indexOf(index) > -1) {
// 自定义:加行号索引 便于批量删除
item._customIndex = index;
selection = selection.concat(item);
}
if (item.children && item.children.length && selectionRowKeys.length) {
selection = selection.concat(this.getSelectionChildren(item, selection, selectionRowKeys));
}
});
selection = [...new Set(selection)];
return JSON.parse(JSON.stringify(selection));
}
function Table_handleResize () {
//let tableWidth = parseInt(getStyle(this.$el, 'width')) - 1;
// 原代码当列宽不设置的时 会出现缩进的现象
//let tableWidth = this.$el.offsetWidth - 1;
//自定义
let tableWidth = this.$el.parentNode.offsetWidth;
let columnsWidth = {};
let sumMinWidth = 0;
let hasWidthColumns = [];
let noWidthColumns = [];
let maxWidthColumns = [];
let noMaxWidthColumns = [];
this.cloneColumns.forEach((col) => {
if (col.width) {
hasWidthColumns.push(col);
}
else{
noWidthColumns.push(col);
if (col.minWidth) {
sumMinWidth += col.minWidth;
}
if (col.maxWidth) {
maxWidthColumns.push(col);
}
else {
noMaxWidthColumns.push(col);
}
}
col._width = null;
});
let unUsableWidth = hasWidthColumns.map(cell => cell.width).reduce((a, b) => a + b, 0);
let usableWidth = tableWidth - unUsableWidth - sumMinWidth - (this.showVerticalScrollBar?this.scrollBarWidth:0) - 1;
let usableLength = noWidthColumns.length;
let columnWidth = 0;
if(usableWidth > 0 && usableLength > 0){
columnWidth = parseInt(usableWidth / usableLength);
}
for (let i = 0; i < this.cloneColumns.length; i++) {
const column = this.cloneColumns[i];
let width = columnWidth + (column.minWidth?column.minWidth:0);
if(column.width){
width = column.width;
}
else{
if (column._width) {
width = column._width;
}
else {
if (column.minWidth > width){
width = column.minWidth;
}
else if (column.maxWidth < width){
width = column.maxWidth;
}
if (usableWidth>0) {
usableWidth -= width - (column.minWidth?column.minWidth:0);
usableLength--;
if (usableLength > 0) {
columnWidth = parseInt(usableWidth / usableLength);
}
else {
columnWidth = 0;
}
}
else{
columnWidth = 0;
}
}
}
column._width = width;
columnsWidth[column._index] = {
width: width
};
}
if(usableWidth>0) {
usableLength = noMaxWidthColumns.length;
columnWidth = parseInt(usableWidth / usableLength);
for (let i = 0; i < noMaxWidthColumns.length; i++) {
const column = noMaxWidthColumns[i];
let width = column._width + columnWidth;
if (usableLength > 1) {
usableLength--;
usableWidth -= columnWidth;
columnWidth = parseInt(usableWidth / usableLength);
}
else {
columnWidth = 0;
}
column._width = width;
columnsWidth[column._index] = {
width: width
};
}
}
this.tableWidth = this.cloneColumns.map(cell => cell._width).reduce((a, b) => a + b, 0) + (this.showVerticalScrollBar?this.scrollBarWidth:0) + 1;
this.columnsWidth = columnsWidth;
this.fixedHeader();
}
function Table_highlightCurrentRow (_index, rowKey) {
const objData = rowKey ? this.getDataByRowKey(rowKey) : this.objData[_index];
if (!objData) return;
if (!this.highlightRow || objData._isHighlight) return;
this.handleCurrentRow('highlight', _index, rowKey);
}
function getRandomStr (len = 32) {
const $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
const maxPos = $chars.length;
let str = '';
for (let i = 0; i < len; i++) {
str += $chars.charAt(Math.floor(Math.random() * maxPos));
}
return str;
};
function Table_makeColumnsId (columns) {
const cloneColumns = deepCopy(columns);
return cloneColumns.map(item => {
if ('children' in item) item.children = this.makeColumnsId(item.children);
item.__id = getRandomStr(6);
return item;
});
};
function TableHead_scrollBarCellClass(){
let hasRightFixed = false;
for(let i in this.headRows){
for(let j in this.headRows[i]){
if(this.headRows[i][j].fixed === 'right') {
hasRightFixed=true;
break;
}
if(hasRightFixed) break;
}
}
return [
{
[`${this.prefixCls}-hidden`]: hasRightFixed,
'efuture-table-scroll-th':true
}
];
}
function handleCheckClick (event, new_window = false) {
if (this.to) {
if (this.target === '_blank') {
return false;
} else {
event.preventDefault();
if (this.to === 'click') {
this.$emit('click', event);
} else {
this.handleClick(new_window);
}
}
}
}
function Upload_handleClick () {
if (this.itemDisabled) return;
// 自定义:弹框之前check
if (this.$parent && this.$parent.onClick) {
this.$parent.onClick()
} else {
if (this.$refs.input) {
this.$refs.input.click();
}
}
}
function DatePicker_reset() {
if (this.$refs.pickerPanel && this.$refs.pickerPanel.reset) {
this.$refs.pickerPanel.reset();
}
}
function DatePicker_handleKeydown (e) {
const pickerPrefixCls = 'ivu-picker';
const keyCode = e.keyCode;
// handle "tab" key
if (keyCode === 9) {
if (this.visible) {
e.stopPropagation();
e.preventDefault();
if (this.isConfirm) {
const selector = `.${pickerPrefixCls}-confirm > *`;
const tabbable = this.$refs.drop.$el.querySelectorAll(selector);
this.internalFocus = true;
const element = [...tabbable][e.shiftKey ? 'pop' : 'shift']();
element.focus();
} else {
this.handleClose();
}
} else {
this.focused = false;
}
}
// open the panel
const arrows = [37, 38, 39, 40];
if (!this.visible && arrows.includes(keyCode)) {
this.visible = true;
return;
}
// close on "esc" key
if (keyCode === 27) {
if (this.visible) {
e.stopPropagation();
this.handleClose();
}
}
// select date, "Enter" key
if (keyCode === 13) {
const timePickers = this.timeSpinnerList.map(item => item.timeSpinner);
if (timePickers.length > 0) {
const columnsPerPicker = timePickers[0].showSeconds ? 3 : 2;
const pickerIndex = Math.floor(this.focusedTime.column / columnsPerPicker);
const value = this.focusedTime.time[pickerIndex];
timePickers[pickerIndex].chooseValue(value);
return;
}
if (this.type.match(/range/)) {
this.$refs.pickerPanel.handleRangePick(this.focusedDate, 'date');
} else {
const panels = this.panelTableList.map(item => item.panelTable);
const compareDate = (d) => {
const sliceIndex = ['year', 'month', 'date'].indexOf((this.type)) + 1;
return [d.getFullYear(), d.getMonth(), d.getDate()].slice(0, sliceIndex).join('-');
};
const dateIsValid = panels.find(({ cells }) => {
return cells.find(({ date, disabled }) => compareDate(date) === compareDate(this.focusedDate) && !disabled);
});
if (dateIsValid) {
if (this.modelValue === null) {
this.onPick(null, false, 'date');
} else {
this.onPick(this.focusedDate, false, 'date');
}
}
}
}
if (!arrows.includes(keyCode)) return; // ignore rest of keys
// navigate times and dates
if (this.focusedTime.active) e.preventDefault(); // to prevent cursor from moving
this.navigateDatePanel(keyValueMapper[keyCode], e.shiftKey);
}
function DatePicker_handleBlur(e) {
if (this.internalFocus) {
this.internalFocus = false;
return;
}
if (this.visible) {
e.preventDefault();
return;
}
this.isFocused = false;
this.onSelectionModeChange(this.type);
this.internalValue = this.internalValue.slice(); // trigger panel watchers to reset views
this.reset();
if (this.$refs.pickerPanel) {
this.$refs.pickerPanel.onToggleVisibility(false);
}
}
export const isClient = typeof window !== 'undefined';
function getScroll(target, top) {
const prop = top ? 'pageYOffset' : 'pageXOffset';
const method = top ? 'scrollTop' : 'scrollLeft';
let ret = target[prop];
if (isClient && typeof ret !== 'number') {
ret = window.document.documentElement[method];
}
return ret;
}
function getOffset(element) {
if (!isClient) return;
const rect = element.getBoundingClientRect();
const scrollTop = getScroll(window, true);
const scrollLeft = getScroll(window);
const docEl = window.document.body;
const clientTop = docEl.clientTop || 0;
const clientLeft = docEl.clientLeft || 0;
return {
top: rect.top + scrollTop - clientTop,
left: rect.left + scrollLeft - clientLeft
};
}
function Anchor_handleScroll (e) {
this.upperFirstTitle = !!this.titlesOffsetArr[0] && e.target.scrollTop < this.titlesOffsetArr[0].offset;
if (this.animating) return;
// this.updateTitleOffset();
const scrollTop = this.scrollContainer.scrollTop;
this.getCurrentScrollAtTitleId(scrollTop);
}
function Affix_handleScroll () {
if (!isClient) return;
const affix = this.affix;
const scrollTop = getScroll(window, true);
const elOffset = getOffset(this.$el);
const windowHeight = window.innerHeight;
const elHeight = this.$el.getElementsByTagName('div')[0].offsetHeight;
// Fixed Top
if ((elOffset.top - this.offsetTop) < scrollTop && this.offsetType == 'top' && !affix) {
this.affix = true;
this.slotStyle = {
width: this.$refs.point.clientWidth + 'px',
height: this.$refs.point.clientHeight + 'px'
};
this.slot = true;
this.styles = {
top: `${this.offsetTop}px`,
};
if (elOffset.left) {
this.styles.left = `${elOffset.left}px`;
}
if (this.$el.offsetWidth) {
this.styles.width = `${this.$el.offsetWidth}px`;
}
this.$emit('on-change', true);
} else if ((elOffset.top - this.offsetTop) > scrollTop && this.offsetType == 'top' && affix) {
this.slot = false;
this.slotStyle = {};
this.affix = false;
this.styles = null;
this.$emit('on-change', false);
}
// Fixed Bottom
if ((elOffset.top + this.offsetBottom + elHeight) > (scrollTop + windowHeight) && this.offsetType == 'bottom' && !affix) {
this.affix = true;
this.styles = {
bottom: `${this.offsetBottom}px`,
left: `${elOffset.left}px`,
width: `${this.$el.offsetWidth}px`
};
this.$emit('on-change', true);
} else if ((elOffset.top + this.offsetBottom + elHeight) < (scrollTop + windowHeight) && this.offsetType == 'bottom' && affix) {
this.affix = false;
this.styles = null;
this.$emit('on-change', false);
}
}
common.initTable = function (obj) {
obj.methods.getSelection = Table_getSelection;
obj.methods.handleResize = Table_handleResize;
obj.methods.highlightCurrentRow = Table_highlightCurrentRow;
obj.methods.makeColumnsId = Table_makeColumnsId;
obj.components.tableHead.methods.scrollBarCellClass = TableHead_scrollBarCellClass;
}
common.initBreadcrumbItem = function (obj) {
obj.mixins[0].methods.handleCheckClick = handleCheckClick;
}
common.initButton = function (obj) {
obj.mixins[0].methods.handleCheckClick = handleCheckClick;
}
common.initCard = function (obj) {
obj.mixins[0].methods.handleCheckClick = handleCheckClick;
}
common.initCell = function (obj) {
obj.mixins[0].methods.handleCheckClick = handleCheckClick;
}
common.initMenuItem = function (obj) {
obj.mixins[1].methods.handleCheckClick = handleCheckClick;
}
common.initUpload = function (obj) {
obj.methods.handleClick = Upload_handleClick;
}
common.initDatePicker = function (obj) {
obj.mixins[0].methods.reset = DatePicker_reset;
obj.mixins[0].methods.handleBlur = DatePicker_handleBlur;
obj.mixins[0].methods.handleKeydown = DatePicker_handleKeydown;
}
common.initAffix = function (obj) {
obj.methods.handleScroll = Affix_handleScroll;
}
common.initAnchor = function (obj) {
obj.methods.handleScroll = Anchor_handleScroll;
}
common.initEview = function (ViewUI) {
common.initTable(ViewUI.Table);
common.initBreadcrumbItem(ViewUI.BreadcrumbItem);
common.initButton(ViewUI.Button);
common.initCard(ViewUI.Card);
common.initCell(ViewUI.Cell);
common.initMenuItem(ViewUI.MenuItem);
common.initUpload(ViewUI.Upload);
common.initDatePicker(ViewUI.DatePicker);
common.initAffix(ViewUI.Affix);
common.initAnchor(ViewUI.Anchor);
}
export default common;