@@ -328,6 +365,15 @@ export default function Stuff() {
전체 : {gridCount} // 선택 : {selectedRowDataCount}
+
+
{/*
+
+ {saleStoreList?.length > 0 && (
+
+ {(option) => {option.saleStoreName}}
+
+ )}
+
+
@@ -313,9 +410,34 @@ export default function StuffDetail() {
+ {powerSimAreaList?.length > 0 && (
+
+ )}
+
+
+
@@ -354,7 +476,15 @@ export default function StuffDetail() {
-
+
+
+
+
@@ -379,9 +509,51 @@ export default function StuffDetail() {
/>
-
diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx
index f0d665d0..58aa4ce9 100644
--- a/src/components/management/StuffSearchCondition.jsx
+++ b/src/components/management/StuffSearchCondition.jsx
@@ -2,10 +2,12 @@
import React, { useEffect } from 'react'
import { useState } from 'react'
-import { Input, RadioGroup, Radio, Button } from '@nextui-org/react'
+import { Input, RadioGroup, Radio, Button, Autocomplete, AutocompleteItem } from '@nextui-org/react'
import RangeDatePicker from '@/components/common/datepicker/RangeDatePicker'
import { useRecoilState, useResetRecoilState } from 'recoil'
import { stuffSearchState } from '@/store/stuffAtom'
+import { isEmptyArray } from '@/util/common-utils'
+import { get } from '@/lib/Axios'
import dayjs from 'dayjs'
import isLeapYear from 'dayjs/plugin/isLeapYear' // 윤년 판단 플러그인
dayjs.extend(isLeapYear)
@@ -33,13 +35,16 @@ export default function StuffSearchCondition() {
const [receiveUser, setReceiveUser] = useState('') //담당자
const [dispCompanyName, setDispCompanyName] = useState('') //견적처
const [dateType, setDateType] = useState('U') //갱신일(U)/등록일(R)
+ const [schSelSaleStoreId, setSchSelSaleStoreId] = useState('') //판매대리점 선택
+ const [schSelSaleStoreList, setSchSelSaleStoreList] = useState([]) //판매대리점 자동완성 SELECT
// 조회
const onSubmit = () => {
let diff = dayjs(endRangeDate).diff(startRangeDate, 'day')
if (diff > 366) {
return alert('최대1년 조회 가능합니다.')
}
+
setStuffSearch({
schObjectNo: stuffSearch?.schObjectNo ? stuffSearch.schObjectNo : objectNo,
schSaleStoreId: stuffSearch?.schSaleStoreId ? stuffSearch.schSaleStoreId : saleStoreId,
@@ -53,6 +58,10 @@ export default function StuffSearchCondition() {
schFromDt: dayjs(startRangeDate).format('YYYY-MM-DD'),
schToDt: dayjs(endRangeDate).format('YYYY-MM-DD'),
code: 'E',
+ schSelSaleStoreId: stuffSearch?.schSelSaleStoreId ? stuffSearch.schSelSaleStoreId : schSelSaleStoreId,
+ startRow: stuffSearch?.startRow ? stuffSearch.startRow : 1,
+ endRow: stuffSearch?.endRow ? stuffSearch.endRow : 100,
+ schSortType: stuffSearch?.schSortType ? stuffSearch.schSortType : 'R',
})
}
@@ -68,9 +77,31 @@ export default function StuffSearchCondition() {
setDispCompanyName('')
setDateType('U')
setDateRange([dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), dayjs(new Date()).format('YYYY-MM-DD')])
+ setSchSelSaleStoreId('')
resetStuffRecoil()
}
+ useEffect(() => {
+ get({ url: `/api/object/saleStore/201TES01/list` }).then((res) => {
+ if (!isEmptyArray(res)) {
+ // console.log('판매점 결과:::::', res)
+ setSchSelSaleStoreList(res)
+ }
+ })
+ }, [])
+
+ //판매대리점 자동완성 변경
+ const onSelectionChange = (key) => {
+ // console.log('자동완성값변경', key)
+ if (key == null) {
+ setSchSelSaleStoreId('')
+ setStuffSearch({ ...stuffSearch, schSelSaleStoreId: '' })
+ } else {
+ setSchSelSaleStoreId(key)
+ setStuffSearch({ ...stuffSearch, schSelSaleStoreId: key })
+ }
+ }
+
//x로 날짜 비웠을때 기본값으로 셋팅
useEffect(() => {
if (!startRangeDate && !endRangeDate) {
@@ -88,7 +119,7 @@ export default function StuffSearchCondition() {
return (
<>
-
+
@@ -220,6 +251,17 @@ export default function StuffSearchCondition() {
setStuffSearch({ ...stuffSearch, code: 'S', schDispCompanyName: e.target.value })
}}
/>
+ {schSelSaleStoreList?.length > 0 && (
+
+ {(option) => {option.saleStoreName}}
+
+ )}
)
} else {
diff --git a/src/hooks/useEvent.js b/src/hooks/useEvent.js
index 2f32d044..715a27b0 100644
--- a/src/hooks/useEvent.js
+++ b/src/hooks/useEvent.js
@@ -1,11 +1,13 @@
import { useEffect, useRef } from 'react'
import { useRecoilValue } from 'recoil'
-import { canvasState, stepState } from '@/store/canvasAtom'
+import { canvasState, currentMenuState } from '@/store/canvasAtom'
+import { fabric } from 'fabric'
export function useEvent() {
const canvas = useRecoilValue(canvasState)
- const step = useRecoilValue(stepState)
+ const currentMenu = useRecoilValue(currentMenuState)
const keyboardEventListeners = useRef([])
+ const mouseEventListeners = useRef([])
useEffect(() => {
if (!canvas) {
@@ -16,47 +18,56 @@ export function useEvent() {
canvas.off(key)
}
})
- removeAllKeyboardEventListeners()
- addEvent(step)
- }, [step])
+ removeAllMouseEventListeners()
+ removeAllDocumentEventListeners()
+ addDefaultEvent()
+ }, [currentMenu, canvas])
- const addEvent = (step) => {
+ const addDefaultEvent = () => {
//default Event 추가
- canvas?.on('mouse:move', defaultMouseMoveEvent)
- addKeyboardEventListener('keydown', document, defaultKeyboardEvent)
+ addCanvasMouseEventListener('mouse:move', defaultMouseMoveEvent)
+ addCanvasMouseEventListener('mouse:out', defaultMouseOutEvent)
+ addDocumentEventListener('keydown', document, defaultKeyboardEvent)
+ }
- if (step === 1) {
- canvas?.on('mouse:down', (e) => {
- canvas?.add(new fabric.Rect({ width: 100, height: 100, fill: 'red', left: e.pointer.x, top: e.pointer.y }))
- })
- addKeyboardEventListener('keydown', document, (e) => {
- if (e.key === 'Escape') {
- console.log(1111)
- }
- })
- } else if (step === 2) {
- canvas?.on('mouse:down', (e) => {
- canvas?.add(new fabric.Circle({ radius: 50, fill: 'blue', left: e.pointer.x, top: e.pointer.y }))
- })
- addKeyboardEventListener('keydown', document, (e) => {
- if (e.key === 'Escape') {
- console.log(2222)
- }
- })
- } else {
- canvas?.on('mouse:down', (e) => {
- canvas?.add(new fabric.Triangle({ width: 100, height: 100, fill: 'green', left: e.pointer.x, top: e.pointer.y }))
- })
- addKeyboardEventListener('keydown', document, (e) => {
- if (e.key === 'Escape') {
- console.log(333)
- }
- })
- }
+ const defaultMouseOutEvent = (e) => {
+ removeMouseLine()
}
const defaultMouseMoveEvent = (e) => {
- console.log('defaultMouseMoveEvent')
+ removeMouseLine()
+ // 가로선
+ const pointer = canvas.getPointer(e.e)
+ const horizontalLine = new fabric.Line([0, pointer.y, 2 * canvas.width, pointer.y], {
+ stroke: 'red',
+ strokeWidth: 1,
+ selectable: false,
+ name: 'mouseLine',
+ })
+
+ // 세로선
+ const verticalLine = new fabric.Line([pointer.x, 0, pointer.x, 2 * canvas.height], {
+ stroke: 'red',
+ strokeWidth: 1,
+ selectable: false,
+ name: 'mouseLine',
+ })
+
+ // 선들을 캔버스에 추가합니다.
+ canvas?.add(horizontalLine, verticalLine)
+
+ // 캔버스를 다시 그립니다.
+ canvas?.renderAll()
+ }
+
+ const removeMouseLine = () => {
+ // 캔버스에서 마우스 선을 찾아 제거합니다.
+ canvas
+ ?.getObjects()
+ .filter((obj) => obj.name === 'mouseLine')
+ .forEach((line) => {
+ canvas?.remove(line)
+ })
}
const defaultKeyboardEvent = (e) => {
@@ -65,21 +76,42 @@ export function useEvent() {
}
}
+ const addCanvasMouseEventListener = (eventType, handler) => {
+ canvas.on(eventType, handler)
+ mouseEventListeners.current.push({ eventType, handler })
+ }
+
+ const removeAllMouseEventListeners = () => {
+ mouseEventListeners.current.forEach(({ eventType, handler }) => {
+ canvas.off(eventType, handler)
+ })
+ mouseEventListeners.current.length = 0 // 배열 초기화
+ }
+
/**
- * document 키보드 이벤트 임의로 직접 등록한 이벤트의 경우 remove가 안되기 때문에 이 함수를 통해서만 등록해야 함.
+ * document 이벤트의 경우 이 함수를 통해서만 등록
* @param eventType
* @param element
* @param handler
*/
- function addKeyboardEventListener(eventType, element, handler) {
+ const addDocumentEventListener = (eventType, element, handler) => {
element.addEventListener(eventType, handler)
keyboardEventListeners.current.push({ eventType, element, handler })
}
- function removeAllKeyboardEventListeners() {
+ /**
+ * document에 등록되는 event 제거
+ */
+ const removeAllDocumentEventListeners = () => {
keyboardEventListeners.current.forEach(({ eventType, element, handler }) => {
element.removeEventListener(eventType, handler)
})
keyboardEventListeners.current.length = 0 // 배열 초기화
}
+
+ return {
+ addDocumentEventListener,
+ addCanvasMouseEventListener,
+ removeAllDocumentEventListeners,
+ }
}
diff --git a/src/hooks/useLine.js b/src/hooks/useLine.js
new file mode 100644
index 00000000..81ebd1db
--- /dev/null
+++ b/src/hooks/useLine.js
@@ -0,0 +1,43 @@
+import { useRecoilValue } from 'recoil'
+import { canvasState, fontSizeState } from '@/store/canvasAtom'
+
+export const useLine = () => {
+ const canvas = useRecoilValue(canvasState)
+ const fontSize = useRecoilValue(fontSizeState)
+
+ const addLineText = (line) => {
+ removeLineText(line)
+
+ const text = new fabric.Text(getLengthByLine(line).toFixed(0), {
+ left: (line.x2 + line.x1) / 2,
+ top: (line.y2 + line.y1) / 2,
+ parent: line,
+ name: 'lengthTxt',
+ fontSize: fontSize,
+ })
+
+ canvas?.add(text)
+ }
+
+ const removeLineText = (line) => {
+ canvas?.remove(canvas?.getObjects().find((obj) => obj.parent === line))
+ }
+
+ const getLengthByLine = (line) => {
+ const scaleX = line.scaleX
+ const scaleY = line.scaleY
+ const x1 = line.left
+ const y1 = line.top
+ const x2 = line.left + line.width * scaleX
+ const y2 = line.top + line.height * scaleY
+ const dx = x2 - x1
+ const dy = y2 - y1
+
+ return Number(Math.sqrt(dx * dx + dy * dy).toFixed(0)) * 10
+ }
+
+ return {
+ addLineText,
+ removeLineText,
+ }
+}
diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js
new file mode 100644
index 00000000..72354443
--- /dev/null
+++ b/src/hooks/usePolygon.js
@@ -0,0 +1,8 @@
+import { canvasState } from '@/store/canvasAtom'
+import { useRecoilValue } from 'recoil'
+
+export const usePolygon = () => {
+ const canvas = useRecoilValue(canvasState)
+
+ return {}
+}
diff --git a/src/locales/ko.json b/src/locales/ko.json
index cf7d758f..82b187bc 100644
--- a/src/locales/ko.json
+++ b/src/locales/ko.json
@@ -118,7 +118,7 @@
"common.message.multi.insert": "Total {0} cases ({1} successes, {2} failures {3})",
"common.message.error": "Error occurred, please contact site administrator.",
"common.message.data.save": "Do you want to save it?",
- "common.message.data.delete": "Do you want to delete it?",
+ "common.message.data.delete": "정말로 삭제하시겠습니까?",
"common.message.data.exists": "{0} is data that already exists.",
"common.message.data.no.exists": "{0} is data that does not exist.",
"common.message.all": "All",
diff --git a/src/store/canvasAtom.js b/src/store/canvasAtom.js
index 4f274620..48dced68 100644
--- a/src/store/canvasAtom.js
+++ b/src/store/canvasAtom.js
@@ -1,4 +1,5 @@
import { atom } from 'recoil'
+import { MENU } from '@/common/common'
export const canvasState = atom({
key: 'canvasState',
@@ -180,7 +181,7 @@ export const objectPlacementModeState = atom({
default: { width: 0, height: 0, areaBoundary: false, inputType: 'free', batchType: 'opening' },
})
-export const stepState = atom({
- key: 'step',
- default: 0,
+export const currentMenuState = atom({
+ key: 'currentMenu',
+ default: MENU.INITIAL_CANVAS_SETTING,
})
diff --git a/src/store/outerLineAtom.js b/src/store/outerLineAtom.js
new file mode 100644
index 00000000..f8494bea
--- /dev/null
+++ b/src/store/outerLineAtom.js
@@ -0,0 +1,65 @@
+import { atom, selector } from 'recoil'
+
+export const OUTER_LINE_TYPE = {
+ OUTER_LINE: 'outerLine', // 외벽선
+ RIGHT_ANGLE: 'rightAngle', // 직각
+ LEE_GUBAE: 'leeGubae', // 이구배
+ ANGLE: 'angle', // 각도
+ DIAGONAL_LINE: 'diagonalLine', // 대각선
+}
+
+/**
+ * 외벽선 작성에서 사용하는 recoilState
+ */
+
+export const outerLineLength1State = atom({
+ //길이1
+ key: 'outerLineLength1State',
+ default: 0,
+})
+
+export const outerLineLength2State = atom({
+ // 길이2
+ key: 'outerLineLength2State',
+ default: 0,
+})
+
+export const outerLineArrow1State = atom({
+ // 방향1
+ key: 'outerLineArrow1State',
+ default: '',
+})
+
+export const outerLineArrow2State = atom({
+ // 방향2
+ key: 'outerLineArrow2State',
+ default: '',
+})
+
+export const outerLineAngle1State = atom({
+ // 각도1
+ key: 'outerLineAngle1State',
+ default: 0,
+})
+
+export const outerLineAngle2State = atom({
+ // 각도2
+ key: 'outerLineAngle2State',
+ default: 0,
+})
+
+export const outerLineDiagonalState = atom({
+ // 대각선
+ key: 'outerLineDiagonalState',
+ default: 0,
+})
+
+export const outerLineTypeState = atom({
+ key: 'outerLineTypeState',
+ default: OUTER_LINE_TYPE.OUTER_LINE,
+})
+
+export const outerLinePointsState = atom({
+ key: 'outerLinePointsState',
+ default: [],
+})
diff --git a/src/store/stuffAtom.js b/src/store/stuffAtom.js
index a122543c..5de2c04e 100644
--- a/src/store/stuffAtom.js
+++ b/src/store/stuffAtom.js
@@ -17,6 +17,10 @@ export const stuffSearchState = atom({
schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), //시작일
schToDt: dayjs(new Date()).format('YYYY-MM-DD'), //종료일
code: 'S',
+ schSelSaleStoreId: '', //판매대리점 선택
+ startRow: 1,
+ endRow: 100,
+ schSortType: 'R', //정렬조건 (R:최근등록일 U:최근수정일)
},
dangerouslyAllowMutability: true,
})
diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js
index 7a20a2b4..641016d5 100644
--- a/src/util/qpolygon-utils.js
+++ b/src/util/qpolygon-utils.js
@@ -992,7 +992,7 @@ export const splitPolygonWithLines = (polygon) => {
/**
* 좌표 테스트용
*/
- allLines.forEach((line) => {
+ /*allLines.forEach((line) => {
const text = new fabric.Text(`(${line.startPoint.x},${line.startPoint.y})`, {
left: line.startPoint.x,
top: line.startPoint.y,
@@ -1021,7 +1021,7 @@ export const splitPolygonWithLines = (polygon) => {
polygon.canvas.add(text)
polygon.canvas.renderAll()
- })
+ })*/
/**
* 좌표 테스트용 끝
*/
@@ -2732,6 +2732,7 @@ const setGableRoof = (polygon, ridge, hip1, hip2, offset, canvas) => {
if (ridge.direction === 'top') {
if (ridge.y1 > y1 && ridge.y2 > y1) {
offset = Math.abs(ridge.y1 - y1) - offset
+ offset = offset < 0 ? 0 : offset
ridge.set({
x1: ridge.x1,
y1: ridge.y1,
@@ -2763,6 +2764,7 @@ const setGableRoof = (polygon, ridge, hip1, hip2, offset, canvas) => {
}
if (ridge.y1 < y1 && ridge.y2 < y1) {
offset = Math.abs(ridge.y2 - y1) - offset
+ offset = offset < 0 ? 0 : offset
ridge.set({
x1: ridge.x1,
y1: ridge.y1 - offset,
@@ -2795,6 +2797,7 @@ const setGableRoof = (polygon, ridge, hip1, hip2, offset, canvas) => {
if (ridge.direction === 'bottom') {
if (ridge.y1 > y1 && ridge.y2 > y1) {
offset = Math.abs(ridge.y1 - y1) - offset
+ offset = offset < 0 ? 0 : offset
ridge.set({
x1: ridge.x1,
y1: ridge.y1 - offset,
@@ -2825,6 +2828,7 @@ const setGableRoof = (polygon, ridge, hip1, hip2, offset, canvas) => {
}
if (ridge.y1 < y1 && ridge.y2 < y1) {
offset = Math.abs(ridge.y2 - y1) - offset
+ offset = offset < 0 ? 0 : offset
ridge.set({
x1: ridge.x1,
y1: ridge.y1,
@@ -2858,6 +2862,7 @@ const setGableRoof = (polygon, ridge, hip1, hip2, offset, canvas) => {
if (ridge.direction === 'right') {
if (ridge.x1 > x1 && ridge.x2 > x1) {
offset = Math.abs(ridge.x1 - x1) - offset
+ offset = offset < 0 ? 0 : offset
ridge.set({
x1: ridge.x1 - offset,
y1: ridge.y1,
@@ -2888,6 +2893,7 @@ const setGableRoof = (polygon, ridge, hip1, hip2, offset, canvas) => {
}
if (ridge.x1 < x1 && ridge.x2 < x1) {
offset = Math.abs(ridge.x2 - x1) - offset
+ offset = offset < 0 ? 0 : offset
ridge.set({
x1: ridge.x1,
y1: ridge.y1,
@@ -2920,6 +2926,7 @@ const setGableRoof = (polygon, ridge, hip1, hip2, offset, canvas) => {
if (ridge.direction === 'left') {
if (ridge.x1 > x1 && ridge.x2 > x1) {
offset = Math.abs(ridge.x1 - x1) - offset
+ offset = offset < 0 ? 0 : offset
ridge.set({
x1: ridge.x1,
y1: ridge.y1,
@@ -2950,6 +2957,7 @@ const setGableRoof = (polygon, ridge, hip1, hip2, offset, canvas) => {
}
if (ridge.x1 < x1 && ridge.x2 < x1) {
offset = Math.abs(ridge.x2 - x1) - offset
+ offset = offset < 0 ? 0 : offset
ridge.set({
x1: ridge.x1 - offset,
y1: ridge.y1,