From 3b103caa6bfc9ed410e67156c3ca1785bf1cecc9 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 19 八月 2022 01:15:31 +0800
Subject: [PATCH] 2022-08-19

---
 src/templates/sharecomponent/searchcomponent/index.jsx |  237 ++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 177 insertions(+), 60 deletions(-)

diff --git a/src/templates/sharecomponent/searchcomponent/index.jsx b/src/templates/sharecomponent/searchcomponent/index.jsx
index c0cdff2..2f848fc 100644
--- a/src/templates/sharecomponent/searchcomponent/index.jsx
+++ b/src/templates/sharecomponent/searchcomponent/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Icon, Tooltip, Modal, notification } from 'antd'
+import { Modal, notification, Switch } from 'antd'
 import moment from 'moment'
 
 import Api from '@/api'
@@ -9,30 +9,31 @@
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
 import { getSearchForm } from '@/templates/zshare/formconfig'
-
-import SearchForm from './searchform'
+import asyncComponent from '@/utils/asyncComponent'
+import MKEmitter from '@/utils/events.js'
 import DragElement from './dragsearch'
+import SearchForm from './searchform'
+import SettingForm from './settingform'
 import './index.scss'
 
 const { confirm } = Modal
 
-// **鎮茶鑰呭線寰�姝g‘锛屼箰瑙傝�呭線寰�鎴愬姛
+const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent'))
+
 class SearchComponent extends Component {
   static propTpyes = {
-    menu: PropTypes.object,          // 褰撳墠鑿滃崟淇℃伅
     config: PropTypes.object,        // 閰嶇疆淇℃伅
-    pasteContent: PropTypes.object,  // 绮樿创閰嶇疆淇℃伅
-    optionLibs: PropTypes.any,       // 涓嬫媺瀛楀吀
-    sysRoles: PropTypes.array,       // 瑙掕壊鍒楄〃锛岄粦鍚嶅崟
     updatesearch: PropTypes.func     // 鏇存柊
   }
 
   state = {
-    dict: (!localStorage.getItem('lang') || localStorage.getItem('lang') === 'zh-CN') ? zhCN : enUS,
-    searchlist: null,    // 鎼滅储鏉′欢闆�
-    sqlVerifing: false,  // sql楠岃瘉涓�
-    visible: false,      // 妯℃�佹鎺у埗
-    card: null           // 缂栬緫涓厓绱�
+    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
+    searchlist: null,
+    sqlVerifing: false,
+    visible: false,
+    showField: false,
+    setVisible: false,
+    card: null
   }
 
   /**
@@ -44,17 +45,36 @@
     })
   }
 
-  /**
-   * @description 鐩戝惉鍒版悳绱㈡潯浠跺鍒舵椂锛岃Е鍙戞悳绱㈡潯浠剁紪杈�
-   */
-  UNSAFE_componentWillReceiveProps (nextProps) {
+  componentDidMount () {
+    MKEmitter.addListener('plusSearch', this.plusSearch)
+    MKEmitter.addListener('revert', this.revert)
+  }
+
+  revert = () => {
+    this.setState({searchlist: fromJS(this.props.config.search).toJS()})
+  }
+
+  plusSearch = (MenuId, item, type) => {
+    const { config } = this.props
     const { searchlist } = this.state
 
-    if (nextProps.pasteContent && nextProps.pasteContent.copyType === 'search') {
-      this.setState({searchlist: [...searchlist, nextProps.pasteContent]})
-      this.handleSearch(nextProps.pasteContent)
-    } else if (!is(fromJS(nextProps.config.search), fromJS(this.props.config.search)) && !is(fromJS(nextProps.config.search), fromJS(searchlist))) {
-      this.setState({searchlist: nextProps.config.search})
+    if (MenuId !== config.uuid) return
+
+    if (type === 'simple') {
+      this.setState({
+        searchlist: [...searchlist, item],
+      }, () => {
+        this.handleSearch(item)
+      })
+    } else if (type === 'multil') {
+      let list = [...searchlist, ...item]
+      list = list.filter(item => !item.origin) // 鍘婚櫎绯荤粺椤�
+      
+      this.setState({
+        searchlist: list
+      }, () => {
+        this.props.updatesearch({...config, search: list})
+      })
     }
   }
 
@@ -68,8 +88,9 @@
       this.setState({searchlist: list})
       this.handleSearch(card)
     } else {
-      this.setState({searchlist: list})
-      this.props.updatesearch({...config, search: list})
+      this.setState({searchlist: list}, ()=> {  
+        this.props.updatesearch({...config, search: list})
+      })
     }
   }
 
@@ -77,10 +98,31 @@
    * @description 鎼滅储鏉′欢缂栬緫锛岃幏鍙栨悳绱㈡潯浠惰〃鍗曚俊鎭�
    */
   handleSearch = (card) => {
+    const { searchlist } = this.state
+    let linkableFields = []
+
+    searchlist.forEach(item => {
+      if (item.uuid === card.uuid) return
+      if (!['select', 'link', 'checkcard'].includes(item.type)) return
+      if (item.type === 'checkcard' && item.multiple === 'true') return
+      
+      linkableFields.push({
+        value: item.field,
+        text: item.label
+      })
+    })
+
+    let columns = null
+    if (this.props.config.type === 'table') {
+      columns = this.props.config.columns.map(item => {
+        return {key: item.uuid, text: item.field, value: item.field, label: item.label}
+      })
+    }
+
     this.setState({
       visible: true,
       card: card,
-      formlist: getSearchForm(card, this.props.sysRoles)
+      formlist: getSearchForm(card, linkableFields, columns)
     })
   }
 
@@ -88,18 +130,18 @@
    * @description 鍙栨秷淇濆瓨锛屽鏋滃厓绱犱负鏂版坊鍏冪礌锛屽垯浠庡簭鍒椾腑鍒犻櫎
    */
   editModalCancel = () => {
-    const { card } = this.state
+    const { config } = this.props
+    const { card, searchlist } = this.state
 
     if (card.focus) {
-      let searchlist = fromJS(this.state.searchlist).toJS()
-
-      searchlist = searchlist.filter(item => item.uuid !== card.uuid)
+      let _searchlist = searchlist.filter(item => item.uuid !== card.uuid)
 
       this.setState({
         card: null,
-        searchlist: searchlist,
+        searchlist: _searchlist,
         visible: false
       })
+      this.props.updatesearch({...config, search: _searchlist})
     } else {
       this.setState({
         card: null,
@@ -116,7 +158,7 @@
    * 4銆佷笅鎷夎彍鍗曟暟鎹簮璇硶楠岃瘉
    */
   handleSubmit = () => {
-    const { optionLibs, menu, config } = this.props
+    const { config } = this.props
     let _searchlist = fromJS(this.state.searchlist).toJS()
 
     this.searchFormRef.handleConfirm().then(res => {
@@ -127,7 +169,27 @@
 
       _searchlist = _searchlist.map(item => { // 鏁版嵁鏇存柊鍙婇噸澶嶆娴�
         if (item.uuid !== res.uuid && res.field && item.field) {
-          if (item.field === res.field) {
+          let itemFields = []
+          if (item.type === 'text') {
+            itemFields = item.field.split(',')
+          } else if (item.type === 'group') {
+            itemFields = [item.field, item.datefield]
+          } else {
+            itemFields = [item.field]
+          }
+
+          let resFields = []
+          if (res.type === 'text') {
+            resFields = res.field.split(',')
+          } else if (res.type === 'group') {
+            resFields = [res.field, res.datefield]
+          } else {
+            resFields = [res.field]
+          }
+
+          let setFields = Array.from(new Set([...itemFields, ...resFields]))
+
+          if (setFields.length < itemFields.length + resFields.length && (res.type !== 'date' || item.type !== 'date')) {
             fieldrepet = true
           } else if (item.label === res.label) {
             labelrepet = true
@@ -144,41 +206,35 @@
       if (fieldrepet) {
         notification.warning({
           top: 92,
-          message: this.state.dict['model.field.exist'] + ' !',
+          message: '瀛楁宸插瓨鍦�!',
           duration: 5
         })
         return
       } else if (labelrepet) {
         notification.warning({
           top: 92,
-          message: this.state.dict['model.name.exist'] + ' !',
+          message: '鍚嶇О宸插瓨鍦�!',
           duration: 5
         })
         return
       }
 
-      if ( res.options && res.options.length > 0 ) { // 涓嬫媺鑿滃崟鍙�夐泦鍚�
-        optionLibs.set(menu.MenuID + res.uuid, {
-          uuid: menu.MenuID + res.uuid,
-          label: res.label,
-          parname: menu.MenuName,
-          type: 'search',
-          options: res.options
-        })
-      }
-
-      if ((res.type === 'select' || res.type === 'multiselect' || res.type === 'link') && res.resourceType === '1' && /\s/.test(res.dataSource)) {
+      if (['checkcard', 'select', 'multiselect', 'link'].includes(res.type) && res.resourceType === '1' && /\s/.test(res.dataSource)) {
         this.setState({
           sqlVerifing: true
         })
 
         let param = {
           func: 's_debug_sql',
+          exec_type: 'y',
           LText: res.dataSource
         }
+
+        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+        param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/@(BID|ID|LoginUID|SessionUid|UserID|Appkey|time_id)@/ig, `'${param.timestamp}'`)
+        
         param.LText = Utils.formatOptions(param.LText)
-        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
-        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
+        param.secretkey = Utils.encrypt('', param.timestamp)
 
         if (window.GLOB.mainSystemApi && res.database === 'sso') {
           param.rduri = window.GLOB.mainSystemApi
@@ -190,8 +246,9 @@
               sqlVerifing: false,
               searchlist: _searchlist,
               visible: false
+            }, ()=> {
+              this.props.updatesearch({...config, search: _searchlist})
             })
-            this.props.updatesearch({...config, search: _searchlist}, optionLibs)
           } else {
             this.setState({sqlVerifing: false})
             
@@ -204,8 +261,9 @@
         this.setState({
           searchlist: _searchlist,
           visible: false
+        }, ()=> { 
+          this.props.updatesearch({...config, search: _searchlist})
         })
-        this.props.updatesearch({...config, search: _searchlist}, optionLibs)
       }
     })
   }
@@ -220,8 +278,6 @@
 
     confirm({
       content: dict['model.confirm'] + dict['model.delete'] + ` - ${card.label} 锛焋,
-      okText: dict['model.confirm'],
-      cancelText: this.state.dict['header.cancel'],
       onOk() {
         let _searchlist = fromJS(_this.state.searchlist).toJS()
 
@@ -237,6 +293,40 @@
     })
   }
 
+  onFieldChange = () => {
+    const { showField } = this.state
+
+    this.setState({
+      showField: !showField
+    })
+  }
+
+  handleSetting = () => {
+    this.setState({
+      setVisible: true
+    })
+  }
+
+  settingSubmit = () => {
+    const { config } = this.props
+
+    this.settingFormRef.handleConfirm().then(res => {
+      this.setState({
+        setVisible: false
+      })
+
+      let _config = null
+
+      if (config.wrap) { // 鑷畾涔夐〉闈able
+        _config = {...config, wrap: {...config.wrap, ...res}}
+      } else {
+        _config = {...config, setting: {...config.setting, ...res}}
+      }
+
+      this.props.updatesearch(_config)
+    })
+  }
+
   /**
    * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
    */
@@ -244,28 +334,41 @@
     this.setState = () => {
       return
     }
+    MKEmitter.removeListener('revert', this.revert)
+    MKEmitter.removeListener('plusSearch', this.plusSearch)
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    if (!is(fromJS(this.state), fromJS(nextState))) {
+      return true
+    } else if (this.props.config.wrap) {
+      return !is(fromJS(nextProps.config.wrap), fromJS(this.props.config.wrap))
+    } else {
+      return !is(fromJS(nextProps.config.setting), fromJS(this.props.config.setting))
+    }
   }
 
   render() {
-    const { dict, searchlist, visible, sqlVerifing, card } = this.state
+    const { config } = this.props
+    const { dict, searchlist, visible, sqlVerifing, card, showField, setVisible } = this.state
 
     return (
-      <div className="model-table-search-list">
-        <Tooltip placement="bottomLeft" overlayClassName="middle" title={dict['model.tooltip.search.guide']}>
-          <Icon type="question-circle" />
-        </Tooltip>
+      <div className={'model-table-search-list length' + searchlist.length + (showField ? ' show-field' : '')}>
+        <FieldsComponent config={{uuid: config.uuid, search: searchlist}} type="search" />
+        <Switch className="switch-field-show" checkedChildren={dict['model.switch.open']} unCheckedChildren={dict['model.switch.close']} defaultChecked={showField} onChange={this.onFieldChange} />
         <DragElement
           list={searchlist}
+          setting={config.wrap || config.setting}
           handleList={this.handleList}
           handleMenu={this.handleSearch}
           deleteMenu={this.deleteElement}
-          placeholder={dict['header.form.search.placeholder']}
+          handleSetting={this.handleSetting}
         />
         {/* 缂栬緫鎼滅储鏉′欢 */}
         <Modal
-          title={dict['model.searchCriteria'] + '-' + (card && card.copyType === 'search' ?  dict['model.copy'] : dict['model.edit'])}
+          title={card && card.copyType === 'search' ?  '鎼滅储鏉′欢-澶嶅埗' : '鎼滅储鏉′欢-缂栬緫'}
           visible={visible}
-          width={750}
+          width={850}
           maskClosable={false}
           onOk={this.handleSubmit}
           confirmLoading={sqlVerifing}
@@ -277,10 +380,24 @@
             card={this.state.card}
             formlist={this.state.formlist}
             inputSubmit={this.handleSubmit}
-            optionLibs={this.props.optionLibs}
             wrappedComponentRef={(inst) => this.searchFormRef = inst}
           />
         </Modal>
+        <Modal
+          title={'鎼滅储璁剧疆'}
+          visible={setVisible}
+          width={800}
+          maskClosable={false}
+          onOk={this.settingSubmit}
+          onCancel={() => this.setState({setVisible: false})}
+          destroyOnClose
+        >
+          <SettingForm
+            setting={config.wrap || config.setting}
+            inputSubmit={this.settingSubmit}
+            wrappedComponentRef={(inst) => this.settingFormRef = inst}
+          />
+        </Modal>
       </div>
     )
   }

--
Gitblit v1.8.0