From 8f2b93863f7abc25199bf1432a130813eb45293c Mon Sep 17 00:00:00 2001 From: changkyu choi Date: Tue, 10 Sep 2024 11:17:05 +0900 Subject: [PATCH] =?UTF-8?q?=EC=86=8C=EC=8A=A4=20=EA=B0=84=EC=86=8C?= =?UTF-8?q?=ED=99=94=20=EB=B0=8F=20=EB=B6=88=ED=95=84=EC=9A=94=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/InitSettingsModal.jsx | 229 ++++++++++++++++----------- 1 file changed, 133 insertions(+), 96 deletions(-) diff --git a/src/components/InitSettingsModal.jsx b/src/components/InitSettingsModal.jsx index 1deb81a7..5a6aad64 100644 --- a/src/components/InitSettingsModal.jsx +++ b/src/components/InitSettingsModal.jsx @@ -9,7 +9,8 @@ import { useAxios } from '@/hooks/useAxios' import { get, post } from '@/lib/Axios' export default function InitSettingsModal(props) { - const [objectNo, setObjectNo] = useState('test123240909001') // 후에 삭제 필요 + const [objectNo, setObjectNo] = useState('test123240909002') // 후에 삭제 필요 + const [lastRoofSeq, setLastRoofSeq] = useState(0) // 마지막 roofSeq를 추적 const [open, setOpen] = useRecoilState(modalState) const [canvasSetting, setCanvasSetting] = useRecoilState(canvasSettingState) const [roofMaterials, setRoofMaterials] = useState([]) @@ -36,7 +37,7 @@ export default function InitSettingsModal(props) { }) get({ url: `/api/canvas-management/canvas-basic-settings/by-object/${objectNo}` }).then((res) => { - if (!res) return + if (res.length == 0) return // 'roofs' 배열을 생성하여 각 항목을 추가 const roofsRow = res.map((item) => { @@ -47,16 +48,16 @@ export default function InitSettingsModal(props) { } }) - const roofsArray = res.map((item) => { - return { - roofSeq: String(item.roofSeq), - roofType: String(item.roofType), - roofWidth: String(item.roofWidth), - roofHeight: String(item.roofHeight), - roofGap: String(item.roofGap), - roofLayout: item.roofLayout, - } - }) + const roofsArray = res.some((item) => !item.roofSeq) + ? null //지붕재 추가 정보가 없다면 roofsArray를 null 처리하여 지붕재 추가 정보가 보이지 않게 한다. + : res.map((item) => ({ + roofSeq: String(item.roofSeq), + roofType: String(item.roofType), + roofWidth: String(item.roofWidth), + roofHeight: String(item.roofHeight), + roofGap: String(item.roofGap), + roofLayout: item.roofLayout, + })) // 나머지 데이터와 함께 'roofs' 배열을 patternData에 넣음 const patternData = { @@ -68,6 +69,14 @@ export default function InitSettingsModal(props) { // 데이터 설정 setBasicSettings({ ...patternData }) + + // 초기 roofSeq 값을 업데이트 + if (roofsArray == null) { + //roofs(지붕재추가) 값이 없으면 lastRoofSeq는 1 설정 + setLastRoofSeq(1) + } else { + setLastRoofSeq(roofsArray.length + 1) + } }) if (!(Object.keys(canvasSetting).length === 0 && canvasSetting.constructor === Object)) { @@ -83,14 +92,20 @@ export default function InitSettingsModal(props) { //배열 추가 함수 const addRoofSetting = () => { - if (basicSetting.roofs.length === 4) { + if (basicSetting.roofs != null && basicSetting.roofs.length === 4) { alert('지붕재는 최대 4종까지 선택할 수 있습니다.') return } + //roofs가 null인 경우 배열 생성 + if (basicSetting.roofs == null) { + basicSetting.roofs = [] + } + //기본값 const newRoofSettings = { - roofSeq: basicSetting.roofs.length + 1, + //roofSeq: basicSetting.roofs.length + 1, + roofSeq: lastRoofSeq, // 마지막 roofSeq를 1 증가 roofType: '3', roofWidth: '200', roofHeight: '200', @@ -102,15 +117,40 @@ export default function InitSettingsModal(props) { ...prevState, roofs: [...prevState.roofs, newRoofSettings], })) + + setLastRoofSeq(newRoofSettings.roofSeq + 1) // roofSeq 값을 업데이트 } //배열 값 변경 함수 const handleRoofSettings = (id, event) => { - const roof = basicSetting.roofs.map((roof, i) => (id === roof.roofSeq ? { ...roof, [event.target.name]: event.target.value } : roof)) - setBasicSettings((prevState) => ({ - ...prevState, - roofs: [...roof], - })) + console.log(id) + + // 기본 세팅에서 roofs 배열을 복사 + const updatedRoofs = [...basicSetting.roofs] + + // roofSeq가 id와 일치하는 항목의 인덱스 찾기 + const index = updatedRoofs.findIndex((roof) => roof.roofSeq === id) + + if (index !== -1) { + // 해당 인덱스의 항목을 수정 + updatedRoofs[index] = { + ...updatedRoofs[index], + [event.target.name]: event.target.value, + } + + // 수정된 배열을 상태에 반영 + setBasicSettings((prevState) => ({ + ...prevState, + roofs: updatedRoofs, + })) + } + + // const roof = basicSetting.roofs.map((roof, i) => (id === roof.roofSeq ? { ...roof, [event.target.name]: event.target.value } : roof)) + + // setBasicSettings((prevState) => ({ + // ...prevState, + // roofs: [...roof], + // })) } //저장 @@ -205,9 +245,82 @@ export default function InitSettingsModal(props) { ※ 지붕재는 최대 4종까지 선택할 수 있습니다. + {/* Roofs Array Rendering */} {basicSetting.roofs && basicSetting.roofs.map((roof, index) => { - return + return ( +
+ 타입 : + + 너비 : + handleRoofSettings(roof.roofSeq, e)} + /> + mm + 높이 : + handleRoofSettings(roof.roofSeq, e)} + /> + mm + 서까래 간격 : + handleRoofSettings(roof.roofSeq, e)} + /> + mm +
+ handleRoofSettings(roof.roofSeq, e)} + > + 병렬식 + 계단식 + +
+
+ +
+
+ ) })}
@@ -223,79 +336,3 @@ export default function InitSettingsModal(props) { ) } - -const RoofSelectBox = (props) => { - return ( -
- 타입 : - - 너비 : - props.onChange(props.roof.roofSeq, e)} - /> - mm - 높이 : - props.onChange(props.roof.roofSeq, e)} - /> - mm - 서까래 간격 : - props.onChange(props.roof.roofSeq, e)} - /> - mm -
- props.onChange(props.roof.roofSeq, e)} - > - 병렬식 - 계단식 - -
-
- -
-
- ) -}