import React from 'react' import classnames from 'classnames' import produce from 'immer' import set from 'lodash/set' import { uuid } from 'utils/util' import { fontWeightOptions, fontStyleOptions, fontFamilyOptions, fontSizeOptions } from '../constants' import { defaultConditionStyle, AvailableTableConditionStyleTypes } from './constants' import { getColumnIconByType } from './util' import { ITableColumnConfig, ITableConditionStyle } from './types' import ColorPicker from 'components/ColorPicker' import ConditionStyleConfigModal from './ConditionStyleConfigModal' import { Row, Col, Tooltip, Form, Select, InputNumber, Button, Radio, Checkbox, Table, Modal } from 'antd' const RadioGroup = Radio.Group const RadioButton = Radio.Button const FormItem = Form.Item import styles from './styles.less' import stylesConfig from '../styles.less' interface IColumnStyleConfigProps { visible: boolean config: ITableColumnConfig[] onCancel: () => void onSave: (config: ITableColumnConfig[]) => void } interface IColumnStyleConfigStates { localConfig: ITableColumnConfig[] selectedColumnName: string conditionStyleConfigModalVisible: boolean currentConditionStyle: ITableConditionStyle } export class ColumnStyleConfig extends React.PureComponent { public constructor (props: IColumnStyleConfigProps) { super(props) const localConfig = props.config this.state = { localConfig, selectedColumnName: localConfig.length > 0 ? localConfig[0].columnName : '', conditionStyleConfigModalVisible: false, currentConditionStyle: null } } public componentWillReceiveProps (nextProps: IColumnStyleConfigProps) { if (nextProps.config === this.props.config) { return } const localConfig = nextProps.config this.setState({ localConfig, selectedColumnName: localConfig.length > 0 ? localConfig[0].columnName : '', conditionStyleConfigModalVisible: false, currentConditionStyle: null }) } private renderColumn (item: ITableColumnConfig) { const { selectedColumnName } = this.state const { columnName, alias, visualType } = item const displayName = alias || columnName const itemCls = classnames({ [styles.selected]: selectedColumnName === columnName }) return (
  • ) } private selectColumn = (columnName: string) => () => { this.setState({ selectedColumnName: columnName }) } private propChange = ( propPath: Exclude | ['style', keyof ITableColumnConfig['style']] ) => (e) => { const value = e.target ? (e.target.value || e.target.checked) : e const { localConfig, selectedColumnName } = this.state const nextLocalConfig = produce(localConfig, (draft) => { const selectedColumn = draft.find(({ columnName }) => columnName === selectedColumnName) set(selectedColumn, propPath, value) return draft }) this.setState({ localConfig: nextLocalConfig }) } private cancel = () => { this.props.onCancel() } private save = () => { this.props.onSave(this.state.localConfig) } private columns = [{ title: '', dataIndex: 'idx', width: 30, render: (_, __, index) => (index + 1) }, { title: '样式类型', dataIndex: 'type', width: 50, render: (type) => AvailableTableConditionStyleTypes[type] }, { title: '操作', dataIndex: 'operation', width: 60, render: (_, record) => (
    ) }] private addConditionStyle = () => { this.setState({ conditionStyleConfigModalVisible: true, currentConditionStyle: { ...defaultConditionStyle } }) } private editConditionStyle = (record) => () => { this.setState({ currentConditionStyle: record, conditionStyleConfigModalVisible: true }) } private deleteConditionStyle = (deletedKey: string) => () => { const { localConfig, selectedColumnName } = this.state const nextLocalConfig = produce(localConfig, (draft) => { const selectedColumn = draft.find(({ columnName }) => columnName === selectedColumnName) const idx = selectedColumn.conditionStyles.findIndex(({ key }) => key === deletedKey) selectedColumn.conditionStyles.splice(idx, 1) }) this.setState({ localConfig: nextLocalConfig }) } private closeConditionStyleConfig = () => { this.setState({ conditionStyleConfigModalVisible: false, currentConditionStyle: null }) } private saveConditionStyleConfig = (conditionStyle: ITableConditionStyle) => { const { localConfig, selectedColumnName } = this.state const nextLocalConfig = produce(localConfig, (draft) => { const selectedColumn = draft.find(({ columnName }) => columnName === selectedColumnName) if (conditionStyle.key) { const idx = selectedColumn.conditionStyles.findIndex(({ key }) => key === conditionStyle.key) selectedColumn.conditionStyles.splice(idx, 1, conditionStyle) } else { selectedColumn.conditionStyles.push({ ...conditionStyle, key: uuid(5) }) } }) this.setState({ localConfig: nextLocalConfig, conditionStyleConfigModalVisible: false, currentConditionStyle: null }) } private modalFooter = [( ), ( )] public render () { const { visible } = this.props const { localConfig, selectedColumnName, conditionStyleConfigModalVisible, currentConditionStyle } = this.state if (localConfig.length <= 0) { return (
    ) } const { style, visualType, sort, conditionStyles } = localConfig.find((c) => c.columnName === selectedColumnName) const { fontSize, fontFamily, fontWeight, fontColor, fontStyle, backgroundColor, justifyContent, inflexible, width } = style return (

    字段列表

      {localConfig.map((item) => this.renderColumn(item))}

    排序与过滤

    开启列排序

    基础样式

    左对齐 居中 右对齐 固定列宽

    条件样式

    ) } } export default ColumnStyleConfig