UNPKG

@ttk/component

Version:

ttk组件库

287 lines (263 loc) 9.61 kB
import React, { PureComponent } from 'react' import classNames from 'classnames' import { Map, fromJS } from 'immutable' import { Button, Checkbox } from '@ttk/component' import './style.less' class TableSettingCard extends PureComponent { constructor(props) { super(props) this.state = { data: this.ininData(props.data), initData: JSON.parse(JSON.stringify(props.data == undefined ? '' : props.data)), height: null, top: -2000, firstVisible: props.visible } } assitShouldComponent = (target) => { let obj = {} for (const [key, value] of Object.entries(target)) { if (typeof (value) != 'function') { obj[key] = value } } return obj } // shouldComponentUpdate(nextProps, nextState) { // // console.log((isequal(this.props, nextProps) && isequal(this.state, nextState))) // return !(isequal(this.assitShouldComponent(this.props), this.assitShouldComponent(nextProps)) && isequal(this.state, nextState)) // } getAbsPoint = (e) => { var x = e.offsetLeft var y = e.offsetTop while (e = e.offsetParent) { x += e.offsetLeft y += e.offsetTop } return { x, y } } componentDidMount() { let table = document.getElementsByClassName(this.props.positionClass)[0] if (table) { const point = this.getAbsPoint(table) let height = window.innerHeight - point.y - 10 this.setState({ height, top: point.y }) } window.addEventListener('resize', this.computed, false) } componentWillUnmount() { window.removeEventListener('resize', this.computed, false) } componentWillReceiveProps(nextProps) { if (nextProps.visible != this.props.visible) { this.state.firstVisible = true } const data = this.ininData(nextProps.data) this.setState({ data: data, ininData: JSON.parse(JSON.stringify(data)) }) } ininData = (data) => { if (!data) { return [] } try { //bug TTK-1361 栏目顺序显示不正确 myf // data.sort((a, b) => { // return a.id > b.id // }) return data } catch (err) { console.log(err) } } handleChange = (e, item) => { const data = fromJS(this.state.data).toJS() const index = data.findIndex(index => { return index.id == item.id }) data[index] = { ...data[index], isVisible: e.target.checked } this.setState({ data }) } computed = () => { let table = document.getElementsByClassName(this.props.positionClass)[0] if (table) { const point = this.getAbsPoint(table) let height = window.innerHeight - point.y - 10 this.setState({ height, top: point.y }) } } renderItem = (data) => { const arrLeft = [], arrRight = [] data.forEach((item, index) => { if (item.isHeader == true) { arrLeft.push( <div key={`mk-tableSetting-item-${index}`} className="mk-tableSetting-item"> <Checkbox className={`${item.isVisible ? 'active' : ''}`} checked={item.isVisible} onChange={(value) => this.handleChange(value, item)} disabled={item.isMustSelect} > {item.caption} </Checkbox> </div> ) } else { arrRight.push( <div key={`mk-table-setting-item-${index}`} className="mk-tableSetting-item"> <Checkbox className={`${item.isVisible ? 'active' : ''}`} checked={item.isVisible} onChange={(value) => this.handleChange(value, item)} disabled={item.isMustSelect} > {item.caption} </Checkbox> </div> ) } }) return [arrLeft, arrRight] } renderItem2 = (data) => { const arr = data.map((item, index) => { return ( <div key={`mk-table-setting-item2-${index}`} className="mk-tableSetting-item-style2"> <Checkbox className={`${item.isVisible ? 'active' : ''}`} checked={item.isVisible} onChange={(value) => this.handleChange(value, item)} disabled={item.isMustSelect} > {item.caption} </Checkbox> </div> ) }) // console.log(arr) return arr } confirmClick = () => { this.setState({ initData: JSON.parse(JSON.stringify(this.state.data)) }) if (this.props.confirmClick) { this.props.confirmClick(this.state.data) } } cancelClick = () => { this.setState({ data: JSON.parse(JSON.stringify(this.state.initData)) }) if (this.props.cancelClick) { this.props.cancelClick() } } reset = () => { if (this.props.resetClick) { this.props.resetClick() } } renderStyle1 = () => { const { data, height, top } = this.state const [arrLeft, arrRight] = this.renderItem(data) return ( <div className="mk-tableSetting-container"> <div className="mk-tableSetting-title"> {arrLeft} </div> <div className="mk-tableSetting-detail"> {arrRight} </div> <div className="mk-tableSetting-line"> </div> </div> ) } renderStyle2 = () => { const { data, height, top } = this.state const arr = this.renderItem2(data) return ( <div className="mk-tableSetting-container2"> {arr} </div> ) } render() { const props = this.props let className = classNames({ 'mk-tableSetting': true, 'mk-tableSetting1': props.showTitle ? true : false, 'mk-tableSetting2': props.showTitle ? false : true, [props.className]: !!props.className, 'animated': true, 'slideInRight': this.props.visible, 'slideOutRight': !this.props.visible, }) let className2 = classNames({ 'mk-tableSetting-bottom': true, 'slideInRight': this.props.visible, 'slideOutRight': !this.props.visible }) let className3 = classNames({ 'mk-tableSetting-bottom-btn': true, 'left-btn': true, }) const { data, height, top } = this.state const [arrLeft, arrRight] = this.renderItem(data) return ( <div style={{ display: `${this.state.firstVisible == false ? 'none' : 'block'}` }}> <div className={className} style={{ height: `${height}px`, position: 'fixed', right: '0px', top: `${top}px`, }} > <h2>栏目设置</h2> {props.showTitle && <div className="mk-tableSetting-header"> <span>表头</span> <span>明细</span> </div>} <div className={ classNames({ 'mk-tableSetting-container-wrapper': true, 'show-title': props.showTitle }) } > <div style={{ height: '100%', position: 'relative' }}> {!props.showTitle ? this.renderStyle2() : this.renderStyle1()} </div> </div> <div className={className2}> <Button className="mk-tableSetting-bottom-btn" type="primary " onClick={this.confirmClick}>确定</Button> <Button className="mk-tableSetting-bottom-btn" onClick={this.reset}>重置</Button> <Button className="mk-tableSetting-bottom-btn cancle" onClick={this.cancelClick}>取消</Button> </div> </div> </div> ) } } export default TableSettingCard