From 5101fab02737f09c382039d946f932fab00d7483 Mon Sep 17 00:00:00 2001 From: ysCha Date: Mon, 26 May 2025 16:53:43 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[1004]=201:1=20=201)=20no=20data=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=202)=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/community/Qna.jsx | 4 +- .../community/modal/QnaRegModal.jsx | 59 ++++++++++++++----- src/locales/ja.json | 1 + src/locales/ko.json | 1 + 4 files changed, 46 insertions(+), 19 deletions(-) diff --git a/src/components/community/Qna.jsx b/src/components/community/Qna.jsx index ed65637f..033f7424 100644 --- a/src/components/community/Qna.jsx +++ b/src/components/community/Qna.jsx @@ -195,9 +195,7 @@ export default function Qna() { )) ) : ( - - {getMessage('common.message.no.data')} - + {getMessage('common.message.no.data')} )} diff --git a/src/components/community/modal/QnaRegModal.jsx b/src/components/community/modal/QnaRegModal.jsx index ef40457b..c7e3b40b 100644 --- a/src/components/community/modal/QnaRegModal.jsx +++ b/src/components/community/modal/QnaRegModal.jsx @@ -27,6 +27,7 @@ export default function QnaRegModal({ setOpen, setReload, searchValue, selectPag const qnaTypeLgCodeRef = useRef(null) const qnaTypeMdCodeRef = useRef(null) const qnaTypeSmCodeRef = useRef(null) + const qstMail = useRef(null); const regUserNmRef = useRef(null) const regUserTelNoRef = useRef(null) const titleRef = useRef(null) @@ -65,6 +66,7 @@ let fileCheck = false; const initQnaReg = async () => { + qstMail.current.value = '' regUserNmRef.current.value = '' regUserTelNoRef.current.value = '' qnaTypeLgCodeRef.current.setValue(); @@ -148,7 +150,7 @@ let fileCheck = false; if(!fileCheck) return; fileUploadProps.uploadFiles.forEach((file) => { - console.log("file::::::::",file) + //console.log("file::::::::",file) formData.push(file) }) @@ -156,6 +158,16 @@ let fileCheck = false; fileCheck = false; } + const isValidEmail = (email) => { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return emailRegex.test(email); + }; + + const isEmpty = (value) => { + return value === null || value === undefined || value.trim() === ""; + }; + + const handleQnaSubmit = async () => { //필수 체크 @@ -164,13 +176,22 @@ let fileCheck = false; let regUserNm = qnaData?.regUserNm??''; - if (regUserNm.trim().length === 0) { + if (!isValidEmail(qnaData.qstMail)) { + qstMail.current.focus(); + swalFire({ + title: getMessage('qna.reg.alert.require.qstMail'), + icon: 'warning', + }); + return; + } - regUserNmRef.current.value = ''; + + if (isEmpty(regUserNm)) { + regUserNmRef.current.value = ''; regUserNmRef.current.focus() swalFire({ - text: getMessage('qna.reg.alert.require.regUserNm'), - type: 'alert', + title: getMessage('qna.reg.alert.require.regUserNm'), + icon: 'warning', }) return false } @@ -178,35 +199,35 @@ let fileCheck = false; let qnaClsLrgCd = qnaData?.qnaClsLrgCd??''; let qnaClsMidCd = qnaData?.qnaClsMidCd??''; - if (qnaClsLrgCd.trim().length === 0 || qnaClsMidCd.trim().length === 0 ) { - (qnaClsLrgCd.trim().length === 0)?qnaTypeLgCodeRef.current.focus():qnaTypeMdCodeRef.current.focus() + if (isEmpty(qnaClsLrgCd) || isEmpty(qnaClsMidCd) ) { + (isEmpty(qnaClsLrgCd))?qnaTypeLgCodeRef.current.focus():qnaTypeMdCodeRef.current.focus() swalFire({ - text: getMessage('qna.reg.alert.select.type'), - type: 'alert', + title: getMessage('qna.reg.alert.select.type'), + icon: 'warning', }) return false } let title = qnaData?.title??''; - if (title.trim().length === 0) { + if (isEmpty(title)) { titleRef.current.value = ''; titleRef.current.focus() swalFire({ - text: getMessage('qna.reg.alert.require.title'), - type: 'alert', + title: getMessage('qna.reg.alert.require.title'), + icon: 'warning', }) return false } //console.log("5::::",qnaData) let contents = qnaData?.contents??''; - if (contents.trim().length === 0) { + if (isEmpty(contents)) { contentsRef.current.value = ''; contentsRef.current.focus() swalFire({ - text: getMessage('qna.reg.alert.require.contents'), - type: 'alert', + title: getMessage('qna.reg.alert.require.contents'), + icon: 'warning', }) return false } @@ -310,7 +331,13 @@ let fileCheck = false; {getMessage('qna.list.header.regNm')} E-Mail* - + setQnaData({...qnaData, qstMail: e.target.value })} + onBlur={(e) => setQnaData({ ...qnaData, qstMail: e.target.value })} /> + + {getMessage('qna.reg.header.regDt')} {dayjs(new Date()).format('YYYY-MM-DD')} diff --git a/src/locales/ja.json b/src/locales/ja.json index 00599068..d90cab69 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -612,6 +612,7 @@ "qna.reg.header.contents": "お問い合わせ内容", "qna.reg.header.fileList": "ファイル添付", "qna.reg.header.save": "保存", + "qna.reg.alert.require.qstMail": "無効なメール形式です。", "qna.reg.alert.require.regUserNm": "名前を入力してください。", "qna.reg.alert.select.type": "お問い合わせ区分を選択してください。", "qna.reg.alert.require.title": "タイトルを入力してください。", diff --git a/src/locales/ko.json b/src/locales/ko.json index efcabd1c..67176ee8 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -612,6 +612,7 @@ "qna.reg.header.contents": "문의정보", "qna.reg.header.fileList": "파일첨부", "qna.reg.header.save": "저장", + "qna.reg.alert.require.qstMail": "올바르지 않은 이메일 형식입니다.", "qna.reg.alert.require.regUserNm": "이름을 입력하세요.", "qna.reg.alert.select.type": "문의구분을 선택하세요.", "qna.reg.alert.require.title": "제목을 입력하세요.", From d8a7986120b1f1d22c6a925b3fdd5b83877a90d2 Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Mon, 26 May 2025 17:30:03 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[1046]=20-=20=EB=8C=93=EA=B8=80=201.=20?= =?UTF-8?q?=EC=9E=84=EC=9D=98=EA=B7=B8=EB=A6=AC=EB=93=9C=20=EC=9A=B0?= =?UTF-8?q?=ED=81=B4=EB=A6=AD=20=ED=9D=A1=EC=B0=A9=EC=A0=90=EC=97=90=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=202.=20=EC=9E=84=EC=9D=98=EA=B7=B8=EB=A6=AC?= =?UTF-8?q?=EB=93=9C=20=EC=83=9D=EC=84=B1=20=ED=9B=84=20mouseLine=20?= =?UTF-8?q?=EC=95=88=EA=B7=B8=EB=A0=A4=EC=A7=80=EB=8A=94=20=ED=98=84?= =?UTF-8?q?=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useEvent.js | 22 ++++++++++++++++++---- src/hooks/useTempGrid.js | 5 +++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/hooks/useEvent.js b/src/hooks/useEvent.js index 59c5d895..d701bcd9 100644 --- a/src/hooks/useEvent.js +++ b/src/hooks/useEvent.js @@ -2,7 +2,14 @@ import { useRef } from 'react' import { useRecoilValue, useSetRecoilState } from 'recoil' import { canvasState, canvasZoomState, currentMenuState, textModeState } from '@/store/canvasAtom' import { fabric } from 'fabric' -import { calculateDistance, calculateDistancePoint, calculateIntersection, distanceBetweenPoints, findClosestPoint } from '@/util/canvas-util' +import { + calculateDistance, + calculateDistancePoint, + calculateIntersection, + distanceBetweenPoints, + findClosestPoint, + getInterSectionLineNotOverCoordinate, +} from '@/util/canvas-util' import { useAdsorptionPoint } from '@/hooks/useAdsorptionPoint' import { useDotLineGrid } from '@/hooks/useDotLineGrid' import { useTempGrid } from '@/hooks/useTempGrid' @@ -146,7 +153,7 @@ export function useEvent() { ...innerLinePoints, ] - if (dotLineGridSetting.LINE || canvas.getObjects().filter((obj) => ['lineGrid', 'tempGrid'].includes(obj.name)).length > 0) { + if (dotLineGridSetting.LINE || canvas.getObjects().filter((obj) => ['lineGrid', 'tempGrid'].includes(obj.name)).length > 1) { const closestLine = getClosestLineGrid(pointer) const horizonLines = canvas.getObjects().filter((obj) => ['lineGrid', 'tempGrid'].includes(obj.name) && obj.direction === 'horizontal') @@ -260,7 +267,9 @@ export function useEvent() { arrivalPoint = guideIntersectionPoint } } - } catch (e) {} + } catch (e) { + console.error(e) + } const horizontalLine = new fabric.Line([-4 * canvas.width, arrivalPoint.y, 4 * canvas.width, arrivalPoint.y], { stroke: 'red', @@ -298,7 +307,12 @@ export function useEvent() { e.preventDefault() e.stopPropagation() //임의 그리드 모드일 경우 - let pointer = { x: e.offsetX, y: e.offsetY } + let originPointer = { x: e.offsetX, y: e.offsetY } + const mouseLines = canvas.getObjects().filter((obj) => obj.name === 'mouseLine') + let pointer = getInterSectionLineNotOverCoordinate(mouseLines[0], mouseLines[1]) || { + x: Math.round(originPointer.x), + y: Math.round(originPointer.y), + } const tempGrid = new fabric.Line([-1500, pointer.y, 2500, pointer.y], { stroke: gridColor, diff --git a/src/hooks/useTempGrid.js b/src/hooks/useTempGrid.js index c875bcb3..c0a7dcc1 100644 --- a/src/hooks/useTempGrid.js +++ b/src/hooks/useTempGrid.js @@ -2,6 +2,7 @@ import { canvasState, tempGridModeState } from '@/store/canvasAtom' import { useRecoilState, useRecoilValue } from 'recoil' import { gridColorState } from '@/store/gridAtom' import { gridDisplaySelector } from '@/store/settingAtom' +import { useMouse } from '@/hooks/useMouse' const GRID_PADDING = 5 export function useTempGrid() { @@ -9,10 +10,10 @@ export function useTempGrid() { const gridColor = useRecoilValue(gridColorState) const isGridDisplay = useRecoilValue(gridDisplaySelector) const [tempGridMode, setTempGridMode] = useRecoilState(tempGridModeState) - + const { getIntersectMousePoint } = useMouse() const tempGridModeStateLeftClickEvent = (e) => { //임의 그리드 모드일 경우 - let pointer = canvas.getPointer(e.e) + let pointer = getIntersectMousePoint(e) const tempGrid = new fabric.Line([pointer.x, -1500, pointer.x, 2500], { stroke: gridColor,