From 100744ad9df5f5d9ac0d771c54b10d8e287b05ea Mon Sep 17 00:00:00 2001 From: yjnoh Date: Mon, 17 Mar 2025 15:02:58 +0900 Subject: [PATCH 01/71] =?UTF-8?q?QPOLYGON=20=EA=B7=B8=EB=A3=B9=EA=B0=9D?= =?UTF-8?q?=EC=B2=B4=20=EC=B9=98=EC=88=98=20=EC=82=AD=EC=A0=9C=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/fabric/QPolygon.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/components/fabric/QPolygon.js b/src/components/fabric/QPolygon.js index 85bb03dd..f19687aa 100644 --- a/src/components/fabric/QPolygon.js +++ b/src/components/fabric/QPolygon.js @@ -136,8 +136,20 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { this.on('removed', () => { // const children = getAllRelatedObjects(this.id, this.canvas) const children = this.canvas.getObjects().filter((obj) => obj.parentId === this.id) + children.forEach((child) => { this.canvas.remove(child) + + //그룹일때 + if (child.hasOwnProperty('_objects')) { + child._objects.forEach((obj) => { + if (obj.hasOwnProperty('texts')) { + obj.texts.forEach((text) => { + this.canvas?.remove(text) + }) + } + }) + } }) }) From 690ab8454f093c30e050e90b47789502c5771716 Mon Sep 17 00:00:00 2001 From: basssy Date: Mon, 17 Mar 2025 15:20:18 +0900 Subject: [PATCH 02/71] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=20=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=20=EC=A0=95=EB=A0=AC*?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 43446209..c1835874 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -301,7 +301,6 @@ export default function Stuff() { } else if (stuffSearchParams?.code === 'E') { stuffSearchParams.startRow = (stuffSearch.pageNo - 1) * stuffSearchParams.pageSize + 1 stuffSearchParams.endRow = stuffSearchParams.pageNo * stuffSearchParams.pageSize - stuffSearchParams.schSortType = defaultSortType stuffSearchParams.pageNo = stuffSearchParams.pageNo if (!stuffSearchParams.saleStoreId) { From dcb99eecf8d3c72d31db6f195d81d961a0fe5b64 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Mon, 17 Mar 2025 17:47:32 +0900 Subject: [PATCH 03/71] =?UTF-8?q?chore:=20=EC=9A=B4=EC=98=81=EC=9A=A9=20?= =?UTF-8?q?=ED=8F=AC=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index bf52888e..a32ba7b9 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start -p 3000", - "start:dev": "next start -p 3001", + "start": "next start -p 5000", + "start:dev": "next start -p 5010", "lint": "next lint", "serve": "node server.js" }, From f915dab239d6c3b22973d2edbf74173cb3e74dd4 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Mon, 17 Mar 2025 18:25:28 +0900 Subject: [PATCH 04/71] =?UTF-8?q?chore:=20ecosystem=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ecosystem.config.js | 10 ++++++++++ package.json | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 ecosystem.config.js diff --git a/ecosystem.config.js b/ecosystem.config.js new file mode 100644 index 00000000..97676e2e --- /dev/null +++ b/ecosystem.config.js @@ -0,0 +1,10 @@ +module.exports = { + apps: [ + { + name: 'qcast-front-production', + script: 'npm run start', + instance: 2, + exec_mode: 'cluster', + }, + ], +} diff --git a/package.json b/package.json index a32ba7b9..1f31b9d3 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "scripts": { "dev": "next dev", "build": "next build", - "start": "next start -p 5000", + "start:cluster1": "next start -p 5000", + "start:cluster2": "next start -p 5001", "start:dev": "next start -p 5010", "lint": "next lint", "serve": "node server.js" From c467fc7fa84aac08356e9661b4f1c8635035fc1f Mon Sep 17 00:00:00 2001 From: yjnoh Date: Tue, 18 Mar 2025 09:36:11 +0900 Subject: [PATCH 05/71] =?UTF-8?q?=ED=9D=A1=EC=B0=A9=EC=A0=90=20=EC=9E=91?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/module/useModuleBasicSetting.js | 160 ++++++++++++++-------- 1 file changed, 102 insertions(+), 58 deletions(-) diff --git a/src/hooks/module/useModuleBasicSetting.js b/src/hooks/module/useModuleBasicSetting.js index 5db1963e..8ac88a31 100644 --- a/src/hooks/module/useModuleBasicSetting.js +++ b/src/hooks/module/useModuleBasicSetting.js @@ -549,6 +549,7 @@ export function useModuleBasicSetting(tabNum) { * 스냅기능 */ let snapDistance = flowDirection === 'south' || flowDirection === 'north' ? 70 : 40 + let sideSnapDistance = 15 let trestleSnapDistance = 15 let intvHor = @@ -588,51 +589,102 @@ export function useModuleBasicSetting(tabNum) { const holdCellCenterX = holdCellLeft + toFixedWithoutRounding(cell.width / 2, 2) const holdCellCenterY = holdCellTop + toFixedWithoutRounding(cell.height / 2, 2) + //흐름방향따라 달라야 한다. + if (flowDirection === 'south' || flowDirection === 'north') { + if (Math.abs(smallCenterX - holdCellCenterX) < snapDistance) { + //움직이는 모듈 가운데 -> 설치 모듈 가운데 + tempModule.left = holdCellCenterX - toFixedWithoutRounding(width / 2, 2) + } + + //움직이는 모듈왼쪽 -> 가운데 + if (Math.abs(smallLeft - holdCellCenterX) < snapDistance) { + tempModule.left = holdCellCenterX + intvHor / 2 + } + // 오른쪽 -> 가운데 + if (Math.abs(smallRight - holdCellCenterX) < snapDistance) { + tempModule.left = holdCellCenterX - width - intvHor / 2 + } + + //설치된 셀에 좌측에 스냅 + if (Math.abs(smallRight - holdCellLeft) < snapDistance) { + // console.log('모듈 좌측 스냅') + tempModule.left = holdCellLeft - width - intvHor + } + + //설치된 셀에 우측에 스냅 + if (Math.abs(smallLeft - holdCellRight) < snapDistance) { + // console.log('모듈 우측 스냅') + tempModule.left = holdCellRight + intvHor + } + //설치된 셀에 위쪽에 스냅 + if (Math.abs(smallBottom - holdCellTop) < sideSnapDistance) { + tempModule.top = holdCellTop - height - intvVer + } + + //설치된 셀에 밑쪽에 스냅 + if (Math.abs(smallTop - holdCellBottom) < sideSnapDistance) { + tempModule.top = holdCellBottom + intvVer + } + + //설치된 셀에 윗쪽에 스냅 + if (Math.abs(smallTop - holdCellTop) < sideSnapDistance) { + tempModule.top = holdCellTop + } + } else { + //흐름방향 west, east + + //가운데 가운데 + if (Math.abs(smallCenterY - holdCellCenterY) < snapDistance) { + tempModule.top = holdCellCenterY - toFixedWithoutRounding(width / 2, 2) + } + + //위쪽 -> 가운데 + if (Math.abs(smallTop - holdCellCenterY) < snapDistance) { + // console.log('holdCellCenterX', holdCellCenterX) + // console.log('smallLeft', smallLeft) + + // console.log('모듈 센터에 스냅') + tempModule.top = holdCellCenterY + intvHor / 2 + + // console.log('tempModule.left', tempModule.left) + } + // 밑 -> 가운데 + if (Math.abs(smallBottom - holdCellCenterY) < snapDistance) { + tempModule.top = holdCellCenterY - height - intvHor / 2 + } + + //설치된 셀에 좌측에 스냅 + if (Math.abs(smallRight - holdCellLeft) < snapDistance) { + // console.log('모듈 좌측 스냅') + tempModule.left = holdCellLeft - width - intvHor + } + + //설치된 셀에 우측에 스냅 + if (Math.abs(smallLeft - holdCellRight) < snapDistance) { + // console.log('모듈 우측 스냅') + tempModule.left = holdCellRight + intvHor + } + //설치된 셀에 위쪽에 스냅 + if (Math.abs(smallBottom - holdCellTop) < sideSnapDistance) { + tempModule.top = holdCellTop - height - intvVer + } + + //설치된 셀에 밑쪽에 스냅 + if (Math.abs(smallTop - holdCellBottom) < sideSnapDistance) { + tempModule.top = holdCellBottom + intvVer + } + + //설치된 셀에 윗쪽에 스냅 + if (Math.abs(smallTop - holdCellTop) < sideSnapDistance) { + tempModule.top = holdCellTop + } + + if (Math.abs(smallLeft - holdCellLeft) < snapDistance) { + tempModule.left = holdCellLeft + } + } + //가운데 -> 가운대 - if (Math.abs(smallCenterX - holdCellCenterX) < snapDistance) { - tempModule.left = holdCellCenterX - toFixedWithoutRounding(width / 2, 2) - } - - //왼쪽 -> 가운데 - if (Math.abs(smallLeft - holdCellCenterX) < snapDistance) { - // console.log('holdCellCenterX', holdCellCenterX) - // console.log('smallLeft', smallLeft) - - // console.log('모듈 센터에 스냅') - tempModule.left = holdCellCenterX + intvHor / 2 - - // console.log('tempModule.left', tempModule.left) - } - // 오른쪽 -> 가운데 - if (Math.abs(smallRight - holdCellCenterX) < snapDistance) { - tempModule.left = holdCellCenterX - width - intvHor / 2 - } - - //설치된 셀에 좌측에 스냅 - if (Math.abs(smallRight - holdCellLeft) < snapDistance) { - // console.log('모듈 좌측 스냅') - tempModule.left = holdCellLeft - width - intvHor - } - - //설치된 셀에 우측에 스냅 - if (Math.abs(smallLeft - holdCellRight) < snapDistance) { - // console.log('모듈 우측 스냅') - tempModule.left = holdCellRight + intvHor - } - //설치된 셀에 위쪽에 스냅 - if (Math.abs(smallBottom - holdCellTop) < 10) { - tempModule.top = holdCellTop - height - intvVer - } - - //설치된 셀에 밑쪽에 스냅 - if (Math.abs(smallTop - holdCellBottom) < 10) { - tempModule.top = holdCellBottom + intvVer - } - - //설치된 셀에 윗쪽에 스냅 - if (Math.abs(smallTop - holdCellTop) < 10) { - tempModule.top = holdCellTop - } //세로 가운데 -> 가운데 // if (Math.abs(smallCenterY - holdCellCenterY) < snapDistance) { @@ -641,11 +693,6 @@ export function useModuleBasicSetting(tabNum) { // //위쪽 -> 가운데 // if (Math.abs(smallTop - holdCellCenterY) < cellSnapDistance) { // tempModule.top = holdCellCenterY - // } - // //아랫쪽 -> 가운데 - // if (Math.abs(smallBottom - holdCellCenterY) < cellSnapDistance) { - // tempModule.top = holdCellCenterY - height - // } }) } @@ -673,22 +720,19 @@ export function useModuleBasicSetting(tabNum) { // if (Math.abs(smallLeft - (trestleLeft + moduleSetupSurfaces[i].width / 2)) < snapDistance) { // tempModule.left = trestleLeft + moduleSetupSurfaces[i].width / 2 // } - // 모듈이 가운데가 세로중앙선에 붙게 스냅 - if (Math.abs(smallCenterX - (trestleLeft + moduleSetupSurfaces[i].width / 2)) < trestleSnapDistance) { - tempModule.left = trestleLeft + moduleSetupSurfaces[i].width / 2 - tempModule.width / 2 - } - + // if (Math.abs(smallCenterX - (trestleLeft + moduleSetupSurfaces[i].width / 2)) < trestleSnapDistance) { + // tempModule.left = trestleLeft + moduleSetupSurfaces[i].width / 2 - tempModule.width / 2 + // } // 모듈오른쪽이 세로중앙선에 붙게 스냅 // if (Math.abs(smallRight - (trestleLeft + moduleSetupSurfaces[i].width / 2)) < trestleSnapDistance) { // tempModule.left = trestleLeft + moduleSetupSurfaces[i].width / 2 - tempModule.width * tempModule.scaleX // } } else { // 모듈이 가로중앙선에 스냅 - if (Math.abs(smallTop + tempModule.height / 2 - bigCenterY) < trestleSnapDistance) { - tempModule.top = bigCenterY - tempModule.height / 2 - } - + // if (Math.abs(smallTop + tempModule.height / 2 - bigCenterY) < trestleSnapDistance) { + // tempModule.top = bigCenterY - tempModule.height / 2 + // } // if (Math.abs(smallTop - (trestleTop + moduleSetupSurfaces[i].height / 2)) < trestleSnapDistance) { // tempModule.top = trestleTop + moduleSetupSurfaces[i].height / 2 // } From 9be21fc2b28760b9b27fa1f0ea33779483e0b097 Mon Sep 17 00:00:00 2001 From: LEEYONGJAE Date: Tue, 18 Mar 2025 09:52:14 +0900 Subject: [PATCH 06/71] =?UTF-8?q?=EB=B2=88=EC=97=AD=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20#914?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/ja.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/ja.json b/src/locales/ja.json index 0028a047..d6670702 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -558,7 +558,7 @@ "board.faq.title": "FAQ", "board.faq.sub.title": "FAQリスト", "board.archive.title": "各種資料ダウンロード", - "board.archive.sub.title": "見積書一覧", + "board.archive.sub.title": "掲載資料一覧", "board.list.header.rownum": "番号", "board.list.header.title": "タイトル", "board.list.header.regDt": "登録日", From 3432d64a3ca1a6c117d78c08245a2ee17e993dab Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 18 Mar 2025 10:23:42 +0900 Subject: [PATCH 07/71] =?UTF-8?q?8=EA=B0=81=20=EC=95=88=EB=82=98=EB=88=A0?= =?UTF-8?q?=EC=A7=80=EB=8A=94=20=ED=98=84=EC=83=81=20=EC=9E=91=EC=97=85=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 --- src/hooks/usePolygon.js | 2 +- src/util/canvas-util.js | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index 54de877b..fd5b5a69 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -767,7 +767,7 @@ export const usePolygon = () => { obj.type === 'QLine' && obj.attributes?.type !== 'pitchSizeLine' && obj.attributes?.roofId === polygon.id && - (innerLineTypes.includes(obj.name) || !obj.name), + innerLineTypes.includes(obj.name), ) innerLines = [...polygon.innerLines] diff --git a/src/util/canvas-util.js b/src/util/canvas-util.js index 935097b0..1146afa7 100644 --- a/src/util/canvas-util.js +++ b/src/util/canvas-util.js @@ -518,14 +518,23 @@ export const sortedPointLessEightPoint = (points) => { */ // 직선의 방정식. // 방정식은 ax + by + c = 0이며, 점의 좌표를 대입하여 계산된 값은 직선과 점 사이의 관계를 나타낸다. -export function isPointOnLine(line, point) { - const a = line.y2 - line.y1 +export function isPointOnLine({ x1, y1, x2, y2 }, { x, y }) { + /*const a = line.y2 - line.y1 const b = line.x1 - line.x2 const c = line.x2 * line.y1 - line.x1 * line.y2 const result = Math.abs(a * point.x + b * point.y + c) / 100 // 점이 선 위에 있는지 확인 - return result <= 10 + return result <= 10*/ + // 직선 방정식 만족 여부 확인 + const crossProduct = (y - y1) * (x2 - x1) - (x - x1) * (y2 - y1) + if (Math.abs(crossProduct) > 5) return false // 작은 오차 허용 + + // 점이 선분의 범위 내에 있는지 확인 + const withinXRange = Math.min(x1, x2) <= x && x <= Math.max(x1, x2) + const withinYRange = Math.min(y1, y2) <= y && y <= Math.max(y1, y2) + + return withinXRange && withinYRange } /** * 점과 가까운 line 찾기 From 7c15da2b4c40133e471d3d936d2fe424f89f88ce Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 18 Mar 2025 10:29:26 +0900 Subject: [PATCH 08/71] =?UTF-8?q?YJSS=20=EA=B8=88=EC=95=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/floorPlan/estimate/useEstimateController.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index d509a1e0..5ed1cd8f 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -291,6 +291,12 @@ export const useEstimateController = (planNo, flag) => { setIsGlobalLoading(false) return swalFire({ text: getMessage('estimate.detail.save.requiredSalePrice'), type: 'alert', icon: 'warning' }) } + + if (item.salePrice < 1) { + itemFlg = false + setIsGlobalLoading(false) + return swalFire({ text: getMessage('estimate.detail.save.requiredSalePrice'), type: 'alert', icon: 'warning' }) + } } } } From 06fa1766d6dd076fcc90e8bc624e2f9a3ce856a9 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 18 Mar 2025 10:56:37 +0900 Subject: [PATCH 09/71] =?UTF-8?q?=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EA=B0=99=EC=9D=80=20?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EA=B2=80=EC=82=AC=20=EB=AA=BB?= =?UTF-8?q?=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/util/qpolygon-utils.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index cded90ee..34bc2320 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -305,6 +305,9 @@ export function removeDuplicatePolygons(polygons) { } export const isSamePoint = (a, b) => { + if (!a || !b) { + return false + } return Math.abs(Math.round(a.x) - Math.round(b.x)) <= 2 && Math.abs(Math.round(a.y) - Math.round(b.y)) <= 2 } From 1fa02de62ffab0c4bd83ffb8bf7e9185e7978cf3 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 18 Mar 2025 11:33:45 +0900 Subject: [PATCH 10/71] =?UTF-8?q?=EC=A7=80=EB=B6=95=EB=A9=B4=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=20=EC=88=9C=EC=84=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useRoofAllocationSetting.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/hooks/roofcover/useRoofAllocationSetting.js b/src/hooks/roofcover/useRoofAllocationSetting.js index 536a2127..fb7d2114 100644 --- a/src/hooks/roofcover/useRoofAllocationSetting.js +++ b/src/hooks/roofcover/useRoofAllocationSetting.js @@ -1,6 +1,6 @@ import { useRecoilState, useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil' import { canvasState, currentAngleTypeSelector, currentMenuState, currentObjectState } from '@/store/canvasAtom' -import { useEffect, useRef, useState } from 'react' +import { useContext, useEffect, useRef, useState } from 'react' import { useAxios } from '@/hooks/useAxios' import { useSwal } from '@/hooks/useSwal' import { usePolygon } from '@/hooks/usePolygon' @@ -26,6 +26,7 @@ import { getChonByDegree, getDegreeByChon } from '@/util/canvas-util' import { moduleSelectionDataState } from '@/store/selectedModuleOptions' import { useCanvasPopupStatusController } from '@/hooks/common/useCanvasPopupStatusController' import { outerLinePointsState } from '@/store/outerLineAtom' +import { QcastContext } from '@/app/QcastProvider' export function useRoofAllocationSetting(id) { const canvas = useRecoilValue(canvasState) @@ -49,7 +50,7 @@ export function useRoofAllocationSetting(id) { const { get, post } = useAxios(globalLocaleState) const { getMessage } = useMessage() const { swalFire } = useSwal() - + const { setIsGlobalLoading } = useContext(QcastContext) const { setSurfaceShapePattern } = useRoofFn() const [moduleSelectionData, setModuleSelectionData] = useRecoilState(moduleSelectionDataState) @@ -200,6 +201,7 @@ export function useRoofAllocationSetting(id) { */ const basicSettingSave = async () => { try { + setIsGlobalLoading(true) const patternData = { objectNo: correntObjectNo, planNo: Number(basicSetting.planNo), @@ -222,6 +224,7 @@ export function useRoofAllocationSetting(id) { await post({ url: `/api/canvas-management/roof-allocation-settings`, data: patternData }).then((res) => { swalFire({ text: getMessage(res.returnMessage) }) + setIsGlobalLoading(false) }) //Recoil 설정 @@ -270,8 +273,6 @@ export function useRoofAllocationSetting(id) { * 선택한 지붕재로 할당 */ const handleSave = () => { - basicSettingSave() - /** * 모두 actualSize 있으면 바로 적용 없으면 actualSize 설정 */ @@ -280,6 +281,7 @@ export function useRoofAllocationSetting(id) { } else { apply() resetPoints() + basicSettingSave() } } @@ -287,7 +289,6 @@ export function useRoofAllocationSetting(id) { * 지붕재 오른쪽 마우스 클릭 후 단일로 지붕재 변경 필요한 경우 */ const handleSaveContext = () => { - basicSettingSave() const newRoofList = currentRoofList.map((roof, idx) => { return { ...roof, index: idx, raft: roof.raft ? roof.raft : roof.raftBaseCd } }) @@ -304,6 +305,7 @@ export function useRoofAllocationSetting(id) { drawDirectionArrow(currentObject) modifyModuleSelectionData() closeAll() + basicSettingSave() } /** @@ -361,6 +363,7 @@ export function useRoofAllocationSetting(id) { splitPolygonWithLines(roofBase) } } catch (e) { + console.log(e) return } From 57446fa6d8e5e8725551dc43587639b5efddff38 Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 18 Mar 2025 12:54:36 +0900 Subject: [PATCH 11/71] =?UTF-8?q?=EC=A3=BC=ED=83=9D=20=EC=9B=90=EB=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/floorPlan/estimate/useEstimateController.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 5ed1cd8f..d509a1e0 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -291,12 +291,6 @@ export const useEstimateController = (planNo, flag) => { setIsGlobalLoading(false) return swalFire({ text: getMessage('estimate.detail.save.requiredSalePrice'), type: 'alert', icon: 'warning' }) } - - if (item.salePrice < 1) { - itemFlg = false - setIsGlobalLoading(false) - return swalFire({ text: getMessage('estimate.detail.save.requiredSalePrice'), type: 'alert', icon: 'warning' }) - } } } } From 2e762537fc1bac06ff8b68fd3fdfe5c0cfcf18db Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 18 Mar 2025 13:24:58 +0900 Subject: [PATCH 12/71] =?UTF-8?q?#918=20=EA=B2=AC=EC=A0=81=EC=84=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=ED=99=94=EB=A9=B4=20=EA=B2=AC=EC=A0=81?= =?UTF-8?q?=EC=9D=BC=20->=20=EA=B2=AC=EC=A0=81=EC=9E=91=EC=84=B1=EC=9D=BC?= =?UTF-8?q?=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/ja.json | 2 +- src/locales/ko.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/locales/ja.json b/src/locales/ja.json index d6670702..ee4c6d28 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -886,7 +886,7 @@ "estimate.detail.drawingEstimateCreateDate": "登録日", "estimate.detail.lastEditDatetime": "変更日時", "estimate.detail.saleStoreId": "一次販売店名", - "estimate.detail.estimateDate": "見積日", + "estimate.detail.estimateDate": "見積作成日", "estimate.detail.otherSaleStoreId": "二次販売店名", "estimate.detail.noOtherSaleStoreId": "二次店なし", "estimate.detail.receiveUser": "担当者", diff --git a/src/locales/ko.json b/src/locales/ko.json index 4c051305..5cfbc50b 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -886,7 +886,7 @@ "estimate.detail.drawingEstimateCreateDate": "등록일", "estimate.detail.lastEditDatetime": "변경일시", "estimate.detail.saleStoreId": "1차 판매점명", - "estimate.detail.estimateDate": "견적일", + "estimate.detail.estimateDate": "견적작성일", "estimate.detail.otherSaleStoreId": "2차 판매점명", "estimate.detail.noOtherSaleStoreId": "2차점 없음", "estimate.detail.receiveUser": "담당자", From 11438773a1b24739623c8495f307933ed3c408be Mon Sep 17 00:00:00 2001 From: basssy Date: Tue, 18 Mar 2025 13:28:58 +0900 Subject: [PATCH 13/71] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=ED=97=A4=EB=8D=94=EB=A9=94=EB=89=B4=20=EB=AC=B8?= =?UTF-8?q?=EC=84=9C=EB=8B=A4=EC=9A=B4=EB=A1=9C=EB=93=9C=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/ja.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/locales/ja.json b/src/locales/ja.json index ee4c6d28..b0db31ce 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -178,7 +178,7 @@ "modal.roof.alloc.select.parallel": "筋配置", "modal.roof.alloc.select.stairs": "千鳥配置", "modal.roof.alloc.apply": "選択した屋根材として割り当て", - "plan.menu.estimate.docDown": "各種資料ダウンロード", + "plan.menu.estimate.docDown": "見積書出力", "plan.menu.estimate.save": "保存", "plan.menu.estimate.reset": "初期化", "plan.menu.estimate.copy": "見積書のコピー", From 84e8af50b8479074aab6f3699d66526e0a0fd452 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 18 Mar 2025 15:55:11 +0900 Subject: [PATCH 14/71] =?UTF-8?q?QSelectbox=20key=20=EC=A4=91=EB=B3=B5=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/common/select/QSelectBox.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/common/select/QSelectBox.jsx b/src/components/common/select/QSelectBox.jsx index f1041da3..a027cb55 100644 --- a/src/components/common/select/QSelectBox.jsx +++ b/src/components/common/select/QSelectBox.jsx @@ -87,7 +87,7 @@ export default function QSelectBox({
    {options?.length > 0 && options?.map((option, index) => ( -
  • handleClickSelectOption(option)}> +
  • handleClickSelectOption(option)}>
  • ))} From 521bfd4303c6453833d7d7fe28e0864339503ce1 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Wed, 19 Mar 2025 11:10:12 +0900 Subject: [PATCH 15/71] =?UTF-8?q?=EB=B0=98=EA=B0=81=EB=A7=8C=20=EC=9E=85?= =?UTF-8?q?=EB=A0=A5=EA=B0=80=EB=8A=A5=20=EB=AC=B8=EA=B5=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/placementShape/PlacementShapeSetting.jsx | 6 +++++- src/locales/ja.json | 3 ++- src/locales/ko.json | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx index a70a8c65..25ca72b8 100644 --- a/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx +++ b/src/components/floor-plan/modal/placementShape/PlacementShapeSetting.jsx @@ -271,7 +271,11 @@ export default function PlacementShapeSetting({ id, pos = { x: 50, y: 180 }, pla {getMessage('modal.placement.initial.setting.plan.drawing')} - {getMessage('modal.placement.initial.setting.plan.drawing.size.stuff')} + + {getMessage('modal.placement.initial.setting.plan.drawing.size.stuff')} +         + {getMessage('modal.placement.initial.setting.plan.drawing.only.number')} + diff --git a/src/locales/ja.json b/src/locales/ja.json index d6670702..0e290001 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -1034,5 +1034,6 @@ "roof.exceed.count": "屋根材は4つまで選択可能です。", "outerLine.property.fix": "外壁線の属性設定 を完了しますか?", "outerLine.property.close": "外壁線の属性設定 を終了しますか?", - "want.to.complete.auxiliary.creation": "보補助線の作成を完了しますか?" + "want.to.complete.auxiliary.creation": "보補助線の作成を完了しますか?", + "modal.placement.initial.setting.plan.drawing.only.number": "(※数字は[半角]入力のみ可能です。)" } diff --git a/src/locales/ko.json b/src/locales/ko.json index 4c051305..013050d4 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1034,5 +1034,6 @@ "roof.exceed.count": "지붕재는 4개까지 선택 가능합니다.", "outerLine.property.fix": "외벽선 속성 설정을 완료하시겠습니까?", "outerLine.property.close": "외벽선 속성 설정을 종료하시겠습니까?", - "want.to.complete.auxiliary.creation": "보조선 작성을 완료하시겠습니까?" + "want.to.complete.auxiliary.creation": "보조선 작성을 완료하시겠습니까?", + "modal.placement.initial.setting.plan.drawing.only.number": "(※ 숫자는 [반각]입력만 가능합니다.)" } From 325c2c1cc0a5188889ebf61b836597600eed2798 Mon Sep 17 00:00:00 2001 From: yjnoh Date: Wed, 19 Mar 2025 13:28:20 +0900 Subject: [PATCH 16/71] =?UTF-8?q?=EB=B2=88=EC=97=AD=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useAuxiliaryDrawing.js | 2 +- src/hooks/roofcover/useEavesGableEdit.js | 2 +- src/hooks/roofcover/useRoofShapePassivitySetting.js | 2 +- src/hooks/roofcover/useRoofShapeSetting.js | 2 +- src/hooks/roofcover/useWallLineOffsetSetting.js | 2 +- src/locales/ja.json | 8 +++++--- src/locales/ko.json | 4 +++- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index 6023bce8..37d1aa7a 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -84,7 +84,7 @@ export function useAuxiliaryDrawing(id, isUseEffect = true) { // innerLines가 있을경우 삭제 const roofs = canvas?.getObjects().filter((obj) => obj.name === POLYGON_TYPE.ROOF) if (roofs.length === 0) { - swalFire({ text: '지붕형상이 없습니다.' }) + swalFire({ text: getMessage('roof.line.not.found') }) closePopup(id) return } diff --git a/src/hooks/roofcover/useEavesGableEdit.js b/src/hooks/roofcover/useEavesGableEdit.js index ff0073ae..37b8017c 100644 --- a/src/hooks/roofcover/useEavesGableEdit.js +++ b/src/hooks/roofcover/useEavesGableEdit.js @@ -52,7 +52,7 @@ export function useEavesGableEdit(id) { useEffect(() => { const outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine') if (!outerLineFix || outerLines.length === 0) { - swalFire({ text: '외벽선이 없습니다.' }) + swalFire({ text: getMessage('wall.line.not.found') }) closePopup(id) } }, []) diff --git a/src/hooks/roofcover/useRoofShapePassivitySetting.js b/src/hooks/roofcover/useRoofShapePassivitySetting.js index 33d5d953..c5077a32 100644 --- a/src/hooks/roofcover/useRoofShapePassivitySetting.js +++ b/src/hooks/roofcover/useRoofShapePassivitySetting.js @@ -51,7 +51,7 @@ export function useRoofShapePassivitySetting(id) { useEffect(() => { const outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine') if (!outerLineFix || outerLines.length === 0) { - swalFire({ text: '외벽선이 없습니다.' }) + swalFire({ text: getMessage('wall.line.not.found') }) closePopup(id) return } diff --git a/src/hooks/roofcover/useRoofShapeSetting.js b/src/hooks/roofcover/useRoofShapeSetting.js index 1167aac9..1881b184 100644 --- a/src/hooks/roofcover/useRoofShapeSetting.js +++ b/src/hooks/roofcover/useRoofShapeSetting.js @@ -191,7 +191,7 @@ export function useRoofShapeSetting(id) { let direction if (outerLines.length < 2) { - swalFire({ text: '외벽선이 없습니다.', icon: 'error' }) + swalFire({ text: getMessage('wall.line.not.found') }) return } diff --git a/src/hooks/roofcover/useWallLineOffsetSetting.js b/src/hooks/roofcover/useWallLineOffsetSetting.js index 01fbec09..245a7f15 100644 --- a/src/hooks/roofcover/useWallLineOffsetSetting.js +++ b/src/hooks/roofcover/useWallLineOffsetSetting.js @@ -60,7 +60,7 @@ export function useWallLineOffsetSetting(id) { useEffect(() => { const outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine') if (outerLines.length === 0) { - swalFire({ text: '외벽선이 없습니다.' }) + swalFire({ text: getMessage('wall.line.not.found') }) closePopup(id) return } diff --git a/src/locales/ja.json b/src/locales/ja.json index 0e290001..80850e4b 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -37,7 +37,7 @@ "modal.roof.shape.setting.patten.a": "Aパターン", "modal.roof.shape.setting.patten.b": "Bパターン", "modal.roof.shape.setting.side": "別に設定", - "plan.menu.roof.cover": "屋根作図", + "plan.menu.roof.cover": "伏せ図入力", "plan.menu.roof.cover.outline.drawing": "外壁線を描く", "plan.menu.roof.cover.roof.shape.setting": "屋根形状の設定", "plan.menu.roof.cover.roof.shape.passivity.setting": "屋根形状の手動設定", @@ -72,7 +72,7 @@ "common.setting.rollback": "前に戻る", "modal.cover.outline.remove": "外壁の取り外し", "modal.cover.outline.select.move": "外壁選択の移動", - "plan.menu.placement.surface": "配置面", + "plan.menu.placement.surface": "実測値入力", "plan.menu.placement.surface.slope.setting": "傾斜設定", "plan.menu.placement.surface.drawing": "配置面の描画", "modal.placement.surface.drawing.straight.line": "直線", @@ -1035,5 +1035,7 @@ "outerLine.property.fix": "外壁線の属性設定 を完了しますか?", "outerLine.property.close": "外壁線の属性設定 を終了しますか?", "want.to.complete.auxiliary.creation": "보補助線の作成を完了しますか?", - "modal.placement.initial.setting.plan.drawing.only.number": "(※数字は[半角]入力のみ可能です。)" + "modal.placement.initial.setting.plan.drawing.only.number": "(※数字は[半角]入力のみ可能です。)", + "wall.line.not.found": "外壁がありません", + "roof.line.not.found": "屋根形状がありません" } diff --git a/src/locales/ko.json b/src/locales/ko.json index 013050d4..e5c98ce5 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1035,5 +1035,7 @@ "outerLine.property.fix": "외벽선 속성 설정을 완료하시겠습니까?", "outerLine.property.close": "외벽선 속성 설정을 종료하시겠습니까?", "want.to.complete.auxiliary.creation": "보조선 작성을 완료하시겠습니까?", - "modal.placement.initial.setting.plan.drawing.only.number": "(※ 숫자는 [반각]입력만 가능합니다.)" + "modal.placement.initial.setting.plan.drawing.only.number": "(※ 숫자는 [반각]입력만 가능합니다.)", + "wall.line.not.found": "외벽선이 없습니다.", + "roof.line.not.found": "지붕형상이 없습니다." } From 590040fa1d7e1fda6011207574750fe44fae0a55 Mon Sep 17 00:00:00 2001 From: "BOOK-BKT8UBVE0A\\dhfkd" Date: Wed, 19 Mar 2025 16:23:19 +0900 Subject: [PATCH 17/71] =?UTF-8?q?=EC=9E=90=EB=8F=99=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20id=20=EC=9E=85=EB=A0=A5=20=EC=88=98=EC=A0=95=20#913?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/auth/AutoLogin.jsx | 109 ++++++++++++++++++++++++++---- src/components/auth/Login.jsx | 6 +- src/locales/ja.json | 1 + src/locales/ko.json | 1 + 4 files changed, 103 insertions(+), 14 deletions(-) diff --git a/src/components/auth/AutoLogin.jsx b/src/components/auth/AutoLogin.jsx index d400f2c4..b3dcbb6e 100644 --- a/src/components/auth/AutoLogin.jsx +++ b/src/components/auth/AutoLogin.jsx @@ -2,26 +2,111 @@ import { useState } from 'react' import { useMessage } from '@/hooks/useMessage' +import { setSession, login } from '@/lib/authActions' +import { sessionStore } from '@/store/commonAtom' +import { useRecoilState } from 'recoil' +import { useAxios } from '@/hooks/useAxios' +import { globalLocaleStore } from '@/store/localeAtom' +import { useRouter } from 'next/navigation' + import GlobalSpinner from '@/components/common/spinner/GlobalSpinner' -export default function AutoLoginPage() { - const [isLoading, setIsLoading] = useState(true) +export default function AutoLoginPage({ autoLoginParam }) { + const router = useRouter() + + const [isLoading, setIsLoading] = useState(autoLoginParam === 'Y' ? false : true) + const [globalLocaleState, setGlbalLocaleState] = useRecoilState(globalLocaleStore) + + const { promisePost } = useAxios(globalLocaleState) const { getMessage } = useMessage() + const [userId, setUserId] = useState('') + const [sessionState, setSessionState] = useRecoilState(sessionStore) + + const [idFocus, setIdFocus] = useState(false) + + const loginProcess = async () => { + setIsLoading(true) + await promisePost({ url: '/api/login/v1.0/user', data: { loginId: userId } }).then((response) => { + setIsLoading(false) + if (response.data) { + const res = response.data + const result = { ...res, storeLvl: res.groupId === '60000' ? '1' : '2', pwdInitYn: 'Y' } + setSession(result) + setSessionState(result) + login() + } else { + alert(getMessage('login.fail')) + router.push('/login?autoLoginParam1=Y') + } + }) + } + return ( <> {isLoading && } -
    -
    - {getMessage('site.name')} - {getMessage('site.sub_name')} -
    -
    -
    - {getMessage('login.auto.page.text')} + {autoLoginParam !== 'Y' ? ( + <> +
    +
    + {getMessage('site.name')} + {getMessage('site.sub_name')} +
    +
    +
    + {getMessage('login.auto.page.text')} +
    +
    -
    -
    + + ) : ( + <> +
    +
    { + e.preventDefault() + loginProcess() + }} + className="space-y-6" + > +
    + {getMessage('site.name')} + {getMessage('site.sub_name')} +
    +
    +
    + { + setUserId(e.target.value) + }} + onFocus={() => setIdFocus(true)} + onBlur={() => setIdFocus(false)} + /> + +
    +
    + +
    +
    +
    +
    + + )} ) } diff --git a/src/components/auth/Login.jsx b/src/components/auth/Login.jsx index 85e342d4..7a6ba957 100644 --- a/src/components/auth/Login.jsx +++ b/src/components/auth/Login.jsx @@ -25,7 +25,9 @@ export default function Login() { useEffect(() => { if (autoLoginParam) { - autoLoginProcess(autoLoginParam) + if (autoLoginParam !== 'Y') { + autoLoginProcess(autoLoginParam) + } } // console.log('🚀 ~ checkSession ~ checkSession():', checkSession()) @@ -334,7 +336,7 @@ export default function Login() {
    )} - {autoLoginParam && } + {autoLoginParam && }
    COPYRIGHT©2024 Hanwha Japan All Rights Reserved.
    diff --git a/src/locales/ja.json b/src/locales/ja.json index 80850e4b..e91861ac 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -594,6 +594,7 @@ "myinfo.message.password.error": "パスワードが間違っています。", "login": "ログイン", "login.auto.page.text": "自動ログイン中です。", + "login.fail": "アカウントが存在しないか、パスワードが間違っています。", "login.id.save": "ID保存", "login.id.placeholder": "IDを入力してください。", "login.password.placeholder": "パスワードを入力してください。", diff --git a/src/locales/ko.json b/src/locales/ko.json index e5c98ce5..be5154ac 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -594,6 +594,7 @@ "myinfo.message.password.error": "비밀번호가 틀렸습니다.", "login": "로그인", "login.auto.page.text": "자동로그인 중 입니다.", + "login.fail": "계정이 없거나 비밀번호가 잘못되었습니다.", "login.id.save": "ID Save", "login.id.placeholder": "아이디를 입력해주세요.", "login.password.placeholder": "비밀번호를 입력해주세요.", From f7fe0f6528062d46329b5a3c9c5ac52da3b80d1d Mon Sep 17 00:00:00 2001 From: basssy Date: Wed, 19 Mar 2025 17:40:13 +0900 Subject: [PATCH 18/71] =?UTF-8?q?#925=20=EA=B2=AC=EC=A0=81=EC=84=9C=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EA=B0=80=EA=B2=A9=ED=91=9C=EC=8B=9C=20?= =?UTF-8?q?=EC=98=B5=EC=85=98=20&=20=ED=94=84=EB=9D=BC=EC=9D=B4=EC=8B=B1?= =?UTF-8?q?=20=ED=98=B8=EC=B6=9C=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index a44af878..06df265d 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -377,8 +377,8 @@ export default function Estimate({}) { useEffect(() => { if (estimateContextState.estimateType !== '') { const param = { - saleStoreId: session.storeId, - sapSalesStoreCd: session.custCd, + saleStoreId: estimateContextState.sapSaleStoreId, + sapSalesStoreCd: estimateContextState.sapSalesStoreCd, docTpCd: estimateContextState?.estimateType, } @@ -481,8 +481,8 @@ export default function Estimate({}) { //Pricing 버튼 const handlePricing = async (showPriceCd) => { const param = { - saleStoreId: session.storeId, - sapSalesStoreCd: session.custCd, + saleStoreId: estimateContextState.sapSaleStoreId, + sapSalesStoreCd: estimateContextState.sapSalesStoreCd, docTpCd: estimateContextState.estimateType, priceCd: showPriceCd, itemIdList: estimateContextState.itemList.filter((item) => item.delFlg === '0' && item.paDispOrder === null), @@ -506,7 +506,6 @@ export default function Estimate({}) { }) } } - setIsGlobalLoading(true) await promisePost({ url: '/api/estimate/price/item-price-list', data: param }).then((res) => { let updateList = [] From 05dd069e537351ac5169ad274ea7648d34fa1390 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 20 Mar 2025 10:02:09 +0900 Subject: [PATCH 19/71] =?UTF-8?q?modified=20=EC=8B=9C=20lines=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EC=83=88=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/fabric/QPolygon.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/fabric/QPolygon.js b/src/components/fabric/QPolygon.js index f19687aa..4b15d687 100644 --- a/src/components/fabric/QPolygon.js +++ b/src/components/fabric/QPolygon.js @@ -119,10 +119,12 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { this.addLengthText() this.on('moving', () => { + this.initLines() this.addLengthText() }) this.on('modified', (e) => { + this.initLines() this.addLengthText() }) @@ -183,7 +185,7 @@ export const QPolygon = fabric.util.createClass(fabric.Polygon, { this.lines = [] - this.points.forEach((point, i) => { + this.getCurrentPoints().forEach((point, i) => { const nextPoint = this.points[(i + 1) % this.points.length] const line = new QLine([point.x, point.y, nextPoint.x, nextPoint.y], { stroke: this.stroke, From e7410e53731f79d4c967586a66197b90fc54950b Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 20 Mar 2025 13:35:06 +0900 Subject: [PATCH 20/71] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=9D=BC?= =?UTF-8?q?=EB=B3=B8=EC=96=B4=20=EB=B3=80=EA=B2=BD=20=EB=88=84=EB=9D=BD?= =?UTF-8?q?=EB=B6=84=20=EC=9E=AC=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 4 ++-- src/components/floor-plan/CanvasMenu.jsx | 2 +- src/locales/ja.json | 4 ++-- src/locales/ko.json | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 06df265d..532d6364 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -387,6 +387,8 @@ export default function Estimate({}) { if (isNotEmptyArray(res?.data)) { setStorePriceList(res.data) } + + setItemChangeYn(true) }) if (estimateContextState.estimateType === 'YJSS') { @@ -416,8 +418,6 @@ export default function Estimate({}) { handlePricing('UNIT_PRICE') } } - - setItemChangeYn(true) } }, [estimateContextState?.estimateType]) diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 0d9ddc0a..a268604e 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -634,7 +634,7 @@ export default function CanvasMenu(props) { onClick={() => setEstimatePopupOpen(true)} > - {getMessage('plan.menu.estimate.docDown')} + {getMessage('plan.menu.estimate.docDownload')}