From 92230c9a97dc9ce9df3313d11d26999c04bb6b26 Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期二, 15 七月 2025 13:12:48 +0800 Subject: [PATCH] 项目初始化 --- src/pages_qiun/components/data-table/senior-table.vue | 1117 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,117 insertions(+), 0 deletions(-) diff --git a/src/pages_qiun/components/data-table/senior-table.vue b/src/pages_qiun/components/data-table/senior-table.vue new file mode 100644 index 0000000..78811d0 --- /dev/null +++ b/src/pages_qiun/components/data-table/senior-table.vue @@ -0,0 +1,1117 @@ +<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杞瑀gb + 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> -- Gitblit v1.9.3