king
2022-11-21 f6626b05f1275cc2f8ca77f773d4f6a6af1b0a89
src/tabviews/custom/components/carousel/prop-card/index.jsx
@@ -1,7 +1,8 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Spin, notification, Carousel } from 'antd'
import { Spin, notification, Carousel, Modal, Checkbox, Button } from 'antd'
import { LeftOutlined, RightOutlined } from '@ant-design/icons'
import asyncComponent from '@/utils/asyncComponent'
import Api from '@/api'
@@ -11,6 +12,7 @@
import './index.scss'
const CardItem = asyncComponent(() => import('../cardItem'))
const NormalHeader = asyncComponent(() => import('@/tabviews/custom/components/share/normalheader'))
class PropCard extends Component {
  static propTpyes = {
@@ -24,8 +26,9 @@
    config: null,              // 图表配置信息
    loading: false,            // 数据加载状态
    sync: false,               // 是否统一请求数据
    data: {},                  // 数据
    BData: null
    data: {$$empty: true},
    BData: null,
    visible: false
  }
  UNSAFE_componentWillMount () {
@@ -66,6 +69,7 @@
      }
    }
    _data.$$uuid = _data[_config.setting.primaryKey] || ''
    _data.$$BID = BID || ''
    _data.$$BData = BData || ''
@@ -74,8 +78,13 @@
      _cols.set(item.field, item)
    })
    if (!_config.wrap.height) { // 兼容
      _config.wrap.height = _config.style.height || '300px'
      delete _config.style.height
    }
    _config.subcards.forEach(card => {
      card.style.height = _config.style.height
      card.style.height = _config.wrap.height
      if (card.setting.click) {
        card.style.cursor = 'pointer'
      }
@@ -101,6 +110,8 @@
        setTimeout(() => {
          this.loadData()
        }, _config.setting.delay || 0)
      } else if (_config.wrap.display === 'modal' && _config.wrap.datatype === 'static') {
        this.openModal()
      }
    })
  }
@@ -152,15 +163,39 @@
        }
      }
      _data.$$uuid = _data[config.setting.primaryKey] || ''
      _data.$$BID = BID || ''
      _data.$$BData = BData || ''
      this.setState({sync: false, data: _data})
    } else if (config.setting.syncRefresh && nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) {
      this.setState({sync: false, data: _data}, () => {
        if (config.wrap.display === 'modal') {
          this.openModal()
        }
      })
    } else if (config.setting.useMSearch && nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) {
      this.setState({}, () => {
        this.loadData()
      })
    }
  }
  openModal = () => {
    const { config, data } = this.state
    let code = config.wrap.code || ('modal' + config.uuid)
    let tip = localStorage.getItem(code)
    if ((data.$$uuid && tip === data.$$uuid) || (!data.$$uuid && tip)) return
    if (config.wrap.modalContent === 'update') {
      localStorage.setItem(code, data.$$uuid || 'true')
      Api.getAppVersion(true)
    }
    setTimeout(() => {
      this.setState({visible: true})
    }, 200)
  }
  /**
@@ -265,18 +300,29 @@
        _data = result.data[0]
      }
      _data.$$uuid = _data[config.setting.primaryKey] || ''
      _data.$$BID = BID || ''
      _data.$$BData = BData || ''
      this.setState({
        data: _data,
        loading: false
      }, () => {
        if (config.wrap.display === 'modal') {
          this.openModal()
        }
      })
    } else {
      this.setState({
        loading: false
      })
      this.timer && this.timer.stop()
      if (result.ErrCode === 'N') {
        Modal.error({
          title: result.message,
        })
      } else {
      notification.error({
        top: 92,
        message: result.message,
@@ -284,11 +330,63 @@
      })
    }
  }
  }
  onTipChange = (e) => {
    const { config, data } = this.state
    let code = config.wrap.code || ('modal' + config.uuid)
    if (e.target.checked) {
      localStorage.setItem(code, data.$$uuid || 'true')
    } else {
      localStorage.removeItem(code)
    }
  }
  render() {
    const { config, loading, data } = this.state
    const { config, loading, data, visible } = this.state
    if (config.wrap.empty === 'hidden' && (!data || data.$$empty)) return null
    if (config.wrap.empty === 'hidden' && data.$$empty) return null
    if (config.wrap.display === 'modal') {
      return <Modal
        wrapClassName='mk-carousel-modal'
        visible={visible}
        maskClosable={false}
        width={config.wrap.modalWidth}
        onCancel={() => this.setState({visible: false})}
        footer={null}
        destroyOnClose
      >
        <div className="custom-prop-carousel-box" style={config.style}>
          <NormalHeader config={config}/>
          <div className="carousel-wrap" style={{height: config.wrap.height}}>
            {config.subcards.length > 1 && config.wrap.autoplay === 'false' ? <div className="prev" onClick={() => this.node && this.node.prev()}><LeftOutlined /></div> : null}
            {config.subcards.length > 1 && config.wrap.autoplay === 'false' ? <div className="next" onClick={() => this.node && this.node.next()}><RightOutlined /></div> : null}
            <Carousel
              autoplay={config.wrap.autoplay !== 'false'}
              dots={config.wrap.dots !== 'false'}
              dotPosition={config.wrap.dotPosition || 'bottom'}
              effect={config.wrap.effect || 'scrollx'}
              autoplaySpeed={config.wrap.speed}
              ref={ref => this.node = ref}
            >
              {config.subcards.map((item, index) => (
                <div key={index}>
                  <CardItem card={item} cards={config} data={data}/>
                </div>
              ))}
            </Carousel>
          </div>
        </div>
        {config.wrap.modalContent !== 'update' ? <div className="mk-footer">
          <Checkbox defaultChecked={false} onChange={this.onTipChange}>不在提醒</Checkbox>
          <Button className="close" onClick={() => this.setState({visible: false})}>立即体验</Button>
        </div> : <div className="mk-footer">
          <Button className="close" onClick={() => this.setState({visible: false})}>知道了</Button>
        </div>}
      </Modal>
    }
    return (
      <div className="custom-prop-carousel-box" id={'anchor' + config.uuid} style={config.style}>
@@ -298,6 +396,8 @@
            <Spin />
          </div> : null
        }
        <NormalHeader config={config}/>
        <div className="carousel-wrap" style={{height: config.wrap.height}}>
        <Carousel
          autoplay={config.wrap.autoplay !== 'false'}
          dots={config.wrap.dots !== 'false'}
@@ -312,6 +412,7 @@
          ))}
        </Carousel>
      </div>
      </div>
    )
  }
}