king
2024-06-14 2c573446cd5059b09c06c8673eaf1f51f43967ce
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) {
@@ -124,6 +169,10 @@
          content = `${content.substr(0, 4)}-${content.substr(5, 2)}-${content.substr(8, 2)} ${content.substr(11, 2)}:${content.substr(14, 2)}:${content.substr(17, 2)}`
        } else if (col.textFormat === 'encryption') {
          content = <span>{col.prefix || ''}<Encrypts value={content} />{col.postfix || ''}</span>
        }
        if (col.noValue === 'hide' && content < '1949-10-02') {
          content = ''
        }
        if (col.textFormat !== 'encryption') {
@@ -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, '$&,')
        }
  
@@ -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]) {
@@ -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,7 +446,12 @@
        content = <span dangerouslySetInnerHTML={{__html: content}}></span>
      } else if (content !== '') {
        content = `${col.prefix || ''}${content}${col.postfix || ''}`
        content = content.replace(/\n/ig, '<br/>').replace(/\s/ig, '&nbsp;')
        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, '&nbsp;')
        }
        content = <span dangerouslySetInnerHTML={{__html: content}}></span>
      }
@@ -444,7 +511,8 @@
    chgSelectData: PropTypes.func,   // 数据切换
    autoMatic: PropTypes.any,
    allSearch: PropTypes.any,
    colsCtrls: PropTypes.any
    colsCtrls: PropTypes.any,
    parCtrl: PropTypes.any
  }
  state = {
@@ -493,10 +561,7 @@
            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
            }
  
@@ -517,7 +582,6 @@
                record,
                col: item,
                config: item.type === 'custom' ? {setting, columns: fields} : null,
                triggerLink: this.triggerLink
              })
            }
          }
@@ -593,7 +657,7 @@
  }
  UNSAFE_componentWillReceiveProps(nextProps) {
    const { allSearch } = this.props
    const { allSearch, parCtrl } = this.props
    const { allColumns } = this.state
    if (allSearch && !is(fromJS(allSearch), fromJS(nextProps.allSearch))) {
@@ -602,6 +666,36 @@
        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)
      })
    }
  }
@@ -651,6 +745,9 @@
        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
@@ -788,50 +885,6 @@
  
      MKEmitter.emit('resetSelectLine', MenuID, '', '')
      MKEmitter.emit('syncBalconyData', MenuID, [], false)
    }
  }
  // 字段透视
  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)
    }
  }
@@ -1064,7 +1117,7 @@
    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() {
@@ -1121,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') {
@@ -1147,7 +1206,7 @@
    }
    return (
      <div className={`normal-custom-table ${setting.tableHeader || ''} ${height ? 'fixed-height' : ''} ${setting.mode || ''} table-vertical-${setting.vertical || 'middle'} table-col-${columns.length} ${fixed}`} style={style}>
      <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
        }