| | |
| | | import React, { useState, useEffect } from 'react'; |
| | | import React, { useState, useEffect, useMemo } from 'react'; |
| | | import { useTranslate } from "react-admin"; |
| | | import { |
| | | Drawer, |
| | |
| | | import AreaAdvancedTab from './AreaAdvancedTab'; |
| | | import { getAreaInfo } from '../http'; |
| | | |
| | | const getAgvOptionId = (option) => { |
| | | if (typeof option === 'string') { |
| | | return option; |
| | | } |
| | | return option?.value ?? option?.id ?? option?.agvNo ?? option?.code ?? option?.name ?? ''; |
| | | }; |
| | | |
| | | const AreaSettings = (props) => { |
| | | const { open, onCancel, sprite, width = PAGE_DRAWER_WIDTH } = props; |
| | | const theme = useTheme(); |
| | |
| | | |
| | | const [activeTab, setActiveTab] = useState(0); |
| | | const [areaName, setAreaName] = useState(''); |
| | | const [agvList, setAgvList] = useState(''); |
| | | const [selectedAgvs, setSelectedAgvs] = useState([]); |
| | | const [barcodeList, setBarcodeList] = useState(''); |
| | | const [areaCode, setAreaCode] = useState(''); |
| | | const [maxQty, setMaxQty] = useState(''); |
| | |
| | | } |
| | | |
| | | useEffect(() => { |
| | | if (sprite?.data) { |
| | | console.log(sprite.data); |
| | | if (sprite?.data?.id) { |
| | | fetchAreaInfo(sprite.data.id); |
| | | |
| | | setAreaName(sprite.data.name || ''); |
| | | setAreaCode(sprite.data.code || ''); |
| | | setMaxQty(sprite.data.maxQty || ''); |
| | | setSpeedLimit(sprite.data.speedLimit || ''); |
| | | setShapeData(sprite.data.shape || ''); |
| | | setPriority(sprite.data.priority || ''); |
| | | setAgvList((sprite.data.agvs || []).join(', ')); |
| | | setBarcodeList((sprite.data.barcodes || []).join('\n')); |
| | | } else { |
| | | setCurAreaInfo(null); |
| | | setAreaName(''); |
| | | setAreaCode(''); |
| | | setMaxQty(''); |
| | | setSpeedLimit(''); |
| | | setShapeData(''); |
| | | setPriority(''); |
| | | setAgvList(''); |
| | | setSelectedAgvs([]); |
| | | setBarcodeList(''); |
| | | } |
| | | }, [sprite]); |
| | | |
| | | const agvOptions = useMemo(() => { |
| | | if (!curAreaInfo) { |
| | | return []; |
| | | } |
| | | return curAreaInfo.agvOptions || curAreaInfo.agvCandidates || curAreaInfo.agvList || []; |
| | | }, [curAreaInfo]); |
| | | |
| | | useEffect(() => { |
| | | if (curAreaInfo) { |
| | | setAreaName(curAreaInfo.name || ''); |
| | | setAreaCode(curAreaInfo.code || ''); |
| | | setMaxQty(curAreaInfo.maxQty || ''); |
| | | setSpeedLimit(curAreaInfo.speedLimit || ''); |
| | | setShapeData(curAreaInfo.shape || ''); |
| | | setPriority(curAreaInfo.priority || ''); |
| | | |
| | | const selected = curAreaInfo.selectedAgvs || curAreaInfo.agvs || []; |
| | | if (Array.isArray(selected) && Array.isArray(agvOptions) && agvOptions.length > 0) { |
| | | const optionMap = new Map(agvOptions.map(option => [getAgvOptionId(option), option])); |
| | | setSelectedAgvs(selected.map(item => optionMap.get(getAgvOptionId(item)) || item)); |
| | | } else { |
| | | setSelectedAgvs(selected); |
| | | } |
| | | |
| | | const barcodes = curAreaInfo.barcodes || curAreaInfo.barcodeList || []; |
| | | setBarcodeList(Array.isArray(barcodes) ? barcodes.join('\n') : (barcodes || '')); |
| | | } |
| | | }, [curAreaInfo, agvOptions]); |
| | | |
| | | const handleTabChange = (event, newValue) => { |
| | | setActiveTab(newValue); |
| | |
| | | <AreaBasicTab |
| | | areaName={areaName} |
| | | setAreaName={setAreaName} |
| | | agvList={agvList} |
| | | setAgvList={setAgvList} |
| | | agvOptions={agvOptions} |
| | | selectedAgvs={selectedAgvs} |
| | | setSelectedAgvs={setSelectedAgvs} |
| | | barcodeList={barcodeList} |
| | | setBarcodeList={setBarcodeList} |
| | | onSave={handleSaveBasic} |
| | | /> |
| | | )} |