From 8c6aef853440630ae89300cdeedba009317b2247 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 5 Nov 2024 15:42:36 +0900 Subject: [PATCH 01/15] =?UTF-8?q?=EB=8F=99=EC=84=A0=EC=9D=B4=EB=8F=99=20?= =?UTF-8?q?=ED=98=95=20=EC=98=AC=EB=A6=BC=EB=82=B4=EB=A6=BC=20=EC=84=A0?= =?UTF-8?q?=ED=83=9D=EB=90=9C=20object=EC=97=90=20=EB=94=B0=EB=9D=BC=20?= =?UTF-8?q?=EC=83=89=EA=B9=94=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useMovementSetting.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/hooks/roofcover/useMovementSetting.js b/src/hooks/roofcover/useMovementSetting.js index f09aee6b..2141eb43 100644 --- a/src/hooks/roofcover/useMovementSetting.js +++ b/src/hooks/roofcover/useMovementSetting.js @@ -1,10 +1,11 @@ import { useRecoilValue } from 'recoil' -import { canvasState } from '@/store/canvasAtom' +import { canvasState, currentObjectState } from '@/store/canvasAtom' import { usePopup } from '@/hooks/usePopup' import { useMessage } from '@/hooks/useMessage' import { useEffect, useRef, useState } from 'react' import { useEvent } from '@/hooks/useEvent' import { POLYGON_TYPE } from '@/common/common' +import { OUTER_LINE_TYPE } from '@/store/outerLineAtom' //동선이동 형 올림 내림 export function useMovementSetting(id) { @@ -16,6 +17,7 @@ export function useMovementSetting(id) { const { initEvent, addCanvasMouseEventListener } = useEvent() const { closePopup } = usePopup() const { getMessage } = useMessage() + const currentObject = useRecoilValue(currentObjectState) 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 }, @@ -46,8 +48,11 @@ export function useMovementSetting(id) { wallLines.forEach((line) => { line.set({ visible: false }) }) + const outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine') // 기존 outerLine의 selectable true outerLines.forEach((line) => { + line.set({ stroke: 'black' }) + line.set({ visible: true }) line.bringToFront() line.set({ selectable: true }) }) @@ -64,6 +69,22 @@ export function useMovementSetting(id) { } }, []) + useEffect(() => { + const outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine') // 기존 outerLine의 selectable true + outerLines.forEach((line) => { + line.set({ stroke: 'black' }) + }) + if (!currentObject) { + return + } + + if (currentObject.name === OUTER_LINE_TYPE.OUTER_LINE) { + currentObject.set({ stroke: 'red' }) + currentObject.bringToFront() + } + canvas.renderAll() + }, [currentObject]) + const mouseMoveEvent = (e) => { if (typeRef.current === TYPE.FLOW_LINE) { flowLineEvent(e) From c05989f6ae10a84e65d7dff7595f43ea39b3e821 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Tue, 5 Nov 2024 15:42:56 +0900 Subject: [PATCH 02/15] =?UTF-8?q?=EC=83=89=20=EC=BD=94=EB=93=9C=EB=A1=9C?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/roofcover/useMovementSetting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/roofcover/useMovementSetting.js b/src/hooks/roofcover/useMovementSetting.js index 2141eb43..1c128133 100644 --- a/src/hooks/roofcover/useMovementSetting.js +++ b/src/hooks/roofcover/useMovementSetting.js @@ -79,7 +79,7 @@ export function useMovementSetting(id) { } if (currentObject.name === OUTER_LINE_TYPE.OUTER_LINE) { - currentObject.set({ stroke: 'red' }) + currentObject.set({ stroke: '#EA10AC' }) currentObject.bringToFront() } canvas.renderAll() From 708f6c8ea11f33c641e55c6cf4f08820872d0334 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Tue, 5 Nov 2024 15:46:30 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feat:=20QInput=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=EC=97=90=20number=20type=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/Playground.jsx | 21 ++++- src/components/common/input/QInput.jsx | 103 +++++++++++++++++-------- 2 files changed, 90 insertions(+), 34 deletions(-) diff --git a/src/components/Playground.jsx b/src/components/Playground.jsx index d1061306..5cd4588c 100644 --- a/src/components/Playground.jsx +++ b/src/components/Playground.jsx @@ -39,6 +39,7 @@ export default function Playground() { const [color, setColor] = useState('#ff0000') const [textInput, setTextInput] = useState('') + const [numberInput, setNumberInput] = useState(null) const [radioInput, setRadioInput] = useState('') const [checkboxInput, setCheckboxInput] = useState([]) const [selectedValue, setSelectedValue] = useState('') @@ -48,6 +49,9 @@ export default function Playground() { useEffect(() => { console.log('textInput:', textInput) }, [textInput]) + useEffect(() => { + console.log('numberInput:', numberInput) + }, [numberInput]) useEffect(() => { console.log('radioInput:', radioInput) }, [radioInput]) @@ -161,8 +165,19 @@ export default function Playground() { > QInput TextInput DATA RESET - - + + +
+ + +
- +
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 13/15] =?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 14/15] =?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 15/15] =?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() {