diff --git a/docs/2025-02-10_Qcell_회의.txt b/docs/2025-02-10_Qcell_회의.txt new file mode 100644 index 00000000..48224f78 --- /dev/null +++ b/docs/2025-02-10_Qcell_회의.txt @@ -0,0 +1,26 @@ +공통. 기본 폰트값 통일 -> + 1. 전체 화면 기본폰트 MS PGothic으로 통일 (폰트 기능 협의) + 2. 번역이 후짐 + +1. 지붕덮개 -> + 1-1. '외벽선 속성 설정을 완료하시겠습니까?' 문구 메시지 처리 + 1-2. 지붕재 설정 selectbox 한글로 나옴 + +2. 배치면 -> + +3. 모듈 -> + 3-1. 모듈 선택 화면 -> + 1) 서까래 간격 유지 안됨 + 2) 데이터 저장 이후 모듈 변경으로 인해 셀렉트박스의 데이터가 없을 경우 이전 데이터로 설정됨 + 3-2. 모듈 설치 -> + 1) 모듈 설치시 방향에 따른 기준 설정 문제 + +4. 회로 -> + 4-1. 회로 선택 화면 -> pcs 선택 화면 관련 시리즈 영역 width값 조정 + +5. 가대설정 -> + 5-1. 가대 그릴시 금구 위치 다름(좌,우, T01 / RA03250210002 / PLAN 1참고) + 5-2. 가대 설치 후 견적서로 넘어가는 시간이 너무 빠르다고 함 + +6. 견적서 -> + 6-1. 견적서 문서 다운로드 도면 이미지 포함 안됨 \ No newline at end of file diff --git a/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx b/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx index e0f3522b..1da94050 100644 --- a/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx +++ b/src/components/floor-plan/modal/auxiliary/AuxiliaryEdit.jsx @@ -21,23 +21,34 @@ export default function AuxiliaryEdit(props) { const currentObject = useRecoilValue(currentObjectState) const { swalFire } = useSwal() const handleSave = () => { - if (!horizonSize || !verticalSize || !arrow1 || !arrow2) { - swalFire({ title: '길이와 방향을 입력하세요.', type: 'alert' }) + if ((!arrow1 && !arrow2) || (+verticalSize === 0 && +horizonSize === 0)) { + swalFire({ title: getMessage('length.direction.is.required'), type: 'alert' }) return } + + if ((verticalSize && +verticalSize === 0) || !arrow1) { + swalFire({ title: getMessage('length.direction.is.required'), type: 'alert' }) + return + } + + if ((horizonSize && +horizonSize === 0) || !arrow2) { + swalFire({ title: getMessage('length.direction.is.required'), type: 'alert' }) + return + } + if (type === 'copy') { if (currentObject) { copy( currentObject, - arrow2 === '←' ? Number(horizonSize) * -1 : Number(horizonSize), - arrow1 === '↑' ? Number(verticalSize) * -1 : Number(verticalSize), + arrow2 ? (arrow2 === '←' ? Number(horizonSize) * -1 : Number(horizonSize)) : 0, + arrow1 ? (arrow1 === '↑' ? Number(verticalSize) * -1 : Number(verticalSize)) : 0, ) } } else { move( currentObject, - arrow2 === '←' ? Number(horizonSize) * -1 : Number(horizonSize), - arrow1 === '↑' ? Number(verticalSize) * -1 : Number(verticalSize), + arrow2 ? (arrow2 === '←' ? Number(horizonSize) * -1 : Number(horizonSize)) : 0, + arrow1 ? (arrow1 === '↑' ? Number(verticalSize) * -1 : Number(verticalSize)) : 0, ) } diff --git a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx index be4653c0..66f1646a 100644 --- a/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/CircuitTrestleSetting.jsx @@ -368,6 +368,7 @@ export default function CircuitTrestleSetting({ id }) { circuitModules.forEach((obj) => { obj.circuit = null obj.pcsItemId = null + obj.circuitNumber = null }) if (allocationType === ALLOCATION_TYPE.PASSIVITY) { diff --git a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx index e0bd7592..7ac64fde 100644 --- a/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx +++ b/src/components/floor-plan/modal/circuitTrestle/step/StepUp.jsx @@ -392,18 +392,21 @@ export default function StepUp(props) { } } + canvas + .getObjects() + .filter((obj) => obj.name === POLYGON_TYPE.MODULE) + .forEach((module) => { + module.circuit = null + module.circuitNumber = null + module.pcsItemId = null + }) + selectedData.roofSurfaceList.forEach((roofSurface) => { const targetSurface = canvas.getObjects().filter((obj) => obj.id === roofSurface.roofSurfaceId)[0] const moduleIds = targetSurface.modules.map((module) => { return module.id }) - targetSurface.modules.map((module) => { - module.circuit = null - module.circuitNumber = null - module.pcsItemId = null - }) - // 모듈 목록 삭제 canvas .getObjects() diff --git a/src/components/floor-plan/modal/grid/GridMove.jsx b/src/components/floor-plan/modal/grid/GridMove.jsx index e28d8564..1713647b 100644 --- a/src/components/floor-plan/modal/grid/GridMove.jsx +++ b/src/components/floor-plan/modal/grid/GridMove.jsx @@ -38,12 +38,12 @@ export default function GridMove(props) { const handleApply = () => { if (currentObject?.direction === 'vertical') { if (!horizonSize || !arrow2) { - swalFire({ title: '길이와 방향을 입력하세요.', type: 'alert' }) + swalFire({ title: getMessage('length.direction.is.required'), type: 'alert' }) return } } else { if (!verticalSize || !arrow1) { - swalFire({ title: '길이와 방향을 입력하세요.', type: 'alert' }) + swalFire({ title: getMessage('length.direction.is.required'), type: 'alert' }) } } diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index ee0a1930..0a3be3ee 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -214,7 +214,7 @@ export default function Stuff() { // 진입시 그리드 데이터 조회 useEffect(() => { - if (stuffSearchParams?.code === 'S') { + if (stuffSearchParams?.code === 'S' || stuffSearchParams?.code === 'END') { const params = { saleStoreId: session.storeId, schObjectNo: stuffSearchParams?.schObjectNo, @@ -267,7 +267,11 @@ export default function Stuff() { setIsGlobalLoading(false) }) } - fetchData() + if (stuffSearchParams.code === 'S') { + fetchData() + } else { + stuffSearchParams.code = 'S' + } } else if (stuffSearchParams?.code === 'M') { const params = { schObjectNo: stuffSearchParams.schObjectNo, @@ -328,7 +332,6 @@ export default function Stuff() { stuffSearchParams.startRow = 1 stuffSearchParams.endRow = 1 * stuffSearchParams.pageSize } - setIsGlobalLoading(false) }) } @@ -383,7 +386,7 @@ export default function Stuff() { schSelSaleStoreId: '', schOtherSelSaleStoreId: '', schSortType: 'U', - code: 'S', + code: 'END', pageNo: 1, pageSize: 100, schMyDataCheck: false, @@ -392,7 +395,6 @@ export default function Stuff() { setStuffSearch({ ...newParams, }) - setIsGlobalLoading(false) } else { stuffSearchParams.code = 'DELETE' diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index d259e573..ecac7471 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -611,14 +611,9 @@ export default function StuffSearchCondition() { //판매대리점 자동완성 변경 const onSelectionChange = (key) => { - //내 물건보기 체크 풀어주기 - setMyDataCheck(stuffSearch.schMyDataCheck) - // stuffSearch.schMyDataCheck = false - if (isObjectNotEmpty(key)) { setOtherSaleStoreId('') setSchSelSaleStoreId(key.saleStoreId) - // stuffSearch.schSelSaleStoreId = key.saleStoreId //고른 1차점의 saleStoreId로 2차점 API호출하기 let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${session?.userId}` let otherList @@ -663,7 +658,6 @@ export default function StuffSearchCondition() { stuffSearch.schMyDataCheck = false if (isObjectNotEmpty(key)) { setOtherSaleStoreId(key.saleStoreId) - // stuffSearch.schOtherSelSaleStoreId = key.saleStoreId //2차점 골랐을때 1차점 값 if (session.storeId === 'T01') { @@ -767,7 +761,6 @@ export default function StuffSearchCondition() { setOtherSaleStoreId('') } else { setTempFlg(stuffSearch.schTempFlg ? stuffSearch.schTempFlg : tempFlg) - setMyDataCheck(stuffSearch.schMyDataCheck) } } else { if (stuffSearch.code === 'DELETE') { @@ -820,7 +813,7 @@ export default function StuffSearchCondition() { setReceiveUser(stuffSearch.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser) setDateType(stuffSearch.schDateType ? stuffSearch.schDateType : dateType) setTempFlg(stuffSearch.schTempFlg ? stuffSearch.schTempFlg : tempFlg) - setMyDataCheck(stuffSearch.schMyDataCheck) + if (session.storeLvl !== '1') { stuffSearch.schSelSaleStoreId = '' } @@ -836,12 +829,6 @@ export default function StuffSearchCondition() { } else if (stuffSearch.schTempFlg === '1') { setTempFlg('1') } - - if (stuffSearch.schMyDataCheck) { - setMyDataCheck(true) - } else { - setMyDataCheck(false) - } }, [stuffSearch]) useEffect(() => { @@ -865,42 +852,35 @@ export default function StuffSearchCondition() { //0203 내물건보기 체크시 공통 schSaleStoreId에 storeId담아 전송 schSelSaleStoreId, schOtherSelSaleStoreId 비우기 if (session?.storeId === 'T01') { if (e.target.checked) { - stuffSearch.schMyDataCheck = e.target.checked setMyDataCheck(true) setOtherSaleStoreId('') //2차점 비우기 setSchSelSaleStoreId('T01') - stuffSearch.schSaleStoreId = session.storeId stuffSearch.schSelSaleStoreId = '' stuffSearch.schOtherSelSaleStoreId = '' const key = { saleStoreId: session.storeId } onSelectionChange(key) } else { stuffSearch.schSaleStoreId = '' - stuffSearch.schMyDataCheck = e.target.checked setSchSelSaleStoreId('') setMyDataCheck(false) + //아래꺼 확인필요 onSelectionChange(null) } } else if (session?.storeLvl === '1') { if (e.target.checked) { - stuffSearch.schMyDataCheck = e.target.checked setMyDataCheck(true) setOtherSaleStoreId('') //2차점 비우기 setSchSelSaleStoreId(schSelSaleStoreId) - stuffSearch.schSaleStoreId = session.storeId stuffSearch.schSelSaleStoreId = '' stuffSearch.schOtherSelSaleStoreId = '' } else { - stuffSearch.schMyDataCheck = e.target.checked - stuffSearch.schSaleStoreId = '' setMyDataCheck(false) } } else { //2차점인제 3,4가 없으면 상관없음 //3,4등등이 있는경우 처리필요 if (e.target.checked) { - stuffSearch.schMyDataCheck = e.target.checked setMyDataCheck(true) if (otherSaleStoreList.length > 1) { stuffSearch.schSaleStoreId = session.storeId @@ -913,7 +893,6 @@ export default function StuffSearchCondition() { } } else { setMyDataCheck(false) - stuffSearch.schMyDataCheck = e.target.checked stuffSearch.schSaleStoreId = '' } } @@ -996,7 +975,6 @@ export default function StuffSearchCondition() { className="input-light" defaultValue={stuffSearch?.schObjectNo ? stuffSearch.schObjectNo : objectNo} onChange={() => { - // stuffSearch.schObjectNo = objectNoRef.current.value setObjectNo(objectNoRef.current.value) }} onKeyUp={handleByOnKeyUp} @@ -1012,7 +990,6 @@ export default function StuffSearchCondition() { className="input-light" defaultValue={stuffSearch?.schSaleStoreName ? stuffSearch.schSaleStoreName : saleStoreName} onChange={() => { - // stuffSearch.schSaleStoreName = saleStoreNameRef.current.value setSaleStoreName(saleStoreNameRef.current.value) }} onKeyUp={handleByOnKeyUp} @@ -1029,7 +1006,6 @@ export default function StuffSearchCondition() { className="input-light" defaultValue={stuffSearch?.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName} onChange={() => { - // stuffSearch.schDispCompanyName = dispCompanyNameRef.current.value setDispCompanyName(dispCompanyNameRef.current.value) }} onKeyUp={handleByOnKeyUp} @@ -1047,7 +1023,6 @@ export default function StuffSearchCondition() { className="input-light" defaultValue={stuffSearch?.schObjectName ? stuffSearch.schObjectName : objectName} onChange={() => { - // stuffSearch.schObjectName = objectNameRef.current.value setObjectName(objectNameRef.current.value) }} onKeyUp={handleByOnKeyUp} @@ -1063,7 +1038,6 @@ export default function StuffSearchCondition() { ref={receiveUserRef} defaultValue={stuffSearch?.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser} onChange={() => { - // stuffSearch.schReceiveUser = receiveUserRef.current.value setReceiveUser(receiveUserRef.current.value) }} onKeyUp={handleByOnKeyUp} @@ -1079,7 +1053,6 @@ export default function StuffSearchCondition() { className="input-light" defaultValue={stuffSearch?.schAddress ? stuffSearch.schAddress : address} onChange={() => { - // stuffSearch.schAddress = addressRef.current.value setAddress(addressRef.current.value) }} onKeyUp={handleByOnKeyUp} @@ -1101,7 +1074,6 @@ export default function StuffSearchCondition() { value={'U'} onChange={(e) => { setDateType(e.target.value) - // stuffSearch.schDateType = e.target.value }} /> @@ -1115,7 +1087,6 @@ export default function StuffSearchCondition() { value={'R'} onChange={(e) => { setDateType(e.target.value) - // stuffSearch.schDateType = e.target.value }} /> @@ -1140,11 +1111,10 @@ export default function StuffSearchCondition() { type="radio" name="schTempFlg" id="schTempFlg" - checked={stuffSearch.schTempFlg === '' ? true : false} + checked={tempFlg === '' ? true : false} value={''} onChange={(e) => { setTempFlg(e.target.value) - stuffSearch.schTempFlg = e.target.value }} /> @@ -1154,11 +1124,10 @@ export default function StuffSearchCondition() { type="radio" name="schTempFlg" id="schTempFlg0" - checked={stuffSearch.schTempFlg === '0' ? true : false} + checked={tempFlg === '0' ? true : false} value={'0'} onChange={(e) => { setTempFlg(e.target.value) - stuffSearch.schTempFlg = e.target.value }} /> @@ -1168,11 +1137,10 @@ export default function StuffSearchCondition() { type="radio" name="schTempFlg" id="schTempFlg1" - checked={stuffSearch.schTempFlg === '1' ? true : false} + checked={tempFlg === '1' ? true : false} value={'1'} onChange={(e) => { setTempFlg(e.target.value) - stuffSearch.schTempFlg = e.target.value }} /> @@ -1297,7 +1265,6 @@ export default function StuffSearchCondition() { onChange={onSelectionChange2} getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} - // isDisabled={otherSaleStoreList != null && otherSaleStoreList.length === 1 ? true : false} isDisabled={ session?.storeLvl === '1' ? (otherSaleStoreList.length > 0 ? false : true) : otherSaleStoreList.length === 1 ? true : false } @@ -1312,10 +1279,9 @@ export default function StuffSearchCondition() { { checkMyData(e) - stuffSearch.schMyDataCheck = e.target.checked }} /> diff --git a/src/hooks/common/useCanvasPopupStatusController.js b/src/hooks/common/useCanvasPopupStatusController.js index d7845362..c6be7f9c 100644 --- a/src/hooks/common/useCanvasPopupStatusController.js +++ b/src/hooks/common/useCanvasPopupStatusController.js @@ -17,7 +17,7 @@ export function useCanvasPopupStatusController(param = 1) { const [compasDeg, setCompasDeg] = useRecoilState(compasDegAtom) const [moduleSelectionDataStore, setModuleSelectionDataStore] = useRecoilState(moduleSelectionDataState) const [selectedModules, setSelectedModules] = useRecoilState(selectedModuleState) - const { get, getFetcher, postFetcher } = useAxios() + const { get, promiseGet, getFetcher, postFetcher } = useAxios() const canvas = useRecoilValue(canvasState) const currentCanvasPlan = useRecoilValue(currentCanvasPlanState) // console.log('🚀 ~ Orientation ~ currentCanvasPlan:', currentCanvasPlan) @@ -37,11 +37,18 @@ export function useCanvasPopupStatusController(param = 1) { // getFetcher, // ) - const res = await get({ + const result = await promiseGet({ url: `/api/v1/canvas-popup-status?objectNo=${currentCanvasPlan.objectNo}&planNo=${currentCanvasPlan.planNo}&popupType=${popupTypeParam}`, }) + .then((res) => { + return res + }) + .catch((err) => { + console.log('🚀 ~ getModuleSelection ~ err:', err) + return null + }) - return res + return result.data } /** @@ -51,8 +58,9 @@ export function useCanvasPopupStatusController(param = 1) { const handleModuleSelectionTotal = async () => { for (let i = 1; i < 3; i++) { const result = await getModuleSelection(i) + console.log('🚀 ~ handleModuleSelectionTotal ~ result:', result) // setModuleSelectionTotal((prev) => ({ ...prev, [i]: JSON.parse(unescapeString(result.popupStatus)) })) - if (!result) return + if (!result.objectNo) return if (i === 1) { setCompasDeg(result.popupStatus) } else if (i === 2) { diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index fbcea158..c63633cc 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -387,7 +387,6 @@ export const useEstimateController = (planNo) => { estimateData.pkgAsp = estimateData.pkgAsp.replaceAll(',', '') } - return //2. 상세데이터 저장 try { setIsGlobalLoading(true) diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index e93d4ff8..b63cdb97 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -425,7 +425,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { lockMovementY: true, // Y 축 이동 잠금 lockRotation: true, // 회전 잠금 viewLengthText: true, - direction: direction, + // direction: direction, originX: 'center', originY: 'center', name: dormerName, @@ -444,7 +444,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { lockMovementY: true, // Y 축 이동 잠금 lockRotation: true, // 회전 잠금 viewLengthText: true, - direction: direction, + // direction: direction, originX: 'center', originY: 'center', name: dormerName, @@ -462,8 +462,8 @@ export function useObjectBatch({ isHidden, setIsHidden }) { setSurfaceShapePattern(rightTriangle) //방향 - drawDirectionArrow(leftTriangle) - drawDirectionArrow(rightTriangle) + // drawDirectionArrow(leftTriangle) + // drawDirectionArrow(rightTriangle) let offsetPolygon @@ -649,7 +649,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { lockRotation: true, // 회전 잠금 viewLengthText: true, fontSize: 14, - direction: direction, + // direction: direction, originX: 'center', originY: 'center', name: dormerName, @@ -666,7 +666,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { lockRotation: true, // 회전 잠금 viewLengthText: true, fontSize: 14, - direction: direction, + // direction: direction, originX: 'center', originY: 'center', name: dormerName, @@ -680,8 +680,8 @@ export function useObjectBatch({ isHidden, setIsHidden }) { setSurfaceShapePattern(leftPentagon) setSurfaceShapePattern(rightPentagon) //방향 - drawDirectionArrow(leftPentagon) - drawDirectionArrow(rightPentagon) + // drawDirectionArrow(leftPentagon) + // drawDirectionArrow(rightPentagon) let offsetPolygon @@ -1025,6 +1025,74 @@ export function useObjectBatch({ isHidden, setIsHidden }) { } } + const copyObjectBatch = () => { + const obj = canvas.getActiveObject() + if (obj) { + let clonedObj = null + const parentSurface = canvas?.getObjects().filter((item) => item.name === POLYGON_TYPE.ROOF && item.id === obj.parentId)[0] + + obj.clone((cloned) => { + clonedObj = cloned + }) + + addCanvasMouseEventListener('mouse:move', (e) => { + const pointer = canvas?.getPointer(e.e) + if (!clonedObj) return + + canvas + .getObjects() + .filter((clonedObj) => clonedObj.name === 'clonedObj') + .forEach((clonedObj) => canvas?.remove(clonedObj)) + + clonedObj.set({ + left: pointer.x, + top: pointer.y, + name: 'clonedObj', + }) + canvas.add(clonedObj) + }) + + addCanvasMouseEventListener('mouse:up', (e) => { + //개구, 그림자 타입일 경우 폴리곤 타입 변경 + if (BATCH_TYPE.OPENING == obj.name || BATCH_TYPE.SHADOW == obj.name) { + clonedObj.set({ + points: rectToPolygon(clonedObj), + }) + + const turfSurface = pointsToTurfPolygon(parentSurface.points) + const turfObject = pointsToTurfPolygon(clonedObj.points) + + if (turf.booleanWithin(turfObject, turfSurface)) { + clonedObj.set({ + lockMovementX: true, + lockMovementY: true, + name: BATCH_TYPE.OPENING, + parentId: parentSurface.id, + }) + clonedObj.setCoords() + } else { + swalFire({ + title: getMessage('batch.object.outside.roof'), + icon: 'warning', + }) + canvas.remove(clonedObj) + } + } else { + clonedObj.set({ + lockMovementX: true, + lockMovementY: true, + name: obj.name, + }) + + if (clonedObj.type === 'group') reGroupObject(clonedObj) + clonedObj.setCoords() + } + canvas.discardActiveObject() + initEvent() + }) + } + } + const dormerOffsetKeyEvent = (setArrow1, setArrow2) => { addDocumentEventListener('keydown', document, (e) => { if (e.key === 'ArrowDown' || e.key === 'ArrowUp') { @@ -1061,5 +1129,6 @@ export function useObjectBatch({ isHidden, setIsHidden }) { moveObjectBatch, dormerOffsetKeyEvent, dormerOffset, + copyObjectBatch, } } diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 577d5b2e..fcac9947 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -58,7 +58,7 @@ export function useContextMenu() { const [cell, setCell] = useState(null) const [column, setColumn] = useState(null) const { handleZoomClear } = useCanvasEvent() - const { moveObjectBatch } = useObjectBatch({}) + const { moveObjectBatch, copyObjectBatch } = useObjectBatch({}) const { moveSurfaceShapeBatch } = useSurfaceShapeBatch({}) const [globalFont, setGlobalFont] = useRecoilState(globalFontAtom) const { addLine, removeLine } = useLine() @@ -130,11 +130,7 @@ export function useContextMenu() { name: getMessage('contextmenu.roof.material.placement'), component: , }, - { - id: 'roofMaterialRemove', - name: getMessage('contextmenu.roof.material.remove'), - fn: () => removeRoofMaterial(), - }, + { id: 'roofMaterialRemoveAll', name: getMessage('contextmenu.roof.material.remove.all'), @@ -470,7 +466,7 @@ export function useContextMenu() { id: 'openingCopy', shortcut: ['c', 'C'], name: `${getMessage('contextmenu.copy')}(C)`, - fn: () => copyObject(), + fn: () => copyObjectBatch(), }, { id: 'openingOffset', diff --git a/src/locales/ja.json b/src/locales/ja.json index dee68fff..d01eaba6 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -1014,5 +1014,6 @@ "max.select": "최대 {0}개까지 선택할 수 있습니다.(JA)", "not.allocation.exist.module": "할당하지 않은 모듈이 있습니다.(JA)", "roof.is.not.selected": "지붕을 선택해주세요.(JA)", - "module.delete.confirm": "パネルを削除して面入力に戻ります。正しいですか?\nはい]を選択すると削除し、面入力に戻ります。\nいいえ」を選択すると、削除せずに現在の状態を維持します。" + "module.delete.confirm": "パネルを削除して面入力に戻ります。正しいですか?\nはい]を選択すると削除し、面入力に戻ります。\nいいえ」を選択すると、削除せずに現在の状態を維持します。", + "length.direction.is.required": "길이와 방향을 입력하세요.(JA)" } diff --git a/src/locales/ko.json b/src/locales/ko.json index 7315ce2c..89934a71 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1015,5 +1015,6 @@ "max.select": "최대 {0}개까지 선택할 수 있습니다.", "module.delete.confirm": "패널을 삭제하고 면입력으로 돌아갑니다. 맞습니까?\n[예]를 선택하면 삭제하고, 면 입력으로 돌아갑니다.\n[아니오]를 선택하면 삭제하지 않고 현재 상태를 유지합니다.", "not.allocation.exist.module": "할당하지 않은 모듈이 있습니다.", - "roof.is.not.selected": "지붕을 선택해주세요." + "roof.is.not.selected": "지붕을 선택해주세요.", + "length.direction.is.required": "길이와 방향을 입력하세요." }