| import React, { useState, useRef, useEffect } from 'react'; | 
| import { Select, AutoComplete } from 'antd'; | 
| import { FormattedMessage, useIntl } from '@umijs/max'; | 
| import { CloseOutlined } from '@ant-design/icons'; | 
| import * as Utils from '../utils' | 
|   | 
| const renderTitle = (title, uuid) => ( | 
|     <> | 
|         <span style={{ fontWeight: 'bold' }} >{title}</span> | 
|         <span style={{ float: 'right', opacity: .3 }} >{uuid}</span> | 
|     </> | 
| ); | 
|   | 
| const sensorTypeSelectOptionsFn = (intl) => { | 
|     let options = []; | 
|     Object.entries(Utils.SENSOR_TYPE).forEach(([key, value]) => { | 
|         switch (key) { | 
|             case Utils.SENSOR_TYPE.SHELF: | 
|                 options.push({ | 
|                     value: value, | 
|                     label: | 
|                         ( | 
|                             <> | 
|                                 <span style={{ fontWeight: 'bold' }} >{intl.formatMessage({ id: 'map.sensor.type.shelf', defaultMessage: '货架' })}</span> | 
|                             </> | 
|                         ) | 
|                 }) | 
|                 break; | 
|             case Utils.SENSOR_TYPE.CONVEYOR: | 
|                 options.push({ | 
|                     value: value, | 
|                     label: | 
|                         ( | 
|                             <> | 
|                                 <span style={{ fontWeight: 'bold' }} >{intl.formatMessage({ id: 'map.sensor.type.conveyor', defaultMessage: '输送线' })}</span> | 
|                             </> | 
|                         ) | 
|                 }) | 
|                 break; | 
|             case Utils.SENSOR_TYPE.SHUTTLE: | 
|                 options.push({ | 
|                     value: value, | 
|                     label: | 
|                         ( | 
|                             <> | 
|                                 <span style={{ fontWeight: 'bold' }} >{intl.formatMessage({ id: 'map.sensor.type.shuttle', defaultMessage: '穿梭车' })}</span> | 
|                             </> | 
|                         ) | 
|                 }) | 
|                 break; | 
|             case Utils.SENSOR_TYPE.LIFT: | 
|                 options.push({ | 
|                     value: value, | 
|                     label: | 
|                         ( | 
|                             <> | 
|                                 <span style={{ fontWeight: 'bold' }} >{intl.formatMessage({ id: 'map.sensor.type.lift', defaultMessage: '提升机' })}</span> | 
|                             </> | 
|                         ) | 
|                 }) | 
|                 break; | 
|             // case Utils.SENSOR_TYPE.AGV: | 
|             //     options.push({ | 
|             //         value: value, | 
|             //         label: | 
|             //             ( | 
|             //                 <> | 
|             //                     <span style={{ fontWeight: 'bold' }} >{intl.formatMessage({ id: 'map.sensor.type.agv', defaultMessage: 'AGV' })}</span> | 
|             //                 </> | 
|             //             ) | 
|             //     }) | 
|             //     break; | 
|             // case Utils.SENSOR_TYPE.POINT: | 
|             //     options.push({ | 
|             //         value: value, | 
|             //         label: | 
|             //             ( | 
|             //                 <> | 
|             //                     <span style={{ fontWeight: 'bold' }} >{intl.formatMessage({ id: 'map.sensor.type.point', defaultMessage: '定位点' })}</span> | 
|             //                 </> | 
|             //             ) | 
|             //     }) | 
|             //     break; | 
|             default: | 
|                 break; | 
|         } | 
|   | 
|     }) | 
|     return options; | 
| } | 
|   | 
| function getAllSensorList(curSensorType) { | 
|     let sensorListAll = []; | 
|     Utils.getMapContainer().children.forEach(child => { | 
|         if (child?.data?.type === curSensorType && child?.data?.no) { | 
|             sensorListAll.push({ | 
|                 value: child.data.no, | 
|                 label: renderTitle(child.data.no, child.data.uuid) | 
|             }) | 
|         } | 
|         // lift special handling | 
|         if (curSensorType === Utils.SENSOR_TYPE.LIFT) { | 
|             if (child?.data?.type === Utils.SENSOR_TYPE.SHELF && child?.data?.shelfType === Utils.SHELF_TYPE.LIFT) { | 
|                 sensorListAll.push({ | 
|                     value: child.data.liftNo + '', | 
|                     label: renderTitle(child.data.liftNo + '', child.data.uuid) | 
|                 }) | 
|             } | 
|         } | 
|     }); | 
|     return sensorListAll; | 
| } | 
|   | 
| const MapSearch = (props) => { | 
|     const intl = useIntl(); | 
|     const { | 
|         curSprite: curSensor, | 
|         setCurSPrite: setCurSensor, | 
|         setSpriteBySettings, | 
|         model, | 
|         setModel, | 
|         ModelEnum, | 
|     } = props; | 
|   | 
|     const sensorTypeSelectOptions = sensorTypeSelectOptionsFn(intl); | 
|     const [curSensorType, setCurSensorType] = React.useState(sensorTypeSelectOptions?.[0]?.value); | 
|   | 
|     const [sensorList, setSensorList] = React.useState([]); | 
|     const [filterSensorList, setFilterSensorList] = React.useState([]); | 
|     const [curSensorLabel, setCurSensorLabel] = React.useState(null); | 
|   | 
|     const resetSearch = () => { | 
|         let sensorListAll = getAllSensorList(curSensorType); | 
|         setSensorList(sensorListAll); | 
|         setFilterSensorList(sensorListAll); | 
|         setCurSensorLabel(null); | 
|     } | 
|   | 
|     // first select and switch floor | 
|     React.useEffect(() => { | 
|         if (!Utils.getMapContainer()) { return } | 
|         setTimeout(() => { | 
|             resetSearch(); | 
|         }, 200) | 
|     }, [curSensorType, props.curFloor]) | 
|   | 
|     // second select condition | 
|     React.useEffect(() => { | 
|         if (!Utils.getMapContainer()) { return; } | 
|         if (!Utils.isNullOfUndefined(curSensorLabel) && sensorList && sensorList.length > 0) { | 
|             setFilterSensorList(sensorList.filter(item => item.value.includes(curSensorLabel))); | 
|         } | 
|     }, [curSensorLabel]) | 
|   | 
|     const onSecondSelect = (value, option) => { | 
|         const uuid = option.label?.props?.children?.[1].props.children; | 
|         const selectSensor = Utils.findSpriteByUuid(uuid); | 
|         if (selectSensor) { | 
|             Utils.beCenter(selectSensor); | 
|         } | 
|         switch (model) { | 
|             case ModelEnum.OBSERVER_MODEL: | 
|                 setCurSensor(selectSensor); | 
|                 break; | 
|             case ModelEnum.MOVABLE_MODEL: | 
|                 setModel(ModelEnum.SETTINGS_MODEL); | 
|                 // avoid model modify which will clear spriteBySettings | 
|                 setTimeout(() => { | 
|                     setSpriteBySettings(selectSensor); | 
|                 }, 200) | 
|                 break; | 
|             case ModelEnum.SETTINGS_MODEL: | 
|                 setSpriteBySettings(selectSensor); | 
|                 break; | 
|             default: | 
|                 break; | 
|         } | 
|     } | 
|   | 
|     return ( | 
|         <> | 
|             <Select | 
|                 className='map-header-select' | 
|                 variant='filled' | 
|                 style={{ | 
|                     width: 160, | 
|                 }} | 
|                 size={'large'} | 
|                 options={sensorTypeSelectOptions} | 
|                 value={curSensorType} | 
|                 onChange={setCurSensorType} | 
|             /> | 
|             <AutoComplete | 
|                 className='map-header-select' | 
|                 variant='filled' | 
|                 style={{ | 
|                     width: 360, | 
|                 }} | 
|                 size={'large'} | 
|                 placeholder={intl.formatMessage({ id: 'common.search.placeholder', defaultMessage: '请输入搜索内容' })} | 
|                 allowClear={{ | 
|                     clearIcon: <CloseOutlined /> | 
|                 }} | 
|                 popupMatchSelectWidth={500} | 
|                 options={filterSensorList} | 
|                 value={curSensorLabel} | 
|                 onSelect={onSecondSelect} | 
|                 onChange={setCurSensorLabel} | 
|             /> | 
|         </> | 
|     ) | 
| } | 
|   | 
| export default MapSearch; |