<template>
|
<view class="wyb-table-box">
|
<view v-if="loading" class="wyb-table-loading-box" :style="{
|
width: width === 'auto' ? screenWidth : width,
|
height: height === 'auto' ? '300rpx' : height,
|
backgroundColor: loaderBgColor,
|
borderTop: '1px solid' + borderColor,
|
borderBottom: '1px solid' + borderColor,
|
borderLeft: showLeftAndRightBorder ? '1px solid' + borderColor : 'none',
|
borderRight: showLeftAndRightBorder ? '1px solid' + borderColor : 'none'}">
|
<view class="loader-one" :style="{
|
width: loaderSize + 'rpx',
|
height: loaderSize + 'rpx',
|
borderTop: '3px solid ' + loadingColor.top,
|
borderRight: '3px solid ' + loadingColor.right,
|
borderBottom: '3px solid ' + loadingColor.bottom,
|
borderLeft: '3px solid ' + loadingColor.left}" />
|
</view>
|
<view v-if="!loading" class="wyb-table-scroll-view" :style="{
|
width: width,
|
height: height,
|
borderTop: '1px solid' + borderColor,
|
borderLeft: showLeftAndRightBorder ? '1px solid' + borderColor : 'none',
|
borderRight: showLeftAndRightBorder ? '1px solid' + borderColor : 'none'}">
|
<view class="wyb-table-header" :style="{borderBottom: '1px solid' + borderColor}">
|
<view class="wyb-table-header-item" v-if="enableCheck" :style="{
|
minWidth: checkColWidth + 'rpx',
|
maxWidth: checkColWidth + 'rpx',
|
minHeight: minHeight[0] + 'rpx',
|
textAlign: textAlign,
|
justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
|
fontSize: fontSize[0] + 'rpx',
|
color: headerFtColor,
|
padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
|
backgroundColor: headerBgColor,
|
borderRight: '1px solid' + borderColor,
|
zIndex: 30,
|
left: 0,
|
color: headerFtColor,
|
backgroundColor: headerBgColor,
|
position: 'sticky'}">
|
<view
|
class="wyb-table-checkbox"
|
v-if="enableCheck === 'multiple'"
|
@tap.stop="onCheckAllTap"
|
:style="{
|
width: checkColWidth * 0.5 + 'rpx',
|
height: checkColWidth * 0.5 + 'rpx',
|
backgroundColor: checkerBoxBgColor,
|
border: '1px solid ' + checkerBorderColor}">
|
<text
|
class="iconfont icon-check"
|
v-show="checkAll"
|
:style="{
|
color: checkerColor,
|
backgroundColor: checkerBgColor,
|
paddingTop: (fontSize[1] || fontSize[0]) * 0.15 + 'rpx',
|
fontSize: (fontSize[1] || fontSize[0]) + 'rpx'}" />
|
</view>
|
</view>
|
<view ref="iosBug" class="wyb-table-header-item" v-for="(item, index) in headers" :key="item.key" @tap="onHeaderItemTap(index)"
|
:style="{
|
minWidth: (item.width || defaultColWidth) + 'rpx',
|
maxWidth: (item.width || defaultColWidth) + 'rpx',
|
minHeight: minHeight[0] + 'rpx',
|
textAlign: textAlign,
|
justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
|
fontSize: fontSize[0] + 'rpx',
|
fontWeight: headerWeight ? 'bold' : 'normal',
|
color: headerFtColor,
|
padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
|
backgroundColor: headerBgColor,
|
borderRight: index === headers.length - 1 || (!showVertBorder && index !== 0) ? 'none' : '1px solid' + borderColor,
|
zIndex: index === 0 ? 20 : 0,
|
left: index === 0 && firstLineFixed ? (enableCheck ? checkColWidth + 'rpx' : 0) : 'auto',
|
position: index === 0 ? 'sticky' : 'static'}">
|
<text :style="{marginLeft: autoSortShow(index) && textAlign !== 'left' ? fontSize[0] * 0.65 + 'rpx' : 0}">
|
{{item.label || emptyString}}
|
</text>
|
<view class="wyb-table-header-icon" v-if="autoSortShow(index)">
|
<text class="iconfont icon-arrow-up" :style="{
|
color: sortWays[sortWay] === 'asc' && sortActiveKey === item.key ?
|
headerFtColor : RGBChange(headerFtColor, 0.7, 'light'),
|
fontWeight: 'normal',
|
marginBottom: '-12px',
|
transform: 'scale(0.4)'}" />
|
<text class="iconfont icon-arrow-down" :style="{
|
color: sortWays[sortWay] === 'inv' && sortActiveKey === item.key ?
|
headerFtColor : RGBChange(headerFtColor, 0.7, 'light'),
|
fontWeight: 'normal',
|
transform: 'scale(0.4)'}" />
|
</view>
|
</view>
|
</view>
|
<view class="wyb-table-content">
|
<view class="wyb-table-content-line" v-for="(content, cIndex) in contentsSort" :key="contentLineKey(content, cIndex)"
|
:style="{borderTop: cIndex === 0 ? 'none' : '1px solid' + borderColor}">
|
<view class="wyb-table-content-item" v-if="enableCheck" :style="{
|
minWidth: checkColWidth + 'rpx',
|
maxWidth: checkColWidth + 'rpx',
|
textAlign: textAlign,
|
justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
|
fontSize: (fontSize[1] || fontSize[0]) + 'rpx',
|
minHeight: (minHeight[1] || minHeight[0]) + 'rpx',
|
padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
|
borderRight: '1px solid' + borderColor,
|
zIndex: 21,
|
color: contentFtColor,
|
backgroundColor: checkerCellBgColor,
|
left: 0,
|
position: 'sticky'}">
|
<view
|
class="wyb-table-checkbox"
|
@tap.stop="onCheckItemTap(cIndex)"
|
:style="{
|
width: checkColWidth * 0.5 + 'rpx',
|
height: checkColWidth * 0.5 + 'rpx',
|
backgroundColor: checkerBoxBgColor,
|
border: '1px solid ' + checkerBorderColor}">
|
<text
|
class="iconfont icon-check"
|
v-show="contentsSort[cIndex].checked"
|
:style="{
|
color: checkerColor,
|
backgroundColor: checkerBgColor,
|
paddingTop: (fontSize[1] || fontSize[0]) * 0.15 + 'rpx',
|
fontSize: (fontSize[1] || fontSize[0]) + 'rpx'}" />
|
</view>
|
</view>
|
<view
|
class="wyb-table-content-item"
|
v-for="(header, hIndex) in headers"
|
@tap.stop="onContentItemTap(cIndex, hIndex)"
|
:key="contentItemKey(header, hIndex)"
|
:style="{
|
minWidth: (header.width || defaultColWidth) + 'rpx',
|
maxWidth: (header.width || defaultColWidth) + 'rpx',
|
textAlign: textAlign,
|
justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
|
fontSize: (fontSize[1] || fontSize[0]) + 'rpx',
|
textDecoration: autoTextDecoration(cIndex, hIndex),
|
color: autoContentColor(cIndex, hIndex),
|
backgroundColor: autoContentBgColor(cIndex, hIndex),
|
minHeight: (minHeight[1] || minHeight[0]) + 'rpx',
|
padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
|
borderBottom: cIndex === contents.length - 1 ? '1px solid' + borderColor : 'none',
|
borderRight: hIndex === headers.length - 1 || (!showVertBorder && hIndex !== 0) ? 'none' : '1px solid' + borderColor,
|
zIndex: hIndex === 0 ? 20 : 0,
|
left: enableCheck ? checkColWidth + 'rpx' : 0,
|
position: hIndex === 0 && firstLineFixed ? 'sticky' : 'static'}">{{autoContentItem(cIndex, hIndex)}}</view>
|
</view>
|
<view v-if="computedCol.length !== 0" class="wyb-table-content-line" :style="{
|
position: bottomComputedFixed ? 'sticky' : 'static',
|
bottom: 0,
|
zIndex: 25,
|
borderTop: '1px solid' + borderColor}">
|
<view class="wyb-table-content-item" v-if="enableCheck" :style="{
|
minWidth: checkColWidth + 'rpx',
|
maxWidth: checkColWidth + 'rpx',
|
textAlign: textAlign,
|
justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
|
fontSize: (fontSize[1] || fontSize[0]) + 'rpx',
|
minHeight: (minHeight[1] || minHeight[0]) + 'rpx',
|
padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
|
borderBottom: '1px solid' + borderColor,
|
borderRight: '1px solid' + borderColor,
|
zIndex: 25,
|
color: contentFtColor,
|
backgroundColor: checkerCellBgColor,
|
left: 0,
|
position: 'sticky'}"></view>
|
<view class="wyb-table-content-item" v-for="(header, index) in headers" :key="index"
|
:style="{
|
minWidth: (header.width || defaultColWidth) + 'rpx',
|
maxWidth: (header.width || defaultColWidth) + 'rpx',
|
textAlign: textAlign,
|
justifyContent: textAlign === 'center' ? textAlign : (textAlign === 'left' ? 'flex-start' : 'flex-end'),
|
fontSize: (fontSize[1] || fontSize[0]) + 'rpx',
|
color: contentFtColor,
|
minHeight: (minHeight[1] || minHeight[0]) + 'rpx',
|
padding: padding[0] + 'rpx ' + (padding[1] || padding[0]) + 'rpx',
|
backgroundColor: index === 0 ? firstColBgColor : contentBgColor,
|
borderBottom: '1px solid' + borderColor,
|
borderRight: index === headers.length - 1 || (!showVertBorder && index !== 0) ? 'none' : '1px solid' + borderColor,
|
zIndex: index === 0 ? 20 : 0,
|
left: enableCheck ? checkColWidth + 'rpx' : 0,
|
position: index === 0 && firstLineFixed ? 'sticky' : 'static'}">
|
{{autoBottomComputedItem(index)}}
|
</view>
|
</view>
|
</view>
|
</view>
|
</view>
|
</template>
|
|
<script>
|
import Pinyin from '../../static/table/characterToPinyin.js'
|
import isEqual from '../../static/table/objEqual.js'
|
export default {
|
data() {
|
return {
|
bottomComputed: [],
|
colorList: [],
|
bgColorList: [],
|
contentsSort: this.contents.slice(),
|
oContentsSort: [],
|
sortWay: 0,
|
sortKeys: [],
|
sortActiveKey: '',
|
sortIsNumbers: [],
|
checkAll: false,
|
checkList: [],
|
onload: true,
|
event: {
|
checkType: this.enableCheck,
|
data: []
|
},
|
chars: '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
}
|
},
|
computed: {
|
loadingColor() {
|
let color = this.loaderColor.slice()
|
let rgbList = this.hexToRgb(color)
|
let top = 'rgba(' + rgbList[0] + ',' + rgbList[1] + ',' + rgbList[2] + ', 0.3)'
|
let bottom = 'rgba(' + rgbList[0] + ',' + rgbList[1] + ',' + rgbList[2] + ', 0.3)'
|
let right = 'rgba(' + rgbList[0] + ',' + rgbList[1] + ',' + rgbList[2] + ', 0.3)'
|
let left = 'rgb(' + rgbList[0] + ',' + rgbList[1] + ',' + rgbList[2] + ')'
|
return {
|
top,
|
bottom,
|
right,
|
left
|
}
|
},
|
contentLineKey() {
|
return function(content, cIndex) {
|
return this.randomString(32, this.chars)
|
}
|
},
|
contentItemKey() {
|
return function(header, hIndex) {
|
return this.randomString(16, this.chars)
|
}
|
},
|
autoContentItem() {
|
return function(cIndex, hIndex) {
|
let content = this.contentsSort[cIndex]
|
let header = this.headers[hIndex]
|
let result = ''
|
if (content[header.key] || content[header.key] === 0) {
|
result = content[header.key]
|
if (this.urlCol.length !== 0) {
|
for (let i in this.urlCol) {
|
let item = this.urlCol[i]
|
if (header.key === item.key) {
|
// 该单元格为链接
|
result = content[header.key][0]
|
}
|
}
|
}
|
if (this.formatCol.length !== 0) {
|
this.formatCol.forEach(item => {
|
if (header.key === item.key) {
|
let needRplace = new RegExp(`\#${item['key']}\#`, 'mg')
|
result = item.template.replace(needRplace, result)
|
}
|
})
|
}
|
|
} else {
|
result = this.emptyString
|
}
|
return result
|
}
|
},
|
autoBottomComputedItem() {
|
return function(index) {
|
let bottomComputed = {}
|
let needComputed = []
|
this.computedCol.forEach(key => {
|
let computedColData = []
|
this.contentsSort.forEach(content => {
|
computedColData.push(content[key] || '0')
|
})
|
needComputed.push(computedColData)
|
})
|
needComputed.forEach((item, index) => {
|
let total = 0
|
item.forEach(num => {
|
total += parseFloat(num)
|
})
|
bottomComputed[this.computedCol[index]] = total
|
})
|
let header = this.headers[index]
|
let result = this.computedCol.includes(header.key) ?
|
bottomComputed[header.key] : (index === 0 ? '总计' : this.emptyString)
|
if (this.formatCol.length !== 0) {
|
this.formatCol.forEach(item => {
|
if (item.bottomComputedFormat) {
|
if (header.key === item.key) {
|
let needRplace = new RegExp(`\#${item['key']}\#`, 'mg')
|
result = item.template.replace(needRplace, bottomComputed[item.key])
|
}
|
}
|
})
|
}
|
return result
|
}
|
},
|
autoTextDecoration() {
|
return function(cIndex, hIndex) {
|
let result = 'auto'
|
let content = this.contentsSort[cIndex]
|
let header = this.headers[hIndex]
|
if (this.urlCol.length !== 0) {
|
for (let i in this.urlCol) {
|
let item = this.urlCol[i]
|
if (header.key === item.key) {
|
// 该单元格为链接
|
if (content[header.key]) {
|
result = 'underline'
|
}
|
}
|
}
|
}
|
return result
|
}
|
},
|
autoContentBgColor() {
|
return function(cIndex, hIndex) {
|
let result = this.contentBgColor
|
let content = this.contentsSort[cIndex]
|
let header = this.headers[hIndex]
|
let keys = []
|
// 先判断是不是首列,设置基础样式
|
if (hIndex === 0) {
|
result = this.firstColBgColor
|
}
|
// 再判断条件格式传没传值,设置条件样式
|
if (this.valueFormat.length !== 0) {
|
this.valueFormat.forEach(item => {
|
keys.push(item.key)
|
})
|
if (keys.includes(header.key)) {
|
// 该列开启了条件格式
|
let key = header.key
|
let type = this.valueFormat[keys.indexOf(key)].type
|
let style = this.valueFormat[keys.indexOf(key)].style
|
let range = this.valueFormat[keys.indexOf(key)].range || ''
|
switch(type) {
|
case 'bigger':
|
if (parseFloat(content[key]) > range) {
|
if (style.bgColor) result = style.bgColor
|
}
|
break
|
case 'smaller':
|
if (parseFloat(content[key]) < range) {
|
if (style.bgColor) result = style.bgColor
|
}
|
break
|
case 'equal':
|
let val
|
if (typeof range === 'number') val = parseFloat(content[key])
|
else val = content[key]
|
if (val === range) {
|
if (style.bgColor) result = style.bgColor
|
}
|
break
|
case 'range':
|
if (parseFloat(content[key]) > range[0] && parseFloat(content[key]) < range[1]){
|
if (style.bgColor) result = style.bgColor
|
}
|
break
|
case 'average-bigger':
|
let average = this.getAverage(key)
|
if (parseFloat(content[key]) > average) {
|
if (style.bgColor) result = style.bgColor
|
}
|
break
|
case 'average-smaller':
|
average = this.getAverage(key)
|
if (parseFloat(content[key]) < average) {
|
if (style.bgColor) result = style.bgColor
|
}
|
break
|
case 'average-equal':
|
average = this.getAverage(key)
|
if (parseFloat(content[key]) === average) {
|
if (style.bgColor) result = style.bgColor
|
}
|
break
|
}
|
}
|
}
|
return result
|
}
|
},
|
autoContentColor() {
|
return function(cIndex, hIndex) {
|
let result = this.contentFtColor
|
let content = this.contentsSort[cIndex]
|
let header = this.headers[hIndex]
|
let keys = []
|
// 先判断是不是链接,设置基础样式
|
if (this.urlCol.length !== 0) {
|
for (let i in this.urlCol) {
|
let item = this.urlCol[i]
|
if (header.key === item.key) {
|
// 该单元格为链接
|
if (content[header.key]) {
|
result = this.linkColor
|
}
|
}
|
}
|
}
|
// 再判断条件格式传没传值,设置条件样式
|
if (this.valueFormat.length !== 0) {
|
this.valueFormat.forEach(item => {
|
keys.push(item.key)
|
})
|
if (keys.includes(header.key)) {
|
// 该列开启了条件格式
|
let key = header.key
|
let type = this.valueFormat[keys.indexOf(key)].type
|
let style = this.valueFormat[keys.indexOf(key)].style
|
let range = this.valueFormat[keys.indexOf(key)].range || ''
|
switch(type) {
|
case 'bigger':
|
if (parseFloat(content[key]) > range) {
|
if (style.color) result = style.color
|
}
|
break
|
case 'smaller':
|
if (parseFloat(content[key]) < range) {
|
if (style.color) result = style.color
|
}
|
break
|
case 'equal':
|
let val
|
if (typeof range === 'number') val = parseFloat(content[key])
|
else val = content[key]
|
if (val === range) {
|
if (style.color) result = style.color
|
}
|
break
|
case 'range':
|
if (parseFloat(content[key]) > range[0] && parseFloat(content[key]) < range[1]){
|
if (style.color) result = style.color
|
}
|
break
|
case 'average-bigger':
|
let average = this.getAverage(key)
|
if (parseFloat(content[key]) > average) {
|
if (style.color) result = style.color
|
}
|
break
|
case 'average-smaller':
|
average = this.getAverage(key)
|
if (parseFloat(content[key]) < average) {
|
if (style.color) result = style.color
|
}
|
break
|
case 'average-equal':
|
average = this.getAverage(key)
|
if (parseFloat(content[key]) === average) {
|
if (style.color) result = style.color
|
}
|
break
|
}
|
}
|
}
|
return result
|
}
|
},
|
autoSortShow() {
|
return function(hIndex) {
|
let result = false
|
let header = this.headers[hIndex]
|
let keys = []
|
// 判断排序是否传值
|
if (this.sortCol.length !== 0 && this.sortKeys.length === 0) {
|
this.sortCol.forEach(item => {
|
keys.push(item.key)
|
})
|
this.sortKeys = keys
|
if (keys.includes(header.key)) {
|
result = true
|
}
|
} else if (this.sortCol.length !== 0) {
|
if (this.sortKeys.includes(header.key)) {
|
result = true
|
}
|
}
|
return result
|
}
|
},
|
screenWidth() {
|
return `${uni.getSystemInfoSync()['screenWidth']}px`
|
}
|
},
|
props: {
|
headers: {
|
type: Array,
|
default() {
|
return []
|
}
|
},
|
contents: {
|
type: Array,
|
default() {
|
return []
|
}
|
},
|
emptyString: {
|
type: String,
|
default: '-'
|
},
|
width: {
|
type: String,
|
default: "100%"
|
},
|
height: {
|
type: String,
|
default: 'auto'
|
},
|
fontSize: {
|
type: Array,
|
default() {
|
return [24]
|
}
|
},
|
defaultColWidth: {
|
type: Number,
|
default: 176
|
},
|
headerWeight: {
|
type: Boolean,
|
default: true
|
},
|
minHeight: {
|
type: Array,
|
default() {
|
return [70]
|
}
|
},
|
headerBgColor: {
|
type: String,
|
default: '#24ABFD'
|
},
|
contentBgColor: {
|
type: String,
|
default: '#DADADA'
|
},
|
headerFtColor: {
|
type: String,
|
default: '#fff'
|
},
|
contentFtColor: {
|
type: String,
|
default: '#3e3e3e'
|
},
|
linkColor: {
|
type: String,
|
default: '#0024c8'
|
},
|
firstColBgColor: {
|
type: String,
|
default: '#DADADA'
|
},
|
firstLineFixed: {
|
type: Boolean,
|
default: false
|
},
|
textAlign: {
|
type: String,
|
default: 'center'
|
},
|
padding: {
|
type: Array,
|
default() {
|
return [5, 10]
|
}
|
},
|
borderColor: {
|
type: String,
|
default: '#fff'
|
},
|
urlCol: {
|
type: Array,
|
default() {
|
return []
|
}
|
},
|
computedCol: {
|
type: Array,
|
default() {
|
return []
|
}
|
},
|
bottomComputedFixed: {
|
type: Boolean,
|
default: true
|
},
|
valueFormat: {
|
type: Array,
|
default() {
|
return []
|
}
|
},
|
formatCol: {
|
type: Array,
|
default() {
|
return []
|
}
|
},
|
showLeftAndRightBorder: {
|
type: Boolean,
|
default: false
|
},
|
showVertBorder: {
|
type: Boolean,
|
default: true
|
},
|
sortCol: {
|
type: Array,
|
default() {
|
return []
|
}
|
},
|
sortWays: {
|
type: Array,
|
default() {
|
return ['none', 'asc', 'inv']
|
}
|
},
|
loading: {
|
type: Boolean,
|
default: false
|
},
|
loaderSize: {
|
type: [String, Number],
|
default: 50
|
},
|
loaderColor: {
|
type: String,
|
default: '#a3a3a3'
|
},
|
loaderBgColor: {
|
type: String,
|
default: '#f8f8f8'
|
},
|
enableCheck: {
|
type: String,
|
default: ''
|
},
|
checkColWidth: {
|
type: [String, Number],
|
default: '70'
|
},
|
checkerColor: {
|
type: String,
|
default: '#3e3e3e'
|
},
|
checkerBorderColor: {
|
type: String,
|
default: '#d3d3d3'
|
},
|
checkerBgColor: {
|
type: String,
|
default: 'rgba(0, 0, 0, 0)'
|
},
|
checkerBoxBgColor: {
|
type: String,
|
default: 'rgba(0, 0, 0, 0)'
|
},
|
checkerCellBgColor: {
|
type: String,
|
default: '#f1f1f1'
|
}
|
},
|
watch: {
|
headers(val) {
|
this.$forceUpdate()
|
},
|
contents(val) {
|
this.contentsSort = val.slice()
|
if (this.onload) {
|
this.contentsSort.forEach(item => {
|
this.$set(item, 'checked', false)
|
})
|
this.oContentsSort = this.contentsSort.slice()
|
this.onload = false
|
}
|
this.$forceUpdate()
|
}
|
},
|
mounted() {
|
this.contentsSort.forEach(item => {
|
this.$set(item, 'checked', false)
|
})
|
this.oContentsSort = this.contentsSort.slice()
|
if (this.sortCol.length !== 0) {
|
this.sortActiveKey = this.sortCol[0].key
|
uni.setStorageSync('lastSortActiveKey', this.sortActiveKey)
|
this.doSort(this.sortCol[0].key, this.sortWays[this.sortWay], this.sortCol[0].isNumber)
|
}
|
},
|
methods: {
|
doSort(key, type, isNumber) {
|
let arr = this.contentsSort
|
if (type === 'asc') {
|
// 升序
|
if (isNumber) {
|
arr.sort((a, b) => {
|
let a1 = (parseFloat(a[key].toString().replace(/[^0-9]/ig, "")) || 0);
|
let b1 = (parseFloat(b[key].toString().replace(/[^0-9]/ig, "")) || 0);
|
a1 = a[key] < 0 ? - a1 : a1;
|
b1 = b[key] < 0 ? - b1 : b1;
|
return a1 - b1
|
})
|
} else {
|
arr.sort((a, b) => {
|
let A = Pinyin.getSpell(a[key].charAt(0), function(charactor, spell) {
|
return spell[1]
|
}).charAt(0).charCodeAt()
|
let B = Pinyin.getSpell(b[key].charAt(0), function(charactor, spell) {
|
return spell[1]
|
}).charAt(0).charCodeAt()
|
return A - B
|
})
|
}
|
|
} else if (type === 'inv') {
|
// 倒序
|
if (isNumber) {
|
arr.sort((a, b) => {
|
let a1 = (parseFloat(a[key].toString().replace(/[^0-9]/ig, "")) || 0);
|
let b1 = (parseFloat(b[key].toString().replace(/[^0-9]/ig, "")) || 0);
|
a1 = a[key] < 0 ? - a1 : a1;
|
b1 = b[key] < 0 ? - b1 : b1;
|
return b1 - a1
|
})
|
} else {
|
arr.sort((a, b) => {
|
let A = Pinyin.getSpell(a[key].charAt(0), function(charactor, spell) {
|
return spell[1]
|
}).charAt(0).charCodeAt()
|
let B = Pinyin.getSpell(b[key].charAt(0), function(charactor, spell) {
|
return spell[1]
|
}).charAt(0).charCodeAt()
|
return B - A
|
})
|
}
|
} else {
|
this.contentsSort = this.oContentsSort.slice()
|
}
|
if (this.enableCheck) {
|
this.event.data.forEach(item => {
|
this.contentsSort.forEach((content, index) => {
|
if (isEqual(item.lineData, content)) {
|
item.index = index
|
}
|
})
|
})
|
}
|
this.$forceUpdate()
|
},
|
initBottomComputed() {
|
let result = {}
|
let needComputed = []
|
this.computedCol.forEach(key => {
|
let computedColData = []
|
this.contentsSort.forEach(content => {
|
computedColData.push(content[key] || '0')
|
})
|
needComputed.push(computedColData)
|
})
|
needComputed.forEach((item, index) => {
|
let total = 0
|
item.forEach(num => {
|
total += parseFloat(num)
|
})
|
result[this.computedCol[index]] = total
|
})
|
this.bottomComputed = result
|
},
|
onHeaderItemTap(index) {
|
let header = this.headers[index]
|
const lastSortActiveKey = uni.getStorageSync('lastSortActiveKey') || ''
|
if (this.sortCol.length !== 0) {
|
if (this.sortKeys.includes(header.key)) {
|
// 当前列开启了排序
|
this.sortActiveKey = header.key
|
uni.setStorageSync('lastSortActiveKey', this.sortActiveKey)
|
if (this.sortWay < 2 && lastSortActiveKey === this.sortActiveKey) {
|
this.sortWay++
|
} else if (lastSortActiveKey !== this.sortActiveKey) {
|
this.sortWay = 1
|
} else if (this.sortWay >= 2) {
|
this.sortWay = 0
|
}
|
let isNumber = this.sortCol[this.sortKeys.indexOf(header.key)].isNumber
|
// console.log(header.key,this.sortWays[this.sortWay],isNumber)
|
this.doSort(header.key, this.sortWays[this.sortWay], isNumber)
|
}
|
}
|
},
|
onContentItemTap(cIndex, hIndex) {
|
let event = {}
|
let content = this.contentsSort[cIndex]
|
let header = this.headers[hIndex]
|
let keys = []
|
|
if (this.urlCol.length !== 0) {
|
for (let i in this.urlCol) {
|
let item = this.urlCol[i]
|
keys.push(item.key)
|
}
|
}
|
|
if (content[header.key]) {
|
if (keys.includes(header.key)) {
|
// 该单元格为链接
|
switch(this.urlCol[keys.indexOf(header.key)].type) {
|
case 'route':
|
let url = content[header.key][1]
|
if (content[header.key][2]) {
|
url = `${url}?`
|
Object.keys(content[header.key][2]).forEach(key => {
|
url += `&${key}=${content[header['key']][2][key]}`
|
})
|
}
|
uni.navigateTo({url})
|
break
|
case 'http':
|
this.openURL(content[header.key][1])
|
break
|
}
|
} else {
|
event = {
|
content: content[header.key],
|
contentIndex: cIndex,
|
header: header.label,
|
headerIndex: hIndex,
|
key: header.key,
|
lineData: content
|
}
|
this.$emit('onCellClick', event)
|
}
|
|
} else {
|
event = {
|
content: '',
|
contentIndex: cIndex,
|
header: header.label,
|
headerIndex: hIndex,
|
key: header.key,
|
lineData: content
|
}
|
if (keys.includes(header.key)) {
|
// 该单元格为链接
|
event['isLink'] = true
|
}
|
this.$emit('onCellClick', event)
|
}
|
|
},
|
onCheckAllTap() {
|
if (this.enableCheck === 'multiple') {
|
let checkList = []
|
this.contentsSort.forEach(item => {
|
checkList.push(item.checked)
|
})
|
this.checkList = checkList
|
if (!this.checkAll) {
|
this.checkAll = true
|
this.contentsSort.forEach(item => {
|
item.checked = true
|
})
|
this.event.data = []
|
this.contentsSort.forEach((content, index) => {
|
this.event.data.push({
|
index,
|
lineData: content
|
})
|
})
|
|
} else {
|
this.checkAll = false
|
this.event.data = []
|
this.contentsSort.forEach(item => {
|
item.checked = false
|
})
|
}
|
this.$emit('onCheck', this.event)
|
}
|
},
|
onCheckItemTap(cIndex) {
|
let content = this.contentsSort[cIndex]
|
if (this.enableCheck === 'single') {
|
this.contentsSort.forEach((item, index) => {
|
if (cIndex === index) {
|
item.checked = !item.checked
|
} else {
|
item.checked = false
|
}
|
})
|
} else if (this.enableCheck === 'multiple') {
|
this.contentsSort[cIndex]['checked'] = !this.contentsSort[cIndex]['checked']
|
}
|
if (this.contentsSort[cIndex]['checked']) {
|
if (this.enableCheck === 'single') {
|
this.event.data = []
|
}
|
this.event.data.push({
|
index: cIndex,
|
lineData: this.contentsSort[cIndex]
|
})
|
} else {
|
this.event.data.forEach(item => {
|
if (item.index === cIndex) this.event.data.splice(this.event.data.indexOf(item), 1)
|
})
|
if (this.event.data.length === 0) {
|
this.checkAll = false
|
}
|
}
|
this.$forceUpdate()
|
this.$emit('onCheck', this.event)
|
},
|
openURL(href) {
|
// #ifdef APP-PLUS
|
plus.runtime.openURL(href)
|
// #endif
|
// #ifdef H5
|
window.open(href)
|
// #endif
|
// #ifdef MP
|
uni.setClipboardData({
|
data: href,
|
success() {
|
uni.showToast({
|
title: '网址已复制,请在手机浏览器里粘贴该网址',
|
icon: 'none'
|
})
|
}
|
})
|
// #endif
|
},
|
getAverage(key) {
|
let numList = []
|
this.contentsSort.forEach(content => {
|
numList.push(parseFloat(content[key]) || 0)
|
})
|
return numList.reduce((a, b) => a + b) / numList.length
|
},
|
getTotal(key) {
|
let numList = []
|
this.contentsSort.forEach(content => {
|
numList.push(parseFloat(content[key]) || 0)
|
})
|
return numList.reduce((a, b) => a + b)
|
},
|
RGBChange(color, level, type) {
|
// 判断颜色类型
|
let r = 0,
|
g = 0,
|
b = 0,
|
hasAlpha = false,
|
alpha = 1
|
if (color.indexOf('#') !== -1) {
|
// hex转rgb
|
if (color.length === 4) {
|
let arr = color.split('')
|
color = '#' + arr[1] + arr[1] + arr[2] + arr[2] + arr[3] + arr[3]
|
}
|
let color16List = [color.substring(1, 3), color.substring(3, 5), color.substring(5, 7)]
|
r = parseInt(color16List[0], 16)
|
g = parseInt(color16List[1], 16)
|
b = parseInt(color16List[2], 16)
|
|
} else {
|
hasAlpha = color.indexOf('a') !== -1
|
let root = color.slice()
|
let idx = root.indexOf('(') + 1
|
root = root.substring(idx)
|
let firstDotIdx = root.indexOf(',')
|
r = parseFloat(root.substring(0, firstDotIdx))
|
root = root.substring(firstDotIdx + 1)
|
let secondDotIdx = root.indexOf(',')
|
g = parseFloat(root.substring(0, secondDotIdx))
|
root = root.substring(secondDotIdx + 1)
|
if (hasAlpha) {
|
let thirdDotIdx = root.indexOf(',')
|
b = parseFloat(root.substring(0, thirdDotIdx))
|
alpha = parseFloat(root.substring(thirdDotIdx + 1))
|
} else {
|
b = parseFloat(root)
|
}
|
}
|
|
let rgbc = [r, g, b]
|
// 减淡或加深
|
for (var i = 0; i < 3; i++)
|
type === 'light' ? rgbc[i] = Math.floor((255 - rgbc[i]) * level + rgbc[i]) : rgbc[i] = Math.floor(rgbc[i] * (1 -
|
level))
|
|
if (hasAlpha) {
|
return `rgba(${rgbc[0]}, ${rgbc[1]}, ${rgbc[2]}, ${alpha})`
|
} else {
|
return `rgb(${rgbc[0]}, ${rgbc[1]}, ${rgbc[2]})`
|
}
|
},
|
hexToRgb(color) {
|
if (color.length === 4) {
|
let arr = color.split('')
|
color = '#' + arr[1] + arr[1] + arr[2] + arr[2] + arr[3] + arr[3]
|
}
|
let color16List = [color.substring(1, 3), color.substring(3, 5), color.substring(5, 7)]
|
let r = parseInt(color16List[0], 16)
|
let g = parseInt(color16List[1], 16)
|
let b = parseInt(color16List[2], 16)
|
return [r, g, b]
|
},
|
randomString(length, chars) {
|
var result = ''
|
for (var i = length; i > 0; --i) result += chars[Math.floor(Math.random() * chars.length)]
|
return result
|
}
|
}
|
}
|
</script>
|
|
<style>
|
@import '../../static/table/iconfont.wxss';
|
@import '../../static/table/loader.wxss';
|
.ios-header-bug {
|
height: 0;
|
width: 1px;
|
opacity: 0;
|
}
|
|
.wyb-table-scroll-view {
|
overflow: scroll;
|
-webkit-overflow-scrolling: touch;
|
}
|
|
.wyb-table-scroll-view::-webkit-scrollbar {
|
display: none;
|
/* #ifdef MP-WEIXIN */
|
width: 0;
|
height: 0;
|
/* #endif */
|
}
|
|
.wyb-table-loading-box {
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
z-index: 500;
|
}
|
|
.wyb-table-header {
|
position: sticky;
|
top: 0;
|
display: grid;
|
grid-auto-flow: column;
|
width: max-content;
|
z-index: 25;
|
}
|
|
.wyb-table-header-item {
|
flex: 1;
|
display: flex;
|
align-items: center;
|
box-sizing: border-box;
|
position: relative;
|
}
|
|
.wyb-table-header-icon {
|
display: flex;
|
flex-direction: column;
|
}
|
|
.wyb-table-content-line {
|
display: grid;
|
grid-auto-flow: column;
|
width: max-content;
|
position: relative;
|
}
|
|
.wyb-table-content-item {
|
display: flex;
|
flex-direction: row;
|
align-items: center;
|
box-sizing: border-box;
|
}
|
|
.wyb-table-checkbox {
|
border-radius: 3px;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
position: relative;
|
}
|
|
.icon-check {
|
width: 100%;
|
height: 100%;
|
position: absolute;
|
border-radius: 0;
|
border-radius: 3px;
|
font-weight: bold;
|
box-sizing: border-box;
|
transform: scale(1.1);
|
}
|
</style>
|