king
2020-09-22 5944c2832820a8bfa86e3efb5085f5a2463897f9
2020-09-22
25个文件已修改
4个文件已添加
434 ■■■■ 已修改文件
src/components/tabview/index.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/actioncomponent/index.jsx 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/chart/antv-bar/index.jsx 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/tabs/antv-tabs/index.jsx 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/tabs/tabcomponents/card.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/components/tabs/tabcomponents/index.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/datasource/index.jsx 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/menushell/card.jsx 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/menushell/index.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/menu/searchcomponent/index.jsx 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/action-type.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/action.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/store/reducer.js 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/commontable/index.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/chart/antv-bar-line/index.jsx 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/chart/antv-bar-line/index.scss 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/share/tabtransfer/index.jsx 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/share/tabtransfer/index.scss 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/tabs/antv-tabs/index.jsx 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/components/tabs/antv-tabs/index.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/custom/index.jsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/home/index.scss 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtable/index.scss 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/subtabtable/index.scss 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/tabviews/zshare/normalTable/index.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/utils-datamanage.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/menudesign/index.jsx 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/tabview/index.scss
@@ -6,6 +6,7 @@
    width: 100%;
    height: 100%;
    > .ant-tabs {
      height: 100%;
      > .ant-tabs-bar { // 去除标签页header与content之间的间隙
        margin-bottom: 0;
        .ant-tabs-tab {
@@ -53,6 +54,9 @@
          }
        }
      }
      >.ant-tabs-content {
        height: 100%;
      }
    }
    .ant-tabs .ant-tabs-top-content.ant-tabs-content-animated {
      transition: margin-left 0s cubic-bezier(0.645, 0.045, 0.355, 1);
src/menu/actioncomponent/index.jsx
@@ -1,5 +1,6 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import { Modal, notification, Button } from 'antd'
import moment from 'moment'
@@ -26,7 +27,6 @@
class ActionComponent extends Component {
  static propTpyes = {
    type: PropTypes.string,          // 菜单类型,主表或子表
    menu: PropTypes.object,          // 菜单信息(菜单id,菜单参数,菜单名称)
    config: PropTypes.object,        // 菜单配置信息
    tabs: PropTypes.array,           // 所有标签
    setSubConfig: PropTypes.func,    // 设置子配置信息
@@ -877,7 +877,7 @@
  }
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
    return !is(fromJS(this.props.config), fromJS(nextProps.config)) || !is(fromJS(this.state), fromJS(nextState))
  }
  /**
@@ -982,4 +982,14 @@
  }
}
export default ActionComponent
const mapStateToProps = (state) => {
  return {
    menu: state.customMenu
  }
}
const mapDispatchToProps = () => {
  return {}
}
export default connect(mapStateToProps, mapDispatchToProps)(ActionComponent)
src/menu/components/chart/antv-bar/index.jsx
@@ -1,5 +1,6 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import { Chart } from '@antv/g2'
import DataSet from '@antv/data-set'
@@ -19,7 +20,6 @@
class antvBarLineChart extends Component {
  static propTpyes = {
    menu: PropTypes.object,
    card: PropTypes.object,
    updateConfig: PropTypes.func,
  }
@@ -548,28 +548,22 @@
  render() {
    const { card } = this.state
    const { menu } = this.props
    return (
      <div className="menu-line-chart-edit-box" style={{height: card.setting.height || 400}}>
        <SettingComponent
          config={card}
          menu={menu}
          updateConfig={this.updateComponent}
        />
        <div className="chart-header">
          <span className="chart-title">{card.setting.title || ''}</span>
          <SearchComponent
            menu={menu}
            config={card}
            sysRoles={menu.sysRoles}
            optionLibs={null}
            updatesearch={this.updateComponent}
          />
        </div>
        <ActionComponent
          type="chart"
          menu={menu}
          config={card}
          tabs={[]}
          // setSubConfig={(_btn) => this.setSubConfig(_btn, 'button')}
@@ -586,4 +580,14 @@
  }
}
export default antvBarLineChart
const mapStateToProps = (state) => {
  return {
    menu: state.customMenu
  }
}
const mapDispatchToProps = () => {
  return {}
}
export default connect(mapStateToProps, mapDispatchToProps)(antvBarLineChart)
src/menu/components/tabs/antv-tabs/index.jsx
@@ -20,7 +20,6 @@
class antvBarLineChart extends Component {
  static propTpyes = {
    menu: PropTypes.object,
    tabs: PropTypes.object,
    updateConfig: PropTypes.func,
  }
@@ -197,7 +196,6 @@
  }
  render() {
    const { menu } = this.props
    const { tabs, dict, labelvisible, editab } = this.state
    return (
@@ -217,7 +215,7 @@
                <span>{tab.icon ? <Icon type={tab.icon} /> : null}{tab.label}</span>
              </Popover>
            } key={tab.uuid}>
              <TabComponents menu={menu} config={tab} handleList={this.updateTabComponent} deleteCard={this.deleteCard} />
              <TabComponents config={tab} handleList={this.updateTabComponent} deleteCard={this.deleteCard} />
            </TabPane>
          ))}
          <TabPane className="tab-add" disabled tab={<Icon onClick={this.tabAdd} type="plus" />} key="add"></TabPane>
src/menu/components/tabs/tabcomponents/card.jsx
@@ -8,7 +8,7 @@
const AntvBar = asyncComponent(() => import('@/menu/components/chart/antv-bar'))
const AntvTabs = asyncComponent(() => import('@/menu/components/tabs/antv-tabs'))
const Card = ({ id, menu, card, moveCard, findCard, delCard, hasDrop, updateConfig }) => {
const Card = ({ id, card, moveCard, findCard, delCard, hasDrop, updateConfig }) => {
  const originalIndex = findCard(id).index
  const [{ isDragging }, drag] = useDrag({
    item: { type: 'menu', id, originalIndex, floor: card.floor },
@@ -38,9 +38,9 @@
  const getCardComponent = () => {
    if (card.type === 'bar' || card.type === 'line') {
      return (<AntvBar menu={menu} card={card} updateConfig={updateConfig} />)
      return (<AntvBar card={card} updateConfig={updateConfig} />)
    } else if (card.type === 'tabs') {
      return (<AntvTabs menu={menu} tabs={card} updateConfig={updateConfig} />)
      return (<AntvTabs tabs={card} updateConfig={updateConfig} />)
    }
  }
src/menu/components/tabs/tabcomponents/index.jsx
@@ -10,7 +10,7 @@
const { confirm } = Modal
const Container = ({menu, config, handleList }) => {
const Container = ({ config, handleList }) => {
  let target = null
  const [cards, setCards] = useState(config.components)
@@ -138,7 +138,6 @@
        <Card
          id={card.uuid}
          key={card.uuid}
          menu={menu}
          config={config}
          card={card}
          moveCard={moveCard}
src/menu/datasource/index.jsx
@@ -1,5 +1,6 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import {connect} from 'react-redux'
import { is, fromJS } from 'immutable'
import { Icon, Modal } from 'antd'
@@ -11,7 +12,6 @@
class DataSource extends Component {
  static propTpyes = {
    config: PropTypes.any,
    menu: PropTypes.object,
    updateConfig: PropTypes.func
  }
@@ -27,10 +27,11 @@
    const { config } = this.props
    this.setState({setting: fromJS(config.setting).toJS()})
    this.props.updateConfig(config) // 触发菜单信息更新
  }
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
    return !is(fromJS(this.state), fromJS(nextState))
  }
  editDataSource = () => {
@@ -84,4 +85,14 @@
  }
}
export default DataSource
const mapStateToProps = (state) => {
  return {
    menu: state.customMenu
  }
}
const mapDispatchToProps = () => {
  return {}
}
export default connect(mapStateToProps, mapDispatchToProps)(DataSource)
src/menu/menushell/card.jsx
@@ -8,7 +8,7 @@
const AntvBar = asyncComponent(() => import('@/menu/components/chart/antv-bar'))
const AntvTabs = asyncComponent(() => import('@/menu/components/tabs/antv-tabs'))
const Card = ({ id, menu, card, moveCard, findCard, delCard, hasDrop, doubleClickCard, updateConfig }) => {
const Card = ({ id, card, moveCard, findCard, delCard, hasDrop, doubleClickCard, updateConfig }) => {
  const originalIndex = findCard(id).index
  const [{ isDragging }, drag] = useDrag({
    item: { type: 'menu', id, originalIndex, floor: card.floor },
@@ -38,9 +38,9 @@
  const getCardComponent = () => {
    if (card.type === 'bar' || card.type === 'line') {
      return (<AntvBar menu={menu} card={card} updateConfig={updateConfig} />)
      return (<AntvBar card={card} updateConfig={updateConfig} />)
    } else if (card.type === 'tabs') {
      return (<AntvTabs menu={menu} tabs={card} updateConfig={updateConfig} />)
      return (<AntvTabs tabs={card} updateConfig={updateConfig} />)
    }
  }
src/menu/menushell/index.jsx
@@ -128,7 +128,6 @@
        <Card
          id={card.uuid}
          key={card.uuid}
          menu={menu}
          card={card}
          moveCard={moveCard}
          delCard={deleteCard}
src/menu/searchcomponent/index.jsx
@@ -1,6 +1,7 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import {connect} from 'react-redux'
import { Modal, notification } from 'antd'
import moment from 'moment'
@@ -19,7 +20,7 @@
class SearchComponent extends Component {
  static propTpyes = {
    config: PropTypes.object,        // 配置信息
    sysRoles: PropTypes.array,       // 角色列表,黑名单
    // optionLibs: PropTypes.any,       // 下拉字典
    updatesearch: PropTypes.func     // 更新
  }
@@ -86,7 +87,7 @@
    this.setState({
      visible: true,
      card: card,
      formlist: getSearchForm(card, this.props.sysRoles, linkableFields)
      formlist: getSearchForm(card, this.props.menu.sysRoles, linkableFields)
    })
  }
@@ -304,4 +305,14 @@
  }
}
export default SearchComponent
const mapStateToProps = (state) => {
  return {
    menu: state.customMenu
  }
}
const mapDispatchToProps = () => {
  return {}
}
export default connect(mapStateToProps, mapDispatchToProps)(SearchComponent)
src/store/action-type.js
@@ -40,5 +40,8 @@
// 修改数据权限
export const MODIFY_DATAMANAGER = 'MODIFY_DATAMANAGER'
// 修改自定义菜单
export const MODIFY_CUSTOMMENU = 'MODIFY_CUSTOMMENU'
// 退出
export const LOGOUT = 'LOGOUT'
src/store/action.js
@@ -112,6 +112,14 @@
  }
}
// 修改自定义菜单
export const modifyCustomMenu = (customMenu) => {
  return {
    type: user.MODIFY_CUSTOMMENU,
    customMenu: customMenu
  }
}
// 退出重置
export const logout = () => {
  return {
src/store/reducer.js
@@ -31,7 +31,8 @@
  permFuncField: [],    // 系统模块
  sysRoles: [],         // 系统角色列表
  dataManager: false,   // 数据管理员
  memberLevel: _level   // 会员等级
  memberLevel: _level,  // 会员等级
  customMenu: null      // 编辑中的菜单(自定义页面)
}
// 用户消息
@@ -141,6 +142,12 @@
        ...state,
        dataManager: action.dataManager
      }
    case Type.MODIFY_CUSTOMMENU:
      // 修改自定义菜单信息
      return {
        ...state,
        customMenu: action.customMenu
      }
    case Type.LOGOUT:
      return {
        selectedMainMenu: '',
@@ -154,7 +161,8 @@
        permAction: {},
        permFuncField: [],
        sysRoles: [],
        permMenus: {}
        permMenus: {},
        customMenu: null
      }
    default:
      return state
src/tabviews/commontable/index.jsx
@@ -597,7 +597,12 @@
        if (_data) {
          statFields.forEach(item => {
            if (_data[item.field] || _data[item.field] === 0) {
              values.push({label: item.label, value: _data[item.field]})
              let val = +_data[item.field]
              if (isNaN(val)) {
                val = 0
              }
              val = val.toFixed(item.decimal)
              values.push({label: item.label, value: val})
            }
          })
        }
src/tabviews/custom/components/chart/antv-bar-line/index.jsx
@@ -43,7 +43,8 @@
    chartData: [],             // 图表数据
    chartFields: [],           // 统计图表生成字段集
    selectFields: [],          // 统计图表选择字段
    percentFields: []          // 设置为百分比的字段,tooltip时增加%
    percentFields: [],         // 设置为百分比的字段,tooltip时增加%
    showHeader: false          // 存在标题、搜索、或统计数据时显示
  }
  UNSAFE_componentWillMount () {
@@ -100,6 +101,11 @@
      })
    }
    let showHeader = false
    if (config.setting.title || _config.plot.datatype === 'statistics') {
      showHeader = true
    }
    this.setState({
      config: _config,
      data: _data,
@@ -110,7 +116,8 @@
      plot: _config.plot,
      sync: _sync,
      title: config.setting.title,
      search: Utils.initMainSearch(config.search)
      search: Utils.initMainSearch(config.search),
      showHeader
    }, () => {
      if (config.setting.sync !== 'true') {
        this.loadData()
@@ -200,11 +207,10 @@
    let result = await Api.genericInterface(param)
    if (result.status) {
      this.setState({
        data: result.data.map((item, index) => {
          item.key = index
          return item
        }),
        data: result.data,
        loading: false
      }, () => {
        this.handleData()
      })
    } else {
      this.setState({
@@ -1017,29 +1023,31 @@
  render() {
    const { BID } = this.props
    const { config, loading, title, plot, empty, chartFields, selectFields } = this.state
    const { showHeader, config, loading, title, plot, empty, chartFields, selectFields } = this.state
    return (
      <div className="custom-line-chart-plot-box">
        {/* <searchLine /> */}
        {title ? <p className="chart-title">{title}</p> : null}
        {loading ?
          <div className="loading-mask">
            <div className="ant-spin-blur"></div>
            <Spin />
          </div> : null
        }
        {plot.datatype === 'statistics' && chartFields.length > 0 ? <Select
          mode="multiple"
          showSearch
          showArrow={true}
          value={selectFields}
          onChange={this.handleChange}
          maxTagCount={0}
          maxTagPlaceholder={(option) => <div className="type-label">{option.join('、')}</div>}
        >
          {chartFields.map((item, i) => <Select.Option key={i} value={item}>{item}</Select.Option>)}
        </Select> : null}
        {showHeader ? <div className="chart-header">
          <span className="chart-title">{title}</span>
          {/* <searchLine /> */}
          {plot.datatype === 'statistics' && chartFields.length > 0 ? <Select
            mode="multiple"
            showSearch
            showArrow={true}
            value={selectFields}
            onChange={this.handleChange}
            maxTagCount={0}
            maxTagPlaceholder={(option) => <div className="type-label">{option.join('、')}</div>}
          >
            {chartFields.map((item, i) => <Select.Option key={i} value={item}>{item}</Select.Option>)}
          </Select> : null}
        </div> : null}
        <div className="canvas-wrap">
          <div className={'chart-action ' + (plot.title ? 'with-title' : '')}>
            {config.action.map(item => {
src/tabviews/custom/components/chart/antv-bar-line/index.scss
@@ -1,10 +1,22 @@
.custom-line-chart-plot-box {
  margin-bottom: 30px;
  > .chart-header {
    height: 45px;
    border-bottom: 1px solid #e8e8e8;
    overflow: hidden;
    .chart-title {
      font-size: 16px;
      float: left;
      line-height: 45px;
      margin-left: 10px;
    }
  }
  
  .canvas-wrap {
    margin: 0 0px;
    position: relative;
    border-top: 1px solid transparent;
    .chart-action {
      position: absolute;
      top: 2px;
@@ -18,7 +30,7 @@
  .canvas {
    margin: 0;
    border: 1px solid #e8e8e8;
    // border: 1px solid #e8e8e8;
    padding: 25px 15px;
  }
  .canvas.empty {
src/tabviews/custom/components/share/tabtransfer/index.jsx
New file
@@ -0,0 +1,59 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
// import { fromJS } from 'immutable'
import { Row, Col, Empty } from 'antd'
import asyncSpinComponent from '@/utils/asyncSpinComponent'
import './index.scss'
// 通用组件
const AntvBarAndLine = asyncSpinComponent(() => import('@/tabviews/custom/components/chart/antv-bar-line'))
const AntvTabs = asyncSpinComponent(() => import('@/tabviews/custom/components/tabs/antv-tabs'))
class MainSearch extends Component {
  static propTpyes = {
    BID: PropTypes.any,              // 父级Id
    config: PropTypes.object,        // 组件配置信息
    mainSearch: PropTypes.any,       // 全局搜索条件
    menuType: PropTypes.any,         // 菜单类型
    dataManager: PropTypes.any,      // 数据权限
  }
  state = {}
  UNSAFE_componentWillMount () {
  }
  getComponents = () => {
    const { menuType, dataManager, BID, mainSearch, config } = this.props
    if (!config || !config.components || config.components.length === 0) return (<Empty description={false} />)
    return config.components.map(item => {
      if (item.type === 'bar' || item.type === 'line') {
        return (
          <Col span={item.setting.span} key={item.uuid}>
            <AntvBarAndLine config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
          </Col>
        )
      } else if (item.type === 'tabs') {
        return (
          <Col span={item.setting.span} key={item.uuid}>
            <AntvTabs config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
          </Col>
        )
      } else {
        return null
      }
    })
  }
  render() {
    return (
      <Row gutter={8}>{this.getComponents()}</Row>
    )
  }
}
export default MainSearch
src/tabviews/custom/components/share/tabtransfer/index.scss
New file
@@ -0,0 +1,41 @@
.ant-advanced-search-form.top-search {
  padding: 0px 24px 10px;
  border-bottom: 1px solid #efefef;
  .ant-form-item {
    display: flex;
    margin-bottom: 0px;
    min-height: 60px;
    .ant-form-explain {
      white-space: nowrap;
    }
  }
  .ant-form-item-control-wrapper {
    flex: 1;
    width: calc(100% - 100px);
  }
  .ant-form-item-label {
    // width: 100px;
    text-overflow: ellipsis;
  }
  .daterange .ant-calendar-picker-input {
    padding: 4px 20px 4px 5px;
    font-size: 13px;
  }
  .ant-select-dropdown {
    z-index: 10 !important;
  }
  .ant-calendar-picker-container {
    z-index: 10 !important;
  }
  .group-required {
    label::before {
      display: inline-block;
      margin-right: 4px;
      color: #f5222d;
      font-size: 14px;
      font-family: SimSun, sans-serif;
      line-height: 1;
      content: '*';
    }
  }
}
src/tabviews/custom/components/tabs/antv-tabs/index.jsx
New file
@@ -0,0 +1,70 @@
import React, {Component} from 'react'
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Tabs, Icon } from 'antd'
import asyncComponent from '@/utils/asyncComponent'
import zhCN from '@/locales/zh-CN/model.js'
import enUS from '@/locales/en-US/model.js'
import './index.scss'
const TabTransfer = asyncComponent(() => import('../../share/tabtransfer'))
const { TabPane } = Tabs
class antvBarLineChart extends Component {
  static propTpyes = {
    BID: PropTypes.any,              // 父级Id
    config: PropTypes.object,        // 组件配置信息
    mainSearch: PropTypes.any,       // 全局搜索条件
    menuType: PropTypes.any,         // 菜单类型
    dataManager: PropTypes.any,      // 数据权限
  }
  state = {
    dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
    tabs: null
  }
  UNSAFE_componentWillMount () {
    const { config } = this.props
    this.setState({
      tabs: config
    })
  }
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.state), fromJS(nextState))
  }
  componentDidMount () {}
  /**
   * @description 组件销毁,清除state更新,清除快捷键设置
   */
  componentWillUnmount () {
    this.setState = () => {
      return
    }
  }
  render() {
    const { BID, mainSearch, menuType, dataManager } = this.props
    const { tabs } = this.state
    return (
      <div className="menu-antv-tabs-wrap">
        <Tabs defaultActiveKey="1" tabPosition={tabs.setting.position} type={tabs.setting.tabStyle}>
          {tabs.subtabs.map(tab => (
            <TabPane tab={<span>{tab.icon ? <Icon type={tab.icon} /> : null}{tab.label}</span>} key={tab.uuid}>
              <TabTransfer config={tab} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager}/>
            </TabPane>
          ))}
        </Tabs>
      </div>
    )
  }
}
export default antvBarLineChart
src/tabviews/custom/components/tabs/antv-tabs/index.scss
New file
@@ -0,0 +1,4 @@
.menu-antv-tabs-wrap {
  position: relative;
  box-sizing: border-box;
}
src/tabviews/custom/index.jsx
@@ -18,6 +18,7 @@
// 通用组件
const AntvBarAndLine = asyncSpinComponent(() => import('./components/chart/antv-bar-line'))
const AntvTabs = asyncSpinComponent(() => import('./components/tabs/antv-tabs'))
class NormalTable extends Component {
  static propTpyes = {
@@ -296,6 +297,7 @@
   * @description 主表数据加载
   */ 
  loadmaindata = (params) => {
    if (!params || params.length === 0) return
    let LText_field = []
    let LText = params.map((item, index) => {
      let _sql = item.sql
@@ -442,6 +444,12 @@
            <AntvBarAndLine config={item} data={data} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
          </Col>
        )
      } else if (item.type === 'tabs') {
        return (
          <Col span={item.setting.span} key={item.uuid}>
            <AntvTabs config={item} BID={BID} mainSearch={mainSearch} menuType={menuType} dataManager={dataManager} />
          </Col>
        )
      } else {
        return null
      }
src/tabviews/home/index.scss
@@ -2,7 +2,7 @@
  position: relative;
  width: 100%;
  min-height: calc(100vh - 92px);
  // min-height: 100vh;
  height: 100%;
  background: #f0f2f5;
  padding: 24px;
  .ant-row-flex {
src/tabviews/subtable/index.jsx
@@ -511,7 +511,12 @@
        if (_data) {
          statFields.forEach(item => {
            if (_data[item.field] || _data[item.field] === 0) {
              values.push({label: item.label, value: _data[item.field]})
              let val = +_data[item.field]
              if (isNaN(val)) {
                val = 0
              }
              val = val.toFixed(item.decimal)
              values.push({label: item.label, value: val})
            }
          })
        }
src/tabviews/subtable/index.scss
@@ -57,6 +57,10 @@
  .normal-data-table {
    padding: 0px;
    .normal-table-footer.pagination {
      bottom: 10px;
    }
  }
  .box404 {
    padding-top: 30px;
src/tabviews/subtabtable/index.jsx
@@ -401,7 +401,12 @@
        if (_data) {
          statFields.forEach(item => {
            if (_data[item.field] || _data[item.field] === 0) {
              values.push({label: item.label, value: _data[item.field]})
              let val = +_data[item.field]
              if (isNaN(val)) {
                val = 0
              }
              val = val.toFixed(item.decimal)
              values.push({label: item.label, value: val})
            }
          })
        }
src/tabviews/subtabtable/index.scss
@@ -5,9 +5,6 @@
  > .top-search {
    padding: 0 0px 10px;
  }
  .normal-data-table {
    padding: 0 0 30px;
  }
  .box404 {
    padding-top: 30px;
  }
src/tabviews/zshare/normalTable/index.jsx
@@ -1000,7 +1000,7 @@
    }
    let _pagination = false
    if (setting.laypage) {
    if (setting.laypage !== 'false' && setting.laypage !== false) {
      _pagination = {
        current: this.state.pageIndex,
        pageSize: this.state.pageSize,
src/utils/utils-datamanage.js
@@ -187,7 +187,7 @@
  /**
   * @description 获取系统存储过程 sPC_Get_TableData 合计值的参数
   */
  static getStatQueryDataParams (setting, statFields, search, orderBy, pageIndex, pageSize, menuType, dataManager) {
  static getStatQueryDataParams (setting, statFields, search, orderBy, BID, menuType, dataManager) {
    let param = {
      func: 'sPC_Get_TableData',
      obj_name: 'data',
@@ -243,7 +243,7 @@
      })
    }
    let LText = ` select ${statFields.map(col => `sum(${col.field}) as ${col.field}`).join(',')} from ${_dataresource} ${_search} `
    let LText = ` select ${statFields.map(col => `isnull(sum(${col.field}),0) as ${col.field}`).join(',')} from ${_dataresource} ${_search} `
    if (_customScript) {
      LText = `${LText}
@@ -269,6 +269,10 @@
      param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
    }
    if (BID) {
      param.BID = BID
    }
    // 数据管理权限
    if (dataManager) {
      param.dataM = 'Y'
src/views/menudesign/index.jsx
@@ -13,6 +13,7 @@
import antdEnUS from 'antd/es/locale/en_US'
import antdZhCN from 'antd/es/locale/zh_CN'
import asyncComponent from '@/utils/asyncComponent'
import { modifyCustomMenu } from '@/store/action'
import './index.scss'
@@ -250,17 +251,19 @@
          _permFuncField = _permFuncField.sort()
        }
        this.setState({
          config: {...this.state.config, sysRoles: _sysRoles, permFuncField: _permFuncField}
        })
        let config = {...this.state.config, sysRoles: _sysRoles, permFuncField: _permFuncField}
        this.setState({config})
        this.props.modifyCustomMenu(config)
      }
    })
  }
  initMenuList = (msg) => {
    this.setState({
      config: {...this.state.config, ...msg}
    })
    let config = {...this.state.config, ...msg}
    this.setState({config})
    this.props.modifyCustomMenu(config)
  }
  editCard = (element) => {
@@ -322,6 +325,8 @@
    this.setState({
      config: config
    })
    this.props.modifyCustomMenu(config)
  }
  /**
@@ -333,12 +338,12 @@
    config.tableFields = fields ? fields : tableFields
    this.setState({
      config: config,
      tableFields: fields ? fields : tableFields
      tableFields: fields ? fields : tableFields,
      config
    })
  }
    this.props.modifyCustomMenu(config)
  }
  render () {
    const { activeKey, dict, MenuId, config } = this.state
@@ -403,8 +408,10 @@
  return {}
}
const mapDispatchToProps = () => {
  return {}
const mapDispatchToProps = (dispatch) => {
  return {
    modifyCustomMenu: (customMenu) => dispatch(modifyCustomMenu(customMenu))
  }
}
export default connect(mapStateToProps, mapDispatchToProps)(MenuDesign)