king
2023-08-17 c7aece35a62b6e91fd98a625bf0e53f64bfbd18d
src/mob/components/formdragelement/card.jsx
@@ -1,16 +1,18 @@
import React from 'react'
import { useDrag, useDrop } from 'react-dnd'
import { fromJS } from 'immutable'
import { Button, Popover, Switch, Checkbox, Form, Rate } from 'antd'
import { ScanOutlined, RightOutlined, PlusOutlined, StarFilled, EditOutlined, CopyOutlined, CloseOutlined } from '@ant-design/icons'
import { ScanOutlined, RightOutlined, PlusOutlined, StarFilled, EditOutlined, CopyOutlined, CloseOutlined, FontColorsOutlined } from '@ant-design/icons'
import moment from 'moment'
import asyncComponent from '@/utils/asyncComponent'
import MkIcon from '@/components/mk-icon'
import MKEmitter from '@/utils/events.js'
import './index.scss'
const CheckCard = asyncComponent(() => import('@/templates/modalconfig/checkCard'))
const Card = ({ id, card, moveCard, findCard, editCard, closeCard, copyCard, showField }) => {
const Card = ({ id, card, moveCard, findCard, editCard, closeCard, copyCard, showField, setStyle }) => {
  const originalIndex = findCard(id).index
  const [{ isDragging }, drag] = useDrag({
    item: { type: 'form', id, originalIndex },
@@ -32,7 +34,7 @@
      }
    }
  })
  const opacity = isDragging ? 0 : 1
  const opacity = isDragging ? 0.5 : 1
  const edit = () => {
    editCard(id)
@@ -44,6 +46,20 @@
  const copy = () => {
    copyCard(id)
  }
  const changeStyle = () => {
    let options = ['font1', 'margin']
    let style = fromJS(card.style || {}).toJS()
    if (card.marginTop && !style.marginTop) { // 外边距设置转移
      style.marginTop = card.marginTop
    }
    if (card.marginBottom && !style.marginBottom) {
      style.marginBottom = card.marginBottom
    }
    MKEmitter.emit('changeStyle', options, style, (s) => {setStyle(s, id)})
  }
  let selectval = ''
@@ -59,21 +75,29 @@
  }
  let formItem = null
  if (card.type === 'text' || card.type === 'number' || card.type === 'linkMain') {
  if (card.type === 'text' || card.type === 'linkMain') {
    formItem = (<div className={'am-list-item input ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className={'am-input-control ' + card.cursor}>{card.initval ? card.initval : <span style={{color: '#bcbcbc'}}>{card.placeholder || <span style={{color: 'transparent'}}>input</span>}</span> }</div>{card.scan && card.scan !== 'false' ? <div className="am-list-extra"><ScanOutlined /></div> : null}</div></div>)
  } else if (card.type === 'number') {
    formItem = (<div className="am-list-item input"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className={'am-input-control ' + card.cursor}>{card.initval || <span style={{color: 'transparent'}}>input</span>}</div></div></div>)
  } else if (card.type === 'select' || card.type === 'link') {
    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{selectval || '请选择'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
    formItem = (<div className={'am-list-item input ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className={'am-input-control ' + card.cursor}>{card.initval || 0}</div>{card.placeholder ? <div className="am-list-extra" style={{color: '#999999', width: 'auto', lineHeight: 1.5, height: '22px'}}>{card.placeholder}</div> : null}</div></div>)
  } else if (card.type === 'select' || card.type === 'link' || card.type === 'cascader') {
    formItem = (<div className={'am-list-item picker ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{selectval || '请选择'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
  } else if (card.type === 'date') {
    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'days').format('YYYY-MM-DD') : '请选择'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
    let format = 'YYYY-MM-DD'
    if (card.precision === 'hour') {
      format = 'YYYY-MM-DD HH'
    } else if (card.precision === 'minute') {
      format = 'YYYY-MM-DD HH:mm'
    } else if (card.precision === 'second') {
      format = 'YYYY-MM-DD HH:mm:ss'
    }
    formItem = (<div className={'am-list-item picker ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'days').format(format) : '请选择'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
  } else if (card.type === 'datemonth') {
    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'month').format('YYYY-MM') : '请选择'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
    formItem = (<div className={'am-list-item picker ' + (card.place || '')}><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'month').format('YYYY-MM') : '请选择'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
  } else if (card.type === 'datetime') {
    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.initval ? moment().subtract(card.initval, 'days').format('YYYY-MM-DD HH:mm') : '请选择'}</div><div className="am-list-extra"><RightOutlined /></div></div></div>)
  } else if (card.type === 'textarea') {
    let height = (card.maxRows || 2) * 25
    formItem = (<div className="am-list-item check-card">
    formItem = (<div className={'am-list-item check-card ' + (card.place || '')}>
      <div className="am-list-line">
        <div className="am-input-label">{card.label}</div>
        <div className="am-input-control">
@@ -103,6 +127,8 @@
    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control">{card.linkfield}</div></div></div>)
  } else if (card.type === 'switch') {
    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-list-switch"><Switch checked={card.initval}/></div></div></div>)
  } else if (card.type === 'check') {
    formItem = (<div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-list-switch"><Checkbox checked={card.initval}>{card.checkTip}</Checkbox></div></div></div>)
  } else if (card.type === 'radio') {
    let options = null
    if (card.options && card.options.length > 0) {
@@ -116,7 +142,7 @@
    }
    formItem = (
    <div className={'am-list-item checkbox mk-radio ' + (card.arrange || '')}>
    <div className={'am-list-item checkbox mk-radio ' + (card.arrange || '') + ' ' + (card.place || '')}>
      <div className="am-list-line">
        <div className="am-input-label">{card.label}</div>
        <div className="am-input-control">
@@ -145,7 +171,7 @@
    }
    formItem = (
      <div className={'am-list-item checkbox ' + (card.arrange || '')}>
      <div className={'am-list-item checkbox ' + (card.arrange || '') + ' ' + (card.place || '')}>
        <div className="am-list-line">
          <div className="am-input-label">{card.label}</div>
          <div className="am-input-control">
@@ -166,10 +192,19 @@
        </div>
      </div>
    </div>
  } else if (card.type === 'formula') {
    formItem = <div className="am-list-item formula">
      <div className="am-list-line">
        <div className="am-input-label">{card.label}</div>
        <div className="am-input-control">
          {card.formula}{card.postfix || ''}
        </div>
      </div>
    </div>
  } else if (card.type === 'split') {
    formItem = <div className="split-line">{card.label}</div>
  } else if (card.type === 'checkcard') {
    formItem = (<div className="am-list-item check-card">
    formItem = (<div className={'am-list-item check-card ' + (card.place || '')}>
      <div className="am-list-line">
        {card.hidelabel !== 'true' ? <div className="am-input-label">{card.label}</div> : null}
        <div className="am-input-control">
@@ -177,6 +212,23 @@
        </div>
      </div>
    </div>)
  } else if (card.type === 'vercode') {
    formItem = <div className="am-list-item"><div className="am-list-line"><div className="am-input-label">{card.label}</div><div className="am-input-control"><span style={{color: '#bcbcbc'}}>{card.placeholder || ''}</span></div><div className="am-list-extra" style={{width: 'auto', height: 'auto', backgroundColor: '#fafafa', padding: '0 15px'}}>获取验证码</div></div></div>
  }
  let className = `${card.required === 'true' ? 'required' : ''} ${card.type === 'split' ? 'split-wrap' : ''} ${card.splitline === 'false' ? 'no-boder' : ''}`
  if (window.GLOB.formId === card.uuid) {
    className += ' actived'
  }
  let style = {...card.style}
  if (card.marginTop && !style.marginTop) { // 外边距设置转移
    style.marginTop = card.marginTop
  }
  if (card.marginBottom && !style.marginBottom) {
    style.marginBottom = card.marginBottom
  }
  return (
@@ -184,19 +236,20 @@
      <div className="mk-popover-control">
        <EditOutlined className="edit" onClick={edit} />
        <CopyOutlined className="copy" onClick={copy} />
        <FontColorsOutlined className="style" onClick={changeStyle} />
        <CloseOutlined className="close" onClick={close} />
      </div>
    } trigger="hover">
      <div className="page-card" style={{ opacity: opacity}}>
        <div ref={node => drag(drop(node))} style={{ border: '0.5px solid transparent'}} onDoubleClick={edit}>
          <Form.Item
            style={{marginTop: card.marginTop || 0, marginBottom: card.marginBottom || 0}}
            className={'ant-form-item' + (card.required === 'true' ? ' required' : '') + (card.splitline === 'false' ? ' no-boder' : '')}
            style={style}
            className={className}
          >
            {formItem}
            <div></div>
            {showField && card.field ? <div className="field-name" style={card.writein === 'false' ? {color: 'orange'} : {}}>
              {card.field}{card.hidden === 'true' ? '(隐藏)' : ''}{card.readonly === 'true' ? '(只读)' : ''}{card.linkField ? <span style={{color: '#1890ff'}}>{`(关联${card.linkField})`}</span> : ''}{card.supField ? <span style={{color: '#8E44AD'}}>{`(上级${card.supField})`}</span> : ''}
              {card.field}{card.hidden === 'true' || card.type === 'funcvar' ? '(隐藏)' : ''}{card.readonly === 'true' ? '(只读)' : ''}{card.readin === 'false' ? '(未填充)' : ''}{card.linkField ? <span style={{color: '#1890ff'}}>{`(关联${card.linkField})`}</span> : ''}{card.supField ? <span style={{color: '#8E44AD'}}>{`(上级${card.supField})`}</span> : ''}
            </div> : ''}
          </Form.Item>
        </div>