king
2023-06-22 79e4981aa6cc9354276fc54cdf6d14eb08ab7fee
src/menu/components/table/edit-table/columns/index.jsx
@@ -52,71 +52,40 @@
  }
  render() {
    const { connectDragSource, connectDropTarget, moveCol, dropCol, addElement, updateCol, editColumn, pasteCell, changeStyle, deleteCol, index, column, align, fields, children, ...restProps } = this.props
    const { connectDragSource, connectDropTarget, moveCol, componentId, dropCol, addElement, updateCol, editColumn, pasteCell, changeStyle, deleteCol, index, column, align, fields, children, ...restProps } = this.props
    if (!column) return (
      <th {...restProps} index={index}>
        {children}
      </th>
      <th {...restProps}>{children}</th>
    )
    if (index !== undefined) {
      let style = {cursor: 'move', textAlign: align}
      if (column.Width) {
        style.width = column.Width
        style.minWidth = column.Width
      }
      if (window.GLOB.columnId === column.uuid) {
        style.color = '#1890ff'
      }
      return connectDragSource(
        connectDropTarget(<th {...restProps} index={index} style={style} onDoubleClick={() => this.props.editColumn(column)}>
          <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
            <div className="mk-popover-control" onDoubleClick={(e) => e.stopPropagation()}>
              {column.type === 'colspan' ? <PlusOutlined className="plus" title="添加列" onClick={() => this.props.addElement(column)} /> : null}
              {column.type === 'custom' ? <PlusOutlined className="plus" title="添加元素" onClick={() => this.props.addElement(column)} /> : null}
              {column.type === 'custom' ? <PlusSquareOutlined className="plus" title="添加按钮" onClick={() => this.props.addElement(column, 'button')} /> : null}
              <EditOutlined className="edit" title="编辑" onClick={() => this.props.editColumn(column)} />
              {column.type === 'custom' ? <PasteComponent options={['customCardElement', 'action']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
              {column.type === 'custom' ? <FontColorsOutlined className="style" title="调整样式" onClick={() => this.props.changeStyle(column)}/> : null}
              <DeleteOutlined className="close" title="删除" onClick={this.deleteCol} />
              {['text', 'number', 'formula'].includes(column.type) ? <MarkColumn field={column.field || ''} columns={fields} marks={column.marks} onSubmit={this.updateMarks} /> : null }
            </div>
          } trigger="hover">
            {children}
          </Popover>
        </th>),
      )
    } else if (column) {
      let style = {textAlign: align}
      if (column.Width) {
        style.width = column.Width
        style.minWidth = column.Width
      }
      if (window.GLOB.columnId === column.uuid) {
        style.color = '#1890ff'
      }
      return (
        <th {...restProps} style={style} key={column.uuid} onDoubleClick={() => this.props.editColumn(column)}>
          <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
            <div className="mk-popover-control" onDoubleClick={(e) => e.stopPropagation()}>
              {column.type === 'colspan' ? <PlusOutlined className="plus" title="添加列" onClick={() => this.props.addElement(column)} /> : null}
              {column.type === 'custom' ? <PlusOutlined className="plus" title="添加元素" onClick={() => this.props.addElement(column)} /> : null}
              {column.type === 'custom' ? <PlusSquareOutlined className="plus" title="添加按钮" onClick={() => this.props.addElement(column, 'button')} /> : null}
              <EditOutlined className="edit" title="编辑" onClick={() => this.props.editColumn(column)} />
              {column.type === 'custom' ? <PasteComponent options={['customCardElement', 'action']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
              <DeleteOutlined className="close" title="删除" onClick={this.deleteCol} />
              {['text', 'number', 'formula'].includes(column.type) ? <MarkColumn field={column.field || ''} columns={fields} marks={column.marks} onSubmit={this.updateMarks} /> : null }
            </div>
          } trigger="hover">
            {children}
          </Popover>
        </th>
      )
    let style = {cursor: 'move', textAlign: align}
    if (column.Width) {
      style.width = column.Width
      style.minWidth = column.Width
    }
    if (window.GLOB.columnId === column.uuid) {
      style.color = '#1890ff'
    }
    return connectDragSource(
      connectDropTarget(<th {...restProps} index={index} style={style} onDoubleClick={() => this.props.editColumn(column)}>
        <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
          <div className="mk-popover-control" onDoubleClick={(e) => e.stopPropagation()}>
            {column.type === 'colspan' ? <PlusOutlined className="plus" title="添加列" onClick={() => this.props.addElement(column)} /> : null}
            {column.type === 'custom' ? <PlusOutlined className="plus" title="添加元素" onClick={() => this.props.addElement(column)} /> : null}
            {column.type === 'custom' ? <PlusSquareOutlined className="plus" title="添加按钮" onClick={() => this.props.addElement(column, 'button')} /> : null}
            <EditOutlined className="edit" title="编辑" onClick={() => this.props.editColumn(column)} />
            {column.type === 'custom' ? <PasteComponent options={['customCardElement', 'action']} updateConfig={(res, resolve) => this.props.pasteCell(column, res, resolve)} /> : null}
            {column.type === 'custom' ? <FontColorsOutlined className="style" title="调整样式" onClick={() => this.props.changeStyle(column)}/> : null}
            <DeleteOutlined className="close" title="删除" onClick={this.deleteCol} />
            {['text', 'number', 'formula'].includes(column.type) ? <MarkColumn field={column.field || ''} columns={fields} marks={column.marks} onSubmit={this.updateMarks} /> : null }
          </div>
        } trigger="hover">
          {children}
        </Popover>
      </th>),
    )
  }
}
@@ -131,17 +100,28 @@
const ColTarget = {
  drop(props, monitor) {
    const item = monitor.getItem()
    const dragIndex = item.index
    const hoverIndex = props.index
    let dragIndex = item.index
    let hoverIndex = props.index
    if (item.$init) {
      props.dropCol(item, hoverIndex)
      if (/sub_/.test(hoverIndex)) {
        message.warning('合并列子元素暂不支持拖拽添加。')
      } else {
        props.dropCol(item, hoverIndex.replace(new RegExp(props.componentId + '@', 'ig'), ''))
      }
      return
    } else if (dragIndex === undefined || hoverIndex === undefined || dragIndex === hoverIndex) {
      return
    } else {
      let reg = new RegExp(props.componentId + '@', 'ig')
      if (reg.test(dragIndex)) {
        props.moveCol(dragIndex.replace(reg, ''), hoverIndex.replace(reg, ''))
      } else {
        message.warning('拖动元素不在当前组件中。')
        return
      }
    }
    props.moveCol(dragIndex, hoverIndex)
    monitor.getItem().index = hoverIndex
  },
}
@@ -281,12 +261,32 @@
  moveCol = (dragIndex, hoverIndex) => {
    let _columns = fromJS(this.state.columns).toJS()
    _columns.splice(hoverIndex, 0, ..._columns.splice(dragIndex, 1))
    if (/^sub_/.test(dragIndex) || /^sub_/.test(hoverIndex)) {
      let sign1 = dragIndex.split('_')
      let sign2 = hoverIndex.split('_')
      if (sign1[1] !== sign2[1]) {
        message.warning('拖动元素不在同一个合并列中。')
        return
      }
      this.loopMoveCol(_columns, sign1[1], sign1[2], sign2[2])
    } else {
      _columns.splice(hoverIndex, 0, ..._columns.splice(dragIndex, 1))
    }
    this.setState({
      columns: _columns
    }, () => {
      this.props.updatecolumn({...this.props.config, cols: _columns})
    })
  }
  loopMoveCol = (columns, colId, dragIndex, hoverIndex) => {
    columns.forEach(column => {
      if (column.type === 'colspan' && column.uuid === colId) {
        column.subcols.splice(hoverIndex, 0, ...column.subcols.splice(dragIndex, 1))
      } else if (column.type === 'colspan') {
        this.loopMoveCol(column.subcols, colId, dragIndex, hoverIndex)
      }
    })
  }
@@ -624,7 +624,7 @@
    MKEmitter.removeListener('submitStyle', this.getStyle)
  }
  handlecolumns = (columns, fields, config, isSub) => {
  handlecolumns = (columns, fields, config, pId) => {
    return columns.map((col, index) => {
      let title = col.label
      if (col.editable === 'true') {
@@ -643,8 +643,9 @@
          upComponent: this.updateCol
        }),
        onHeaderCell: () => ({
          index: isSub ? undefined : index,
          index: pId ? config.uuid + '@sub_' + pId + '_' + index : config.uuid + '@' + index,
          column: col,
          componentId: config.uuid,
          fields: fields,
          align: col.Align,
          moveCol: this.moveCol,
@@ -656,7 +657,7 @@
          changeStyle: this.changeStyle,
          deleteCol: this.deleteCol,
        }),
        children: col.subcols && col.subcols.length ? this.handlecolumns(col.subcols, fields, config, true) : null,
        children: col.subcols && col.subcols.length ? this.handlecolumns(col.subcols, fields, config, col.uuid) : null,
      }
    })
  }
@@ -728,10 +729,7 @@
          destroyOnClose
        >
          <TableVerify
            card={config.submit}
            setting={config.setting}
            cols={config.cols}
            columns={config.columns}
            config={config}
            wrappedComponentRef={(inst) => this.verifyRef = inst}
          />
        </Modal>