| | |
| | | import React, {Component} from 'react' |
| | | import PropTypes from 'prop-types' |
| | | import { is, fromJS } from 'immutable' |
| | | import { Spin, Empty, notification, Carousel } from 'antd' |
| | | import { Spin, Empty, notification, Carousel, Modal, Checkbox, Button } from 'antd' |
| | | import { LeftOutlined, RightOutlined } from '@ant-design/icons' |
| | | |
| | | import Api from '@/api' |
| | | import UtilsDM from '@/utils/utils-datamanage.js' |
| | |
| | | import './index.scss' |
| | | |
| | | const CardItem = asyncComponent(() => import('../cardItem')) |
| | | const NormalHeader = asyncComponent(() => import('@/tabviews/custom/components/share/normalheader')) |
| | | |
| | | class DataCard extends Component { |
| | | static propTpyes = { |
| | |
| | | sync: false, // 是否统一请求数据 |
| | | card: null, // 卡片设置 |
| | | data: null, // 数据 |
| | | BData: null |
| | | BData: null, |
| | | visible: false |
| | | } |
| | | |
| | | UNSAFE_componentWillMount () { |
| | |
| | | _cols.set(item.field, item) |
| | | }) |
| | | |
| | | _card.style.height = _config.style.height |
| | | |
| | | if (_card.setting.click) { |
| | | _card.style.cursor = 'pointer' |
| | | } |
| | |
| | | } |
| | | return item |
| | | }) |
| | | |
| | | if (!_config.wrap.height) { // 兼容 |
| | | _config.wrap.height = _config.style.height || '300px' |
| | | delete _config.style.height |
| | | } |
| | | |
| | | _card.style.height = _config.wrap.height |
| | | |
| | | _config.wrap.speed = (_config.wrap.speed || 3) * 1000 |
| | | |
| | |
| | | setTimeout(() => { |
| | | this.loadData() |
| | | }, _config.setting.delay || 0) |
| | | } else { |
| | | this.openModal() |
| | | } |
| | | }) |
| | | } |
| | |
| | | return item |
| | | }) |
| | | |
| | | 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}, () => { |
| | | this.openModal() |
| | | }) |
| | | } else if (config.setting.useMSearch && nextProps.mainSearch && !is(fromJS(this.props.mainSearch), fromJS(nextProps.mainSearch))) { |
| | | this.setState({}, () => { |
| | | this.loadData() |
| | | }) |
| | |
| | | MKEmitter.removeListener('refreshByButtonResult', this.refreshByButtonResult) |
| | | |
| | | this.timer && this.timer.stop() |
| | | } |
| | | |
| | | openModal = () => { |
| | | const { config, data } = this.state |
| | | |
| | | if (config.wrap.display !== 'modal' || !data || data.length === 0) return |
| | | |
| | | let code = config.wrap.code || ('modal' + config.uuid) |
| | | let tip = localStorage.getItem(code) |
| | | |
| | | if (!data[0].$$uuid || tip === data[0].$$uuid + data.length) return |
| | | |
| | | if (config.wrap.modalContent === 'update') { |
| | | localStorage.setItem(code, data[0].$$uuid + data.length) |
| | | |
| | | Api.getAppVersion(true) |
| | | } |
| | | |
| | | setTimeout(() => { |
| | | this.setState({visible: true}) |
| | | }, 200) |
| | | } |
| | | |
| | | /** |
| | |
| | | return item |
| | | }), |
| | | loading: false |
| | | }, () => { |
| | | 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, |
| | |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | |
| | | onTipChange = (e) => { |
| | | const { config, data } = this.state |
| | | |
| | | let code = config.wrap.code || ('modal' + config.uuid) |
| | | if (e.target.checked) { |
| | | localStorage.setItem(code, data[0].$$uuid + data.length) |
| | | } else { |
| | | localStorage.removeItem(code) |
| | | } |
| | | } |
| | | |
| | | render() { |
| | | const { config, loading, data, card } = this.state |
| | | const { config, loading, data, card, visible } = this.state |
| | | |
| | | if (config.wrap.empty === 'hidden' && (!data || data.length === 0)) 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 |
| | | > |
| | | {visible ? <div className="custom-data-carousel-box" style={config.style}> |
| | | <NormalHeader config={config}/> |
| | | <div className="carousel-wrap" style={{height: config.wrap.height}}> |
| | | {data.length > 1 && config.wrap.autoplay === 'false' ? <div className="prev" onClick={() => this.node && this.node.prev()}><LeftOutlined /></div> : null} |
| | | {data.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} |
| | | > |
| | | {data.map((item, index) => ( |
| | | <div key={index}> |
| | | <CardItem card={card} cards={config} data={item}/> |
| | | </div> |
| | | ))} |
| | | </Carousel> |
| | | </div> |
| | | </div> : null} |
| | | {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-data-carousel-box" id={'anchor' + config.uuid} style={config.style}> |
| | |
| | | <Spin /> |
| | | </div> : null |
| | | } |
| | | <NormalHeader config={config}/> |
| | | <div className="carousel-wrap" style={{height: config.wrap.height}}> |
| | | {data && data.length > 0 ? <Carousel |
| | | autoplay={config.wrap.autoplay !== 'false'} |
| | | dots={config.wrap.dots !== 'false'} |
| | |
| | | <CardItem card={card} cards={config} data={item}/> |
| | | </div> |
| | | ))} |
| | | </Carousel> : null} |
| | | {!data || data.length === 0 ? <Empty description={false}/> : null} |
| | | </Carousel> : <Empty description={false}/>} |
| | | </div> |
| | | </div> |
| | | ) |
| | | } |