diff --git a/src/app/SessionProvider.js b/src/app/SessionProvider.js index d8f3caa9..c82eddaa 100644 --- a/src/app/SessionProvider.js +++ b/src/app/SessionProvider.js @@ -1,6 +1,8 @@ 'use client' -import { createContext, useState } from 'react' +import { loginUserStore } from '@/store/commonAtom' +import { createContext, useEffect, useState } from 'react' +import { useRecoilState } from 'recoil' export const SessionContext = createContext({ session: {}, @@ -8,5 +10,11 @@ export const SessionContext = createContext({ export default function SessionProvider({ useSession, children }) { const [session, setSession] = useState(useSession) + const [loginUserState, setLoginUserState] = useRecoilState(loginUserStore) + + useEffect(() => { + setLoginUserState(session) + }, [session]) + return {children} } diff --git a/src/app/layout.js b/src/app/layout.js index 1118b0d9..8c78f6c7 100644 --- a/src/app/layout.js +++ b/src/app/layout.js @@ -55,10 +55,6 @@ export default async function RootLayout({ children }) { redirect('/login') } - if (headerPathname === '/login' && session.isLoggedIn) { - redirect('/') - } - return ( diff --git a/src/common/common.js b/src/common/common.js index 92ddbdca..a35dc8c4 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -177,6 +177,8 @@ export const SAVE_KEY = [ 'moduleRowsTotCnt', 'seq', 'smartRackId', + 'quotationParam', + 'pcses', ] export const OBJECT_PROTOTYPE = [fabric.Line.prototype, fabric.Polygon.prototype, fabric.Triangle.prototype] diff --git a/src/components/auth/Login.jsx b/src/components/auth/Login.jsx index 55711929..eca80361 100644 --- a/src/components/auth/Login.jsx +++ b/src/components/auth/Login.jsx @@ -5,7 +5,7 @@ import Image from 'next/image' import Link from 'next/link' import { useRecoilState } from 'recoil' import { useAxios } from '@/hooks/useAxios' -import { setSession, login } from '@/lib/authActions' +import { setSession, login, checkSession } from '@/lib/authActions' import { useMessage } from '@/hooks/useMessage' import { globalLocaleStore } from '@/store/localeAtom' import { sessionStore } from '@/store/commonAtom' @@ -21,11 +21,19 @@ export default function Login() { // 자동 로그인 const initParams = useSearchParams() const autoLoginParam = initParams.get('autoLoginParam1') + useEffect(() => { if (autoLoginParam) { autoLoginProcess(autoLoginParam) } + + checkSession().then((res) => { + if (res) { + login() + } + }) }, []) + const autoLoginProcess = async (autoLoginParam) => { await promisePost({ url: '/api/login/v1.0/user/login/autoLoginDecryptData', data: { loginId: autoLoginParam } }) .then((res) => { diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index eb8e7bea..31698b1a 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -2,7 +2,7 @@ import { useContext, useEffect, useRef } from 'react' -import { useRecoilValue } from 'recoil' +import { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil' import QContextMenu from '@/components/common/context-menu/QContextMenu' import PanelBatchStatistics from '@/components/floor-plan/modal/panelBatch/PanelBatchStatistics' @@ -16,6 +16,7 @@ import { totalDisplaySelector } from '@/store/settingAtom' import { MENU } from '@/common/common' import { FloorPlanContext } from '@/app/floor-plan/FloorPlanProvider' import { QcastContext } from '@/app/QcastProvider' +import { moduleStatisticsState } from '@/store/circuitTrestleAtom' export default function CanvasFrame() { const canvasRef = useRef(null) @@ -27,7 +28,8 @@ export default function CanvasFrame() { const { currentCanvasPlan } = usePlan() const totalDisplay = useRecoilValue(totalDisplaySelector) // 집계표 표시 여부 const { setIsGlobalLoading } = useContext(QcastContext) - + const [moduleStatistics, setModuleStatistics] = useRecoilState(moduleStatisticsState) + const reset = useResetRecoilState(moduleStatisticsState) const loadCanvas = () => { if (canvas) { canvas?.clear() // 캔버스를 초기화합니다. @@ -43,6 +45,7 @@ export default function CanvasFrame() { useEffect(() => { loadCanvas() + reset() }, [currentCanvasPlan, canvas]) useEffect(() => { diff --git a/src/components/floor-plan/modal/basic/BasicSetting.jsx b/src/components/floor-plan/modal/basic/BasicSetting.jsx index 89560025..f4fc830d 100644 --- a/src/components/floor-plan/modal/basic/BasicSetting.jsx +++ b/src/components/floor-plan/modal/basic/BasicSetting.jsx @@ -1,6 +1,6 @@ import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import Module from '@/components/floor-plan/modal/basic/step/Module' import PitchModule from '@/components/floor-plan/modal/basic/step/pitch/PitchModule' import PitchPlacement from '@/components/floor-plan/modal/basic/step/pitch/PitchPlacement' @@ -16,6 +16,9 @@ import { addedRoofsState } from '@/store/settingAtom' import { isObjectNotEmpty } from '@/util/common-utils' import Swal from 'sweetalert2' import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupStatusController' +import { useMasterController } from '@/hooks/common/useMasterController' +import { loginUserStore } from '@/store/commonAtom' +import { currentCanvasPlanState } from '@/store/canvasAtom' export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const { getMessage } = useMessage() @@ -27,9 +30,12 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { const [isManualModuleSetup, setIsManualModuleSetup] = useRecoilState(isManualModuleSetupState) const moduleSelectionData = useRecoilValue(moduleSelectionDataState) const addedRoofs = useRecoilValue(addedRoofsState) + const loginUserState = useRecoilValue(loginUserStore) + const currentCanvasPlan = useRecoilValue(currentCanvasPlanState) // const { initEvent } = useContext(EventContext) const { manualModuleSetup, autoModuleSetup, manualFlatroofModuleSetup, autoFlatroofModuleSetup } = useModuleBasicSetting() + const { updateObjectDate } = useMasterController() const handleBtnNextStep = () => { if (tabNum === 1) { orientationRef.current.handleNextStep() @@ -49,6 +55,16 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { }) return } + + //물건정보 갱신일 수정 + updateObjectDataApi({ + objectNo: currentCanvasPlan.objectNo, //오브젝트_no + standardWindSpeedId: moduleSelectionData.common.stdWindSpeed, //기준풍속코드 + verticalSnowCover: moduleSelectionData.common.stdSnowLd, //적설량 + surfaceType: moduleSelectionData.common.illuminationTpNm, //면조도구분 + installHeight: moduleSelectionData.common.instHt, //설치높이 + userId: loginUserState.userId, //작성자아아디 + }) } setTabNum(tabNum + 1) @@ -72,6 +88,10 @@ export default function BasicSetting({ id, pos = { x: 50, y: 230 } }) { manualModuleSetup() }, [isManualModuleSetup]) + const updateObjectDataApi = async (params) => { + const res = await updateObjectDate(params) + } + return (
diff --git a/src/components/floor-plan/modal/basic/step/ModuleTabContents.jsx b/src/components/floor-plan/modal/basic/step/ModuleTabContents.jsx index ad48695e..706fad9f 100644 --- a/src/components/floor-plan/modal/basic/step/ModuleTabContents.jsx +++ b/src/components/floor-plan/modal/basic/step/ModuleTabContents.jsx @@ -1,4 +1,4 @@ -import { useState } from 'react' +import { useState, useEffect } from 'react' import { useMessage } from '@/hooks/useMessage' import { isObjectNotEmpty } from '@/util/common-utils' import QSelectBox from '@/components/common/select/QSelectBox' @@ -15,6 +15,7 @@ export default function ModuleTabContents({ tabIndex, addRoof, setAddedRoofs, ro roofBaseList, constructionList, globalPitchText, + selectedRaftBase, selectedTrestle, selectedConstMthd, selectedRoofBase, @@ -27,8 +28,7 @@ export default function ModuleTabContents({ tabIndex, addRoof, setAddedRoofs, ro hajebichi, lengthRef, hajebichiRef, - setLengthBase, - setHajebichi, + handleHajebichiAndLength, handleChangeRaftBase, handleChangeTrestle, handleChangeConstMthd, @@ -59,7 +59,7 @@ export default function ModuleTabContents({ tabIndex, addRoof, setAddedRoofs, ro type="text" className="input-origin block" value={lengthBase} - onChange={(e) => setLengthBase(e.target.value)} + onChange={(e) => handleHajebichiAndLength(e, 'length')} disabled={roofMaterial.lenAuth === 'R' ? true : false} ref={lengthRef} /> @@ -77,9 +77,9 @@ export default function ModuleTabContents({ tabIndex, addRoof, setAddedRoofs, ro {raftCodes.length > 0 && ( setHajebichi(e.target.value)} + onChange={(e) => handleHajebichiAndLength(e, 'hajebichi')} value={hajebichi} ref={hajebichiRef} /> diff --git a/src/components/floor-plan/modal/basic/step/Placement.jsx b/src/components/floor-plan/modal/basic/step/Placement.jsx index 4938b1e9..eff568cd 100644 --- a/src/components/floor-plan/modal/basic/step/Placement.jsx +++ b/src/components/floor-plan/modal/basic/step/Placement.jsx @@ -57,10 +57,6 @@ const Placement = forwardRef((props, refs) => { refs.isChidori.current = e.target.value } - useEffect(() => { - console.log('isChidori', isChidori) - }, [isChidori]) - const handleSetupLocation = (e) => { setSetupLocation(e.target.value) refs.setupLocation.current = e.target.value @@ -81,6 +77,20 @@ const Placement = forwardRef((props, refs) => { setSelectedItems({ ...selectedItems, [e.target.name]: e.target.checked }) } + useEffect(() => { + if (moduleSelectionData && moduleSelectionData.module.itemList.length > 0) { + let initCheckedModule = {} + moduleSelectionData.module.itemList.forEach((obj, index) => { + if (index === 0) { + initCheckedModule = { [obj.itemId]: true } + } else { + initCheckedModule = { ...initCheckedModule, [obj.itemId]: true } + } + }) + setSelectedItems(initCheckedModule) + } + }, []) + return ( <>
@@ -111,7 +121,13 @@ const Placement = forwardRef((props, refs) => {
- +
diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index b4d13d20..3783e033 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -163,7 +163,6 @@ export default function CircuitTrestleSetting({ id }) { .getObjects() .filter((obj) => obj.name === POLYGON_TYPE.MODULE_SETUP_SURFACE) .map((obj) => { - getModuleList(obj) return { roofSurfaceId: obj.id, roofSurface: canvas @@ -176,6 +175,7 @@ export default function CircuitTrestleSetting({ id }) { itemId: module.moduleInfo.itemId, circuit: module.circuitNumber ? module.circuitNumber : null, pcsItemId: module.circuit ? module.circuit?.pcsItemId : null, + uniqueId: module.id ? module.id : null, } }), } @@ -429,6 +429,8 @@ export default function CircuitTrestleSetting({ id }) { obj.circuit = null obj.pcsItemId = null }) + setAllocationType(ALLOCATION_TYPE.AUTO) + canvas.renderAll() }, }) } @@ -506,7 +508,7 @@ export default function CircuitTrestleSetting({ id }) { )} {tabNum === 1 && allocationType === ALLOCATION_TYPE.PASSIVITY && (
-
+
-
) } diff --git a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx index 1ad351eb..74a67576 100644 --- a/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx +++ b/src/components/floor-plan/modal/lineProperty/LinePropertySetting.jsx @@ -13,7 +13,7 @@ export default function LinePropertySetting(props) { const { id, pos = contextPopupPosition, target } = props const { getMessage } = useMessage() const { closePopup } = usePopup() - const { changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, changeSurfaceLinePropertyReset } = useSurfaceShapeBatch() + const { changeSurfaceLinePropertyEvent, changeSurfaceLineProperty, changeSurfaceLinePropertyReset } = useSurfaceShapeBatch({}) const { initEvent } = useEvent() // const { initEvent } = useContext(EventContext) diff --git a/src/components/floor-plan/modal/object/SizeSetting.jsx b/src/components/floor-plan/modal/object/SizeSetting.jsx index ebb925a6..b7df4986 100644 --- a/src/components/floor-plan/modal/object/SizeSetting.jsx +++ b/src/components/floor-plan/modal/object/SizeSetting.jsx @@ -17,7 +17,7 @@ export default function SizeSetting(props) { const { getMessage } = useMessage() const { closePopup } = usePopup() const { resizeObjectBatch } = useObjectBatch({}) - const { resizeSurfaceShapeBatch } = useSurfaceShapeBatch() + const { resizeSurfaceShapeBatch } = useSurfaceShapeBatch({}) const widthRef = useRef(null) const heightRef = useRef(null) diff --git a/src/components/floor-plan/modal/panelBatch/PanelBatchStatistics.jsx b/src/components/floor-plan/modal/panelBatch/PanelBatchStatistics.jsx index 2fbe78e9..4b41b72e 100644 --- a/src/components/floor-plan/modal/panelBatch/PanelBatchStatistics.jsx +++ b/src/components/floor-plan/modal/panelBatch/PanelBatchStatistics.jsx @@ -25,24 +25,27 @@ export default function PanelBatchStatistics() { {header.map((item, index) => ( - {item.name} + {item.name} ))} {rows.map((row, index) => ( - + {header.map((item, i) => ( - + {typeof row[item.prop] === 'number' ? row[item.prop].toLocaleString('ko-KR', { maximumFractionDigits: 4 }) : row[item.prop]} ))} ))} - {footer.map((item, index) => ( - {typeof item === 'number' ? item.toLocaleString('ko-KR', { maximumFractionDigits: 4 }) : item} - // {item.amount} + {header.map((header, index) => ( + + {typeof footer[header.prop] === 'number' + ? footer[header.prop].toLocaleString('ko-KR', { maximumFractionDigits: 4 }) + : footer[header.prop]} + ))} diff --git a/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx b/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx index 7fc56d57..263054cf 100644 --- a/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx +++ b/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx @@ -1,3 +1,4 @@ +'use client' import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' import { useEffect, useRef, useState } from 'react' @@ -17,7 +18,9 @@ export default function PlacementSurfaceSetting({ id, pos = { x: 50, y: 230 } }) const [yInversion, setYInversion] = useState(false) const canvas = useRecoilValue(canvasState) const { closePopup } = usePopup() - const { applySurfaceShape } = useSurfaceShapeBatch() + const [isHidden, setIsHidden] = useState(false) + + const { applySurfaceShape } = useSurfaceShapeBatch({ isHidden, setIsHidden }) const surfaceShapePolygons = canvas?.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) @@ -232,6 +235,7 @@ export default function PlacementSurfaceSetting({ id, pos = { x: 50, y: 230 } }) surfaceRefs.xInversion = xInversion //좌우반전 surfaceRefs.yInversion = yInversion //상하반전 surfaceRefs.rotate = rotate * 90 //앵글 + setIsHidden(true) applySurfaceShape(surfaceRefs, selectedType, id) } @@ -241,7 +245,7 @@ export default function PlacementSurfaceSetting({ id, pos = { x: 50, y: 230 } }) return ( -
+

{getMessage('plan.menu.placement.surface.arrangement')}