diff --git a/.gitignore b/.gitignore index 315cf207..f3b61bd7 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,5 @@ next-env.d.ts #lock files yarn.lock package-lock.json +pnpm-lock.yaml certificates \ No newline at end of file diff --git a/src/app/QcastProvider.js b/src/app/QcastProvider.js index 861ee8f9..43404308 100644 --- a/src/app/QcastProvider.js +++ b/src/app/QcastProvider.js @@ -1,6 +1,6 @@ 'use client' -import { createContext, useEffect, useState } from 'react' +import { createContext, useState } from 'react' import { ErrorBoundary } from 'next/dist/client/components/error-boundary' import { useCommonCode } from '@/hooks/common/useCommonCode' import ServerError from './error' diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index d21c55e7..cf2e0d56 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -1,32 +1,28 @@ 'use client' -import { useContext, useEffect, useRef } from 'react' +import { useEffect, useRef } from 'react' import { useRecoilValue } from 'recoil' +import QContextMenu from '@/components/common/context-menu/QContextMenu' +import PanelBatchStatistics from '@/components/floor-plan/modal/panelBatch/PanelBatchStatistics' +import ImgLoad from '@/components/floor-plan/modal/ImgLoad' import { useCanvas } from '@/hooks/useCanvas' -import { useEvent } from '@/hooks/useEvent' import { usePlan } from '@/hooks/usePlan' import { useContextMenu } from '@/hooks/useContextMenu' -import { currentMenuState } from '@/store/canvasAtom' -import QContextMenu from '@/components/common/context-menu/QContextMenu' import { useCanvasConfigInitialize } from '@/hooks/common/useCanvasConfigInitialize' -import { MENU } from '@/common/common' -import PanelBatchStatistics from '@/components/floor-plan/modal/panelBatch/PanelBatchStatistics' +import { currentMenuState } from '@/store/canvasAtom' import { totalDisplaySelector } from '@/store/settingAtom' -import ImgLoad from '@/components/floor-plan/modal/ImgLoad' +import { MENU } from '@/common/common' export default function CanvasFrame() { const canvasRef = useRef(null) - const { canvas, handleBackImageLoadToCanvas } = useCanvas('canvas') + const { canvas } = useCanvas('canvas') const { canvasLoadInit, gridInit } = useCanvasConfigInitialize() const currentMenu = useRecoilValue(currentMenuState) const { contextMenu, handleClick } = useContextMenu() - const { selectedPlan, currentCanvasPlan } = usePlan() + const { selectedPlan } = usePlan() const totalDisplay = useRecoilValue(totalDisplaySelector) // 집계표 표시 여부 - // useEvent() - // const { initEvent } = useContext(EventContext) - // initEvent() const loadCanvas = () => { if (canvas) { diff --git a/src/components/floor-plan/CanvasLayout.jsx b/src/components/floor-plan/CanvasLayout.jsx index 70bf2bb9..ba2994c0 100644 --- a/src/components/floor-plan/CanvasLayout.jsx +++ b/src/components/floor-plan/CanvasLayout.jsx @@ -3,12 +3,12 @@ import { useContext, useEffect } from 'react' import { useRecoilValue } from 'recoil' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' +import { SessionContext } from '@/app/SessionProvider' import { useMessage } from '@/hooks/useMessage' import { useSwal } from '@/hooks/useSwal' import { usePlan } from '@/hooks/usePlan' -import { globalLocaleStore } from '@/store/localeAtom' -import { SessionContext } from '@/app/SessionProvider' import { useCanvasMenu } from '@/hooks/common/useCanvasMenu' +import { globalLocaleStore } from '@/store/localeAtom' export default function CanvasLayout({ children }) { // const { menuNumber } = props diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 71fdb0bf..b211b420 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -2,54 +2,47 @@ import { useContext, useEffect, useState } from 'react' +import { usePathname, useRouter } from 'next/navigation' + import { useRecoilState, useRecoilValue, useSetRecoilState } from 'recoil' -import { usePathname, useRouter } from 'next/navigation' +import { v4 as uuidv4 } from 'uuid' + import MenuDepth01 from './MenuDepth01' import QSelectBox from '@/components/common/select/QSelectBox' -import { v4 as uuidv4 } from 'uuid' +import SettingModal01 from '@/components/floor-plan/modal/setting01/SettingModal01' +import PlacementShapeSetting from '@/components/floor-plan/modal/placementShape/PlacementShapeSetting' +import EstimateCopyPop from '../estimate/popup/EstimateCopyPop' +import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' +import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import { useMessage } from '@/hooks/useMessage' import { usePlan } from '@/hooks/usePlan' import { useSwal } from '@/hooks/useSwal' import { useEvent } from '@/hooks/useEvent' +import { usePopup } from '@/hooks/usePopup' +import { useCanvasEvent } from '@/hooks/useCanvasEvent' +import { useCommonUtils } from '@/hooks/common/useCommonUtils' +import useMenu from '@/hooks/common/useMenu' +import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' +import { useAxios } from '@/hooks/useAxios' +import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' import { canvasSettingState, canvasState, canvasZoomState, currentMenuState, verticalHorizontalModeState } from '@/store/canvasAtom' import { sessionStore } from '@/store/commonAtom' import { outerLinePointsState } from '@/store/outerLineAtom' import { appMessageStore, globalLocaleStore } from '@/store/localeAtom' -import { - addedRoofsSelector, - addedRoofsState, - basicSettingState, - roofMaterialsSelector, - selectedRoofMaterialSelector, - settingModalFirstOptionsState, -} from '@/store/settingAtom' +import { addedRoofsState, basicSettingState, selectedRoofMaterialSelector, settingModalFirstOptionsState } from '@/store/settingAtom' +import { placementShapeDrawingPointsState } from '@/store/placementShapeDrawingAtom' +import { commonUtilsState } from '@/store/commonUtilsAtom' +import { menusState, menuTypeState } from '@/store/menuAtom' +import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom' +import { pwrGnrSimTypeState } from '@/store/simulatorAtom' +import { isObjectNotEmpty } from '@/util/common-utils' import KO from '@/locales/ko.json' import JA from '@/locales/ja.json' -import { useCanvasEvent } from '@/hooks/useCanvasEvent' -import SettingModal01 from '@/components/floor-plan/modal/setting01/SettingModal01' -import { usePopup } from '@/hooks/usePopup' -import { placementShapeDrawingPointsState } from '@/store/placementShapeDrawingAtom' -import PlacementShapeSetting from '@/components/floor-plan/modal/placementShape/PlacementShapeSetting' -import { useCommonUtils } from '@/hooks/common/useCommonUtils' -import { commonUtilsState } from '@/store/commonUtilsAtom' -import { menusState, menuTypeState } from '@/store/menuAtom' -import useMenu from '@/hooks/common/useMenu' import { MENU } from '@/common/common' -import { useEstimateController } from '@/hooks/floorPlan/estimate/useEstimateController' -import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom' -import DocDownOptionPop from '../estimate/popup/DocDownOptionPop' -import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' -import EstimateCopyPop from '../estimate/popup/EstimateCopyPop' -import { pwrGnrSimTypeState } from '@/store/simulatorAtom' -import { useAxios } from '@/hooks/useAxios' - -import { useModuleBasicSetting } from '@/hooks/module/useModuleBasicSetting' -import { isObjectNotEmpty } from '@/util/common-utils' - export default function CanvasMenu(props) { const { menuNumber, setMenuNumber } = props const pathname = usePathname() @@ -58,8 +51,8 @@ export default function CanvasMenu(props) { const canvasMenus = useRecoilValue(menusState) const [type, setType] = useRecoilState(menuTypeState) const [verticalHorizontalMode, setVerticalHorizontalMode] = useRecoilState(verticalHorizontalModeState) - const [appMessageState, setAppMessageState] = useRecoilState(appMessageStore) - const [currentMenu, setCurrentMenu] = useRecoilState(currentMenuState) + const setAppMessageState = useSetRecoilState(appMessageStore) + const setCurrentMenu = useSetRecoilState(currentMenuState) const setOuterLinePoints = useSetRecoilState(outerLinePointsState) const setPlacementPoints = useSetRecoilState(placementShapeDrawingPointsState) const canvasSetting = useRecoilValue(canvasSettingState) @@ -123,13 +116,6 @@ export default function CanvasMenu(props) { if (pathname !== '/floor-plan') router.push('/floor-plan') } - useEffect(() => { - console.log('addedRoofs', addedRoofs) - }, [addedRoofs]) - useEffect(() => { - console.log('selectedRoofMaterial', selectedRoofMaterial) - }, [selectedRoofMaterial]) - const changeSelectedRoofMaterial = (e) => { setBasicSetting({ ...basicSetting, selectedRoofMaterial: e }) } diff --git a/src/components/floor-plan/FloorPlan.jsx b/src/components/floor-plan/FloorPlan.jsx index e2c53668..fe95d46b 100644 --- a/src/components/floor-plan/FloorPlan.jsx +++ b/src/components/floor-plan/FloorPlan.jsx @@ -1,6 +1,6 @@ 'use client' -import { useContext, useEffect } from 'react' +import { useEffect } from 'react' //import { useRecoilState } from 'recoil' import CanvasMenu from '@/components/floor-plan/CanvasMenu' import { useCanvasMenu } from '@/hooks/common/useCanvasMenu' diff --git a/src/components/floor-plan/MenuDepth01.jsx b/src/components/floor-plan/MenuDepth01.jsx index 5b1897b3..1253c491 100644 --- a/src/components/floor-plan/MenuDepth01.jsx +++ b/src/components/floor-plan/MenuDepth01.jsx @@ -1,11 +1,12 @@ 'use client' +import { useEffect } from 'react' + import { useMessage } from '@/hooks/useMessage' +import useMenu from '@/hooks/common/useMenu' import { canvasState, currentMenuState } from '@/store/canvasAtom' import { useRecoilState, useRecoilValue } from 'recoil' import { menuTypeState, subMenusState } from '@/store/menuAtom' -import useMenu from '@/hooks/common/useMenu' -import { useEffect } from 'react' export default function MenuDepth01() { const type = useRecoilValue(menuTypeState) diff --git a/src/components/floor-plan/RoofCoveringMenu.jsx b/src/components/floor-plan/RoofCoveringMenu.jsx index 26da4bda..b270a1f2 100644 --- a/src/components/floor-plan/RoofCoveringMenu.jsx +++ b/src/components/floor-plan/RoofCoveringMenu.jsx @@ -1,11 +1,12 @@ 'use client' -import { useMessage } from '@/hooks/useMessage' import { useRecoilState, useSetRecoilState } from 'recoil' -import { currentMenuState } from '@/store/canvasAtom' + import { MENU } from '@/common/common' -import { modalState } from '@/store/modalAtom' import { ToggleonMouse } from '@/components/header/Header' +import { useMessage } from '@/hooks/useMessage' +import { currentMenuState } from '@/store/canvasAtom' +import { modalState } from '@/store/modalAtom' export default function RoofCoveringMenu() { const { getMessage } = useMessage() diff --git a/src/components/floor-plan/modal/roofAllocation/ContextRoofAllocationSetting.jsx b/src/components/floor-plan/modal/roofAllocation/ContextRoofAllocationSetting.jsx index cba18953..23993cb0 100644 --- a/src/components/floor-plan/modal/roofAllocation/ContextRoofAllocationSetting.jsx +++ b/src/components/floor-plan/modal/roofAllocation/ContextRoofAllocationSetting.jsx @@ -28,6 +28,7 @@ export default function ContextRoofAllocationSetting(props) { handleChangeRaft, handleChangeLayout, handleSaveContext, + currentRoofList, } = useRoofAllocationSetting(id) const { findCommonCode } = useCommonCode() @@ -39,7 +40,7 @@ export default function ContextRoofAllocationSetting(props) { return ( -
+

{getMessage('plan.menu.estimate.roof.alloc')}

- {roofList.map((roof, index) => { + {currentRoofList.map((roof, index) => { return (
@@ -88,78 +93,74 @@ export default function ContextRoofAllocationSetting(props) {
r.id === roof.id)} + value={roof} + showKey={'roofMatlNm'} + sourceKey={'roofMatlCd'} + targetKey={'roofMatlCd'} onChange={(e) => handleChangeRoofMaterial(e, index)} />
- {index === 0 && 基本屋根材} + {index === 0 && {getMessage('modal.roof.alloc.default.roof.material')}} {index !== 0 && }
-
- {roof.widAuth && ( -
- W -
- + {(roof.widAuth || roof.lenAuth) && ( +
+ {roof.widAuth && ( +
+ W +
+ +
- {/*
- -
*/} -
- )} - {roof.lenAuth && ( -
- L -
- + )} + {roof.lenAuth && ( +
+ L +
+ +
- {/*
- -
*/} -
- )} - {roof.raftAuth && ( -
- {getMessage('modal.placement.initial.setting.rafter')} -
- {raftCodes.length > 0 && ( - ({ name: raft.clCodeNm, value: raft.clCode }))} - onChange={(e) => handleChangeRaft(e, index)} - value={raftCodes.find((r) => r.value === roof.raft)} - /> - )} - {/* */} + )} +
+ )} + {(roof.raftAuth || roof.roofPchAuth) && ( +
+ {roof.raftAuth && ( +
+
+ {getMessage('modal.placement.initial.setting.rafter')} + {raftCodes.length > 0 && ( +
+ +
+ )} +
-
- )} - {roof.roofPchAuth && ( -
- {getMessage('hajebichi')} -
- + )} + {roof.roofPchAuth && ( +
+
+ {getMessage('hajebichi')} +
+ +
+
- {/*
- -
*/} -
- )} -
+ )} +
+ )}
- {roofList.map((roof, index) => { + {currentRoofList.map((roof, index) => { return (
diff --git a/src/hooks/option/useCanvasSetting.js b/src/hooks/option/useCanvasSetting.js index 441a06030..1c1dca34 100644 --- a/src/hooks/option/useCanvasSetting.js +++ b/src/hooks/option/useCanvasSetting.js @@ -269,17 +269,6 @@ export function useCanvasSetting() { roofSizeSet: item.roofSizeSet, roofAngleSet: item.roofAngleSet, } - - roofsArray = { - roofApply: true, - roofSeq: 1, - roofMatlCd: 'ROOF_ID_WA_53A', - roofWidth: 265, - roofHeight: 235, - roofHajebichi: 0, - roofGap: 'HEI_455', - roofLayout: 'P', - } }) } else { roofsRow = [ diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index a2c7b483..c48a8d7a 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -13,6 +13,7 @@ import useMenu from '@/hooks/common/useMenu' import { useCanvasMenu } from '@/hooks/common/useCanvasMenu' import { menuTypeState } from '@/store/menuAtom' import { useRoofFn } from '@/hooks/common/useRoofFn' +import { ROOF_MATERIAL_LAYOUT } from '@/components/floor-plan/modal/placementShape/PlacementShapeSetting' // 지붕면 할당 export function useRoofAllocationSetting(id) { @@ -32,7 +33,7 @@ export function useRoofAllocationSetting(id) { const [currentRoofMaterial, setCurrentRoofMaterial] = useState(roofMaterials[0]) // 팝업 내 기준 지붕재 const [roofList, setRoofList] = useRecoilState(addedRoofsState) // 배치면 초기설정에서 선택한 지붕재 배열 const [editingLines, setEditingLines] = useState([]) - const isFirstRef = useRef(0) + const [currentRoofList, setCurrentRoofList] = useState(roofList) const { setSurfaceShapePattern } = useRoofFn() @@ -76,20 +77,25 @@ export function useRoofAllocationSetting(id) { }, []) const onAddRoofMaterial = () => { - if (roofList.length >= 4) { + if (currentRoofList.length >= 4) { swalFire({ type: 'alert', icon: 'error', text: getMessage('지붕재는 4개까지 선택 가능합니다.') }) return } - setRoofList([...roofList, { ...currentRoofMaterial, selected: false, id: currentRoofMaterial.roofMatlCd, name: currentRoofMaterial.roofMatlNm }]) + setCurrentRoofList([ + ...currentRoofList, + { ...currentRoofMaterial, selected: false, id: currentRoofMaterial.roofMatlCd, name: currentRoofMaterial.roofMatlNm }, + ]) } const onDeleteRoofMaterial = (idx) => { - setRoofList([...roofList.filter((_, index) => index !== idx)]) + const isSelected = currentRoofList[idx].selected + const newRoofList = [...currentRoofList].filter((_, index) => index !== idx) + if (isSelected) { + newRoofList[0].selected = true + } + setCurrentRoofList(newRoofList) } - const { handleMenu } = useMenu() - const [currentMenu, setCurrentMenu] = useRecoilState(currentMenuState) - // 선택한 지붕재로 할당 const handleSave = () => { // 모두 actualSize 있으면 바로 적용 없으면 actualSize 설정 @@ -102,7 +108,7 @@ export function useRoofAllocationSetting(id) { // 지붕재 오른쪽 마우스 클릭 후 단일로 지붕재 변경 필요한 경우 const handleSaveContext = () => { - const selectedRoofMaterial = roofList.find((roof) => roof.selected) + const selectedRoofMaterial = currentRoofList.find((roof) => roof.selected) setSurfaceShapePattern(currentObject, roofDisplay.column, false, selectedRoofMaterial) closeAll() } @@ -169,11 +175,11 @@ export function useRoofAllocationSetting(id) { setBasicSetting((prev) => { return { ...prev, - selectedRoofMaterial: roofList.find((roof) => roof.selected), + selectedRoofMaterial: currentRoofList.find((roof) => roof.selected), } }) - setRoofList(roofList) + setRoofList(currentRoofList) const roofs = canvas.getObjects().filter((obj) => obj.name === 'roof') @@ -182,7 +188,12 @@ export function useRoofAllocationSetting(id) { roof.set({ isFixed: true, }) - setSurfaceShapePattern(roof, roofDisplay.column) + setSurfaceShapePattern( + roof, + roofDisplay.column, + false, + currentRoofList.find((roof) => roof.selected), + ) drawDirectionArrow(roof) }) @@ -216,54 +227,53 @@ export function useRoofAllocationSetting(id) { // 지붕재 변경 const handleChangeRoofMaterial = (value, index) => { - if (isFirstRef.current === 0) { - isFirstRef.current++ - return - } + const selectedIndex = roofMaterials.findIndex((roof) => roof.selected) const selectedRoofMaterial = roofMaterials.find((roof) => roof.roofMatlCd === value.id) - const newRoofList = roofList.map((roof, idx) => { + const newRoofList = currentRoofList.map((roof, idx) => { if (idx === index) { return { ...selectedRoofMaterial } } return roof }) - setRoofList(newRoofList) + newRoofList[selectedIndex].selected = true + + setCurrentRoofList(newRoofList) } // 기본 지붕재 radio값 변경 const handleDefaultRoofMaterial = (index) => { - const newRoofList = roofList.map((roof, idx) => { + const newRoofList = currentRoofList.map((roof, idx) => { return { ...roof, selected: idx === index } }) - setRoofList(newRoofList) + setCurrentRoofList(newRoofList) } // 서까래 변경 const handleChangeRaft = (e, index) => { const raftValue = e.value - const newRoofList = roofList.map((roof, idx) => { + const newRoofList = currentRoofList.map((roof, idx) => { if (idx === index) { return { ...roof, raft: raftValue } } return roof }) - setRoofList(newRoofList) + setCurrentRoofList(newRoofList) } const handleChangeLayout = (layoutValue, index) => { - const newRoofList = roofList.map((roof, idx) => { + const newRoofList = currentRoofList.map((roof, idx) => { if (idx === index) { return { ...roof, layout: layoutValue } } return roof }) - setRoofList(newRoofList) + setCurrentRoofList(newRoofList) } return { @@ -278,11 +288,11 @@ export function useRoofAllocationSetting(id) { setBasicSetting, currentRoofMaterial, setCurrentRoofMaterial, - roofList, handleDefaultRoofMaterial, handleChangeRoofMaterial, handleChangeRaft, handleChangeLayout, handleSaveContext, + currentRoofList, } } diff --git a/src/store/settingAtom.js b/src/store/settingAtom.js index 2350b0f5..df5022a7 100644 --- a/src/store/settingAtom.js +++ b/src/store/settingAtom.js @@ -224,9 +224,9 @@ export const roofMaterialsAtom = atom({ export const selectedRoofMaterialSelector = selector({ key: 'selectedRoofMaterialSelector', get: ({ get }) => { - const basicSetting = get(basicSettingState) + const addedRoofs = get(addedRoofsState) - return { ...basicSetting.selectedRoofMaterial } + return addedRoofs.find((roof) => roof.selected) }, })