From c8804ceb1fe2dea76f9949c5ea04423876ee2c81 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 28 六月 2024 14:02:47 +0800
Subject: [PATCH] 2024-06-28
---
src/tabviews/custom/components/share/normalTable/index.jsx | 331 ++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 232 insertions(+), 99 deletions(-)
diff --git a/src/tabviews/custom/components/share/normalTable/index.jsx b/src/tabviews/custom/components/share/normalTable/index.jsx
index 01f6363..6ef27dd 100644
--- a/src/tabviews/custom/components/share/normalTable/index.jsx
+++ b/src/tabviews/custom/components/share/normalTable/index.jsx
@@ -20,6 +20,51 @@
'5:1': '20%', '6:1': '16.67%', '7:1': '14.29%', '8:1': '12.5%', '9:1': '11.11%',
'10:1': '10%', '3:4': '133.33%', '2:3': '150%', '9:16': '177.78%'
}
+
+// 瀛楁閫忚
+const triggerLink = (e, item, record) => {
+ e.stopPropagation()
+
+ if (item.linkThdMenu) {
+ let __param = {
+ $BID: record.$$uuid
+ }
+
+ if (item.field) {
+ __param.$searchkey = item.field.toLowerCase()
+ __param.$searchval = record[item.field] || ''
+ }
+
+ Object.keys(record).forEach(key => {
+ if (/^\$/.test(key)) return
+ __param[key] = record[key]
+ })
+
+ let tabmenu = item.linkThdMenu
+
+ tabmenu.param = __param
+
+ MKEmitter.emit('modifyTabs', tabmenu, true)
+ } else if (item.linkurl) {
+ let src = item.linkurl
+
+ if (/@/.test(src)) {
+ src = src.replace(/@id@/ig, record.$$uuid)
+ src = src.replace(/@appkey@/ig, window.GLOB.appkey)
+ src = src.replace(/@userid@/ig, sessionStorage.getItem('UserID'))
+ src = src.replace(/@LoginUID@/ig, sessionStorage.getItem('LoginUID'))
+
+ Object.keys(record).forEach(key => {
+ if (/^\$/.test(key)) return
+ let reg = new RegExp('@' + key + '@', 'ig')
+ src = src.replace(reg, record[key])
+ })
+ }
+
+ window.open(src)
+ }
+}
+
class BodyRow extends React.Component {
shouldComponentUpdate (nextProps, nextState) {
return !is(fromJS(this.props.data), fromJS(nextProps.data)) || this.props.className !== nextProps.className
@@ -107,10 +152,10 @@
}
render() {
- let { col, config, record, className, style, triggerLink, ...resProps } = this.props
+ let { col, config, record, className, style, ...resProps } = this.props
if (!col) return (<td {...resProps} className={className} style={style}/>)
-
+
if (col.type === 'text') {
let content = ''
if (record[col.field] !== undefined) {
@@ -126,15 +171,19 @@
content = <span>{col.prefix || ''}<Encrypts value={content} />{col.postfix || ''}</span>
}
+ if (col.noValue === 'hide' && content < '1949-10-02') {
+ content = ''
+ }
+
if (col.textFormat !== 'encryption') {
content = (col.prefix || '') + content + (col.postfix || '')
}
}
if (col.marks) {
- let mark = getMark(col.marks, record, style)
+ style = style ? {...style} : {}
- style = mark.style
+ let mark = getMark(col.marks, record, style)
if (mark.icon) {
if (mark.position === 'front') {
@@ -162,21 +211,19 @@
resProps.rowSpan = record['$$' + col.field]
}
- if (!record.$disabled && (col.linkThdMenu || col.linkurl)) {
- content = (
- <div>
- <div className="link-menu" onDoubleClick={(e) => triggerLink(e, col, record)}></div>
- {content}
- </div>
- )
- }
-
resProps.children = content
+
+ if (!record.$disabled && (col.linkThdMenu || col.linkurl)) {
+ return (<td {...resProps} className={className + ' clickable'} onClick={(e) => triggerLink(e, col, record)} style={style}/>)
+ }
} else if (col.type === 'number') {
let content = ''
try {
content = parseFloat(record[col.field])
if (isNaN(content)) {
+ content = ''
+ }
+ if (col.noValue === 'hide' && content === 0) {
content = ''
}
} catch (e) {
@@ -197,6 +244,7 @@
}
if (col.format === 'thdSeparator') {
+ content = content + ''
content = content.replace(/\d{1,3}(?=(\d{3})+(\.\d*)?$)/g, '$&,')
}
@@ -204,9 +252,9 @@
}
if (col.marks) {
- let mark = getMark(col.marks, record, style)
+ style = style ? {...style} : {}
- style = mark.style
+ let mark = getMark(col.marks, record, style)
if (mark.icon) {
if (mark.position === 'front') {
@@ -235,16 +283,11 @@
resProps.rowSpan = record['$$' + col.field]
}
- if (!record.$disabled && (col.linkThdMenu || col.linkurl)) {
- content = (
- <div>
- <div className="link-menu" onDoubleClick={(e) => triggerLink(e, col, record)}></div>
- {content}
- </div>
- )
- }
-
resProps.children = content
+
+ if (!record.$disabled && (col.linkThdMenu || col.linkurl)) {
+ return (<td {...resProps} className={className + ' clickable'} onClick={(e) => triggerLink(e, col, record)} style={style}/>)
+ }
} else if (col.type === 'picture') {
let photos = ''
if (record[col.field]) {
@@ -268,7 +311,7 @@
<div>
{photos.map((url, i) => (
<Col key={i} span={col.span || 24}>
- <MkPicture style={{paddingTop, backgroundSize: col.backgroundSize || 'cover'}} scale={scale} url={url} urls={photos}/>
+ <MkPicture lostTip={col.lostTip !== 'false'} style={{paddingTop, backgroundSize: col.backgroundSize || 'cover'}} scale={scale} url={url} urls={photos}/>
</Col>
))}
</div>
@@ -329,6 +372,17 @@
} else {
_href += '?' + _param
}
+ } else if (/@/.test(_href)) {
+ _href = _href.replace(/@id@/ig, record.$$uuid || '')
+ _href = _href.replace(/@appkey@/ig, window.GLOB.appkey)
+ _href = _href.replace(/@userid@/ig, sessionStorage.getItem('UserID'))
+ _href = _href.replace(/@LoginUID@/ig, sessionStorage.getItem('LoginUID'))
+
+ Object.keys(record).forEach(key => {
+ if (/^\$/.test(key)) return
+ let reg = new RegExp('@' + key + '@', 'ig')
+ _href = _href.replace(reg, record[key])
+ })
}
if (col.blur) {
@@ -352,6 +406,10 @@
// eslint-disable-next-line
let func = new Function('data', col.formula)
content = func([record])
+
+ if (col.noValue === 'hide' && content === 0) {
+ content = ''
+ }
} catch (e) {
console.warn(e)
content = ''
@@ -365,6 +423,10 @@
try {
// eslint-disable-next-line
content = eval(content)
+
+ if (col.noValue === 'hide' && content === 0) {
+ content = ''
+ }
} catch (e) {
console.info(content)
console.warn(e)
@@ -384,14 +446,19 @@
content = <span dangerouslySetInnerHTML={{__html: content}}></span>
} else if (content !== '') {
content = `${col.prefix || ''}${content}${col.postfix || ''}`
- content = content.replace(/\n/ig, '<br/>').replace(/\s/ig, ' ')
+ if (!col.evalchars || col.evalchars.includes('enter')) {
+ content = content.replace(/\n/ig, '<br/>')
+ }
+ if (!col.evalchars || col.evalchars.includes('space')) {
+ content = content.replace(/\s/ig, ' ')
+ }
content = <span dangerouslySetInnerHTML={{__html: content}}></span>
}
if (col.marks) {
- let mark = getMark(col.marks, record, style)
+ style = style ? {...style} : {}
- style = mark.style
+ let mark = getMark(col.marks, record, style)
if (mark.icon) {
if (mark.position === 'front') {
@@ -442,7 +509,10 @@
loading: PropTypes.bool, // 琛ㄦ牸鍔犺浇涓�
refreshdata: PropTypes.func, // 琛ㄦ牸涓帓搴忓垪銆侀〉鐮佺殑鍙樺寲鏃跺埛鏂�
chgSelectData: PropTypes.func, // 鏁版嵁鍒囨崲
- autoMatic: PropTypes.any
+ autoMatic: PropTypes.any,
+ allSearch: PropTypes.any,
+ colsCtrls: PropTypes.any,
+ parCtrl: PropTypes.any
}
state = {
@@ -455,11 +525,13 @@
rowspans: null, // 琛屽悎骞跺瓧娈典俊鎭�
pickup: false, // 鏀惰捣鏈�夋嫨椤�
orderfields: {}, // 鎺掑簭id涓巉ield杞崲
- pageOptions: []
+ pageOptions: [],
+ allColumns: null,
+ reseting: false
}
UNSAFE_componentWillMount () {
- const { setting, fields, columns } = this.props
+ const { setting, columns, fields, colsCtrls } = this.props
let radio = 5 // 铏氬寲姣斾緥
let _format = false // 鏄惁铏氬寲澶勭悊
let rowspans = []
@@ -483,21 +555,14 @@
let cell = null
if (item.type === 'colspan') {
- cell = { title: item.label, align: item.Align }
+ cell = { title: item.label, align: item.Align, $key: item.uuid }
cell.children = getColumns(item.subcols)
} else {
if (item.rowspan === 'true') {
rowspans.push(item.field)
}
- if (item.type === 'index') {
- item.field = '$Index'
- item.type = 'text'
- } else if (_format && !Math.floor(Math.random() * radio)) {
+ if (_format && !Math.floor(Math.random() * radio)) {
item.blur = true
- }
-
- if (item.marks && item.marks.length === 0) {
- item.marks = ''
}
if (item.field) {
@@ -507,6 +572,7 @@
}
cell = {
+ $key: item.uuid,
align: item.Align,
dataIndex: item.uuid,
title: item.label,
@@ -516,7 +582,6 @@
record,
col: item,
config: item.type === 'custom' ? {setting, columns: fields} : null,
- triggerLink: this.triggerLink
})
}
}
@@ -532,6 +597,7 @@
fields.push(item.field)
_columns.push({
+ $key: item.uuid,
align: item.Align,
dataIndex: item.field,
title: item.label,
@@ -564,24 +630,74 @@
pageOptions = pageOptions.sort((a, b) => a - b)
}
+ if (setting.maxPageSize) {
+ pageOptions = pageOptions.filter(item => item <= setting.maxPageSize)
+ }
+
+ let allColumns = null
+ if (colsCtrls) {
+ rowspans = null
+ allColumns = [..._columns]
+ _columns = this.getCurColumns(_columns, this.props.allSearch)
+ }
+
this.setState({
pageSize: setting.pageSize || 10,
pageOptions,
+ allColumns,
columns: _columns,
rowspans,
tableId,
orderfields
- }, () => {
- const element = document.getElementById(tableId)
- element && element.style.setProperty('--mk-table-border-color', setting.borderColor || '#e8e8e8')
- element && element.style.setProperty('--mk-table-color', setting.color || 'rgba(0, 0, 0, 0.65)')
- element && element.style.setProperty('--mk-table-font-size', setting.fontSize || '14px')
- element && element.style.setProperty('--mk-table-font-weight', setting.fontWeight || 'normal')
})
}
shouldComponentUpdate (nextProps, nextState) {
return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
+ }
+
+ UNSAFE_componentWillReceiveProps(nextProps) {
+ const { allSearch, parCtrl } = this.props
+ const { allColumns } = this.state
+
+ if (allSearch && !is(fromJS(allSearch), fromJS(nextProps.allSearch))) {
+ this.setState({
+ reseting: true,
+ columns: this.getCurColumns(allColumns, nextProps.allSearch)
+ }, () => {
+ this.setState({reseting: false})
+ })
+ } else if (parCtrl && !is(fromJS(this.props.columns), fromJS(nextProps.columns))) {
+ let getColumns = (cols) => {
+ return cols.map(item => {
+ let cell = null
+
+ if (item.type === 'colspan') {
+ cell = { title: item.label, align: item.Align }
+ cell.children = getColumns(item.subcols)
+ } else {
+ cell = {
+ align: item.Align,
+ dataIndex: item.uuid,
+ title: item.label,
+ sorter: (item.field || item.sortField) && item.IsSort === 'true',
+ width: item.Width || 120,
+ onCell: record => ({
+ record,
+ col: item,
+ config: item.type === 'custom' ? {setting: this.props.setting, columns: this.props.fields} : null,
+ })
+ }
+ }
+
+ return cell
+ })
+ }
+
+ this.setState({
+ columns: getColumns(nextProps.columns)
+ })
+ }
}
componentDidMount () {
@@ -610,6 +726,50 @@
MKEmitter.removeListener('autoQueryData', this.autoQueryData)
MKEmitter.removeListener('autoSelectData', this.autoSelectData)
MKEmitter.removeListener('mkCheckTopLine', this.mkCheckTopLine)
+ }
+
+ getCurColumns = (columns, allSearch) => {
+ const { colsCtrls } = this.props
+
+ let values = {}
+ allSearch.forEach(item => {
+ values[item.key] = item.value
+ })
+ let cols = null
+ colsCtrls.some(item => {
+ let originVal = item.field.map(f => values[f] || '').join('')
+ let contrastVal = item.contrastValue
+ let result = false
+
+ if (item.match === '=') {
+ result = originVal === contrastVal
+ } else if (item.match === '!=') {
+ result = originVal !== contrastVal
+ } else if (item.match === 'regexp') {
+ let reg = new RegExp(item.contrastValue, 'ig')
+ result = reg.test(originVal)
+ } else {
+ originVal = isNaN(originVal) ? originVal : +originVal
+ contrastVal = isNaN(contrastVal) ? contrastVal : +contrastVal
+ if (item.match === '>') {
+ result = originVal > contrastVal
+ } else if (item.match === '<') {
+ result = originVal < contrastVal
+ }
+ }
+
+ if (!result) return false
+
+ cols = item.cols
+
+ return true
+ })
+
+ if (cols) {
+ return columns.filter(col => cols.includes(col.$key))
+ }
+
+ return columns
}
autoSelectData = (id, index) => {
@@ -713,7 +873,7 @@
MKEmitter.emit('resetSelectLine', MenuID, '', '')
MKEmitter.emit('syncBalconyData', MenuID, data, data.length > 0)
if (data.length === 0) {
- message.warning('鏈幏鍙栧埌鏁版嵁锛�')
+ message.warning(window.GLOB.dict['no_data'] || '鏈幏鍙栧埌鏁版嵁锛�')
}
} else {
this.setState({
@@ -728,52 +888,10 @@
}
}
- // 瀛楁閫忚
- triggerLink = (e, item, record) => {
- e.stopPropagation()
-
- let __param = {
- $searchkey: item.field,
- $searchval: record[item.field] || '',
- $BID: record.$$uuid
- }
-
- if (item.linkfields && item.linkfields.length > 0) {
- item.linkfields.forEach(field => {
- __param[field] = record[field] || ''
- })
- }
-
- if (item.linkThdMenu) {
- let tabmenu = item.linkThdMenu
-
- tabmenu.param = __param
-
- MKEmitter.emit('modifyTabs', tabmenu, true)
- } else if (item.linkurl) {
- let src = item.linkurl
-
- let con = '?'
-
- if (/\?/ig.test(src)) {
- con = '&'
- }
-
- if (item.linkfields && item.linkfields.length > 0) {
- item.linkfields.forEach(field => {
- if (field.toLowerCase() === 'id') return
- con += `${field}=${record[field] || ''}&`
- })
- }
-
- src = src + `${con}id=${record.$$uuid}&appkey=${window.GLOB.appkey}&userid=${sessionStorage.getItem('UserID')}&LoginUID=${sessionStorage.getItem('LoginUID') || ''}`
-
- window.open(src)
- }
- }
-
onSelectChange = (selectedRowKeys, e) => {
const { setting, MenuID, data } = this.props
+
+ if (this.state.pickup) return
let index = ''
let _activeIndex = null
@@ -999,12 +1117,14 @@
if (!setting.doubleClick) return
if (record.$disabled) return
- MKEmitter.emit('triggerBtnId', setting.doubleClick, [record], 'linkbtn')
+ MKEmitter.emit('triggerBtnId', setting.doubleClick, [record], 'linkbtn', (record.$$uuid || '') + (record.$Index || ''))
}
render() {
const { setting, statFValue, lineMarks, data } = this.props
- const { selectedRowKeys, activeIndex, pickup, tableId, pageOptions, columns } = this.state
+ const { selectedRowKeys, activeIndex, pickup, pageOptions, columns, reseting } = this.state
+
+ if (reseting) return null
// 璁剧疆琛ㄦ牸閫夋嫨灞炴�э細鍗曢�夈�佸閫夈�佷笉鍙��
let rowSelection = null
@@ -1043,7 +1163,7 @@
pageSizeOptions: pageOptions,
showSizeChanger: true,
total: this.props.total || 0,
- showTotal: (total, range) => `${range[0]}-${range[1]} 鍏� ${total} 鏉
+ showTotal: (total, range) => `${range[0]}-${range[1]} ${window.GLOB.dict['of'] || '鍏�'} ${total} ${window.GLOB.dict['items'] || '鏉�'}`
}
}
@@ -1054,8 +1174,14 @@
}
let height = setting.height || false
- if (height && height <= 100) {
- height = height + 'vh'
+ if (height) {
+ if (height <= 100) {
+ if (height < 0) {
+ height = `calc(100vh - ${-height}px)`
+ } else {
+ height = height + 'vh'
+ }
+ }
}
let loading = this.props.loading
if (setting.mask === 'hidden') {
@@ -1072,10 +1198,17 @@
}
}
+ let style = {
+ '--mk-table-border-color': setting.borderColor || '#e8e8e8',
+ '--mk-table-color': setting.color || 'rgba(0, 0, 0, 0.65)',
+ '--mk-table-font-size': setting.fontSize || '14px',
+ '--mk-table-font-weight': setting.fontWeight || 'normal'
+ }
+
return (
- <div className={`normal-custom-table ${setting.tableHeader || ''} ${height ? 'fixed-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || 'middle'} table-col-${columns.length} ${fixed}`} id={tableId}>
+ <div className={`normal-custom-table ${setting.tableHeader || ''} ${setting.parity === 'true' ? 'mk-parity' : ''} ${height ? 'fixed-table-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || 'middle'} table-col-${columns.length} ${fixed}`} style={style}>
{(setting.tableType === 'radio' || setting.tableType === 'checkbox') && data && data.length > 0 ?
- <Switch title="鏀惰捣" className="main-pickup" checkedChildren="寮�" unCheckedChildren="鍏�" checked={pickup} onChange={this.pickupChange} /> : null
+ <Switch title="鏀惰捣" className="main-pickup" checkedChildren={window.GLOB.dict['open'] || '寮�'} unCheckedChildren={window.GLOB.dict['shut'] || '鍏�'} checked={pickup} onChange={this.pickupChange} /> : null
}
<Table
components={components}
--
Gitblit v1.8.0