king
2023-04-06 9a457873b191ad48f8500279571341e7a98bfd9f
2023-04-06
36个文件已修改
2个文件已添加
1118 ■■■■ 已修改文件
public/options.json 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/cardcellcomponent/dragaction/index.jsx 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/cardcellcomponent/elementform/index.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/cardcellcomponent/formconfig.jsx 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/cardcellcomponent/index.jsx 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/cardcellcomponent/index.scss 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/cardcomponent/options.jsx 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/cardsimplecomponent/options.jsx 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/double-data-card/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/double-data-card/options.jsx 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/card/doublecardcomponent/options.jsx 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/actionform/index.jsx 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/dragaction/index.jsx 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/formconfig.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/share/actioncomponent/index.jsx 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/table/base-table/columns/editColumn/formconfig.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/table/edit-table/columns/editColumn/index.jsx 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/index.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/index.jsx 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/verifycard/index.scss 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/transfer/index.jsx 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/colorsketch/index.jsx 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/mob/colorsketch/index.scss 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/cardcellList/index.jsx 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/cardcellList/index.scss 224 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/double-data-card/index.jsx 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/card/double-data-card/index.scss 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/sharecomponent/fieldscomponent/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/codemirror/index.jsx 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/codemirror/index.scss 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/codemirror/replaceform/index.jsx 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/codemirror/replaceform/index.scss 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/editTable/index.jsx 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/editTable/index.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/templates/zshare/formconfig.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/option.js 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
public/options.json
@@ -1,6 +1,6 @@
{
  "appId": "201912101635586033882D350DED94BC08AB8",
  "appkey": "2019120316231227060CDBAFCB3BF4582BBF8",
  "appId": "202011020835217933120E25C41C54A8988AA",
  "appkey": "20201102081641237BDDE0D5F2E98420BA7EC",
  "mainSystemApi": "https://cloud.positecgroup.com/webapi/dostars",
  "systemType": "",
  "externalDatabase": "",
@@ -17,6 +17,6 @@
  "transfer": true,
  "keepPassword": "true",
  "platforms": ["H5", "wechat", "android", "ios", "wxMiniProgram"],
  "host": "https://css-test.positecgroup.com",
  "service": ""
  "host": "http://oms-test.positecgroup.com",
  "service": "oms_new/"
}
src/menu/components/card/cardcellcomponent/dragaction/index.jsx
@@ -1,6 +1,7 @@
import React, { useState } from 'react'
import { useDrop } from 'react-dnd'
import { is, fromJS } from 'immutable'
import { message } from 'antd'
import update from 'immutability-helper'
import Card from './card'
@@ -53,7 +54,6 @@
    }
    copycard.uuid = Utils.getuuid()
    copycard.originCard = card
    try {
      delete _val.$srcId
@@ -76,12 +76,18 @@
      oInput.select()
      document.execCommand('Copy')
      document.body.removeChild(oInput)
      message.success('复制成功。')
    } else {
      message.warning('复制失败。')
    }
    if (card.eleType !== 'button') {
    _cards.push(copycard)
    handleList(_cards)
    handleMenu(copycard)
    }
  }
  const changeStyle = id => {
@@ -149,7 +155,7 @@
          if (newcard.OpenType === 'excelIn') {
            newcard.label = item.text
            newcard.class = 'dgreen'
            newcard.class = 'border-dgreen'
            newcard.Ot = 'notRequired'
          } else if (item.subType === 'excelOut') {
            newcard.label = item.text
src/menu/components/card/cardcellcomponent/elementform/index.jsx
@@ -15,8 +15,8 @@
const cardTypeOptions = {
  sequence: ['eleType', 'width'],
  text: ['eleType', 'datatype', 'format', 'width', 'height', 'prefix', 'postfix', 'link', 'anchors', 'noValue', 'bgImage', 'fixStyle', 'copyable'],
  number: ['eleType', 'datatype', 'width', 'height', 'prefix', 'postfix', 'noValue', 'fixStyle'],
  text: ['eleType', 'datatype', 'format', 'width', 'height', 'prefix', 'postfix', 'link', 'anchors', 'noValue', 'bgImage', 'fixStyle', 'copyable', 'alignItems'],
  number: ['eleType', 'datatype', 'width', 'height', 'prefix', 'postfix', 'noValue', 'fixStyle', 'alignItems'],
  picture: ['eleType', 'datatype', 'width', 'lenWidRadio', 'maxWidth', 'link', 'noValue'],
  video: ['eleType', 'datatype', 'width', 'aspectRatio', 'autoPlay', 'loop', 'startTime', 'noValue', 'posterType'],
  icon: ['eleType', 'datatype', 'width', 'tooltip'],
@@ -25,7 +25,7 @@
  barcode: ['eleType', 'datatype', 'width', 'barHeight', 'displayValue', 'interval', 'noValue'],
  qrcode: ['eleType', 'datatype', 'width', 'qrWidth', 'color', 'url', 'noValue'],
  currentDate: ['eleType', 'width', 'dateFormat', 'prefix', 'postfix', 'fixStyle'],
  formula: ['eleType', 'width', 'height', 'prefix', 'postfix', 'eval', 'formula', 'noValue', 'fixStyle'],
  formula: ['eleType', 'width', 'height', 'prefix', 'postfix', 'eval', 'formula', 'noValue', 'fixStyle', 'alignItems'],
  color: ['eleType', 'datatype', 'width', 'lenWidRadio', 'noValue', 'copyable'],
}
src/menu/components/card/cardcellcomponent/formconfig.jsx
@@ -43,6 +43,11 @@
    tooltip = '在扩展卡片中,动态数据显示值为获取到的第一行数据。'
  }
  let width = card.width || 12
  if (/x/.test(card.width)) {
    width = +width.replace(/x/, '.5')
  }
  let forms = [
    {
      type: 'select',
@@ -85,7 +90,7 @@
      min: 0,
      label: '内容',
      initVal: card.value || '',
      tooltip: '文本类型,会替换内容中的@username@、@fullName@、@mk_city@、@appname@、@bid@。',
      tooltip: '文本类型,会替换内容中的@username@、@fullName@、@mk_city@、@appname@、@bid@、@month@、@week@、@day@',
      required: true
    },
    {
@@ -328,12 +333,12 @@
    {
      type: 'number',
      key: 'width',
      min: 1,
      min: 0.5,
      max: 24,
      precision: 0,
      precision: 1,
      label: '元素宽度',
      initVal: card.width || 12,
      tooltip: '栅格布局,每行等分为24列。',
      initVal: width,
      tooltip: '栅格布局,每行等分为24列,可设置半列即.5。',
      required: true
    },
    {
@@ -536,7 +541,7 @@
      type: 'radio',
      key: 'eval',
      label: '解析',
      initVal: card.eval || 'true',
      initVal: card.eval || 'false',
      tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。',
      required: false,
      options: [{
@@ -570,6 +575,19 @@
    },
    {
      type: 'radio',
      key: 'alignItems',
      label: '垂直对齐',
      initVal: card.alignItems || '',
      tooltip: '垂直方向的对齐方式。',
      required: false,
      options: [
        { value: '', text: '居上' },
        { value: 'center', text: '居中' },
        { value: 'end', text: '居下' }
      ]
    },
    {
      type: 'radio',
      key: 'fixStyle',
      label: '前后缀',
      initVal: card.fixStyle || '',
src/menu/components/card/cardcellcomponent/index.jsx
@@ -361,6 +361,13 @@
    const { elements } = this.state
    this.elementFormRef.handleConfirm().then(res => {
      if (res.width % 0.5) {
        res.width = parseInt(res.width / 0.5) * 0.5
      }
      if (res.width % 1) {
        res.width = (res.width + '').replace(/.5/, 'x')
      }
      let _elements = elements.map(cell => {
        if (cell.uuid === res.uuid) {
          res.style = cell.style || {}
@@ -458,6 +465,14 @@
            if (res.show === 'link' || res.show === 'icon') {
              style.color = color[cl]
              style.backgroundColor = 'transparent'
            } else if (res.class === 'default') {
              style.color = 'rgba(0, 0, 0, 0.65)'
              style.backgroundColor = '#fff'
              style.borderColor = '#d9d9d9'
            } else if (res.class.indexOf('border') > -1) {
              style.color = color[cl]
              style.backgroundColor = '#fff'
              style.borderColor = color[cl]
            } else {
              style.color = '#ffffff'
              style.backgroundColor = color[cl]
@@ -736,7 +751,7 @@
    const { elements, visible, actvisible, profVisible, card, record } = this.state
    return (
      <div className="model-menu-card-cell-list">
      <div className={'model-menu-card-cell-list ' + (cardCell && cardCell.setting && cardCell.setting.layout === 'flex' ? 'mk-flex' : '') }>
        <DragElement
          list={elements}
          parent={cardCell}
src/menu/components/card/cardcellcomponent/index.scss
@@ -43,4 +43,231 @@
  .card-cell:hover, .card-button-cell:hover {
    box-shadow: 0px 0px 2px #1890ff;
  }
  .card-detail-row {
    .ant-col[class*="x"] {
      float: left;
      box-sizing: border-box;
    }
    >.ant-col-0x {
      width: 2.08333333%;
    }
    >.ant-col-1x {
      width: 6.25%;
    }
    >.ant-col-2x {
      width: 10.41666667%;
    }
    >.ant-col-3x {
      width: 14.58333333%;
    }
    >.ant-col-4x {
      width: 18.75%;
    }
    >.ant-col-5x {
      width: 22.91666667%;
    }
    >.ant-col-6x {
      width: 27.08333333%;
    }
    >.ant-col-7x {
      width: 31.25%;
    }
    >.ant-col-8x {
      width: 35.41666667%;
    }
    >.ant-col-9x {
      width: 39.58333333%;
    }
    >.ant-col-10x {
      width: 43.75%;
    }
    >.ant-col-11x {
      width: 47.91666667%;
    }
    >.ant-col-12x {
      width: 52.08333333%;
    }
    >.ant-col-13x {
      width: 56.25%;
    }
    >.ant-col-14x {
      width: 60.41666667%;
    }
    >.ant-col-15x {
      width: 64.58333333%;
    }
    >.ant-col-16x {
      width: 68.75%;
    }
    >.ant-col-17x {
      width: 72.91666667%;
    }
    >.ant-col-18x {
      width: 77.08333333%;
    }
    >.ant-col-19x {
      width: 81.25%;
    }
    >.ant-col-20x {
      width: 85.41666667%;
    }
    >.ant-col-21x {
      width: 89.58333333%;
    }
    >.ant-col-22x {
      width: 93.75%;
    }
    >.ant-col-23x {
      width: 97.91666667%;
    }
  }
}
.model-menu-card-cell-list.mk-flex {
  >.card-detail-row {
    display: flex;
    >.ant-col-1 {
      flex: 1;
    }
    >.ant-col-2 {
      flex: 2;
    }
    >.ant-col-3 {
      flex: 3;
    }
    >.ant-col-4 {
      flex: 4;
    }
    >.ant-col-5 {
      flex: 5;
    }
    >.ant-col-6 {
      flex: 6;
    }
    >.ant-col-7 {
      flex: 7;
    }
    >.ant-col-8 {
      flex: 8;
    }
    >.ant-col-9 {
      flex: 9;
    }
    >.ant-col-10 {
      flex: 10;
    }
    >.ant-col-11 {
      flex: 11;
    }
    >.ant-col-12 {
      flex: 12;
    }
    >.ant-col-13 {
      flex: 13;
    }
    >.ant-col-14 {
      flex: 14;
    }
    >.ant-col-15 {
      flex: 15;
    }
    >.ant-col-16 {
      flex: 16;
    }
    >.ant-col-17 {
      flex: 17;
    }
    >.ant-col-18 {
      flex: 18;
    }
    >.ant-col-19 {
      flex: 19;
    }
    >.ant-col-20 {
      flex: 20;
    }
    >.ant-col-21 {
      flex: 21;
    }
    >.ant-col-22 {
      flex: 22;
    }
    >.ant-col-23 {
      flex: 23;
    }
    >.ant-col-24 {
      flex: 24;
    }
    >.ant-col-0x {
      flex: 0.5;
    }
    >.ant-col-1x {
      flex: 1.5;
    }
    >.ant-col-2x {
      flex: 2.5;
    }
    >.ant-col-3x {
      flex: 3.5;
    }
    >.ant-col-4x {
      flex: 4.5;
    }
    >.ant-col-5x {
      flex: 5.5;
    }
    >.ant-col-6x {
      flex: 6.5;
    }
    >.ant-col-7x {
      flex: 7.5;
    }
    >.ant-col-8x {
      flex: 8.5;
    }
    >.ant-col-9x {
      flex: 9.5;
    }
    >.ant-col-10x {
      flex: 10.5;
    }
    >.ant-col-11x {
      flex: 11.5;
    }
    >.ant-col-12x {
      flex: 12.5;
    }
    >.ant-col-13x {
      flex: 13.5;
    }
    >.ant-col-14x {
      flex: 14.5;
    }
    >.ant-col-15x {
      flex: 15.5;
    }
    >.ant-col-16x {
      flex: 16.5;
    }
    >.ant-col-17x {
      flex: 17.5;
    }
    >.ant-col-18x {
      flex: 18.5;
    }
    >.ant-col-19x {
      flex: 19.5;
    }
    >.ant-col-20x {
      flex: 20.5;
    }
    >.ant-col-21x {
      flex: 21.5;
    }
    >.ant-col-22x {
      flex: 22.5;
    }
    >.ant-col-23x {
      flex: 23.5;
    }
  }
}
src/menu/components/card/cardcomponent/options.jsx
@@ -214,6 +214,17 @@
    },
    {
      type: 'radio',
      field: 'layout',
      label: '元素布局',
      initval: setting.layout || 'grid',
      required: false,
      options: [
        {value: 'grid', label: '栅格布局'},
        {value: 'flex', label: '弹性布局'},
      ]
    },
    {
      type: 'radio',
      field: 'clickType',
      label: '触发方式',
      initval: setting.clickType || 'normal',
src/menu/components/card/cardsimplecomponent/options.jsx
@@ -218,6 +218,17 @@
    },
    {
      type: 'radio',
      field: 'layout',
      label: '元素布局',
      initval: setting.layout || 'grid',
      required: false,
      options: [
        {value: 'grid', label: '栅格布局'},
        {value: 'flex', label: '弹性布局'},
      ]
    },
    {
      type: 'radio',
      field: 'click',
      label: '点击事件',
      initval: setting.click || '',
src/menu/components/card/double-data-card/index.jsx
@@ -602,7 +602,7 @@
            <PlusOutlined className="plus" title="添加卡片" onClick={() => this.addCard()}/>
            {appType !== 'mob' ? <PlusCircleOutlined className="plus" title="添加搜索" onClick={() => this.addSearch()}/> : null}
            <PlusSquareOutlined className="plus" title="添加按钮" onClick={() => this.addButton()}/>
            <NormalForm title="数据卡设置" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
            <NormalForm title="双重数据卡设置" width={800} update={this.updateWrap} getForms={this.getWrapForms}>
              <EditOutlined style={{color: '#1890ff'}} title="编辑"/>
            </NormalForm>
            <CopyComponent type="datacard" card={card}/>
src/menu/components/card/double-data-card/options.jsx
@@ -199,6 +199,17 @@
      required: false
    },
    {
      type: 'number',
      field: 'minWidth',
      label: '最小宽度',
      min: 0,
      max: 5000,
      precision: 0,
      initval: wrap.minWidth,
      tooltip: '设置卡片区域的最小宽度,显示区域小于此值将出现横向滚动。',
      required: false
    },
    {
      type: 'radio',
      field: 'permission',
      label: '权限验证',
src/menu/components/card/doublecardcomponent/options.jsx
@@ -165,6 +165,17 @@
    },
    {
      type: 'radio',
      field: 'layout',
      label: '元素布局',
      initval: setting.layout || 'grid',
      required: false,
      options: [
        {value: 'grid', label: '栅格布局'},
        {value: 'flex', label: '弹性布局'},
      ]
    },
    {
      type: 'radio',
      field: 'clickType',
      label: '触发方式',
      initval: setting.clickType || 'normal',
src/menu/components/share/actioncomponent/actionform/index.jsx
@@ -552,7 +552,6 @@
      this.record.pageTemplate = ''
      this.record.funcType = ''
      this.record.sqlType = ''
      if (value === 'pop' || value === 'prompt' || value === 'exec') {
        _fieldval.intertype = 'system'
        _fieldval.sqlType = ''
@@ -565,10 +564,10 @@
        _fieldval.Ot = 'notRequired'
        _fieldval.execSuccess = 'grid'
        _fieldval.label = '导入Excel'
        _fieldval.class = 'dgreen'
        _fieldval.class = 'border-dgreen'
        this.record.Ot = 'notRequired'
        this.record.label = '导入Excel'
        this.record.class = 'dgreen'
        this.record.class = 'border-dgreen'
        this.record.execSuccess = 'grid'
      } else if (value === 'excelOut') {
        _fieldval.intertype = 'system'
@@ -576,11 +575,12 @@
        _fieldval.class = 'dgreen'
        _fieldval.execSuccess = 'never'
        _fieldval.Ot = 'requiredOnce'
        _fieldval.control = ''
        this.record.Ot = 'requiredOnce'
        this.record.label = '导出Excel'
        this.record.class = 'dgreen'
        this.record.execSuccess = 'never'
        this.record.control = ''
      } else if (value === 'popview') {
        _fieldval.display = 'modal'
        _fieldval.Ot = 'requiredSgl'
@@ -600,15 +600,6 @@
      } else if (value === 'funcbutton') {
        // _fieldval.funcType = ''
  
      }
      if (value === 'excelIn') {
        _fieldval.label = '导入Excel'
        _fieldval.class = 'dgreen'
      } else if (value === 'excelOut') {
        _fieldval.label = '导出Excel'
        _fieldval.class = 'dgreen'
        _fieldval.control = ''
        this.record.control = ''
      }
      if (appType !== 'mob' && _fieldval.Ot === 'notRequired') {
src/menu/components/share/actioncomponent/dragaction/index.jsx
@@ -1,6 +1,7 @@
import React, { useState } from 'react'
import { useDrop } from 'react-dnd'
import { is, fromJS } from 'immutable'
import { message } from 'antd'
import update from 'immutability-helper'
import Utils from '@/utils/utils.js'
@@ -69,7 +70,6 @@
    }
    copycard.uuid = Utils.getuuid()
    copycard.originCard = card
    try {
      delete _val.$srcId
@@ -92,13 +92,17 @@
      oInput.select()
      document.execCommand('Copy')
      document.body.removeChild(oInput)
      message.success('复制成功。')
    } else {
      message.warning('复制失败。')
    }
    const { index: overIndex } = findCard(id)
    // const { index: overIndex } = findCard(id)
    const _cards = update(cards, { $splice: [[overIndex + 1, 0, copycard]] })
    // const _cards = update(cards, { $splice: [[overIndex + 1, 0, copycard]] })
    handleList(_cards, copycard)
    // handleList(_cards, copycard)
  }
  const [, drop] = useDrop({
@@ -122,7 +126,7 @@
        if (newcard.OpenType === 'excelIn') {
          newcard.label = item.text
          newcard.class = 'dgreen'
          newcard.class = 'border-dgreen'
          newcard.Ot = 'notRequired'
        } else if (newcard.OpenType === 'excelOut') {
          newcard.label = item.text
src/menu/components/share/actioncomponent/formconfig.jsx
@@ -1,4 +1,4 @@
import { btnCustomClasses, btnClasses } from '@/utils/option.js'
import { btnClasses } from '@/utils/option.js'
/**
@@ -677,7 +677,7 @@
      tooltip: '此颜色为按钮初始化颜色,可在样式调整中修改。',
      required: false,
      forbid: type === 'datacard' && appType === 'mob', // 移动端,滑动显示的按钮不设置通用颜色
      options: btnCustomClasses
      options: btnClasses
    },
    {
      type: 'radio',
src/menu/components/share/actioncomponent/index.jsx
@@ -266,6 +266,12 @@
      if ((btn.OpenType === 'excelIn' || btn.OpenType === 'excelOut') && (!btn.verify || !btn.verify.columns) && (config.subtype === 'basetable' || config.subtype === 'normaltable')) {
        let columns = []
        let maps = []
        let labels = {}
        if (config.subtype === 'normaltable') {
          config.columns.forEach(col => {
            labels[col.field] = col.label
          })
        }
        if (btn.OpenType === 'excelOut') {
          let pushcol = (item) => {
@@ -289,16 +295,27 @@
          }
          config.cols.forEach(item => {
            if (item.type === 'colspan' && config.subtype === 'normaltable') {
            if (item.Hide === 'true') return
            if (config.subtype === 'normaltable') {
              if (item.type === 'colspan') {
              item.subcols.forEach(cell => {
                if (!cell.field || cell.Hide === 'true' || maps.includes(cell.field)) return
                maps.push(cell.field)
                pushcol(cell)
              })
              } else if (item.type === 'custom') {
                item.elements.forEach(cell => {
                  if (!cell.field || maps.includes(cell.field)) return
                  maps.push(cell.field)
                  pushcol({...cell, label: labels[cell.field]})
                })
              }
            }
            if (!item.field || item.Hide === 'true' || maps.includes(item.field)) return
            if (!item.field || maps.includes(item.field)) return
            maps.push(item.field)
  
            pushcol(item)
@@ -337,16 +354,27 @@
          }
          config.cols.forEach(item => {
            if (item.type === 'colspan' && config.subtype === 'normaltable') {
            if (item.Hide === 'true') return
            if (config.subtype === 'normaltable') {
              if (item.type === 'colspan') {
              item.subcols.forEach(cell => {
                if (!cell.field || cell.Hide === 'true' || maps.includes(cell.field)) return
                maps.push(cell.field)
                pushcol(cell)
              })
              } else if (item.type === 'custom') {
                item.elements.forEach(cell => {
                  if (!cell.field || maps.includes(cell.field)) return
                  maps.push(cell.field)
                  pushcol({...cell, label: labels[cell.field]})
                })
              }
            }
            if (!item.field || item.Hide === 'true' || maps.includes(item.field)) return
            if (!item.field || maps.includes(item.field)) return
            maps.push(item.field)
  
            pushcol(item)
@@ -379,6 +407,15 @@
              if (btn.show === 'icon') {
                btn.style.color = color[btn.class]
                btn.style.backgroundColor = 'transparent'
              } else if (btn.class === 'default') {
                btn.style.color = 'rgba(0, 0, 0, 0.65)'
                btn.style.backgroundColor = '#fff'
                btn.style.borderColor = '#d9d9d9'
              } else if (btn.class.indexOf('border') > -1) {
                let _c = btn.class.replace('border-', '')
                btn.style.color = color[_c]
                btn.style.backgroundColor = '#fff'
                btn.style.borderColor = color[_c]
              } else {
                btn.style.color = '#ffffff'
                btn.style.backgroundColor = color[btn.class]
src/menu/components/table/base-table/columns/editColumn/formconfig.jsx
@@ -395,7 +395,7 @@
      type: 'radio',
      key: 'eval',
      label: '解析',
      initVal: card.eval || 'true',
      initVal: card.eval || 'false',
      tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。',
      required: false,
      options: [
src/menu/components/table/edit-table/columns/editColumn/formconfig.jsx
@@ -475,7 +475,7 @@
      type: 'radio',
      key: 'eval',
      label: '解析',
      initVal: card.eval || 'true',
      initVal: card.eval || 'false',
      tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。',
      required: false,
      options: [
src/menu/components/table/edit-table/columns/editColumn/index.jsx
@@ -350,18 +350,19 @@
  }
  handleSubmit = () => {
    // const { columns } = this.props
    // 表单提交时检查输入值是否正确
    this.props.form.validateFieldsAndScroll((err, values) => {
      if (!err) {
        // if (values.field && columns.filter(col => col.field && col.uuid !== values.uuid && col.field === values.field).length > 0) {
        //   notification.warning({
        //     top: 92,
        //     message: '字段已添加!',
        //     duration: 5
        //   })
        //   return
        // }
        if (values.type === 'number' && values.editable === 'true') {
          if (typeof(values.max) === 'number' && typeof(values.min) === 'number' && values.max < values.min) {
            notification.warning({
              top: 92,
              message: '最大值不可小于最小值!',
              duration: 5
            })
            return
          }
        }
        this.setState({visible: false, formlist: null})
        this.props.submitCol(values)
src/menu/components/table/normal-table/columns/editColumn/formconfig.jsx
@@ -415,7 +415,7 @@
      type: 'radio',
      key: 'eval',
      label: '解析',
      initVal: card.eval || 'true',
      initVal: card.eval || 'false',
      tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。',
      required: false,
      options: [
src/menu/datasource/index.jsx
@@ -162,6 +162,8 @@
          }
          return item
        })
        res.columns.reverse()
      }
      let maxScript = 0
@@ -200,6 +202,8 @@
      if (config.subtype !== 'dualdatacard') {
        delete res.subColumns
      } else {
        res.subColumns.reverse()
      }
      this.setState({loading: false, visible: false})
src/menu/datasource/verifycard/index.jsx
@@ -1,7 +1,7 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { fromJS } from 'immutable'
import { Form, Tabs, Popconfirm, notification, Modal, Typography, Spin, message, Button } from 'antd'
import { Form, Tabs, Popconfirm, notification, Modal, Typography, Spin, message, Button, Input } from 'antd'
import { StopOutlined, CheckCircleOutlined, EditOutlined, SwapOutlined, DeleteOutlined, CopyOutlined, BorderOutlined, SnippetsOutlined } from '@ant-design/icons'
import moment from 'moment'
@@ -20,6 +20,7 @@
const { TabPane } = Tabs
const { Paragraph } = Typography
const { Search } = Input
const CodeMirror = asyncComponent(() => import('@/templates/zshare/codemirror'))
const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent'))
@@ -35,6 +36,7 @@
    subColumns: [],
    activeKey: 'setting',
    loading: false,
    searchKey: '',
    initsql: '',          // sql验证时变量声明及赋值
    usefulfields: '',
    defaultsql: '',       // 默认Sql
@@ -194,15 +196,21 @@
    _search = _search.replace(/@\$@/ig, '')
    _search = _search ? 'where ' + _search : ''
    let columns = config.columns ? fromJS(config.columns).toJS() : []
    let subColumns = config.subColumns ? fromJS(config.subColumns).toJS() : []
    columns.reverse()
    subColumns.reverse()
    this.setState({
      scripts,
      columns: config.columns ? fromJS(config.columns).toJS() : [],
      subColumns: config.subColumns ? fromJS(config.subColumns).toJS() : [],
      columns: columns,
      subColumns: subColumns,
      setting: _setting,
      median: _setting,
      searches: search,
      defaultSearch: _search
      defaultSearch: _search,
      searchKey: ''
    })
    this.getsysScript()
@@ -273,7 +281,7 @@
    values.uuid = Utils.getuuid()
    this.setState({ columns: [...columns, values] })
    this.setState({ columns: [values, ...columns] })
  }
  subColumnChange = (values, resolve) => {
@@ -293,7 +301,7 @@
    values.uuid = Utils.getuuid()
    this.setState({ subColumns: [...subColumns, values] })
    this.setState({ subColumns: [values, ...subColumns] })
  }
  deleteScript = (record) => {
@@ -931,7 +939,7 @@
  render() {
    const { config } = this.props
    const { columns, subColumns, median, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql, visible, pvisible, reload, script, scriptValue } = this.state
    const { columns, subColumns, median, setting, scripts, colColumns, scriptsColumns, activeKey, loading, searches, defaultsql, visible, pvisible, reload, script, scriptValue, searchKey } = this.state
    return (
      <div className="model-data-source-wrap">
@@ -965,7 +973,7 @@
              type="fields"
              updatefield={this.updatefields}
            />
            <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} type="datasourcefield" wrappedComponentRef={(inst) => this.datasource = inst} data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/>
            <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.datasource = inst} data={columns} columns={colColumns} onChange={(columns) => this.setState({columns})}/>
          </TabPane> : null}
          {config.subtype === 'dualdatacard' ? <TabPane tab={
            <span>
@@ -979,7 +987,7 @@
              type="fields"
              updatefield={this.updateSubfields}
            />
            <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} type="datasourcefield" wrappedComponentRef={(inst) => this.subdatasource = inst} data={subColumns} columns={colColumns} onChange={(subColumns) => this.setState({subColumns})}/>
            <EditTable actions={['edit', 'move', 'copy', 'del', 'clear']} searchKey={searchKey} type="datasourcefield" wrappedComponentRef={(inst) => this.subdatasource = inst} data={subColumns} columns={colColumns} onChange={(subColumns) => this.setState({subColumns})}/>
          </TabPane> : null}
          <TabPane tab={
            <span>
@@ -989,6 +997,7 @@
              {config.type !== 'interface' && activeKey === 'setting' ? <SnippetsOutlined title="导入数据源" className="mk-paste-datasource" onClick={(e) => {e.stopPropagation();this.setState({pvisible: true})}}/> : null}
              {activeKey === 'columns' ? <CopyOutlined title="以逗号拼接形式复制字段" className="mk-copy-fields" onClick={(e) => {e.stopPropagation();this.copyColumns()}}/> : null}
              {activeKey === 'subcolumns' ? <CopyOutlined title="以逗号拼接形式复制字段" className="mk-copy-fields" onClick={(e) => {e.stopPropagation();this.copySubColumns()}}/> : null}
              {activeKey === 'subcolumns' || activeKey === 'columns' ? <span onClick={(e) => {e.stopPropagation()}}><Search className="mk-search-fields" defaultValue={searchKey} allowClear onSearch={(val, e) => {e.stopPropagation();this.setState({searchKey: val})}} /></span> : null}
            </span>
          } key="scripts" disabled={median.interType !== 'system'} id="mk-scripts-tabpane">
            {scripts.length ? <BorderOutlined className="full-scripts" onClick={() => {
src/menu/datasource/verifycard/index.scss
@@ -45,6 +45,34 @@
    .mk-copy-fields:hover, .mk-copy-datasource:hover, .mk-paste-datasource:hover {
      opacity: 1;
    }
    .mk-search-fields {
      position: absolute;
      cursor: pointer;
      width: 150px;
      z-index: 1;
      top: 10px;
      right: -240px;
      display: inline-block;
      .ant-input {
        border-radius: 40px;
        height: 30px;
        transition: opacity 0.2s;
      }
      .ant-input:not(:hover):not(:active):not(:focus) {
        opacity: 0.6;
      }
      .ant-input:not(:hover):not(:active):not(:focus) + .ant-input-suffix {
        opacity: 0.6;
      }
    }
    .mk-search-fields:hover {
      .ant-input {
        opacity: 1;
      }
      .ant-input-suffix {
        opacity: 1;
      }
    }
    .count-tip {
      position: absolute;
      top: 0px;
src/menu/transfer/index.jsx
@@ -83,6 +83,7 @@
              }
            }
          })
          tab.components[0].cols = tab.components[0].cols.filter(col => !(col.field && col.Hide === 'true'))
          tab.components[0].cols.forEach(col => {
            if (col.type !== 'action') return
            col.elements.forEach(btn => {
@@ -108,6 +109,7 @@
            }
          }
        })
        item.cols = item.cols.filter(col => !(col.field && col.Hide === 'true'))
        item.cols.forEach(col => {
          if (col.type !== 'action') return
          col.elements.forEach(btn => {
src/mob/colorsketch/index.jsx
@@ -9,8 +9,9 @@
const presetColors = [
  '#1890ff', '#f5222d', '#fa541c', '#fa8c16', '#faad14', '#fadb14', '#a0d911', '#52c41a', '#13c2c2', '#2f54eb', '#722ed1',
  '#eb2f96', '#aeb303', '#c32539', '#1d3661', '#ffd591', '#ffe58f', '#fffb8f', '#eaff8f', '#b7eb8f', '#87e8de', '#91d5ff',
  '#adc6ff', '#d3adf7', '#EBE9E9', '#d9d9d9', '#434343', '#000000', '#ffffff', 'transparent'
  '#adc6ff', '#EBE9E9', '#d9d9d9', 'rgba(0, 0, 0, 0.65)', 'rgba(0, 0, 0, 0.85)', '#000000', '#ffffff', 'transparent'
]
const _href = window.location.href.split('#')[0]
class ColorSketch extends Component {
  static propTpyes = {
@@ -20,6 +21,7 @@
  }
  state = {
    color: '',
    initVal: '',
    colors: [],
    allowClear: false
  }
@@ -38,6 +40,21 @@
    let _colors = sessionStorage.getItem('app_colors')
    let colors = JSON.parse(JSON.stringify(presetColors))
    let normal_colors = localStorage.getItem(_href + 'normal_colors')
    if (normal_colors) {
      try {
        normal_colors = JSON.parse(normal_colors)
      } catch (e) {
        normal_colors = []
      }
      normal_colors.forEach(item => {
        colors.push({color: item, title: '常用色:' + item})
      })
    } else {
      normal_colors = []
    }
    if (_colors) {
      try {
@@ -47,13 +64,19 @@
      }
      
      _colors.forEach(item => {
        if (!colors.includes(item.linkurl)) {
          colors.push(item.linkurl)
        }
        if (normal_colors.includes(item.linkurl)) return
        colors.push({color: item.linkurl, title: '系统色:' + item.linkurl})
      })
    }
    this.setState({color: initVal, allowClear: allowClear === true, colors})
    if (colors.length < 40) {
      for (let i = colors.length; i < 40; i++) {
        colors.push({color: 'transparent', title: '' + i})
      }
    }
    this.setState({color: initVal, initVal, allowClear: allowClear === true, colors})
  }
  handleChange = (color) => {
@@ -77,13 +100,42 @@
    }
  }
  onVisibleChange = (status) => {
    const { initVal, color } = this.state
    if (!status && color && color !== initVal && color !== 'rgba(0, 0, 0, 0)' && color !== 'transparent' && !/rgba\(\d+,\s*\d+,\s*\d+,\s*0\)/.test(color)) {
      let normal_colors = localStorage.getItem(_href + 'normal_colors')
      if (normal_colors) {
        try {
          normal_colors = JSON.parse(normal_colors)
        } catch (e) {
          normal_colors = []
        }
      } else {
        normal_colors = []
      }
      normal_colors.unshift(color)
      normal_colors = Array.from(new Set(normal_colors))
      if (normal_colors.length > 10) {
        normal_colors.length = 10
      }
      localStorage.setItem(_href + 'normal_colors', JSON.stringify(normal_colors))
    }
  }
  render() {
    const { color, allowClear, colors } = this.state
    return (
      <div className="color-sketch-block">
        <Popover content={
          <SketchPicker color={ color } presetColors={colors} onChange={ this.handleChange } />
        } overlayClassName="color-sketch-popover" placement="bottomRight" title="" trigger="click">
        } overlayClassName="color-sketch-popover" placement="bottomRight" title="" trigger="click" onVisibleChange={this.onVisibleChange}>
          <div className="color-sketch-block-box">
            <div className="color-sketch-block-inner" style={ {background: color} }></div>
          </div>
src/mob/colorsketch/index.scss
@@ -58,6 +58,23 @@
    padding: 0;
    .sketch-picker {
      width: 250px!important;
      .flexbox-fix:last-child {
        overflow: hidden;
        >div:nth-child(30) {
          position: relative;
          margin-bottom: 20px!important;
        }
        >div:nth-child(30)::after {
          content: ' ';
          display: block;
          border-bottom: 1px solid #d9d9d9;
          position: absolute;
          width: 300px;
          bottom: -10px;
          right: -20px;
        }
      }
    }
  }
}
src/tabviews/custom/components/card/cardcellList/index.jsx
@@ -267,6 +267,19 @@
            let city = sessionStorage.getItem('city') || ''
            let bid = data.$$BID || ''
            val = val.replace(/@username@/ig, userName).replace(/@fullName@/ig, fullName).replace(/@mk_city@/ig, city).replace(/@bid@/ig, bid)
          } else if (/@month@/ig.test(val)) {
            val = val.replace(/@month@/ig, new Date().toLocaleString('en-US', { month: 'long' }))
          } else if (/@week@/ig.test(val)) {
            val = val.replace(/@week@/ig, (() => {
              let day = new Date().getDay()
              let weeks = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
              return weeks[day]
            })())
          } else if (/@day@/ig.test(val)) {
            val = val.replace(/@day@/ig, (() => {
              let day = new Date().getDate()
              return day < 10 ? '0' + day : day
            })())
          }
        } else if (data.hasOwnProperty(card.field)) {
          val = data[card.field]
@@ -388,10 +401,17 @@
          _style.backgroundImage = `url('${data[card.bgImage]}')`
        }
  
        let lineStyle = {height: card.innerHeight || 'auto'}
        if (card.alignItems) {
          lineStyle.display = 'flex'
          lineStyle.alignItems = card.alignItems
          lineStyle.justifyContent = _style.textAlign || 'left'
        }
        contents.push(
          <Col key={card.uuid} style={_style_} span={card.width}>
            <div style={_style} onClick={(e) => {this.openNewView(e, card)}}>
              <div className={'ant-mk-text line' + (card.height || '') + className} style={{height: card.innerHeight || 'auto'}}>{val}</div>
              <div className={'ant-mk-text line' + (card.height || '') + className} style={lineStyle}>{val}</div>
            </div>
          </Col>
        )
@@ -458,10 +478,17 @@
          className = mark.signType
        }
  
        let lineStyle = {height: card.innerHeight || 'auto'}
        if (card.alignItems) {
          lineStyle.display = 'flex'
          lineStyle.alignItems = card.alignItems
          lineStyle.justifyContent = _style.textAlign || 'left'
        }
        contents.push(
          <Col key={card.uuid} style={_style_} span={card.width}>
            <div style={_style}>
              <div className={'ant-mk-text line' + (card.height || '') + className} style={{height: card.innerHeight || 'auto'}}>{val}</div>
              <div className={'ant-mk-text line' + (card.height || '') + className} style={lineStyle}>{val}</div>
            </div>
          </Col>
        )
@@ -777,10 +804,17 @@
          className = mark.signType
        }
  
        let lineStyle = {height: card.innerHeight || 'auto'}
        if (card.alignItems) {
          lineStyle.display = 'flex'
          lineStyle.alignItems = card.alignItems
          lineStyle.justifyContent = _style.textAlign || 'left'
        }
        contents.push(
          <Col key={card.uuid} style={_style_} span={card.width}>
            <div style={_style}>
              <div className={'ant-mk-text line' + (card.height || '') + className} style={{height: card.innerHeight || 'auto'}}>{val}</div>
              <div className={'ant-mk-text line' + (card.height || '') + className} style={lineStyle}>{val}</div>
            </div>
          </Col>
        )
@@ -983,8 +1017,10 @@
  }
  render() {
    const { cardCell } = this.props
    return (
      <div className="card-cell-list">
      <div className={'card-cell-list ' + (cardCell && cardCell.setting && cardCell.setting.layout === 'flex' ? 'mk-flex' : '')}>
        {this.getContent()}
      </div>
    )
src/tabviews/custom/components/card/cardcellList/index.scss
@@ -193,9 +193,233 @@
    width: 26px;
    height: 26px;
  }
  .ant-col[class*="x"] {
    float: left;
    box-sizing: border-box;
  }
  >.ant-col-0x {
    width: 2.08333333%;
  }
  >.ant-col-1x {
    width: 6.25%;
  }
  >.ant-col-2x {
    width: 10.41666667%;
  }
  >.ant-col-3x {
    width: 14.58333333%;
  }
  >.ant-col-4x {
    width: 18.75%;
  }
  >.ant-col-5x {
    width: 22.91666667%;
  }
  >.ant-col-6x {
    width: 27.08333333%;
  }
  >.ant-col-7x {
    width: 31.25%;
  }
  >.ant-col-8x {
    width: 35.41666667%;
  }
  >.ant-col-9x {
    width: 39.58333333%;
  }
  >.ant-col-10x {
    width: 43.75%;
  }
  >.ant-col-11x {
    width: 47.91666667%;
  }
  >.ant-col-12x {
    width: 52.08333333%;
  }
  >.ant-col-13x {
    width: 56.25%;
  }
  >.ant-col-14x {
    width: 60.41666667%;
  }
  >.ant-col-15x {
    width: 64.58333333%;
  }
  >.ant-col-16x {
    width: 68.75%;
  }
  >.ant-col-17x {
    width: 72.91666667%;
  }
  >.ant-col-18x {
    width: 77.08333333%;
  }
  >.ant-col-19x {
    width: 81.25%;
  }
  >.ant-col-20x {
    width: 85.41666667%;
  }
  >.ant-col-21x {
    width: 89.58333333%;
  }
  >.ant-col-22x {
    width: 93.75%;
  }
  >.ant-col-23x {
    width: 97.91666667%;
  }
}
.card-cell-list::after {
  content: ' ';
  display: block;
  clear: both;
}
.card-cell-list.mk-flex {
  display: flex;
  >.ant-col-1 {
    flex: 1;
  }
  >.ant-col-2 {
    flex: 2;
  }
  >.ant-col-3 {
    flex: 3;
  }
  >.ant-col-4 {
    flex: 4;
  }
  >.ant-col-5 {
    flex: 5;
  }
  >.ant-col-6 {
    flex: 6;
  }
  >.ant-col-7 {
    flex: 7;
  }
  >.ant-col-8 {
    flex: 8;
  }
  >.ant-col-9 {
    flex: 9;
  }
  >.ant-col-10 {
    flex: 10;
  }
  >.ant-col-11 {
    flex: 11;
  }
  >.ant-col-12 {
    flex: 12;
  }
  >.ant-col-13 {
    flex: 13;
  }
  >.ant-col-14 {
    flex: 14;
  }
  >.ant-col-15 {
    flex: 15;
  }
  >.ant-col-16 {
    flex: 16;
  }
  >.ant-col-17 {
    flex: 17;
  }
  >.ant-col-18 {
    flex: 18;
  }
  >.ant-col-19 {
    flex: 19;
  }
  >.ant-col-20 {
    flex: 20;
  }
  >.ant-col-21 {
    flex: 21;
  }
  >.ant-col-22 {
    flex: 22;
  }
  >.ant-col-23 {
    flex: 23;
  }
  >.ant-col-24 {
    flex: 24;
  }
  >.ant-col-0x {
    flex: 0.5;
  }
  >.ant-col-1x {
    flex: 1.5;
  }
  >.ant-col-2x {
    flex: 2.5;
  }
  >.ant-col-3x {
    flex: 3.5;
  }
  >.ant-col-4x {
    flex: 4.5;
  }
  >.ant-col-5x {
    flex: 5.5;
  }
  >.ant-col-6x {
    flex: 6.5;
  }
  >.ant-col-7x {
    flex: 7.5;
  }
  >.ant-col-8x {
    flex: 8.5;
  }
  >.ant-col-9x {
    flex: 9.5;
  }
  >.ant-col-10x {
    flex: 10.5;
  }
  >.ant-col-11x {
    flex: 11.5;
  }
  >.ant-col-12x {
    flex: 12.5;
  }
  >.ant-col-13x {
    flex: 13.5;
  }
  >.ant-col-14x {
    flex: 14.5;
  }
  >.ant-col-15x {
    flex: 15.5;
  }
  >.ant-col-16x {
    flex: 16.5;
  }
  >.ant-col-17x {
    flex: 17.5;
  }
  >.ant-col-18x {
    flex: 18.5;
  }
  >.ant-col-19x {
    flex: 19.5;
  }
  >.ant-col-20x {
    flex: 20.5;
  }
  >.ant-col-21x {
    flex: 21.5;
  }
  >.ant-col-22x {
    flex: 22.5;
  }
  >.ant-col-23x {
    flex: 23.5;
  }
}
src/tabviews/custom/components/card/double-data-card/index.jsx
@@ -917,7 +917,8 @@
            selectedData={selectedData}
          /> : null
        }
        <div className={`data-zoom ${config.wrap.wrapClass}`}>
        <div className={config.wrap.minWidth ? 'data-zoom-box' : ''}>
          <div className={`data-zoom ${config.wrap.wrapClass}`} style={config.wrap.minWidth ? {minWidth: config.wrap.minWidth} : null}>
          <Row className={'card-row-list '}>
            {precards.map((item, index) => (
              <Col key={'pre' + index} className="extend-card" span={item.setting.width || 6}>
@@ -976,6 +977,7 @@
          </Row>
          {precards.length === 0 && nextcards.length === 0 && (!data || data.length === 0) ? <Empty description={false}/> : null}
        </div>
        </div>
        {config.wrap.pagestyle === 'page' && config.setting.laypage && data ? <Pagination size="small" total={total} showTotal={(t, range) => `${range[0]}-${range[1]} 共 ${total} 条`} pageSize={pageSize} showSizeChanger={true} pageSizeOptions={this.state.pageOptions} onChange={this.changePageIndex} onShowSizeChange={this.pageSizeChange} current={pageIndex}/> : null}
        {config.wrap.pagestyle === 'more' && config.setting.laypage && data && data.length > 0 ? <div className={'mk-more' + (pageSize * pageIndex >= total ? ' disabled' : '')} onClick={this.loadMore}>查看更多<DownOutlined/></div> : null}
      </div>
src/tabviews/custom/components/card/double-data-card/index.scss
@@ -297,6 +297,25 @@
      }
    }
  }
  .data-zoom-box {
    width: 100%;
    overflow-x: auto;
    padding-bottom: 10px;
  }
  .data-zoom-box::-webkit-scrollbar {
    height: 7px;
  }
  .data-zoom-box::-webkit-scrollbar-thumb {
    border-radius: 5px;
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
    background: rgba(0, 0, 0, 0.13);
  }
  .data-zoom-box::-webkit-scrollbar-track {
    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
    border-radius: 3px;
    border: 1px solid rgba(0, 0, 0, 0.07);
    background: rgba(0, 0, 0, 0);
  }
}
.double-data-card-box::-webkit-scrollbar {
  width: 7px;
src/templates/sharecomponent/fieldscomponent/index.jsx
@@ -163,7 +163,7 @@
          field: item.field,
          datatype: _t
        }
        items.push(newcard)
        items.unshift(newcard)
        keys.push(item.field.toLowerCase())
      })
src/templates/zshare/codemirror/index.jsx
@@ -1,11 +1,12 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Dropdown, Menu } from 'antd'
import { FullscreenOutlined, FullscreenExitOutlined, FontSizeOutlined, FormatPainterOutlined } from '@ant-design/icons'
import { Dropdown, Menu, Modal, notification } from 'antd'
import { FullscreenOutlined, FullscreenExitOutlined, FontSizeOutlined, FormatPainterOutlined, SwapOutlined } from '@ant-design/icons'
import {UnControlled as CodeMirror} from 'react-codemirror2'
import sqlFormatter from '@/utils/sqlFormatter.js'
import ReplaceForm from './replaceform'
import 'codemirror/mode/javascript/javascript'
import 'codemirror/mode/sql/sql'
import 'codemirror/mode/xml/xml'
@@ -33,7 +34,8 @@
    options: null,  // mode : text/xml, text/css, text/javascript、text/x-mysql ; theme : cobalt - 黑底
    fullScreen: false,
    style: {fontSize: '18px', lineHeight: '32px'},
    display: true
    display: true,
    visible: false
  }
  editor = null
@@ -149,9 +151,42 @@
    this.props.onChange(_sql)
  }
  submit = () => {
    let _sql = this.state.value
    this.ReplaceRef.handleConfirm().then(res => {
      let reg = new RegExp(res.origin, 'ig')
      let times = _sql.match(reg)
      if (!times) {
        notification.warning({
          top: 92,
          message: '未查询到字符《' + res.origin + '》。',
          duration: 5
        })
        return
      }
      _sql = _sql.replace(reg, res.value)
      this.setState({display: false, defaultVal: _sql}, () => {
        this.setState({display: true})
      })
      this.props.onChange(_sql)
      notification.success({
        top: 92,
        message: `共替换${times.length}处字符《${res.origin}》。`,
        duration: 5
      })
      this.setState({ visible: false })
    })
  }
  render() {
    const { mode, func } = this.props
    const { defaultVal, options, fullScreen, style, display } = this.state
    const { defaultVal, options, fullScreen, style, display, visible } = this.state
    const menu = (
      <Menu>
        <Menu.Item
@@ -194,13 +229,15 @@
    )
    return (
      <div className="code-mirror-wrap" style={fullScreen || func ? style : null}>
        {!mode && !fullScreen ? <FormatPainterOutlined onClick={this.handleFormat}/> : null}
        {!fullScreen ? <FullscreenOutlined onClick={this.fullScreenChange}/> : null}
        {fullScreen ? <FullscreenExitOutlined onClick={this.fullScreenChange}/> : null}
      <>
        <div className={'code-mirror-wrap ' + (fullScreen ? 'mk-fullscreen' : '')} style={fullScreen || func ? style : null}>
          {!mode ? <FormatPainterOutlined title="格式化" onClick={this.handleFormat}/> : null}
          <FullscreenOutlined title="最大化" onClick={this.fullScreenChange}/>
          <FullscreenExitOutlined title="向下还原" onClick={this.fullScreenChange}/>
        {fullScreen || func ? <Dropdown overlayClassName="mk-mirror-font" overlay={menu} placement="bottomRight">
          <FontSizeOutlined />
        </Dropdown> : null}
          <SwapOutlined title="字符替换" onClick={() => this.setState({visible: true})}/>
        {display ? <CodeMirror
          className="code-mirror-area"
          value={defaultVal}
@@ -212,6 +249,19 @@
          }}
        /> : null}
      </div>
        <Modal
          title="字符替换"
          visible={visible}
          width={500}
          maskClosable={false}
          okText="替换"
          onOk={this.submit}
          onCancel={() => {this.setState({ visible: false })}}
          destroyOnClose
        >
          <ReplaceForm inputSubmit={this.submit} wrappedComponentRef={(inst) => this.ReplaceRef = inst}/>
        </Modal>
      </>
    )
  }
}
src/templates/zshare/codemirror/index.scss
@@ -37,6 +37,7 @@
    color: #1890ff;
    cursor: pointer;
    transition: opacity 0.3s;
    display: none;
  }
  .anticon-fullscreen-exit:hover {
    opacity: 1;
@@ -45,7 +46,7 @@
    position: fixed;
    z-index: 11;
    right: 10px;
    top: 40px;
    top: 65px;
    font-size: 20px;
    opacity: 0.7;
    color: #1890ff;
@@ -87,6 +88,34 @@
      background: #f5f5f5;
    }
  }
  .anticon-swap {
    position: absolute;
    left: -25px;
    top: 40px;
    color: #13c2c2;
    font-size: 16px;
  }
}
.code-mirror-wrap.mk-fullscreen {
  .anticon-format-painter {
    position: fixed;
    z-index: 11;
  }
  .anticon-fullscreen-exit {
    display: inline-block;
  }
  .anticon-fullscreen {
    display: none;
  }
  .anticon-swap {
    position: fixed;
    z-index: 11;
    left: auto;
    right: 10px;
    top: auto;
    bottom: 20px;
  }
}
.mk-mirror-font {
  z-index: 1200!important;
src/templates/zshare/codemirror/replaceform/index.jsx
New file
@@ -0,0 +1,82 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { Form, Row, Col, Input } from 'antd'
// import './index.scss'
class ReplaceForm extends Component {
  static propTpyes = {
    inputSubmit: PropTypes.func // 回车事件
  }
  componentDidMount () {
    try {
      let _form = document.getElementById('origin')
      if (_form && _form.select) {
        _form.select()
      }
    } catch (e) {
      console.warn('Form focusing error!')
    }
  }
  handleConfirm = () => {
    // 表单提交时检查输入值是否正确
    return new Promise((resolve, reject) => {
      this.props.form.validateFieldsAndScroll((err, values) => {
        if (!err) {
          resolve(values)
        }
      })
    })
  }
  enterPress = (e) => {
    e.stopPropagation()
    setTimeout(() => {
      this.props.inputSubmit()
    }, 200)
  }
  render() {
    const { getFieldDecorator } = this.props.form
    const formItemLayout = {
      labelCol: {
        xs: { span: 24 },
        sm: { span: 8 }
      },
      wrapperCol: {
        xs: { span: 24 },
        sm: { span: 14 }
      }
    }
    return (
      <Form {...formItemLayout}>
        <Row gutter={24}>
          <Col span={24}>
            <Form.Item label="原字符">
              {getFieldDecorator('origin', {
                initialValue: '',
                rules: [
                  {
                    required: true,
                    message: '请输入原字符!'
                  }
                ]
              })(<Input autoComplete="off" onPressEnter={this.enterPress}/>)}
            </Form.Item>
          </Col>
          <Col span={24}>
            <Form.Item label="替换为">
              {getFieldDecorator('value', {
                initialValue: ''
              })(<Input autoComplete="off" onPressEnter={this.enterPress}/>)}
            </Form.Item>
          </Col>
        </Row>
      </Form>
    )
  }
}
export default Form.create()(ReplaceForm)
src/templates/zshare/codemirror/replaceform/index.scss
src/templates/zshare/editTable/index.jsx
@@ -163,6 +163,7 @@
class EditTable extends Component {
  static propTpyes = {
    actions: PropTypes.any,         // 操作项
    searchKey: PropTypes.any,       // 搜索条件
    data: PropTypes.any,            // 数据列表
    columns: PropTypes.array,       // 显示列
    onChange: PropTypes.func        // 数据变化
@@ -585,7 +586,7 @@
  }
  render() {
    const { actions, indexShow } = this.props
    const { actions, indexShow, searchKey } = this.props
    const { editLineId } = this.state
    let components = {
@@ -595,7 +596,7 @@
    }
    let moveprops = {}
    if (actions.includes('move')) {
    if (actions.includes('move') && !searchKey) {
      components.body.row = DragableBodyRow
      moveprops.moveAble = !this.state.editingKey
      moveprops.moveRow = this.moveRow
@@ -641,6 +642,8 @@
      return item
    })
    let reg = searchKey ? new RegExp(searchKey, 'ig') : null
    return (
      <EditableContext.Provider value={this.props.form}>
        <div className="modal-edit-table">
@@ -651,7 +654,18 @@
              components={components}
              dataSource={data}
              columns={columns}
              rowClassName={record => !editLineId || editLineId !== record.uuid ? 'editable-row' : 'editable-row active'}
              rowClassName={record => {
                let className = 'editable-row'
                if (editLineId && editLineId === record.uuid) {
                  className += ' active'
                }
                if (searchKey) {
                  if (!reg.test(record.field) && !reg.test(record.label)) {
                    className += ' hidden'
                  }
                }
                return className
              }}
              pagination={false}
              onRow={(record, index) => ({
                index,
src/templates/zshare/editTable/index.scss
@@ -31,6 +31,9 @@
      background-color: #bae7ff!important;
    }
  }
  .editable-row.hidden {
    display: none;
  }
  .mk-index {
    text-align: center;
    white-space: nowrap;
src/templates/zshare/formconfig.jsx
@@ -3466,7 +3466,7 @@
      type: 'radio',
      key: 'eval',
      label: '解析',
      initVal: card.eval || 'true',
      initVal: card.eval || 'false',
      tooltip: '当公式内容涉及计算时请选择“是”,当公式内容为字段拼接时请选择“否”。',
      required: false,
      options: [{
src/utils/option.js
@@ -391,36 +391,6 @@
  text: '白底紫框'
}]
// 按钮颜色集
export const btnCustomClasses = [{
  value: 'primary',
  text: '蓝色'
}, {
  value: 'yellow',
  text: '黄色'
}, {
  value: 'orange',
  text: '橙色'
}, {
  value: 'danger',
  text: '红色'
}, {
  value: 'green',
  text: '绿色'
}, {
  value: 'dgreen',
  text: '深绿色'
}, {
  value: 'purple',
  text: '紫色'
}, {
  value: 'cyan',
  text: '青色'
}, {
  value: 'gray',
  text: '灰色'
}]
export const calendarColors = [
  {name: 'red', value: '#d0021b'},
  {name: 'orange', value: '#f5a623'},