From 9cc5f07d9438b1a37d3ad605472f7f40bdaeb69b Mon Sep 17 00:00:00 2001 From: minsik Date: Tue, 5 Nov 2024 17:43:01 +0900 Subject: [PATCH 01/18] =?UTF-8?q?context=20menu=20short=20cut=20=EB=B2=84?= =?UTF-8?q?=EA=B7=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useContextMenu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 9099752e..979675be 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -241,7 +241,7 @@ export function useContextMenu() { return menu.shortcut?.includes(e.key) }) - if (temp.length > 0) menu = temp + if (temp.length > 0) menu = temp[0] } if (menu) handleClick(null, menu) From 40e5cf773dc55b5ff85d9a042baa0de95c1910b2 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 6 Nov 2024 08:42:41 +0900 Subject: [PATCH 02/18] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 49 ++++++++++------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 49fc92f8..9a455216 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -420,7 +420,6 @@ export default function StuffDetail() { useEffect(() => { if (isObjectNotEmpty(detailData)) { - // console.log('상세데이타세팅:::::', detailData) // 도도부현API get({ url: '/api/object/prefecture/list' }).then((res) => { if (!isEmptyArray(res)) { @@ -434,23 +433,18 @@ export default function StuffDetail() { let firstList let otherList let favList - // if (sessionState?.storeId === 'T01') { + if (session?.storeId === 'T01') { - // url = `/api/object/saleStore/${sessionState?.storeId}/firstList?userId=${sessionState?.userId}` url = `/api/object/saleStore/${session?.storeId}/firstList?userId=${session?.userId}` } else { - // if (sessionState.storeLvl === '1') { if (session.storeLvl === '1') { - // url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` } else { - // url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` } } get({ url: url }).then((res) => { if (!isEmptyArray(res)) { - // if (sessionState?.storeId === 'T01') { if (session?.storeId === 'T01') { firstList = res.filter((row) => row.saleStoreLevel === '1') firstList.sort((a, b) => (a.saleStoreId !== 'T01') - (b.saleStoreId !== 'T01') || a.saleStoreId - b.saleStoreId) @@ -459,14 +453,19 @@ export default function StuffDetail() { setFavoriteStoreList(favList) setShowSaleStoreList(favList) - form.setValue('saleStoreId', firstList[0].saleStoreId) - form.setValue('saleStoreName', firstList[0].saleStoreName) - form.setValue('saleStoreLevel', firstList[0].saleStoreLevel) - setSelOptions(firstList[0].saleStoreId) + if (detailData.firstAgentId != null) { + form.setValue('saleStoreId', detailData.firstAgentId) + setSelOptions(detailData.firstAgentId) + } else { + form.setValue('saleStoreId', detailData.saleStoreId) + setSelOptions(detailData.saleStoreId) + } //상세데이터의 1차점 아이디로 2차점 목록 조회하기 - // url = `/api/object/saleStore/${detailData?.saleStoreId}/list?firstFlg=0&userId=${sessionState?.userId}` - url = `/api/object/saleStore/${detailData?.saleStoreId}/list?firstFlg=0&userId=${session?.userId}` + + let data = detailData?.firstAgentId ? detailData.firstAgentId : detailData.saleStoreId + // url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=0&userId=${session?.userId}` + url = `/api/object/saleStore/${data}/list?firstFlg=0&userId=${session?.userId}` get({ url: url }).then((res) => { if (!isEmptyArray(res)) { @@ -482,7 +481,6 @@ export default function StuffDetail() { }) } else { //1차점 셀렉트박스 - // if (sessionState?.storeLvl === '1') { if (session?.storeLvl === '1') { firstList = res favList = res.filter((row) => row.priority !== 'B') @@ -572,7 +570,6 @@ export default function StuffDetail() { form.setValue('remarks', detailData.remarks) }) } - // }, [detailData, sessionState]) }, [detailData, session]) //경칭선택 변경 이벤트 @@ -1931,7 +1928,6 @@ export default function StuffDetail() {
- {/* {sessionState?.storeId === 'T01' && ( */} {session?.storeId === 'T01' && ( <>
@@ -1947,10 +1943,8 @@ export default function StuffDetail() { onChange={onSelectionChange} getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} - // isClearable={sessionState?.storeLvl === '1' ? true : false} - isClearable={session?.storeLvl === '1' ? true : false} - // isDisabled={sessionState?.storeLvl !== '1' ? true : false} - isDisabled={session?.storeLvl !== '1' ? true : false} + isClearable={detailData.tempFlg === '0' ? false : session?.storeLvl === '1' ? true : false} + isDisabled={detailData.tempFlg === '0' ? true : session?.storeLvl !== '1' ? true : false} value={saleStoreList.filter(function (option) { return option.saleStoreId === selOptions })} @@ -1967,7 +1961,6 @@ export default function StuffDetail() {
)} - {/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl === '1' && ( */} {session?.storeId !== 'T01' && session?.storeLvl === '1' && ( <>
@@ -1983,8 +1976,9 @@ export default function StuffDetail() { getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} isClearable={false} - // isDisabled={sessionState?.storeLvl !== '1' ? true : sessionState?.storeId !== 'T01' ? true : false} - isDisabled={session?.storeLvl !== '1' ? true : session?.storeId !== 'T01' ? true : false} + isDisabled={ + detailData.tempFlg === '0' ? true : session?.storeLvl !== '1' ? true : session?.storeId !== 'T01' ? true : false + } value={showSaleStoreList.filter(function (option) { return option.saleStoreId === selOptions })} @@ -2001,7 +1995,6 @@ export default function StuffDetail() {
)} - {/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl !== '1' && ( */} {session?.storeId !== 'T01' && session?.storeLvl !== '1' && ( <>
@@ -2062,10 +2055,10 @@ export default function StuffDetail() { onChange={onSelectionChange2} getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} - // isDisabled={sessionState?.storeLvl === '1' && form.watch('saleStoreId') != '' ? false : true} - isDisabled={session?.storeLvl === '1' && form.watch('saleStoreId') != '' ? false : true} - // isClearable={sessionState?.storeLvl === '1' ? true : false} - isClearable={session?.storeLvl === '1' ? true : false} + isDisabled={ + detailData.tempFlg === '0' ? true : session?.storeLvl === '1' && form.watch('saleStoreId') != '' ? false : true + } + isClearable={detailData.tempFlg === '0' ? false : session?.storeLvl === '1' ? true : false} value={otherSaleStoreList.filter(function (option) { return option.saleStoreId === otherSelOptions })} From 524eab2130541ba19a28a3219037d2814a365059 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 6 Nov 2024 08:58:10 +0900 Subject: [PATCH 03/18] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A3=BC=EC=84=9D=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 62 ----------------------------- 1 file changed, 62 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index b369defe..2603cc04 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -167,62 +167,6 @@ export default function Stuff() { } } - //그리드 체크박스 선택시 미사용 - // const getSelectedRowdata = (data) => { - // setSelectedRowData(data) - // setSelectedRowDataCount(data.length) - // } - - //물건삭제 - // const fnDeleteRowData = (data) => { - // if (data.length === 0) { - // return alert('삭제할 데이터를 선택하세요') - // } - // let errCount = 0 - // data.forEach((cell) => { - // if (!cell.objectNo) { - // if (errCount === 0) { - // alert('물건정보가 있는 행만 삭제 됩니다') - // } - // errCount++ - // } - // }) - // } - - //행추가 - // let newCount = 0 - // const addRowItems = () => { - // // console.log('girdRef::::::', gridRef.current.api) - // const newItems = [ - // { - // mission: newCount + 1, - // successful: true, - // }, - // ] - // gridRef.current.api.applyTransaction({ - // add: newItems, - // addIndex: newCount, - // }) - // newCount++ - // } - - //행삭제 - // const removeRowItems = () => { - // // console.log('selectedRowData::', selectedRowData) - // let errCount = 0 - // selectedRowData.forEach((cell) => { - // if (!cell.company) { - // let newSelectedRowData = selectedRowData.filter((item) => item.company == null) - // gridRef.current.api.applyTransaction({ remove: newSelectedRowData }) - // } else { - // if (errCount === 0) { - // alert('행추가로 추가 한 행만 삭제됩니다.') - // } - // errCount++ - // } - // }) - // } - // 진입시 그리드 데이터 조회 useEffect(() => { if (isObjectNotEmpty(session)) { @@ -297,8 +241,6 @@ export default function Stuff() { //조회를 눌렀을때 async function fetchData() { - let saleStoreId - saleStoreId = stuffSearchParams?.schSelSaleStoreId ? stuffSearchParams.schSelSaleStoreId : session?.storeId const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` await get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { @@ -330,8 +272,6 @@ export default function Stuff() { }) setPageNo(1) - let saleStoreId - saleStoreId = stuffSearchParams?.schSelSaleStoreId ? stuffSearchParams.schSelSaleStoreId : session?.storeId const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { @@ -364,8 +304,6 @@ export default function Stuff() { }) setPageNo(1) - let saleStoreId - saleStoreId = stuffSearchParams?.schSelSaleStoreId ? stuffSearchParams.schSelSaleStoreId : session?.storeId const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { From 9577105d23d6abe1c256aeba46da98e7853d0888 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Wed, 6 Nov 2024 10:44:59 +0900 Subject: [PATCH 04/18] =?UTF-8?q?=EB=8F=99=EC=84=A0=20=EC=9D=B4=EB=8F=99?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useMovementSetting.js | 119 ++++++++++++++++++++-- 1 file changed, 108 insertions(+), 11 deletions(-) diff --git a/src/hooks/roofcover/useMovementSetting.js b/src/hooks/roofcover/useMovementSetting.js index f872fc17..34961ea0 100644 --- a/src/hooks/roofcover/useMovementSetting.js +++ b/src/hooks/roofcover/useMovementSetting.js @@ -6,6 +6,7 @@ import { useEffect, useRef, useState } from 'react' import { useEvent } from '@/hooks/useEvent' import { POLYGON_TYPE } from '@/common/common' import { OUTER_LINE_TYPE } from '@/store/outerLineAtom' +import { QLine } from '@/components/fabric/QLine' //동선이동 형 올림 내림 export function useMovementSetting(id) { @@ -18,6 +19,7 @@ export function useMovementSetting(id) { const { closePopup } = usePopup() const { getMessage } = useMessage() const currentObject = useRecoilValue(currentObjectState) + const selectedObject = useRef(null) const buttonType = [ { id: 1, name: getMessage('modal.movement.flow.line.move'), type: TYPE.FLOW_LINE }, { id: 2, name: getMessage('modal.movement.flow.line.updown'), type: TYPE.UP_DOWN }, @@ -40,6 +42,7 @@ export function useMovementSetting(id) { } useEffect(() => { + removeFlowLine() typeRef.current = type const outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine') // 기존 outerLine의 selectable true outerLines.forEach((line) => { @@ -85,8 +88,10 @@ export function useMovementSetting(id) { canvas.renderAll() addCanvasMouseEventListener('mouse:move', mouseMoveEvent) + addCanvasMouseEventListener('mouse:down', mouseDownEvent) return () => { initEvent() + removeFlowLine() const wallLines = canvas.getObjects().filter((obj) => obj.name === POLYGON_TYPE.WALL) wallLines.forEach((line) => { line.set({ visible: true }) @@ -107,11 +112,14 @@ export function useMovementSetting(id) { outerLines.forEach((line) => { line.set({ stroke: 'black' }) }) - clearRef() + selectedObject.current = null + if (!currentObject) { return } + clearRef() + selectedObject.current = currentObject if (currentObject.name === OUTER_LINE_TYPE.OUTER_LINE) { currentObject.set({ stroke: '#EA10AC' }) currentObject.bringToFront() @@ -134,14 +142,91 @@ export function useMovementSetting(id) { } } - const mouseMoveEvent = (e) => { + const mouseDownEvent = (e) => { if (typeRef.current === TYPE.FLOW_LINE) { - flowLineEvent(e) + flowLineDownEvent(e) } else { - updownEvent(e) + updownDownEvent(e) } } - const flowLineEvent = (e) => { + + const removeFlowLine = () => { + const flowLine = canvas.getObjects().filter((obj) => obj.name === 'flowLine') + flowLine.forEach((line) => { + canvas.remove(line) + }) + } + + const mouseMoveEvent = (e) => { + if (typeRef.current === TYPE.FLOW_LINE) { + flowLineMoveEvent(e) + } else { + updownMoveEvent(e) + } + } + //동선 이동 마우스 클릭 이벤트 + const flowLineDownEvent = (e) => { + const target = selectedObject.current + if (!target) { + return + } + + const direction = target.direction + + removeFlowLine() + + let newPoint = [] + if (direction === 'left' || direction === 'right') { + if (FLOW_LINE_REF.DOWN_LEFT_RADIO_REF.current.checked) { + newPoint = [ + target.x1, + target.y1 + Number(FLOW_LINE_REF.DOWN_LEFT_INPUT_REF.current.value / 10), + target.x2, + target.y2 + Number(FLOW_LINE_REF.DOWN_LEFT_INPUT_REF.current.value / 10), + ] + } else { + newPoint = [ + target.x1, + target.y1 - Number(FLOW_LINE_REF.UP_RIGHT_INPUT_REF.current.value / 10), + target.x2, + target.y2 - Number(FLOW_LINE_REF.UP_RIGHT_INPUT_REF.current.value / 10), + ] + } + } else { + if (FLOW_LINE_REF.DOWN_LEFT_RADIO_REF.current.checked) { + newPoint = [ + target.x1 - Number(FLOW_LINE_REF.DOWN_LEFT_INPUT_REF.current.value / 10), + target.y1, + target.x2 - Number(FLOW_LINE_REF.DOWN_LEFT_INPUT_REF.current.value / 10), + target.y2, + ] + } else { + newPoint = [ + target.x1 + Number(FLOW_LINE_REF.UP_RIGHT_INPUT_REF.current.value / 10), + target.y1, + target.x2 + Number(FLOW_LINE_REF.UP_RIGHT_INPUT_REF.current.value / 10), + target.y2, + ] + } + } + + const cloned = new fabric.Line(newPoint, { + stroke: 'red', + strokeWidth: 4, + name: 'flowLine', + currentLine: target, + }) + + canvas.add(cloned) + canvas.renderAll() + canvas.discardActiveObject() + } + + //형 올림내림 마우스 클릭 이벤트 + const updownDownEvent = (e) => { + console.log('updownDownEvent') + } + const flowLineMoveEvent = (e) => { const target = canvas.getActiveObject() if (!target) { return @@ -181,7 +266,7 @@ export function useMovementSetting(id) { canvas?.renderAll() } - const updownEvent = (e) => { + const updownMoveEvent = (e) => { const target = canvas.getActiveObject() if (!target) { return @@ -222,12 +307,24 @@ export function useMovementSetting(id) { const handleSave = () => { if (type === TYPE.FLOW_LINE) { - // 동선이동 - if (FLOW_LINE_REF.DOWN_LEFT_RADIO_REF.current.checked) { - // 높이 변경: 아래, 왼쪽 체크 - } else { - // 높이 변경: 위, 오른쪽 체크 + const flowLine = canvas.getObjects().find((obj) => obj.name === 'flowLine') + + const currentLine = flowLine.currentLine + if (!flowLine || !currentLine) { + return } + + currentLine.set({ + x1: flowLine.x1, + y1: flowLine.y1, + x2: flowLine.x2, + y2: flowLine.y2, + }) + currentLine.startPoint = { x: flowLine.x1, y: flowLine.y1 } + currentLine.endPoint = { x: flowLine.x2, y: flowLine.y2 } + + canvas.remove(flowLine) + canvas.renderAll() } else { // 형 올림내림 if (UP_DOWN_REF.UP_RADIO_REF.current.checked) { From daf6bd4e009582ea81138b410df3f73a26ab48c1 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Wed, 6 Nov 2024 12:44:35 +0900 Subject: [PATCH 05/18] =?UTF-8?q?=EB=B0=B0=EC=B9=98=EB=A9=B4=20=EC=98=A4?= =?UTF-8?q?=EB=B8=8C=EC=A0=9D=ED=8A=B8=20=EC=9D=B4=EB=8F=99=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/fabric/QPolygon.js | 17 ++ .../floor-plan/modal/object/SizeSetting.jsx | 16 +- src/hooks/common/useCanvasConfigInitialize.js | 9 +- src/hooks/object/useObjectBatch.js | 50 +++-- src/hooks/surface/useSurfaceShapeBatch.js | 208 ++++++++++++++++++ src/hooks/useContextMenu.js | 9 +- src/hooks/usePlan.js | 8 +- 7 files changed, 288 insertions(+), 29 deletions(-) diff --git a/src/components/fabric/QPolygon.js b/src/components/fabric/QPolygon.js index 5d1bad29..44cbfb37 100644 --- a/src/components/fabric/QPolygon.js +++ b/src/components/fabric/QPolygon.js @@ -137,6 +137,22 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { }) }) + this.on('polygonMoved', () => { + //폴리곤일때만 사용 + let matrix = this.calcTransformMatrix() + + let transformedPoints = this.get('points') + .map((p) => { + return new fabric.Point(p.x - this.pathOffset.x, p.y - this.pathOffset.y) + }) + .map((p) => { + return fabric.util.transformPoint(p, matrix) + }) + this.set('points', transformedPoints) + this.set('pathOffset', { x: this.left, y: this.top }) + this.setCoords() + }) + // polygon.fillCell({ width: 50, height: 30, padding: 10 }) }, @@ -211,6 +227,7 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { let points = this.getCurrentPoints() + this.texts = [] points.forEach((start, i) => { const end = points[(i + 1) % points.length] const dx = end.x - start.x diff --git a/src/components/floor-plan/modal/object/SizeSetting.jsx b/src/components/floor-plan/modal/object/SizeSetting.jsx index 1b20b853..333150ea 100644 --- a/src/components/floor-plan/modal/object/SizeSetting.jsx +++ b/src/components/floor-plan/modal/object/SizeSetting.jsx @@ -8,6 +8,8 @@ import { contextPopupPositionState } from '@/store/popupAtom' import { useRef, useState, useEffect } from 'react' import { useObjectBatch } from '@/hooks/object/useObjectBatch' import { useEvent } from '@/hooks/useEvent' +import { BATCH_TYPE, POLYGON_TYPE } from '@/common/common' +import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' export default function SizeSetting(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -15,8 +17,8 @@ export default function SizeSetting(props) { const { id, pos = contextPopupPosition, target } = props const { getMessage } = useMessage() const { closePopup } = usePopup() - const { reSizeObjectBatch } = useObjectBatch({}) - + const { resizeObjectBatch } = useObjectBatch({}) + const { reSizePolygon } = useSurfaceShapeBatch() const widthRef = useRef(null) const heightRef = useRef(null) @@ -30,7 +32,15 @@ export default function SizeSetting(props) { const width = widthRef.current.value const height = heightRef.current.value - reSizeObjectBatch(settingTarget, target, width, height) + if ( + target.name === BATCH_TYPE.OPENING || + target.name === BATCH_TYPE.SHADOW || + target.name === BATCH_TYPE.TRIANGLE_DORMER || + target.name === BATCH_TYPE.PENTAGON_DORMER || + target.name === POLYGON_TYPE.ROOF + ) { + resizeObjectBatch(settingTarget, target, width, height) + } } return ( diff --git a/src/hooks/common/useCanvasConfigInitialize.js b/src/hooks/common/useCanvasConfigInitialize.js index 8d8eb38b..c4f137b0 100644 --- a/src/hooks/common/useCanvasConfigInitialize.js +++ b/src/hooks/common/useCanvasConfigInitialize.js @@ -100,8 +100,6 @@ export function useCanvasConfigInitialize() { const groups = canvas.getObjects().filter((obj) => obj.groupYn && obj.name === 'dimensionGroup') const groupIds = [] - console.log('groupDimensionInit', groups) - groups.forEach((group) => { if (!groupIds.includes(group.id)) { groupIds.push(group.id) @@ -157,6 +155,7 @@ export function useCanvasConfigInitialize() { //그룹아이디로 캔버스의 객체를 조회함 const groupObjects = canvas.getObjects().filter((obj) => obj.groupId === id || obj.id === id) const objectsName = canvas.getObjects().filter((obj) => obj.groupId === id || obj.id === id)[0].groupName + const objectsParentId = canvas.getObjects().filter((obj) => obj.groupId === id || obj.id === id)[0].parentId let objectArray = [] @@ -181,8 +180,14 @@ export function useCanvasConfigInitialize() { lockMovementY: true, originX: 'center', originY: 'center', + parentId: objectsParentId, }) canvas.add(group) + + //그룹 객체 재그룹 완료 + group.getObjects().forEach((obj) => { + obj.fire('modified') + }) }) } diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index 19cbadec..3fb47cee 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -33,10 +33,16 @@ export function useObjectBatch({ isHidden, setIsHidden }) { }, []) const dbClickEvent = () => { + console.log('dbClickEvent 실행') const dormerObject = canvas.getObjects().filter((obj) => obj.name === BATCH_TYPE.TRIANGLE_DORMER || obj.name === BATCH_TYPE.PENTAGON_DORMER) + console.log('dormerObject', dormerObject) + if (dormerObject) { + canvas.off('mouse:dblclick') canvas.on('mouse:dblclick', (e) => { + console.log('event', e) + if (e.target && e.target instanceof fabric.Group) { const pointer = canvas.getPointer(e.e) const objects = e.target._objects @@ -71,7 +77,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { let rect, isDown, origX, origY let selectedSurface //프리입력 - console.log('useObjectBatch', isHidden) + if (selectedType === INPUT_TYPE.FREE) { addCanvasMouseEventListener('mouse:down', (e) => { isDown = true @@ -160,7 +166,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { } isDown = false - rect.set({ name: objName }) + rect.set({ name: objName, parentId: selectedSurface.id }) rect.setCoords() initEvent() @@ -204,6 +210,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { lockRotation: true, lockScalingX: true, lockScalingY: true, + parentId: selectedSurface.id, }) //개구냐 그림자냐에 따라 변경 @@ -241,7 +248,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { } isDown = false - rect.set({ name: objName }) + rect.set({ name: objName, parentId: selectedSurface.id }) rect.setCoords() initEvent() if (setIsHidden) setIsHidden(false) @@ -483,6 +490,9 @@ export function useObjectBatch({ isHidden, setIsHidden }) { subTargetCheck: true, name: dormerName, id: id, + parentId: selectedSurface.id, + originX: 'center', + originY: 'center', }) canvas?.add(objectGroup) @@ -693,6 +703,10 @@ export function useObjectBatch({ isHidden, setIsHidden }) { subTargetCheck: true, name: dormerName, id: id, + parentId: selectedSurface.id, + groupYn: true, + originX: 'center', + originY: 'center', }) canvas?.add(objectGroup) @@ -858,9 +872,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { return [leftPoints, rightPoints] } - const reSizeObjectBatch = (side, target, width, height) => { - const targetObj = canvas.getActiveObject() - + const resizeObjectBatch = (side, target, width, height) => { const objectWidth = target.width const objectHeight = target.height const changeWidth = (width / 10 / objectWidth).toFixed(2) @@ -884,7 +896,6 @@ export function useObjectBatch({ isHidden, setIsHidden }) { const newCoords = target.getPointByOrigin(sideX, sideY) target.set({ - ...target, originX: sideX, originY: sideY, left: newCoords.x, @@ -894,8 +905,8 @@ export function useObjectBatch({ isHidden, setIsHidden }) { target.setCoords() canvas?.renderAll() //변경 좌표를 한번 적용 - target.scaleX = changeWidth === 0 ? 1 : changeWidth - target.scaleY = changeHeight === 0 ? 1 : changeHeight + target.scaleX = changeWidth || 1 + target.scaleY = changeHeight || 1 //크기 변경후 좌표를 재 적용 const changedCoords = target.getPointByOrigin('center', 'center') @@ -910,9 +921,12 @@ export function useObjectBatch({ isHidden, setIsHidden }) { if (target.name === 'roof') { //얘는 일단 도머에 적용함 - target._objects.forEach((obj) => { - setSurfaceShapePattern(obj) - }) + if (target.type === 'group') { + target._objects.forEach((obj) => setSurfaceShapePattern(obj)) + } else { + setSurfaceShapePattern(target) + target.fire('modified') + } } // target.setCoords() canvas.renderAll() @@ -923,27 +937,29 @@ export function useObjectBatch({ isHidden, setIsHidden }) { const reGroupObject = (groupObj) => { groupObj._restoreObjectsState() //이건 실행만 되도 그룹이 변경됨 const reGroupObjects = [] - groupObj._objects.forEach((obj) => { const newObj = new QPolygon(obj.getCurrentPoints(), { ...obj, points: obj.getCurrentPoints(), scaleX: 1, scaleY: 1, + texts: [], }) reGroupObjects.push(newObj) canvas.remove(obj) - if (obj.direction) { drawDirectionArrow(obj) } + newObj.fire('modified') }) - const reGroup = new fabric.Group(reGroupObjects, { subTargetCheck: true, name: groupObj.name, id: groupObj.id, groupYn: true, + parentId: groupObj.parentId, + originX: 'center', + originY: 'center', }) canvas?.add(reGroup) canvas?.remove(groupObj) @@ -965,7 +981,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { }) initEvent() obj.setCoords() - reGroupObject(obj) + if (obj.type === 'group') reGroupObject(obj) }) } } @@ -975,7 +991,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { applyDormers, splitDormerTriangle, splitDormerPentagon, - reSizeObjectBatch, + resizeObjectBatch, moveObjectBatch, } } diff --git a/src/hooks/surface/useSurfaceShapeBatch.js b/src/hooks/surface/useSurfaceShapeBatch.js index 2bfefb98..9457169c 100644 --- a/src/hooks/surface/useSurfaceShapeBatch.js +++ b/src/hooks/surface/useSurfaceShapeBatch.js @@ -12,10 +12,12 @@ import { useEvent } from '@/hooks/useEvent' import { usePopup } from '@/hooks/usePopup' import { roofDisplaySelector } from '@/store/settingAtom' import { usePolygon } from '@/hooks/usePolygon' +import { fontSelector } from '@/store/fontAtom' export function useSurfaceShapeBatch() { const { getMessage } = useMessage() const { drawDirectionArrow } = usePolygon() + const lengthTextFont = useRecoilValue(fontSelector('lengthText')) const canvas = useRecoilValue(canvasState) const globalPitch = useRecoilValue(globalPitchState) @@ -598,8 +600,214 @@ export function useSurfaceShapeBatch() { }) } + const findAllChildren = (parentId) => { + let allChildren = [] + + // 직계 자식 객체들 찾기 + const directChildren = canvas.getObjects().filter((obj) => obj.parentId === parentId) + + directChildren.forEach((child) => { + allChildren.push(child) // 현재 자식 추가 + + // 자식이 그룹인 경우 + if (child.type === 'group') { + // 그룹 내부의 객체들 추가 + child.getObjects().forEach((groupItem) => { + allChildren.push(groupItem) + // 그룹 내부 객체의 자식들도 찾기 + const nestedChildren = findAllChildren(groupItem.id) + allChildren.push(...nestedChildren) + }) + } + + // 현재 자식의 하위 자식들 찾기 + const childrenOfChild = findAllChildren(child.id) + allChildren.push(...childrenOfChild) + }) + + // 중복 제거하여 반환 + return [...new Set(allChildren)] + } + + const findGroupObjects = (parentId) => { + let groupObjectsArray = [] + + // 직계 자식 객체들 찾기 + const directChildren = canvas.getObjects().filter((obj) => obj.parentId === parentId) + + // 각 자식 객체에 대해 처리 + directChildren.forEach((child) => { + groupObjectsArray.push(child) // 현재 자식 추가 + + // 자식이 그룹인 경우 그룹 내부 객체들도 처리 + if (child.type === 'group') { + child.getObjects().forEach((groupItem) => { + // 그룹 내부 각 아이템의 하위 객체들 찾기 + const nestedObjects = findGroupObjects(groupItem.id) + groupObjectsArray.push(...nestedObjects) + }) + } + + // 일반 자식의 하위 객체들 찾기 + const childObjects = findGroupObjects(child.id) + groupObjectsArray.push(...childObjects) + }) + + return groupObjectsArray + } + + function getAllRelatedObjects(id) { + const result = [] + const map = new Map() + + // Create a map of objects by their id + canvas.getObjects().forEach((obj) => { + map.set(obj.id, obj) + }) + + // Helper function to recursively find all related objects + function findRelatedObjects(id) { + const obj = map.get(id) + if (obj) { + result.push(obj) + canvas.getObjects().forEach((o) => { + if (o.parentId === id) { + findRelatedObjects(o.id) + } + }) + } + } + + // Start the search with the given parentId + findRelatedObjects(id) + + return result + } + + const moveSurfaceShapeBatch = () => { + const roof = canvas.getActiveObject() + + if (roof) { + let isDragging = false + + const childrenObjects = canvas.getObjects().filter((obj) => obj.parentId === roof.id) + + console.log('childrenObjects', childrenObjects) + + // const groupObjects = canvas.getObjects().filter((obj) => obj.parentId === roof.id && obj.type === 'group') + + // const ungroupObjects = [] // 그룹 해제된 객체들 + // const groupChildObjects = [] + + // groupObjects.forEach((obj) => { + // obj._restoreObjectsState() + // obj.getObjects().forEach((o) => { + // o.set({ + // ungroupYn: true, + // }) + // canvas.add(o) + // ungroupObjects.push(o) + // }) + // canvas.remove(obj) + // }) + + // const childObjects = findAllChildren(roof.id) + // groupObjects.forEach((obj) => { + // groupChildObjects.push(...obj.getObjects()) + // }) + + // console.log('ungroupObjects', ungroupObjects) + // console.log('childObjects', childObjects) + // console.log('groupChildObjects', groupChildObjects) + + // const children = canvas.getObjects().filter((obj) => obj.parentId === roof.id) + // let grandChildren = [] + + // children.forEach((child) => { + // if (child.type === 'group') { + // child.getObjects().forEach((grandChild) => { + // const groupObjects = canvas.getObjects().filter((obj) => obj.parentId === grandChild.id) + // grandChildren.push(...groupObjects) + // }) + // } else { + // grandChildren.push(...canvas.getObjects().filter((obj) => obj.parentId === child.id)) + // } + // }) + + const selectionArray = [roof, ...childrenObjects] + + const selection = new fabric.ActiveSelection(selectionArray, { + canvas: canvas, + draggable: true, + lockMovementX: false, // X축 이동 허용 + lockMovementY: false, // Y축 이동 허용 + originX: 'center', + originY: 'center', + }) + + canvas.setActiveObject(selection) + + addCanvasMouseEventListener('mouse:up', (e) => { + isDragging = false + canvas.selection = true + + canvas.discardActiveObject() // 모든 선택 해제 + canvas.requestRenderAll() // 화면 업데이트 + + selection.getObjects().forEach((obj) => { + obj.set({ + lockMovementX: true, + lockMovementY: true, + }) + obj.setCoords() + + if (obj.type === 'group') { + reGroupObject(obj) + } + }) + + canvas.renderAll() + roof.fire('polygonMoved') + if (roof.type === 'group') reGroupObject(obj) + drawDirectionArrow(roof) + initEvent() + }) + } + } + + const reGroupObject = (groupObj) => { + groupObj._restoreObjectsState() //이건 실행만 되도 그룹이 변경됨 + const reGroupObjects = [] + + groupObj._objects.forEach((obj) => { + const newObj = new QPolygon(obj.getCurrentPoints(), { + ...obj, + points: obj.getCurrentPoints(), + scaleX: 1, + scaleY: 1, + }) + reGroupObjects.push(newObj) + canvas.remove(obj) + + if (obj.direction) { + drawDirectionArrow(obj) + } + }) + + const reGroup = new fabric.Group(reGroupObjects, { + subTargetCheck: true, + name: groupObj.name, + id: groupObj.id, + groupYn: true, + parentId: groupObj.parentId, + }) + canvas?.add(reGroup) + canvas?.remove(groupObj) + } + return { applySurfaceShape, deleteAllSurfacesAndObjects, + moveSurfaceShapeBatch, } } diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 979675be..7f8b9db5 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -33,6 +33,7 @@ import RowRemove from '@/components/floor-plan/modal/module/row/RowRemove' import RowInsert from '@/components/floor-plan/modal/module/row/RowInsert' import CircuitNumberEdit from '@/components/floor-plan/modal/module/CircuitNumberEdit' import { useObjectBatch } from '@/hooks/object/useObjectBatch' +import { useSurfaceShapeBatch } from '@/hooks/surface/useSurfaceShapeBatch' export function useContextMenu() { const currentMenu = useRecoilValue(currentMenuState) // 현재 메뉴 @@ -50,7 +51,7 @@ export function useContextMenu() { const [column, setColumn] = useState(null) const { handleZoomClear } = useCanvasEvent() const { moveObjectBatch } = useObjectBatch({}) - + const { moveSurfaceShapeBatch } = useSurfaceShapeBatch() const currentMenuSetting = () => { switch (currentMenu) { case MENU.PLAN_DRAWING: @@ -256,6 +257,7 @@ export function useContextMenu() { }, [currentContextMenu]) useEffect(() => { + console.log('currentObject', currentObject) if (currentObject?.name) { console.log(currentObject?.name) switch (currentObject.name) { @@ -305,22 +307,25 @@ export function useContextMenu() { { id: 'sizeEdit', name: '사이즈 변경', - component: , + component: , }, { id: 'roofMaterialRemove', shortcut: ['d', 'D'], name: `${getMessage('contextmenu.remove')}(D)`, + fn: () => deleteObject(), }, { id: 'roofMaterialMove', shortcut: ['m', 'M'], name: `${getMessage('contextmenu.move')}(M)`, + fn: () => moveSurfaceShapeBatch(), }, { id: 'roofMaterialCopy', shortcut: ['c', 'C'], name: `${getMessage('contextmenu.copy')}(C)`, + fn: () => copyObject(), }, ], [ diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index bddebc63..d1887f6f 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -77,11 +77,9 @@ export function usePlan() { }) //디렉션이 있는 경우에만 - if (group.lineDirection) { - obj.set({ - lineDirection: group.lineDirection, - }) - } + if (group.lineDirection) obj.set({ lineDirection: group.lineDirection }) + //부모객체가 있으면 (면형상 위에 도머등..) + if (group.parentId) obj.set({ parentId: group.parentId }) canvas?.add(obj) obj.setCoords() From 2a108eb1afaf75d4419833c773ded4fbd4e34bab Mon Sep 17 00:00:00 2001 From: yjnoh Date: Wed, 6 Nov 2024 13:57:04 +0900 Subject: [PATCH 06/18] =?UTF-8?q?dormeroffset=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/object/DormerOffset.jsx | 57 +++++++++++++------ src/hooks/object/useObjectBatch.js | 30 +++++++++- 2 files changed, 70 insertions(+), 17 deletions(-) diff --git a/src/components/floor-plan/modal/object/DormerOffset.jsx b/src/components/floor-plan/modal/object/DormerOffset.jsx index bc56e4b7..a90b61ee 100644 --- a/src/components/floor-plan/modal/object/DormerOffset.jsx +++ b/src/components/floor-plan/modal/object/DormerOffset.jsx @@ -1,9 +1,11 @@ +import { useState, useEffect, useRef } from 'react' import { useMessage } from '@/hooks/useMessage' import WithDraggable from '@/components/common/draggable/WithDraggable' import { useRecoilValue } from 'recoil' import { contextPopupPositionState } from '@/store/popupAtom' import { usePopup } from '@/hooks/usePopup' -import { useState } from 'react' +import { useObjectBatch } from '@/hooks/object/useObjectBatch' +import { canvasState } from '@/store/canvasAtom' export default function DormerOffset(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) @@ -12,6 +14,31 @@ export default function DormerOffset(props) { const { closePopup } = usePopup() const [arrow1, setArrow1] = useState(null) const [arrow2, setArrow2] = useState(null) + const arrow1LengthRef = useRef() + const arrow2LengthRef = useRef() + + const canvas = useRecoilValue(canvasState) + const { dormerOffsetKeyEvent, dormerOffset } = useObjectBatch({}) + + useEffect(() => { + if (canvas) { + dormerOffsetKeyEvent(setArrow1, setArrow2) + } + }, []) + + const handleOffsetDormer = () => { + const length1 = arrow1LengthRef.current.value + const length2 = arrow2LengthRef.current.value + + dormerOffset(arrow1, arrow2, length1, length2) + + setArrow1(null) + setArrow2(null) + arrow1LengthRef.current.value = '' + arrow2LengthRef.current.value = '' + + // closePopup(id) + } return (
@@ -29,44 +56,40 @@ export default function DormerOffset(props) {

{getMessage('length')}

- +
mm
- +
mm
@@ -75,7 +98,9 @@ export default function DormerOffset(props) {
- +
diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index 3fb47cee..41583a81 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -16,7 +16,7 @@ import { fontSelector } from '@/store/fontAtom' export function useObjectBatch({ isHidden, setIsHidden }) { const { getMessage } = useMessage() const canvas = useRecoilValue(canvasState) - const { addCanvasMouseEventListener, initEvent } = useEvent() + const { addCanvasMouseEventListener, initEvent, addDocumentEventListener } = useEvent() const { swalFire } = useSwal() const { drawDirectionArrow } = usePolygon() const lengthTextFont = useRecoilValue(fontSelector('lengthText')) @@ -963,6 +963,8 @@ export function useObjectBatch({ isHidden, setIsHidden }) { }) canvas?.add(reGroup) canvas?.remove(groupObj) + + return reGroup } const moveObjectBatch = () => { @@ -986,6 +988,30 @@ export function useObjectBatch({ isHidden, setIsHidden }) { } } + const dormerOffsetKeyEvent = (setArrow1, setArrow2) => { + addDocumentEventListener('keydown', document, (e) => { + if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { + const keyEvent = e.key === 'ArrowDown' ? 'down' : 'up' + setArrow1(keyEvent) + } else if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') { + const keyEvent = e.key === 'ArrowLeft' ? 'left' : 'right' + setArrow2(keyEvent) + } + }) + } + + const dormerOffset = (arrow1, arrow2, length1, length2) => { + length1 = parseInt(length1) / 10 + length2 = parseInt(length2) / 10 + + const dormer = canvas.getActiveObject() + if (length1) dormer.top = arrow1 === 'down' ? dormer.top + length1 : dormer.top - length1 + if (length2) dormer.left = arrow2 === 'left' ? dormer.left - length2 : dormer.left + length2 + + const newDormer = reGroupObject(dormer) + canvas?.setActiveObject(newDormer) + } + return { applyOpeningAndShadow, applyDormers, @@ -993,5 +1019,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { splitDormerPentagon, resizeObjectBatch, moveObjectBatch, + dormerOffsetKeyEvent, + dormerOffset, } } From 2d07bceb5dcd098c417ede2a2e164e6101a44f69 Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 6 Nov 2024 14:28:50 +0900 Subject: [PATCH 07/18] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=ED=99=94=EB=A9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 111 +++++++++++++++++++++++---- 1 file changed, 96 insertions(+), 15 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 47f99c3d..813962b3 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -10,7 +10,7 @@ import SingleDatePicker from '../common/datepicker/SingleDatePicker' import EstimateFileUploader from './EstimateFileUploader' import { useAxios } from '@/hooks/useAxios' import { globalLocaleStore } from '@/store/localeAtom' -import { isObjectNotEmpty } from '@/util/common-utils' +import { isNotEmptyArray, isObjectNotEmpty } from '@/util/common-utils' import dayjs from 'dayjs' import { useCommonCode } from '@/hooks/common/useCommonCode' import Select from 'react-select' @@ -21,6 +21,12 @@ export default function Estimate({ params }) { const [planNo, setPlanNo] = useState('') //플랜번호 const [files, setFiles] = useState([]) // 보내는 첨부파일 + //체크박스 + const [checkItems, setCheckItems] = useState(new Set()) + const [checkedList, setCheckedList] = useState([]) + + const [showContentCode, setShowContentCode] = useState('ATTR001') + //견적특이사항 접고 펼치기 const [hidden, setHidden] = useState(false) @@ -40,6 +46,11 @@ export default function Estimate({ params }) { //견적서 상세데이터 const { state, setState } = useEstimateController(params.pid) + //견적특이사항 상세 데이터 LIST + + //견적특이사항 List + const [specialNoteList, setSpecialNoteList] = useState([]) + const globalLocaleState = useRecoilValue(globalLocaleStore) const { get, post } = useAxios(globalLocaleState) @@ -65,17 +76,57 @@ export default function Estimate({ params }) { if (code1 != null) { setHonorificCodeList(code1) } - - //견적특이사항 API호출 - //http://localhost:8080/api/estimate/special-note-list }, []) + useEffect(() => { + //견적특이사항 API호출 + //여러개 선택하면 구분자로 (、) + let url = `/api/estimate/special-note-list` + get({ url: url }).then((res) => { + if (isNotEmptyArray(res)) { + if (state?.estimateOption) { + res.map((row) => { + let estimateOption = state?.estimateOption?.split('、') + row.text = false + estimateOption.map((row2) => { + if (row2 === row.code) { + row.text = true + } + }) + }) + setSpecialNoteList(res) + } + } + }) + }, [state?.estimateOption]) + //견적일 set useEffect(() => { - let estimateDatej = dayjs(startDate).format('YYYY-MM-DD') - setState({ estimateDate: estimateDatej }) + let estimateDate = dayjs(startDate).format('YYYY-MM-DD') + setState({ estimateDate: estimateDate }) }, [startDate]) + useEffect(() => { + //선택된 견적특이사항 setState + if (isNotEmptyArray(specialNoteList)) { + const liveCheckedData = specialNoteList.filter((row) => row.text === true) + + const data = [] + for (let ele of liveCheckedData) { + data.push(ele.code) + } + + const newData = data.join('、') + setState({ estimateOption: newData }) + } + }, [specialNoteList]) + + // 견적특이사항 remark 보여주기 + const settingShowContent = (code, event) => { + setShowContentCode(code) + event.stopPropagation() + } + return (
@@ -359,17 +410,47 @@ export default function Estimate({ params }) { {/* 견적 특이사항 코드영역시작 */}
-
+
+ {/* SpecialNoteList반복문 */} + {specialNoteList.map((row) => { + return ( +
{ + settingShowContent(row.code, event) + }} + > +
+ { + setSpecialNoteList((specialNote) => + specialNote.map((temp) => (temp.code === row.code ? { ...temp, text: !temp.text } : temp)), + ) + settingShowContent(row.code, event) + }} + /> + +
+
+ ) + })} +
{/* 견적특이사항 선택한 내용?영역시작 */}
-
-
제목11??
-
제목1 비고
-
-
-
제목22??
-
제목2 비고
-
+ {specialNoteList.map((row) => { + if (row.code === showContentCode) { + return ( +
+
{row.codeNm}
+
{row.remarks}
+
+ ) + } + })}
{/* 견적특이사항 선택한 내용?영역끝 */}
From 7954c45c7efe76ae79256220f950825962739846 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Wed, 6 Nov 2024 15:04:42 +0900 Subject: [PATCH 08/18] =?UTF-8?q?=EA=B0=9C=EA=B5=AC=20=EC=98=A4=ED=94=84?= =?UTF-8?q?=EC=85=8B=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/modal/object/DormerOffset.jsx | 4 ++-- src/hooks/object/useObjectBatch.js | 7 +++++-- src/hooks/useContextMenu.js | 3 ++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/components/floor-plan/modal/object/DormerOffset.jsx b/src/components/floor-plan/modal/object/DormerOffset.jsx index a90b61ee..191a94ea 100644 --- a/src/components/floor-plan/modal/object/DormerOffset.jsx +++ b/src/components/floor-plan/modal/object/DormerOffset.jsx @@ -9,7 +9,7 @@ import { canvasState } from '@/store/canvasAtom' export default function DormerOffset(props) { const contextPopupPosition = useRecoilValue(contextPopupPositionState) - const { id, pos = contextPopupPosition } = props + const { id, pos = contextPopupPosition, title } = props const { getMessage } = useMessage() const { closePopup } = usePopup() const [arrow1, setArrow1] = useState(null) @@ -43,7 +43,7 @@ export default function DormerOffset(props) {
-

{getMessage('contextmenu.dormer.offset')}

+

{title}

diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index 41583a81..a16ce0f9 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -1008,8 +1008,11 @@ export function useObjectBatch({ isHidden, setIsHidden }) { if (length1) dormer.top = arrow1 === 'down' ? dormer.top + length1 : dormer.top - length1 if (length2) dormer.left = arrow2 === 'left' ? dormer.left - length2 : dormer.left + length2 - const newDormer = reGroupObject(dormer) - canvas?.setActiveObject(newDormer) + if (dormer.type === 'group') { + const newDormer = reGroupObject(dormer) + canvas?.setActiveObject(newDormer) + } + canvas.renderAll() } return { diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 7f8b9db5..34f5a952 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -296,7 +296,7 @@ export function useContextMenu() { { id: 'dormerOffset', name: getMessage('contextmenu.dormer.offset'), - component: , + component: , }, ], ]) @@ -376,6 +376,7 @@ export function useContextMenu() { { id: 'openingOffset', name: getMessage('contextmenu.opening.offset'), + component: , }, ], ]) From 4cad5cfd50de0eb995d1c2cf639f19c3033a0567 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Wed, 6 Nov 2024 15:19:44 +0900 Subject: [PATCH 09/18] =?UTF-8?q?refactor:=20QInput=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20type=20text=EB=A1=9C=20=ED=86=B5=EC=9D=BC,?= =?UTF-8?q?=20=EC=88=AB=EC=9E=90=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20=EA=B2=80?= =?UTF-8?q?=EC=82=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Playground.jsx | 4 +- src/components/common/input/QInput.jsx | 65 +++++++++++++++----------- 2 files changed, 39 insertions(+), 30 deletions(-) diff --git a/src/components/Playground.jsx b/src/components/Playground.jsx index 5cd4588c..a908ba0f 100644 --- a/src/components/Playground.jsx +++ b/src/components/Playground.jsx @@ -39,7 +39,7 @@ export default function Playground() { const [color, setColor] = useState('#ff0000') const [textInput, setTextInput] = useState('') - const [numberInput, setNumberInput] = useState(null) + const [numberInput, setNumberInput] = useState('') const [radioInput, setRadioInput] = useState('') const [checkboxInput, setCheckboxInput] = useState([]) const [selectedValue, setSelectedValue] = useState('') @@ -171,7 +171,7 @@ export default function Playground() {
From b0a9e91d077e161208a329a66442ec2fcb97990f Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 6 Nov 2024 15:47:04 +0900 Subject: [PATCH 13/18] =?UTF-8?q?=EC=B4=88=EA=B8=B0=20position=20=EC=84=B8?= =?UTF-8?q?=ED=8C=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/draggable/WithDraggable.jsx | 12 ++++++------ .../placementSurface/PlacementSurfaceSetting.jsx | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/common/draggable/WithDraggable.jsx b/src/components/common/draggable/WithDraggable.jsx index 29952981..76656837 100644 --- a/src/components/common/draggable/WithDraggable.jsx +++ b/src/components/common/draggable/WithDraggable.jsx @@ -1,18 +1,18 @@ 'use client' -import { useEffect, useState } from 'react' +import { useState } from 'react' import Draggable from 'react-draggable' -export default function WithDraggable({ isShow, children, pos, handle = '' }) { - const [position, setPosition] = useState({ x: 0, y: 0 }) +export default function WithDraggable({ isShow, children, pos = { x: 0, y: 0 }, handle = '' }) { + const [position, setPosition] = useState(pos) const handleOnDrag = (e, data) => { e.stopPropagation() setPosition({ x: data.x, y: data.y }) } - useEffect(() => { - setPosition({ ...pos }) - }, []) + // useEffect(() => { + // setPosition({ ...pos }) + // }, []) return ( <> diff --git a/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx b/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx index c22d2248..431e0f85 100644 --- a/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx +++ b/src/components/floor-plan/modal/placementSurface/PlacementSurfaceSetting.jsx @@ -240,7 +240,7 @@ export default function PlacementSurfaceSetting({ id, pos = { x: 50, y: 230 } }) }, []) return ( - +

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

From c53653d0819915325297fd6bab8f7b60f71e5e42 Mon Sep 17 00:00:00 2001 From: minsik Date: Wed, 6 Nov 2024 15:47:54 +0900 Subject: [PATCH 14/18] =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=20=EB=B3=80?= =?UTF-8?q?=EC=88=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/setting01/SettingModal01.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/floor-plan/modal/setting01/SettingModal01.jsx b/src/components/floor-plan/modal/setting01/SettingModal01.jsx index e1bef1f0..222226c1 100644 --- a/src/components/floor-plan/modal/setting01/SettingModal01.jsx +++ b/src/components/floor-plan/modal/setting01/SettingModal01.jsx @@ -11,12 +11,12 @@ import { useRecoilValue } from 'recoil' import { usePopup } from '@/hooks/usePopup' export default function SettingModal01(props) { - const { setShowDotLineGridModal, setShowFontSettingModal, id, isConfig } = props - console.log(props) + const { id } = props const [buttonAct, setButtonAct] = useState(1) const { getMessage } = useMessage() const canGridOptionSeletorValue = useRecoilValue(canGridOptionSeletor) - const { addPopup, closePopup } = usePopup() + const { closePopup } = usePopup() + const handleBtnClick = (num) => { setButtonAct(num) } From 4e1cbd08d8f7c9089f51daf2b800924624044360 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Wed, 6 Nov 2024 16:03:55 +0900 Subject: [PATCH 15/18] =?UTF-8?q?Polygon=20=EC=84=A0=ED=83=9D=20=EC=8B=9C?= =?UTF-8?q?=20stroke=20red?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useCanvasEvent.js | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/hooks/useCanvasEvent.js b/src/hooks/useCanvasEvent.js index 4bab1fd6..9b25eedd 100644 --- a/src/hooks/useCanvasEvent.js +++ b/src/hooks/useCanvasEvent.js @@ -209,13 +209,52 @@ export function useCanvasEvent() { created: (e) => { const target = e.selected[0] setCurrentObject(target) + const { selected } = e + + if (selected.length > 0) { + selected.forEach((obj) => { + if (obj.type === 'QPolygon') { + obj.set({ stroke: 'red' }) + } + }) + canvas.renderAll() + } }, cleared: (e) => { setCurrentObject(null) + const { deselected } = e + + if (deselected.length > 0) { + deselected.forEach((obj) => { + if (obj.type === 'QPolygon') { + obj.set({ stroke: 'black' }) + } + }) + } + canvas.renderAll() }, updated: (e) => { const target = e.selected[0] setCurrentObject(target) + const { selected, deselected } = e + + if (deselected.length > 0) { + deselected.forEach((obj) => { + if (obj.type === 'QPolygon') { + obj.set({ stroke: 'black' }) + } + }) + } + + if (selected.length > 0) { + selected.forEach((obj) => { + if (obj.type === 'QPolygon') { + obj.set({ stroke: 'red' }) + } + }) + } + + canvas.renderAll() }, } From d8a69306f3aeb51be38a5dd0b961ca3083111ccd Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 6 Nov 2024 16:16:25 +0900 Subject: [PATCH 16/18] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=86=8C=EC=8A=A4=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 130 ++++++++---------- .../management/StuffSearchCondition.jsx | 30 +--- 2 files changed, 64 insertions(+), 96 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 2603cc04..8c97347d 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -5,7 +5,7 @@ import { useRouter, usePathname } from 'next/navigation' import { useAxios } from '@/hooks/useAxios' import { useMessage } from '@/hooks/useMessage' import StuffQGrid from './StuffQGrid' -import { useRecoilValue, useRecoilState, useSetRecoilState } from 'recoil' +import { useRecoilValue, useRecoilState, useSetRecoilState, useResetRecoilState } from 'recoil' import { stuffSearchState } from '@/store/stuffAtom' import { queryStringFormatter, isEmptyArray } from '@/util/common-utils' import dayjs from 'dayjs' @@ -19,7 +19,7 @@ import { sessionStore } from '@/store/commonAtom' import { SessionContext } from '@/app/SessionProvider' export default function Stuff() { - const sessionState = useRecoilValue(sessionStore) + const resetStuffRecoil = useResetRecoilState(stuffSearchState) const { session } = useContext(SessionContext) const setAppMessageState = useSetRecoilState(appMessageStore) const stuffSearchParams = useRecoilValue(stuffSearchState) @@ -34,9 +34,6 @@ export default function Stuff() { const { get } = useAxios(globalLocaleState) const gridRef = useRef() - // const [selectedRowData, setSelectedRowData] = useState([]) - // const [selectedRowDataCount, setSelectedRowDataCount] = useState(0) - const router = useRouter() const pathname = usePathname() @@ -67,10 +64,6 @@ export default function Stuff() { field: 'lastEditDatetime', minWidth: 200, headerName: getMessage('stuff.gridHeader.lastEditDatetime'), - // headerCheckboxSelection: true, - // headerCheckboxSelectionCurrentPageOnly: true, //페이징시 현재 페이지만 체크되도록 - // checkboxSelection: true, - // showDisabledCheckboxes: true, cellStyle: { justifyContent: 'center' }, valueFormatter: function (params) { if (params.value) { @@ -169,77 +162,67 @@ export default function Stuff() { // 진입시 그리드 데이터 조회 useEffect(() => { - if (isObjectNotEmpty(session)) { - if (stuffSearchParams?.code === 'S') { - const params = { - // saleStoreId: stuffSearchParams.schSelSaleStoreId, - saleStoreId: session.storeId, - schObjectNo: stuffSearchParams?.schObjectNo, - schAddress: stuffSearchParams?.schAddress, - schObjectName: stuffSearchParams?.schObjectName, - schSaleStoreName: stuffSearchParams?.schSaleStoreName, - schReceiveUser: stuffSearchParams?.schReceiveUser, - schDispCompanyName: stuffSearchParams?.schDispCompanyName, - schDateType: stuffSearchParams.schDateType, - schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), - schToDt: dayjs(new Date()).format('YYYY-MM-DD'), - startRow: (pageNo - 1) * pageSize + 1, - endRow: pageNo * pageSize, - schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId - ? stuffSearchParams.schOtherSelSaleStoreId - : stuffSearchParams.schSelSaleStoreId, - schSortType: stuffSearchParams.schSortType, - } - async function fetchData() { - const apiUrl = `/api/object/list?${queryStringFormatter(params)}` - await get({ - url: apiUrl, - }).then((res) => { - if (!isEmptyArray(res)) { - setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) - setTotalCount(res[0].totCnt) - } - }) - } - if (stuffSearchParams?.schSelSaleStoreId !== '') { - fetchData() - } - } else if (stuffSearchParams?.code === 'M') { - //메인화면에서 진입 - const params = { - saleStoreId: session?.storeId, - schObjectNo: stuffSearchParams.schObjectNo, - schAddress: '', - schObjectName: '', - schSaleStoreName: '', - schReceiveUser: '', - schDispCompanyName: '', - schDateType: 'U', - schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), - schToDt: dayjs(new Date()).format('YYYY-MM-DD'), - startRow: (pageNo - 1) * pageSize + 1, - endRow: pageNo * pageSize, - schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId - ? stuffSearchParams.schOtherSelSaleStoreId - : stuffSearchParams.schSelSaleStoreId, - schSortType: 'R', - } - setStuffSearch({ - ...params, + if (stuffSearchParams?.code === 'S') { + const params = { + saleStoreId: session.storeId, + schObjectNo: stuffSearchParams?.schObjectNo, + schAddress: stuffSearchParams?.schAddress, + schObjectName: stuffSearchParams?.schObjectName, + schSaleStoreName: stuffSearchParams?.schSaleStoreName, + schReceiveUser: stuffSearchParams?.schReceiveUser, + schDispCompanyName: stuffSearchParams?.schDispCompanyName, + schDateType: stuffSearchParams.schDateType, + schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), + schToDt: dayjs(new Date()).format('YYYY-MM-DD'), + startRow: (pageNo - 1) * pageSize + 1, + endRow: pageNo * pageSize, + schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : stuffSearchParams.schSelSaleStoreId, + schSortType: stuffSearchParams.schSortType, + } + + async function fetchData() { + const apiUrl = `/api/object/list?${queryStringFormatter(params)}` + await get({ + url: apiUrl, + }).then((res) => { + if (!isEmptyArray(res)) { + setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) + setTotalCount(res[0].totCnt) + } }) } - } - }, [pageNo, session, stuffSearchParams]) - useEffect(() => { - if (stuffSearchParams?.code === 'E') { + fetchData() + } else if (stuffSearchParams?.code === 'M') { + const params = { + saleStoreId: session?.storeId, + schObjectNo: stuffSearchParams.schObjectNo, + schAddress: '', + schObjectName: '', + schSaleStoreName: '', + schReceiveUser: '', + schDispCompanyName: '', + schDateType: 'U', + schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), + schToDt: dayjs(new Date()).format('YYYY-MM-DD'), + startRow: (pageNo - 1) * pageSize + 1, + endRow: pageNo * pageSize, + schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId ? stuffSearchParams.schOtherSelSaleStoreId : stuffSearchParams.schSelSaleStoreId, + schSortType: 'R', + } + setStuffSearch({ + ...params, + }) + } else if (stuffSearchParams?.code === 'E') { stuffSearchParams.startRow = 1 stuffSearchParams.endRow = 1 * pageSize stuffSearchParams.schSortType = defaultSortType - setPageNo(1) + setStuffSearch({ + ...stuffSearch, + code: 'FINISH', + }) - //조회를 눌렀을때 async function fetchData() { const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` await get({ url: apiUrl }).then((res) => { @@ -252,7 +235,10 @@ export default function Stuff() { } }) } + fetchData() + } else if (stuffSearchParams?.code === 'C') { + resetStuffRecoil() } }, [stuffSearchParams]) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 659ab696..1d40b61a 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -94,13 +94,13 @@ export default function StuffSearchCondition() { }) } else { setStuffSearch({ - schObjectNo: objectNo ? objectNo : '', - schSaleStoreName: saleStoreName ? saleStoreName : '', - schAddress: address ? address : '', - schObjectName: objectName ? objectName : '', - schDispCompanyName: dispCompanyName ? dispCompanyName : '', + schObjectNo: objectNo, + schSaleStoreName: saleStoreName, + schAddress: address, + schObjectName: objectName, + schDispCompanyName: dispCompanyName, schSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : stuffSearch.schSelSaleStoreId, - schReceiveUser: receiveUser ? receiveUser : '', + schReceiveUser: receiveUser, schDateType: dateType, schFromDt: dayjs(startDate).format('YYYY-MM-DD'), schToDt: dayjs(endDate).format('YYYY-MM-DD'), @@ -131,14 +131,12 @@ export default function StuffSearchCondition() { setDateType('U') setStartDate(dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD')) setEndDate(dayjs(new Date()).format('YYYY-MM-DD')) - // if (sessionState?.storeId === 'T01') { if (session?.storeId === 'T01') { setSchSelSaleStoreId('') handleClear1() //판매대리점선택 자동완성 클리어 resetStuffRecoil() setStuffSearch({ ...stuffSearch, - code: 'C', schSelSaleStoreId: '', schOtherSelSaleStoreId: '', }) @@ -156,23 +154,17 @@ export default function StuffSearchCondition() { } useEffect(() => { - // if (isObjectNotEmpty(sessionState)) { if (isObjectNotEmpty(session)) { // storeId가 T01 이거나 storeLvl이 1차점일때만 판매대리점 선택 활성화 let url - // if (sessionState?.storeId === 'T01') { if (session?.storeId === 'T01') { //T01일떄 - // url = `/api/object/saleStore/${sessionState?.storeId}/firstList?userId=${sessionState?.userId}` url = `/api/object/saleStore/${session?.storeId}/firstList?userId=${session?.userId}` } else { - // if (sessionState.storeLvl === '1') { if (session.storeLvl === '1') { //T01아닌 1차점일때 - // url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` } else { - // url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` } } @@ -187,7 +179,6 @@ export default function StuffSearchCondition() { let allList let favList let otherList - // if (sessionState?.storeId === 'T01') { if (session?.storeId === 'T01') { allList = res allList.sort((a, b) => (a.saleStoreId !== 'T01') - (b.saleStoreId !== 'T01') || a.saleStoreId - b.saleStoreId) @@ -195,17 +186,14 @@ export default function StuffSearchCondition() { setSchSelSaleStoreList(allList) setFavoriteStoreList(favList) setShowSaleStoreList(favList) - // setSchSelSaleStoreId(sessionState?.storeId) setSchSelSaleStoreId(session?.storeId) setStuffSearch({ ...stuffSearch, code: 'S', - // schSelSaleStoreId: sessionState?.storeId, schSelSaleStoreId: session?.storeId, }) //T01일때 2차 판매점 호출하기 디폴트로 1차점을 본인으로 셋팅해서 세션storeId사용 - // url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=0&userId=${sessionState?.userId}` url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=0&userId=${session?.userId}` get({ url: url }).then((res) => { @@ -222,7 +210,6 @@ export default function StuffSearchCondition() { } }) } else { - // if (sessionState?.storeLvl === '1') { if (session?.storeLvl === '1') { allList = res favList = res.filter((row) => row.priority !== 'B') @@ -250,7 +237,6 @@ export default function StuffSearchCondition() { setOtherSaleStoreList(otherList) //선택한 2차점 세션으로 자동셋팅 - // setOtherSaleStoreId(sessionState?.storeId) setOtherSaleStoreId(session?.storeId) setStuffSearch({ ...stuffSearch, @@ -262,7 +248,6 @@ export default function StuffSearchCondition() { } }) } - // }, [sessionState]) }, [session]) //초기화 눌렀을 때 1차판매점 자동완성도.. @@ -296,7 +281,6 @@ export default function StuffSearchCondition() { stuffSearch.schSelSaleStoreId = key.saleStoreId //T01아닌 1차점은 본인으로 디폴트셋팅이고 수정할수없어서 여기안옴 //고른 1차점의 saleStoreId로 2차점 API호출하기 - // let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${sessionState?.userId}` let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${session?.userId}` let otherList get({ url: url }).then((res) => { @@ -620,7 +604,6 @@ export default function StuffSearchCondition() { value={'U'} onChange={(e) => { setDateType(e.target.value) - //setStuffSearch({ ...stuffSearch, code: 'S', schDateType: e.target.value }) }} /> @@ -634,7 +617,6 @@ export default function StuffSearchCondition() { value={'R'} onChange={(e) => { setDateType(e.target.value) - //setStuffSearch({ ...stuffSearch, code: 'S', schDateType: e.target.value }) }} /> From 23a5e2d2a73c9b8ad5934de48642fd17a51a7343 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 7 Nov 2024 08:33:23 +0900 Subject: [PATCH 17/18] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=ED=99=94=EB=A9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 27 +++++++++------- src/components/management/StuffDetail.jsx | 11 +------ .../estimate/useEstimateController.js | 31 ++++++++++++++++--- 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 813962b3..f12d7c69 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -1,9 +1,9 @@ 'use client' -import { useEffect, useState, useRef } from 'react' +import { useEffect, useState, useContext } from 'react' import { useRecoilValue } from 'recoil' import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' -import { sessionStore } from '@/store/commonAtom' +import { SessionContext } from '@/app/SessionProvider' import { useMessage } from '@/hooks/useMessage' import { useCanvasMenu } from '@/hooks/common/useCanvasMenu' import SingleDatePicker from '../common/datepicker/SingleDatePicker' @@ -21,10 +21,6 @@ export default function Estimate({ params }) { const [planNo, setPlanNo] = useState('') //플랜번호 const [files, setFiles] = useState([]) // 보내는 첨부파일 - //체크박스 - const [checkItems, setCheckItems] = useState(new Set()) - const [checkedList, setCheckedList] = useState([]) - const [showContentCode, setShowContentCode] = useState('ATTR001') //견적특이사항 접고 펼치기 @@ -40,7 +36,7 @@ export default function Estimate({ params }) { setStartDate, } - const sessionState = useRecoilValue(sessionStore) + const { session } = useContext(SessionContext) const objectRecoil = useRecoilValue(floorPlanObjectState) //견적서 상세데이터 @@ -127,6 +123,19 @@ export default function Estimate({ params }) { event.stopPropagation() } + // 첨부파일 state에 넣기 + useEffect(() => { + // console.log(files) + if (files.length > 0) { + files.map((row) => { + setState({ fileList: row.data }) + }) + } else { + console.log('첨부파일 없음') + setState({ fileList: [] }) + } + }, [files]) + return (
@@ -206,7 +215,6 @@ export default function Estimate({ params }) { defaultValue={state?.charger} onChange={(e) => { //담당자 charger - // console.log('담당자:::::', e.target.value) setState({ charger: e.target.value }) }} /> @@ -227,7 +235,6 @@ export default function Estimate({ params }) { defaultValue={state?.objectName} onChange={(e) => { //안건명 objectName - // console.log('안건명::::', e.target.value) setState({ objectName: e.target.value }) }} /> @@ -244,7 +251,6 @@ export default function Estimate({ params }) { if (isObjectNotEmpty(e)) { setState({ objectNameOmit: e.clCodeNm }) } else { - // console.log('XXX') setState({ objectNameOmit: '' }) } }} @@ -342,7 +348,6 @@ export default function Estimate({ params }) { defaultValue={state?.remarks} onChange={(e) => { //비고 - // console.log('비고:::::', e.target.value) setState({ remarks: e.target.value }) }} /> diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 9a455216..61cdc1df 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -11,7 +11,6 @@ import { isEmptyArray, isNotEmptyArray, isObjectNotEmpty } from '@/util/common-u import { useMessage } from '@/hooks/useMessage' import { useForm } from 'react-hook-form' import { useRecoilValue, useSetRecoilState } from 'recoil' -import { sessionStore } from '@/store/commonAtom' import { SessionContext } from '@/app/SessionProvider' import FindAddressPop from './popup/FindAddressPop' import PlanRequestPop from './popup/PlanRequestPop' @@ -28,7 +27,6 @@ export default function StuffDetail() { const [selOptions, setSelOptions] = useState('') //선택한 1차점 const [otherSelOptions, setOtherSelOptions] = useState('') //선택한 1차점외 - const sessionState = useRecoilValue(sessionStore) const { session } = useContext(SessionContext) const router = useRouter() @@ -320,12 +318,11 @@ export default function StuffDetail() { let firstList let otherList let favList - // if (sessionState?.storeId === 'T01') { if (session?.storeId === 'T01') { url = `/api/object/saleStore/${session?.storeId}/firstList?userId=${session?.userId}` } else { if (session.storeLvl === '1') { - url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` + url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` } else { url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` } @@ -400,7 +397,6 @@ export default function StuffDetail() { } }) } - // }, [objectNo, sessionState]) }, [objectNo, session]) useEffect(() => { @@ -1279,9 +1275,7 @@ export default function StuffDetail() { //1차점 or 2차점 안고르고 임시저장하면 if (params.saleStoreId == '') { - // params.saleStoreId = sessionState.storeId params.saleStoreId = session.storeId - // params.saleStoreLevel = sessionState.storeLvl params.saleStoreLevel = session.storeLvl } @@ -1445,7 +1439,6 @@ export default function StuffDetail() {
- {/* {sessionState?.storeId === 'T01' && ( */} {session?.storeId === 'T01' && ( <>
@@ -1479,7 +1472,6 @@ export default function StuffDetail() { )} - {/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl === '1' && ( */} {session?.storeId !== 'T01' && session?.storeLvl === '1' && ( <>
@@ -1511,7 +1503,6 @@ export default function StuffDetail() {
)} - {/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl !== '1' && ( */} {session?.storeId !== 'T01' && session?.storeLvl !== '1' && ( <>
diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 87fa15ca..2b92a14a 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -1,9 +1,11 @@ import { useAxios } from '@/hooks/useAxios' -import { useEffect, useReducer, useState } from 'react' +import { useContext, useEffect, useReducer, useState } from 'react' import { useRecoilState, useRecoilValue } from 'recoil' import { globalLocaleStore } from '@/store/localeAtom' import { estimateState, floorPlanObjectState } from '@/store/floorPlanObjectAtom' import { isObjectNotEmpty } from '@/util/common-utils' +import { SessionContext } from '@/app/SessionProvider' + const reducer = (prevState, nextState) => { return { ...prevState, ...nextState } } @@ -41,6 +43,7 @@ const defaultEstimateData = { unit: '', }, ], + fileList: [], } // Helper functions @@ -51,14 +54,14 @@ const updateItemInList = (itemList, itemId, updates) => { } export const useEstimateController = (planNo) => { + const { session } = useContext(SessionContext) const globalLocaleState = useRecoilValue(globalLocaleStore) const objectRecoil = useRecoilValue(floorPlanObjectState) const [estimateData, setEstimateData] = useRecoilState(estimateState) - const { get, post } = useAxios(globalLocaleState) + const { get, post, promisePost } = useAxios(globalLocaleState) const [isLoading, setIsLoading] = useState(false) - const { promisePost } = useAxios() const [state, setState] = useReducer(reducer, defaultEstimateData) useEffect(() => { @@ -123,12 +126,32 @@ export const useEstimateController = (planNo) => { } useEffect(() => { - setEstimateData({ ...state }) + setEstimateData({ ...state, userId: session.userId }) + //sapSalesStoreCd 추가예정 필수값 + // setEstimateData({ ...state, userId: session.userId, sapSalesStoreCd : session.sapSalesStoreCd }) }, [state]) //견적서 저장 const handleEstimateSubmit = async () => { console.log('::담긴 estimateData:::', estimateData) + //1. 첨부파일 저장 + const formData = new FormData() + formData.append('file', estimateData.fileList) + formData.append('objectNo', estimateData.objectNo) + formData.append('planNo', estimateData.planNo) + formData.append('category', '10') + formData.append('userId', estimateData.userId) + for (const value of formData.values()) { + console.log('formData::', value) + } + + await promisePost({ url: '/api/file/fileUpload', data: formData }).then((res) => { + console.log('파일저장::::::::::', res) + }) + + //2. 상세데이터 저장 + + console.log('상세저장시작!!') return try { const result = await promisePost({ From b94be836df97f5e6df42b74acf23ced7944d0801 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 7 Nov 2024 10:27:25 +0900 Subject: [PATCH 18/18] chore: remove unused files --- src/app/intro/page.jsx | 12 ---- src/components/Intro.jsx | 142 --------------------------------------- src/util/session-util.js | 12 ---- 3 files changed, 166 deletions(-) delete mode 100644 src/app/intro/page.jsx delete mode 100644 src/components/Intro.jsx delete mode 100644 src/util/session-util.js diff --git a/src/app/intro/page.jsx b/src/app/intro/page.jsx deleted file mode 100644 index ebf1081b..00000000 --- a/src/app/intro/page.jsx +++ /dev/null @@ -1,12 +0,0 @@ -import Intro from '@/components/Intro' -import { initCheck } from '@/util/session-util' - -export default async function IntroPage() { - return ( - <> -
- -
- - ) -} diff --git a/src/components/Intro.jsx b/src/components/Intro.jsx deleted file mode 100644 index a6825af7..00000000 --- a/src/components/Intro.jsx +++ /dev/null @@ -1,142 +0,0 @@ -'use client' - -import { useEffect, useState } from 'react' - -import Link from 'next/link' - -import { useRecoilState } from 'recoil' -import { modalContent, modalState } from '@/store/modalAtom' - -import { useAxios } from '@/hooks/useAxios' - -import { Button } from '@nextui-org/react' - -import SingleDatePicker from './common/datepicker/SingleDatePicker' -import RangeDatePicker from './common/datepicker/RangeDatePicker' -import QGrid from './common/grid/QGrid' -import { useSwal } from '@/hooks/useSwal' - -export default function Intro() { - const { get } = useAxios() - const { swalFire } = useSwal() - - // const [open, setOpen] = useState(false) - const [startDate, setStartDate] = useState(new Date()) - const singleDatePickerProps = { - startDate, - setStartDate, - } - - const [dateRange, setDateRange] = useState([null, null]) - const [startRangeDate, endRangeDate] = dateRange - const rangeDatePickerProps = { - startRangeDate, - endRangeDate, - setDateRange, - } - - // const gridProps = { - // isPageable: false, - // } - const [gridProps, setGridProps] = useState({ - gridData: [], - isPageable: false, - }) - - const [open, setOpen] = useRecoilState(modalState) - const [contents, setContent] = useRecoilState(modalContent) - - const modelProps = { - open, - setOpen, - } - - const ipsum = ( - <> -

title

-

- 저작자·발명가·과학기술자와 예술가의 권리는 법률로써 보호한다. 이 헌법은 1988년 2월 25일부터 시행한다. 다만, 이 헌법을 시행하기 위하여 필요한 - 법률의 제정·개정과 이 헌법에 의한 대통령 및 국회의원의 선거 기타 이 헌법시행에 관한 준비는 이 헌법시행 전에 할 수 있다. -

-

- 국가는 주택개발정책등을 통하여 모든 국민이 쾌적한 주거생활을 할 수 있도록 노력하여야 한다. 통신·방송의 시설기준과 신문의 기능을 보장하기 - 위하여 필요한 사항은 법률로 정한다. -

-

- 국회에서 의결된 법률안은 정부에 이송되어 15일 이내에 대통령이 공포한다. 선거에 관한 경비는 법률이 정하는 경우를 제외하고는 정당 또는 - 후보자에게 부담시킬 수 없다. -

- - ) - - useEffect(() => { - async function fetchData() { - // const response = await fetch('https://www.ag-grid.com/example-assets/space-mission-data.json') - // const data = await response.json() - const data = await get({ url: 'https://www.ag-grid.com/example-assets/space-mission-data.json' }) - setGridProps({ ...gridProps, gridData: data }) - } - fetchData() - }, []) - - return ( - <> -
- - - -
-
-
Single Date Picker
-
- -
-
-
-
Range Date Picker
-
- -
-
-
-
QGrid
-
- -
-
-
-
QModal
-
- {/* - {ipsum} */} - -
-
-
-
QToast
-
- -
-
- - ) -} diff --git a/src/util/session-util.js b/src/util/session-util.js deleted file mode 100644 index 6f818e43..00000000 --- a/src/util/session-util.js +++ /dev/null @@ -1,12 +0,0 @@ -import { checkSession } from '@/lib/user' -import { redirect } from 'next/navigation' - -export const initCheck = async () => { - const { session } = await checkSession() - - if (!session.isLoggedIn) { - redirect('/login') - } - - return session -}