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