king
2022-11-07 af6486b3629d23e426ce85b87dbc20dfa15b1afe
src/menu/components/tabs/table-tabs/index.jsx
@@ -2,23 +2,19 @@
import PropTypes from 'prop-types'
import { is, fromJS } from 'immutable'
import { Tabs, Popover, Modal } from 'antd'
import { PlusOutlined, CloseOutlined, EditOutlined, DeleteOutlined, FontColorsOutlined, ToolOutlined } from '@ant-design/icons'
import { PlusOutlined, CloseOutlined, EditOutlined, DeleteOutlined, ToolOutlined } from '@ant-design/icons'
import MKEmitter from '@/utils/events.js'
import asyncComponent from '@/utils/asyncComponent'
import asyncIconComponent from '@/utils/asyncIconComponent'
import MkIcon from '@/components/mk-icon'
import DraggableTabs from './dragabletabs'
import { resetStyle } from '@/utils/utils-custom.js'
import MenuUtils from '@/utils/utils-custom.js'
import Utils from '@/utils/utils.js'
import { getTabForm, getTabsSetForm } from './options'
import { getTabForm } from './options'
import './index.scss'
const NormalForm = asyncIconComponent(() => import('@/components/normalform'))
const CopyComponent = asyncIconComponent(() => import('@/menu/components/share/copycomponent'))
const PasteComponent = asyncIconComponent(() => import('../paste'))
const TabComponents = asyncComponent(() => import('../tabcomponents'))
const PasteBaseTable = asyncIconComponent(() => import('@/menu/components/share/pastebasetable'))
const BaseTable = asyncComponent(() => import('@/menu/components/table/base-table'))
const { TabPane } = Tabs
const { confirm } = Modal
@@ -33,7 +29,7 @@
  state = {
    tabs: null,
    editab: null,
    defaultActiveKey: ''
    sign: 1
  }
  UNSAFE_componentWillMount () {
@@ -43,23 +39,19 @@
      let _tabs = {
        uuid: tabs.uuid,
        type: tabs.type,
        subtype: tabs.subtype,
        width: 24,
        name: tabs.name,
        setting: {width: 24, position: 'top', tabStyle: 'line', name: tabs.name},
        style: { marginLeft: '8px', marginRight: '8px', marginTop: '8px', marginBottom: '8px' },
        subtype: 'tabletabs',
        setting: {},
        style: {},
        subtabs: [
          { uuid: Utils.getuuid(), label: 'Tab 1', icon: '', components: [] },
          { uuid: Utils.getuuid(), label: '子表1', icon: '', components: [{uuid: Utils.getuuid(), name: '子表1', type: 'table', subtype: 'basetable', isNew: true}] },
        ]
      }
      this.setState({
        defaultActiveKey: _tabs.subtabs[0].uuid,
        tabs: _tabs
      })
      this.props.updateConfig(_tabs)
    } else {
      this.setState({
        defaultActiveKey: window.GLOB.TabsMap.get(tabs.uuid) || '',
        tabs: fromJS(tabs).toJS()
      })
    }
@@ -68,8 +60,6 @@
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.state), fromJS(nextState))
  }
  componentDidMount () {}
  /**
   * @description 组件销毁,清除state更新,清除快捷键设置
@@ -80,54 +70,11 @@
    }
  }
  changeStyle = () => {
    const { tabs } = this.state
    MKEmitter.emit('changeStyle', ['background', 'border', 'padding', 'margin', 'shadow'], tabs.style, this.getStyle)
  }
  getStyle = (style) => {
    let _card = {...this.state.tabs, style}
    this.setState({
      tabs: _card
    })
    this.props.updateConfig(_card)
  }
  updateComponent = (component) => {
    component.width = component.setting.width
    component.name = component.setting.name
    this.setState({
      tabs: component
    })
    this.props.updateConfig(component)
  }
  updateTabComponent = (tab) => {
    let tabs = fromJS(this.state.tabs).toJS()
    tabs.subtabs = tabs.subtabs.map(t => {
      if (t.uuid === tab.uuid) {
        return tab
      } else {
        return t
      }
    })
    this.setState({tabs})
    this.props.updateConfig(tabs)
  }
  delTab = (tab) => {
    let tabs = fromJS(this.state.tabs).toJS()
    const _this = this
    tabs.subtabs = tabs.subtabs.filter(t => t.uuid !== tab.uuid)
    let uuids = MenuUtils.getDelButtonIds({...tab, type: 'group'})
    confirm({
      title: '确定删除标签?',
@@ -135,10 +82,6 @@
      onOk() {
        _this.setState({tabs})
        _this.props.updateConfig(tabs)
        if (uuids.length === 0) return
        MKEmitter.emit('delButtons', uuids)
      },
      onCancel() {}
    })
@@ -163,16 +106,69 @@
    this.props.updateConfig(tabs)
  }
  insert = (item, tab) => {
  dropTable = (hoverKey, dragKey) => {
    if (dragKey) {
      this.props.switchConfig(dragKey, hoverKey, () => {
        this.setState({sign: this.state.sign + 1}, () => {
          setTimeout(() => {
            let node = document.getElementById(dragKey)
            node && node.click()
          }, 200)
        })
      })
    } else {
      let tabs = fromJS(this.state.tabs).toJS()
      let name = '子表' + (tabs.subtabs.length + 1)
      let tab = { uuid: Utils.getuuid(), label: name, icon: '', components: [{uuid: Utils.getuuid(), type: 'table', name: name, subtype: 'basetable', isNew: true}]}
      const hoverIndex = tabs.subtabs.findIndex(item => item.uuid === hoverKey)
      if (hoverIndex === -1) {
        tabs.subtabs.push(tab)
      } else {
        tabs.subtabs.splice(hoverIndex + 1, 0, tab)
      }
      this.setState({tabs}, () => {
        setTimeout(() => {
          let node = document.getElementById(tab.uuid)
          node && node.click()
        }, 200)
      })
      this.props.updateConfig(tabs)
    }
  }
  plusTable = () => {
    let tabs = fromJS(this.state.tabs).toJS()
    let name = '子表' + (tabs.subtabs.length + 1)
    let tab = { uuid: Utils.getuuid(), label: name, icon: '', components: [{uuid: Utils.getuuid(), type: 'table', name: name, subtype: 'basetable', isNew: true}]}
    tabs.subtabs.push(tab)
    this.setState({tabs}, () => {
      setTimeout(() => {
        let node = document.getElementById(tab.uuid)
        node && node.click()
      }, 200)
    })
    this.props.updateConfig(tabs)
  }
  insert = (item) => {
    let tabs = fromJS(this.state.tabs).toJS()
    tabs.subtabs.forEach(stab => {
      if (stab.uuid === tab.uuid) {
        stab.components.push(item)
      }
    })
    let name = item.name || ('子表' + (tabs.subtabs.length + 1))
    let tab = { uuid: Utils.getuuid(), label: name, icon: '', components: [item]}
    this.setState({tabs})
    tabs.subtabs.push(tab)
    this.setState({tabs}, () => {
      setTimeout(() => {
        let node = document.getElementById(tab.uuid)
        node && node.click()
      }, 200)
    })
    this.props.updateConfig(tabs)
  }
@@ -202,10 +198,8 @@
    editab.label = res.label
    editab.icon = res.icon
    editab.hide = res.hide || 'false'
    editab.backgroundColor = res.backgroundColor
    editab.controlVal = res.controlVal || ''
    editab.selectVal = res.selectVal || ''
    editab.blacklist = res.blacklist
    editab.permission = res.permission || 'false'
    editab.components[0].name = res.label
    if (editab.uuid) {
      tabs.subtabs = tabs.subtabs.map(t => {
@@ -228,56 +222,42 @@
    this.props.updateConfig(tabs)
  }
  getTabsForms = () => {
    const { tabs } = this.state
  updateConfig = (tb, i) => {
    let tabs = fromJS(this.state.tabs).toJS()
    tabs.subtabs[i].components = [tb]
    return getTabsSetForm(tabs.setting, tabs.uuid)
  }
    this.setState({ tabs })
  updateTabs = (res) => {
    this.updateComponent({...this.state.tabs, setting: res})
  }
  onChange = (key) => {
    const { tabs } = this.state
    window.GLOB.TabsMap.set(tabs.uuid, key)
    this.props.updateConfig(tabs)
  }
  render() {
    const { tabs, defaultActiveKey } = this.state
    let _style = resetStyle(tabs.style)
    const { tabs } = this.state
    return (
      <div className={'menu-tabs-edit-box ' + (tabs.setting.display || '')} style={_style} id={tabs.uuid}>
        <DraggableTabs defaultActiveKey={defaultActiveKey} tabBarStyle={{background: tabs.setting.backgroundColor || 'transparent'}} tabPosition={tabs.setting.position} type={tabs.setting.tabStyle} tabsMove={this.moveSwitch} onChange={this.onChange}>
          {tabs.subtabs.map(tab => (
      <div className="table-tabs-edit-box" style={tabs.style} id={tabs.uuid}>
        <DraggableTabs tabsMove={this.moveSwitch} tabsDrop={this.dropTable}>
          {tabs.subtabs.map((tab, i) => (
            <TabPane tab={
              <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
                <div className="mk-popover-control">
                  <NormalForm title="标签编辑" width={800} update={this.updateTab} getForms={() => this.getTabForms(tab)}>
                    <EditOutlined style={{color: '#1890ff'}} title="编辑"/>
                  </NormalForm>
                  <PasteComponent Tab={tab} insert={this.insert} />
                  <CloseOutlined className="close" onClick={() => this.delTab(tab)} />
                </div>
              } trigger="hover">
                <span style={{textDecoration: tab.hide === 'true' ? 'line-through' : 'none'}}>{tab.icon ? <MkIcon type={tab.icon} /> : null}{tab.label}</span>
                <span id={tab.uuid} style={{textDecoration: tab.hide === 'true' ? 'line-through' : 'none'}}>{tab.icon ? <MkIcon type={tab.icon} /> : null}{tab.label}</span>
              </Popover>
            } key={tab.uuid} style={{backgroundColor: tab.backgroundColor || 'transparent'}}>
              <TabComponents config={tab} handleList={this.updateTabComponent} deleteCard={this.deleteCard} />
            } key={tab.uuid}>
              <BaseTable card={tab.components[0]} updateConfig={(tb) => this.updateConfig(tb, i)} />
            </TabPane>
          ))}
        </DraggableTabs>
        <Popover overlayClassName="mk-popover-control-wrap" mouseLeaveDelay={0.2} mouseEnterDelay={0.2} content={
          <div className="mk-popover-control">
            <NormalForm title="添加标签" width={800} update={this.updateTab} getForms={() => this.getTabForms()}>
              <PlusOutlined className="plus" title="添加标签"/>
            </NormalForm>
            <NormalForm title="标签页设置" width={800} update={this.updateTabs} getForms={this.getTabsForms}>
              <EditOutlined style={{color: '#1890ff'}} title="编辑"/>
            </NormalForm>
            <CopyComponent type="tabs" card={tabs}/>
            <FontColorsOutlined className="style" title="调整样式" onClick={this.changeStyle}/>
            <PlusOutlined className="plus" title="添加子表" onClick={this.plusTable}/>
            <PasteBaseTable insert={this.insert} />
            <DeleteOutlined className="close" onClick={() => this.props.deletecomponent(tabs.uuid)} />
          </div>
        } trigger="hover">