From 3a9effd36f8684aa9705c7ed98ea9ddbc4e17ea3 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期一, 01 四月 2024 17:03:30 +0800
Subject: [PATCH] 2024-04-01

---
 src/tabviews/zshare/actionList/tabbutton/index.jsx             |  127 ++++++++++++++++++++
 src/menu/components/share/actioncomponent/actionform/index.jsx |   44 ++++++-
 src/components/normalform/modalform/mkTable/index.jsx          |    4 
 src/menu/components/share/actioncomponent/formconfig.jsx       |  122 ++++++++++++++++++++
 src/tabviews/zshare/actionList/tabbutton/index.scss            |   14 ++
 5 files changed, 296 insertions(+), 15 deletions(-)

diff --git a/src/components/normalform/modalform/mkTable/index.jsx b/src/components/normalform/modalform/mkTable/index.jsx
index 341e32a..0ae8cfa 100644
--- a/src/components/normalform/modalform/mkTable/index.jsx
+++ b/src/components/normalform/modalform/mkTable/index.jsx
@@ -352,6 +352,10 @@
         if (_options.length) {
           col.extends.forEach(n => {
             record[n.value] = _options.map(o => o[n.key]).join(' / ')
+
+            if (n.mutilLabel && !record[n.mutilLabel]) {
+              record[n.mutilLabel] = _options[_options.length - 1][n.key]
+            }
           })
         }
       } else {
diff --git a/src/menu/components/share/actioncomponent/actionform/index.jsx b/src/menu/components/share/actioncomponent/actionform/index.jsx
index f7259e5..a88a6f8 100644
--- a/src/menu/components/share/actioncomponent/actionform/index.jsx
+++ b/src/menu/components/share/actioncomponent/actionform/index.jsx
@@ -409,6 +409,16 @@
     } else if (openType === 'tab') {
       reOptions.Ot = requireOptions.filter(op => ['notRequired', 'requiredSgl', 'requiredOnce'].includes(op.value))
 
+      if (Ot === 'notRequired') {
+        shows.push('sysId')
+      }
+
+      if (shows.includes('linkmenu') && this.record.linkmenu[0] === 'multiMenu') {
+        shows.push('multiMenus')
+      } else if (this.record.sysId === 'js') {
+        shows.push('sign')
+      }
+
       reRequired.linkmenu = true
       reTooltip.linkmenu = ''
     } else if (openType === 'innerpage') {
@@ -1114,14 +1124,32 @@
         
               let id = values.linkmenu[values.linkmenu.length - 1]
         
-              list.forEach(item => {
-                if (item.MenuID === id) {
-                  values.MenuID = id
-                  values.MenuName = item.MenuName
-                  values.MenuNo = item.MenuNo
-                  values.tabType = item.type
-                }
-              })
+              if (id !== 'multiMenu') {
+                list.forEach(item => {
+                  if (item.MenuID === id) {
+                    values.MenuID = id
+                    values.MenuName = item.MenuName
+                    values.MenuNo = item.MenuNo
+                    values.tabType = item.type
+                  }
+                })
+                delete values.multiMenus
+              } else {
+                values.multiMenus.forEach(menu => {
+                  menu.sign = menu.sign || ''
+
+                  let _id = menu.menuId[menu.menuId.length - 1]
+
+                  list.forEach(item => {
+                    if (item.MenuID === _id) {
+                      menu.MenuID = _id
+                      menu.MenuName = item.MenuName
+                      menu.MenuNo = item.MenuNo
+                      menu.tabType = item.type
+                    }
+                  })
+                })
+              }
             }
           } else if (values.OpenType === 'funcbutton' && values.funcType === 'expPdf') {
             values.Ot = 'notRequired'
diff --git a/src/menu/components/share/actioncomponent/formconfig.jsx b/src/menu/components/share/actioncomponent/formconfig.jsx
index 0ac75b8..e37705d 100644
--- a/src/menu/components/share/actioncomponent/formconfig.jsx
+++ b/src/menu/components/share/actioncomponent/formconfig.jsx
@@ -499,7 +499,7 @@
       initVal: card.linkmenu || (isApp ? '' : []),
       required: true,
       extendName: 'MenuNo',
-      options: isApp ? appMenus : menulist
+      options: isApp ? appMenus : (menulist.length ? [...menulist, {value: 'multiMenu', label: '澶氳彍鍗�'}] : [])
     },
     {
       type: 'text',
@@ -1510,6 +1510,65 @@
     },
     {
       type: 'radio',
+      key: 'sysId',
+      label: '鑷畾涔塈D',
+      initVal: card.sysId || '',
+      tooltip: '涓嶉�夎鎸夐挳鍙湪鍓嶇鐢熸垚ID鍊�(32浣�)锛屼綔涓哄悗缁彍鍗曠殑BID锛屽瓨鍦ㄦ爣璁版椂锛孖D鍊煎悗灏嗘嫾鎺ユ爣璁板�笺��',
+      required: false,
+      options: [{
+        value: '',
+        text: '绌�'
+      }, {
+        value: 'js',
+        text: '鍓嶇鐢熸垚'
+      }]
+    },
+    {
+      type: 'text',
+      key: 'sign',
+      label: '鏍囪',
+      initVal: card.sign || '',
+      required: false
+    },
+    {
+      type: 'table',
+      key: 'multiMenus',
+      label: '鑿滃崟鍒楄〃',
+      initVal: card.multiMenus || [],
+      required: true,
+      actions: ['edit', 'del', 'add', 'move'],
+      columns: [
+        {
+          title: '鍚嶇О',
+          dataIndex: 'name',
+          inputType: 'text',
+          editable: true,
+          required: false,
+          width: '30%'
+        },
+        {
+          title: '鑿滃崟',
+          dataIndex: 'menuId',
+          inputType: 'cascader',
+          editable: true,
+          required: true,
+          extends: [{key: 'label', value: 'label', mutilLabel: 'name'}],
+          width: '30%',
+          render: (text, record) => record.label,
+          options: menulist
+        },
+        {
+          title: '鏍囪',
+          dataIndex: 'sign',
+          inputType: 'text',
+          editable: true,
+          required: false,
+          width: '20%'
+        }
+      ]
+    },
+    {
+      type: 'radio',
       key: 'preHandle',
       label: '鑷畾涔夎剼鏈�',
       initVal: card.preHandle || 'false',
@@ -1793,7 +1852,7 @@
       initVal: card.linkmenu || [],
       required: true,
       extendName: 'MenuNo',
-      options: menulist
+      options: menulist.length ? [...menulist, {value: 'multiMenu', label: '澶氳彍鍗�'}] : []
     },
     {
       type: 'textarea',
@@ -2539,6 +2598,65 @@
     },
     {
       type: 'radio',
+      key: 'sysId',
+      label: '鑷畾涔塈D',
+      initVal: card.sysId || '',
+      tooltip: '涓嶉�夎鎸夐挳鍙湪鍓嶇鐢熸垚ID鍊�(32浣�)锛屼綔涓哄悗缁彍鍗曠殑BID锛屽瓨鍦ㄦ爣璁版椂锛孖D鍊煎悗灏嗘嫾鎺ユ爣璁板�笺��',
+      required: false,
+      options: [{
+        value: '',
+        text: '绌�'
+      }, {
+        value: 'js',
+        text: '鍓嶇鐢熸垚'
+      }]
+    },
+    {
+      type: 'text',
+      key: 'sign',
+      label: '鏍囪',
+      initVal: card.sign || '',
+      required: false
+    },
+    {
+      type: 'table',
+      key: 'multiMenus',
+      label: '鑿滃崟鍒楄〃',
+      initVal: card.multiMenus || [],
+      required: true,
+      actions: ['edit', 'del', 'add', 'move'],
+      columns: [
+        {
+          title: '鍚嶇О',
+          dataIndex: 'name',
+          inputType: 'text',
+          editable: true,
+          required: false,
+          width: '30%'
+        },
+        {
+          title: '鑿滃崟',
+          dataIndex: 'menuId',
+          inputType: 'cascader',
+          editable: true,
+          required: true,
+          extends: [{key: 'label', value: 'label', mutilLabel: 'name'}],
+          width: '30%',
+          render: (text, record) => record.label,
+          options: menulist
+        },
+        {
+          title: '鏍囪',
+          dataIndex: 'sign',
+          inputType: 'text',
+          editable: true,
+          required: false,
+          width: '20%'
+        }
+      ]
+    },
+    {
+      type: 'radio',
       key: 'preHandle',
       label: '鑷畾涔夎剼鏈�',
       initVal: card.preHandle || 'false',
diff --git a/src/tabviews/zshare/actionList/tabbutton/index.jsx b/src/tabviews/zshare/actionList/tabbutton/index.jsx
index 87402ee..461c1aa 100644
--- a/src/tabviews/zshare/actionList/tabbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/tabbutton/index.jsx
@@ -1,11 +1,12 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Button, notification } from 'antd'
+import { Button, notification, Dropdown } from 'antd'
 
 import MKEmitter from '@/utils/events.js'
 import MkIcon from '@/components/mk-icon'
-// import './index.scss'
+
+import './index.scss'
 
 class TabButton extends Component {
   static propTpyes = {
@@ -103,7 +104,7 @@
     const { btn, selectedData, BID } = this.props
     const { disabled } = this.state
 
-    if (disabled) return
+    if (disabled || btn.multiMenus) return
     if (triggerId && btn.uuid !== triggerId) return
 
     if (type === 'linkbtn' && !btn.$toolbtn && !is(fromJS(selectedData || []), fromJS(record))) {
@@ -138,8 +139,22 @@
       let ids = data.map(d => (d.$$uuid || ''))
       ids = ids.filter(Boolean)
       primaryId = ids.join(',')
-    } else if (btn.Ot === 'notRequired' && BID) {
-      primaryId = BID
+    } else if (btn.Ot === 'notRequired') {
+      if (btn.sysId === 'js') {
+        primaryId = (() => {
+          let uuid = []
+          let timestamp = new Date().getTime()
+          let _options = '0123456789abcdefghigklmnopqrstuv'
+          for (let i = 0; i < 19; i++) {
+            uuid.push(_options.substr(Math.floor(Math.random() * 0x20), 1))
+          }
+          uuid = timestamp + uuid.join('')
+          return uuid
+        })()
+        primaryId = primaryId + (btn.sign || '')
+      } else {
+        primaryId = BID || ''
+      }
     }
 
     let newtab = {}
@@ -197,6 +212,92 @@
     }
   }
 
+  triggerMenu = (tab) => {
+    const { btn, selectedData, BID } = this.props
+
+    let data = selectedData || []
+
+    if (btn.Ot !== 'notRequired' && data.length === 0) {
+      // 闇�瑕侀�夋嫨琛屾椂锛屾牎楠屾暟鎹�
+      notification.warning({
+        top: 92,
+        message: '璇烽�夋嫨琛岋紒',
+        duration: 5
+      })
+      return false
+    } else if (btn.Ot === 'requiredSgl' && data.length !== 1) {
+      // 闇�瑕侀�夋嫨鍗曡鏃讹紝鏍¢獙鏁版嵁
+      notification.warning({
+        top: 92,
+        message: '璇烽�夋嫨鍗曡鏁版嵁锛�',
+        duration: 5
+      })
+      return
+    }
+
+    let primaryId = ''
+
+    if (btn.Ot === 'requiredSgl') {
+      primaryId = data[0].$$uuid || ''
+    } else if (btn.Ot === 'requiredOnce') {
+      let ids = data.map(d => (d.$$uuid || ''))
+      ids = ids.filter(Boolean)
+      primaryId = ids.join(',')
+    } else if (btn.Ot === 'notRequired') {
+      if (btn.sysId === 'js') {
+        primaryId = (() => {
+          let uuid = []
+          let timestamp = new Date().getTime()
+          let _options = '0123456789abcdefghigklmnopqrstuv'
+          for (let i = 0; i < 19; i++) {
+            uuid.push(_options.substr(Math.floor(Math.random() * 0x20), 1))
+          }
+          uuid = timestamp + uuid.join('')
+          return uuid
+        })()
+        primaryId = primaryId + (tab.sign || '')
+      } else {
+        primaryId = BID || ''
+      }
+    }
+
+    let menuId = tab.menuId.slice(-1)[0]
+    let menu = null
+
+    if (window.GLOB.mkThdMenus.has(menuId)) {
+      menu = {...window.GLOB.mkThdMenus.get(menuId), param: { $BID: primaryId }}
+    } else if (tab.MenuID) {
+      menu = {
+        MenuID: tab.MenuID,
+        MenuName: tab.MenuName,
+        type: tab.tabType,
+        param: { $BID: primaryId }
+      }
+    }
+
+    if (!menu) {
+      notification.warning({
+        top: 92,
+        message: '鑿滃崟宸插垹闄ゆ垨娌℃湁璁块棶鏉冮檺锛�',
+        duration: 5
+      })
+      return
+    }
+
+
+    if (btn.openTab === 'view') {
+      window.open('#/view/' + menu.MenuID + '/' + primaryId)
+    } else {
+      MKEmitter.emit('modifyTabs', menu, true)
+  
+      MKEmitter.emit('openNewTab')
+    }
+
+    if (window.GLOB.systemType === 'production') {
+      MKEmitter.emit('queryTrigger', {menuId: btn.uuid, name: '鏍囩椤�'})
+    }
+  }
+
   render() {
     const { btn, name } = this.props
     const { disabled, hidden } = this.state
@@ -213,6 +314,22 @@
       label = <span>{btn.icon ? <MkIcon style={{marginRight: '8px'}} type={btn.icon} /> : ''}{name || btn.label}</span>
     }
 
+    if (btn.multiMenus && !disabled) {
+      return (<Dropdown
+        overlay={<div className="mk-tab-dropdown-wrap">{
+          btn.multiMenus.map(tab => <div key={tab.uuid} onClick={() => this.triggerMenu(tab)}>{tab.name}</div>)
+        }</div>}
+        trigger={['hover']}
+      >
+        <Button
+          type="link"
+          title={btn.show === 'icon' ? btn.label : ''}
+          style={btn.style || null}
+          className={btn.$toolbtn ? (btn.hover || '') : ''}
+        >{label}</Button>
+      </Dropdown>)
+    }
+
     return (
       <Button
         type="link"
diff --git a/src/tabviews/zshare/actionList/tabbutton/index.scss b/src/tabviews/zshare/actionList/tabbutton/index.scss
index 8b13789..cb1f053 100644
--- a/src/tabviews/zshare/actionList/tabbutton/index.scss
+++ b/src/tabviews/zshare/actionList/tabbutton/index.scss
@@ -1 +1,15 @@
+.mk-tab-dropdown-wrap {
+  box-shadow: 0 0 2px #bcbcbc;
+  background: #ffffff;
+  min-width: 85px;
+  border-radius: 2px;
 
+  div {
+    height: 32px;
+    line-height: 32px;
+    padding: 0 15px;
+    color: rgba(0, 0, 0, 0.65);
+    background: #ffffff;
+    cursor: pointer;
+  }
+}
\ No newline at end of file

--
Gitblit v1.8.0