From 08e182853069b711ae8d786cd8f381d243cd1a4a Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Thu, 31 Oct 2024 11:16:41 +0900 Subject: [PATCH 01/20] =?UTF-8?q?=EB=8F=99=EC=84=A0=EC=9D=B4=EB=8F=99=20-?= =?UTF-8?q?=20=ED=98=95=20=EC=98=AC=EB=A6=BC=EB=82=B4=EB=A6=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modal/movement/type/FlowLine.jsx | 8 +- .../floor-plan/modal/movement/type/Updown.jsx | 6 +- src/hooks/roofcover/useMovementSetting.js | 93 ++++++++++++++++++- 3 files changed, 98 insertions(+), 9 deletions(-) diff --git a/src/components/floor-plan/modal/movement/type/FlowLine.jsx b/src/components/floor-plan/modal/movement/type/FlowLine.jsx index 1d3dd26e..c6a8ca49 100644 --- a/src/components/floor-plan/modal/movement/type/FlowLine.jsx +++ b/src/components/floor-plan/modal/movement/type/FlowLine.jsx @@ -1,5 +1,6 @@ import { useMessage } from '@/hooks/useMessage' import { useEffect, useState } from 'react' +import { useEvent } from '@/hooks/useEvent' const FLOW_LINE_TYPE = { DOWN_LEFT: 'downLeft', @@ -44,12 +45,7 @@ export default function FlowLine({ FLOW_LINE_REF }) {
- +
diff --git a/src/components/floor-plan/modal/movement/type/Updown.jsx b/src/components/floor-plan/modal/movement/type/Updown.jsx index a27abf80..f99a17f2 100644 --- a/src/components/floor-plan/modal/movement/type/Updown.jsx +++ b/src/components/floor-plan/modal/movement/type/Updown.jsx @@ -1,5 +1,8 @@ import { useMessage } from '@/hooks/useMessage' import { useEffect, useState } from 'react' +import { useEvent } from '@/hooks/useEvent' +import { canvasState } from '@/store/canvasAtom' +import { useRecoilValue } from 'recoil' const UP_DOWN_TYPE = { UP: 'up', @@ -9,6 +12,7 @@ const UP_DOWN_TYPE = { export default function Updown({ UP_DOWN_REF }) { const { getMessage } = useMessage() const [type, setType] = useState(UP_DOWN_TYPE.UP) + const canvas = useRecoilValue(canvasState) useEffect(() => { if (type === UP_DOWN_TYPE.UP) { @@ -44,7 +48,7 @@ export default function Updown({ UP_DOWN_REF }) {
- +
diff --git a/src/hooks/roofcover/useMovementSetting.js b/src/hooks/roofcover/useMovementSetting.js index 355a6bf8..1f64bcd7 100644 --- a/src/hooks/roofcover/useMovementSetting.js +++ b/src/hooks/roofcover/useMovementSetting.js @@ -2,7 +2,8 @@ import { useRecoilValue } from 'recoil' import { canvasState } from '@/store/canvasAtom' import { usePopup } from '@/hooks/usePopup' import { useMessage } from '@/hooks/useMessage' -import { useRef, useState } from 'react' +import { useEffect, useRef, useState } from 'react' +import { useEvent } from '@/hooks/useEvent' //동선이동 형 올림 내림 export function useMovementSetting(id) { @@ -11,6 +12,7 @@ export function useMovementSetting(id) { UP_DOWN: 'updown', //형 올림내림 } const canvas = useRecoilValue(canvasState) + const { initEvent, addCanvasMouseEventListener } = useEvent() const { closePopup } = usePopup() const { getMessage } = useMessage() const buttonType = [ @@ -18,6 +20,7 @@ export function useMovementSetting(id) { { id: 2, name: getMessage('modal.movement.flow.line.updown'), type: TYPE.UP_DOWN }, ] const [type, setType] = useState(TYPE.FLOW_LINE) + const typeRef = useRef(type) const FLOW_LINE_REF = { DOWN_LEFT_INPUT_REF: useRef(null), @@ -33,7 +36,93 @@ export function useMovementSetting(id) { DOWN_RADIO_REF: useRef(null), } - const handleSave = () => {} + useEffect(() => { + typeRef.current = type + }, [type]) + + useEffect(() => { + const wallLines = canvas.getObjects().filter((obj) => obj.name === 'wallLine') // 기존 wallLine의 visible false + wallLines.forEach((line) => { + line.set({ visible: false }) + }) + const outerLines = canvas.getObjects().filter((obj) => obj.name === 'outerLine') // 기존 outerLine의 selectable true + outerLines.forEach((line) => { + line.bringToFront() + line.set({ selectable: true }) + }) + + canvas.renderAll() + addCanvasMouseEventListener('mouse:move', mouseMoveEvent) + return () => { + initEvent() + const wallLines = canvas.getObjects().filter((obj) => obj.name === 'wallLine') + wallLines.forEach((line) => { + line.set({ visible: true }) + }) + canvas.renderAll() + } + }, []) + + const mouseMoveEvent = (e) => { + if (typeRef.current === TYPE.FLOW_LINE) { + flowLineEvent(e) + } else { + updownEvent(e) + } + } + const flowLineEvent = (e) => { + console.log('flow') + } + + const updownEvent = (e) => { + const target = canvas.getActiveObject() + if (!target) { + return + } + const direction = target.direction + const { top: targetTop, left: targetLeft } = target + const currentX = canvas.getPointer(e.e).x + const currentY = Math.floor(canvas.getPointer(e.e).y) + /*const allPoints = canvas + ?.getObjects() + .filter((obj) => obj.name === 'outerLine') + .map((obj) => { + return { x: obj.x1, y: obj.y1 } + }) + + const xArr = allPoints.map((point) => point.x) + const yArr = allPoints.map((point) => point.y)*/ + + if (direction === 'left' || direction === 'right') { + if (targetTop > currentY) { + UP_DOWN_REF.DOWN_RADIO_REF.current.checked = true + UP_DOWN_REF.UP_INPUT_REF.current.value = '' + + UP_DOWN_REF.DOWN_INPUT_REF.current.value = (Number(Math.abs(targetTop - currentY)) / 10000).toFixed(5) * 100000 + } else { + UP_DOWN_REF.UP_RADIO_REF.current.checked = true + UP_DOWN_REF.DOWN_INPUT_REF.current.value = '' + + UP_DOWN_REF.UP_INPUT_REF.current.value = (Number(Math.abs(targetTop - currentY)) / 10000).toFixed(5) * 100000 + } + } + + canvas?.renderAll() + } + + const getOnlyDecimal = function (_number, _length) { + let result + + result = _number % 1 + + result = Number(result.toFixed(_length)) + + return result * 10 + } + + const handleSave = () => { + closePopup(id) + } return { TYPE, From 220b5ff8d7b5edaad9cc59bdceec6d52704e30fe Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 31 Oct 2024 11:27:53 +0900 Subject: [PATCH 02/20] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=ED=8C=90=EB=A7=A4=EC=A0=90=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 63 +-- .../management/StuffSearchCondition.jsx | 374 ++++++++++++++---- src/store/stuffAtom.js | 3 +- 3 files changed, 335 insertions(+), 105 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 999ea900..d9c6022e 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -240,7 +240,9 @@ export default function Stuff() { schToDt: dayjs(new Date()).format('YYYY-MM-DD'), startRow: (pageNo - 1) * pageSize + 1, endRow: pageNo * pageSize, - schSelSaleStoreId: '', + schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId + ? stuffSearchParams.schOtherSelSaleStoreId + : stuffSearchParams.schSelSaleStoreId, schSortType: stuffSearchParams.schSortType, } @@ -256,12 +258,12 @@ export default function Stuff() { }) } fetchData() - } else { + } else if (stuffSearchParams?.code === 'M') { //메인화면에서 진입 const params = { saleStoreId: sessionState?.storeId, schObjectNo: stuffSearchParams.schObjectNo, - schAddress: '', + schAddress: 'dfdfdfdfdf', schObjectName: '', schSaleStoreName: '', schReceiveUser: '', @@ -271,25 +273,31 @@ export default function Stuff() { schToDt: dayjs(new Date()).format('YYYY-MM-DD'), startRow: (pageNo - 1) * pageSize + 1, endRow: pageNo * pageSize, - schSelSaleStoreId: '', + schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId + ? stuffSearchParams.schOtherSelSaleStoreId + : stuffSearchParams.schSelSaleStoreId, schSortType: 'R', } + setStuffSearch({ + ...params, + }) - async function fetchData() { - const apiUrl = `/api/object/list?${queryStringFormatter(params)}` - await get({ - url: apiUrl, - }).then((res) => { - if (!isEmptyArray(res)) { - setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) - setTotalCount(res[0].totCnt) - } - }) - } - fetchData() + // async function fetchData() { + // const apiUrl = `/api/object/list?${queryStringFormatter(params)}` + // await get({ + // url: apiUrl, + // }).then((res) => { + // if (!isEmptyArray(res)) { + // setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) + // setTotalCount(res[0].totCnt) + // } + // }) + // } + // fetchData() } } - }, [pageNo, sessionState]) + // }, [pageNo, sessionState, stuffSearchParams]) + }, [pageNo, stuffSearchParams]) useEffect(() => { if (stuffSearchParams?.code === 'E') { @@ -298,6 +306,7 @@ export default function Stuff() { stuffSearchParams.schSortType = defaultSortType setPageNo(1) + //조회를 눌렀을때 async function fetchData() { const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` @@ -320,10 +329,13 @@ export default function Stuff() { let startRow = (1 - 1) * e.target.value + 1 stuffSearchParams.startRow = startRow stuffSearchParams.endRow = 1 * e.target.value + stuffSearchParams.schSelSaleStoreId = stuffSearchParams?.schOtherSelSaleStoreId + ? stuffSearchParams.schOtherSelSaleStoreId + : stuffSearchParams.schSelSaleStoreId setPageSize(e.target.value) setStuffSearch({ - ...stuffSearch, - code: 'S', + ...stuffSearchParams, + // code: 'P', startRow: startRow, endRow: 1 * e.target.value, }) @@ -348,6 +360,9 @@ export default function Stuff() { stuffSearchParams.endRow = 1 * pageSize stuffSearchParams.schSortType = e.target.value + stuffSearchParams.schSelSaleStoreId = stuffSearchParams?.schOtherSelSaleStoreId + ? stuffSearchParams.schOtherSelSaleStoreId + : stuffSearchParams.schSelSaleStoreId setDefaultSortType(e.target.value) setStuffSearch({ ...stuffSearch, @@ -358,7 +373,6 @@ export default function Stuff() { }) setPageNo(1) - const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { @@ -382,7 +396,9 @@ export default function Stuff() { // 페이징 현재페이지 변경 const handleChangePage = (page) => { stuffSearchParams.code = 'S' - + stuffSearchParams.schSelSaleStoreId = stuffSearchParams?.schOtherSelSaleStoreId + ? stuffSearchParams.schOtherSelSaleStoreId + : stuffSearchParams.schSelSaleStoreId setStuffSearch({ ...stuffSearch, code: 'S', @@ -405,10 +421,7 @@ export default function Stuff() { {getMessage('stuff.search.grid.all')} {convertNumberToPriceDecimal(totalCount)} -
  • - {/* {getMessage('stuff.search.grid.selected')} */} - {/* {convertNumberToPriceDecimal(selectedRowDataCount)} */} -
  • +
  • diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 421f806f..62e6a9f2 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -15,12 +15,14 @@ import SingleDatePicker from '../common/datepicker/SingleDatePicker' import { sessionStore } from '@/store/commonAtom' import { useMessage } from '@/hooks/useMessage' import { isObjectNotEmpty } from '@/util/common-utils' +import { searchState } from '@/store/boardAtom' export default function StuffSearchCondition() { const sessionState = useRecoilValue(sessionStore) const [appMessageState, setAppMessageState] = useRecoilState(appMessageStore) const globalLocaleState = useRecoilValue(globalLocaleStore) const { getMessage } = useMessage() const ref = useRef() + const ref2 = useRef() const { get } = useAxios(globalLocaleState) const objectNoRef = useRef(null) @@ -59,6 +61,10 @@ export default function StuffSearchCondition() { const [schSelSaleStoreList, setSchSelSaleStoreList] = useState([]) //판매대리점 자동완성 SELECT 전체 const [favoriteStoreList, setFavoriteStoreList] = useState([]) //즐겨찾기한 판매점목록 const [showSaleStoreList, setShowSaleStoreList] = useState([]) //보여줄 판매점목록 + + const [otherSaleStoreList, setOtherSaleStoreList] = useState([]) //1차점 이외 판매점목록 + const [otherSaleStoreId, setOtherSaleStoreId] = useState('') + // 조회 const onSubmit = () => { let diff = dayjs(endDate).diff(startDate, 'day') @@ -73,7 +79,7 @@ export default function StuffSearchCondition() { schAddress: address ? address : stuffSearch?.schAddress, schObjectName: objectName ? objectName : stuffSearch?.schObjectName, schDispCompanyName: dispCompanyName ? dispCompanyName : stuffSearch?.schDispCompanyName, - schSelSaleStoreId: stuffSearch?.schSelSaleStoreId ? stuffSearch.schSelSaleStoreId : schSelSaleStoreId, + schSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : stuffSearch.schSelSaleStoreId, schReceiveUser: receiveUser ? receiveUser : stuffSearch?.schReceiveUser, schDateType: stuffSearch?.schDateType ? stuffSearch.schDateType : dateType, schFromDt: dayjs(startDate).format('YYYY-MM-DD'), @@ -90,7 +96,7 @@ export default function StuffSearchCondition() { schAddress: address ? address : '', schObjectName: objectName ? objectName : '', schDispCompanyName: dispCompanyName ? dispCompanyName : '', - schSelSaleStoreId: schSelSaleStoreId ? schSelSaleStoreId : '', + schSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : stuffSearch.schSelSaleStoreId, schReceiveUser: receiveUser ? receiveUser : '', schDateType: dateType, schFromDt: dayjs(startDate).format('YYYY-MM-DD'), @@ -105,6 +111,7 @@ export default function StuffSearchCondition() { //초기화 const resetRecoil = () => { + //T01아니면 자동완성 초기화 막기 objectNoRef.current.value = '' saleStoreNameRef.current.value = '' addressRef.current.value = '' @@ -121,49 +128,144 @@ export default function StuffSearchCondition() { setDateType('U') setStartDate(dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD')) setEndDate(dayjs(new Date()).format('YYYY-MM-DD')) - setSchSelSaleStoreId('') - handleClear() //판매대리점선택 자동완성 클리어 - resetStuffRecoil() + if (sessionState?.storeId === 'T01') { + setSchSelSaleStoreId('') + handleClear1() //판매대리점선택 자동완성 클리어 + resetStuffRecoil() + setStuffSearch({ + ...stuffSearch, + code: 'C', + schSelSaleStoreId: '', + schOtherSelSaleStoreId: '', + }) + } else { + if (otherSaleStoreList.length > 1) { + handleClear2() + setOtherSaleStoreId('') + stuffSearch.schObjectNo = '' + stuffSearch.schDateType = 'U' + } else { + stuffSearch.schObjectNo = '' + stuffSearch.schDateType = 'U' + } + } } useEffect(() => { if (isObjectNotEmpty(sessionState)) { - // storeId가 T01 이거나 1차점일때만 판매대리점 선택 활성화 + // storeId가 T01 이거나 storeLvl이 1차점일때만 판매대리점 선택 활성화 let url if (sessionState?.storeId === 'T01') { - // url = `/api/object/saleStore/${sessionState?.storeId}/list?userId=an1` - url = `/api/object/saleStore/${sessionState?.storeId}/list?userId=${sessionState?.userId}` + //T01일떄 + url = `/api/object/saleStore/${sessionState?.storeId}/firstList?userId=${sessionState?.userId}` } else { - url = `/api/object/saleStore/${sessionState?.storeId}/list` + if (sessionState.storeLvl === '1') { + //T01아닌 1차점일때 + url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` + } else { + url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` + } } + get({ url: url }).then((res) => { if (!isEmptyArray(res)) { res.map((row) => { row.value = row.saleStoreId row.label = row.saleStoreName }) - const allList = res - const favList = res.filter((row) => row.priority !== 'B') - setSchSelSaleStoreList(allList) - setFavoriteStoreList(favList) - setShowSaleStoreList(favList) + let allList + let favList + let otherList + if (sessionState?.storeId === 'T01') { + allList = res + allList.sort((a, b) => (a.saleStoreId !== 'T01') - (b.saleStoreId !== 'T01') || a.saleStoreId - b.saleStoreId) + favList = res.filter((row) => row.saleStoreId === 'T01' || row.priority !== 'B') + setSchSelSaleStoreList(allList) + setFavoriteStoreList(favList) + setShowSaleStoreList(favList) + setSchSelSaleStoreId(sessionState?.storeId) + setStuffSearch({ + ...stuffSearch, + code: 'S', + schSelSaleStoreId: sessionState?.storeId, + }) + + //T01일때 2차 판매점 호출하기 + url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=0&userId=${sessionState?.userId}` + + get({ url: url }).then((res) => { + if (!isEmptyArray(res)) { + res.map((row) => { + row.value = row.saleStoreId + row.label = row.saleStoreName + }) + + otherList = res + setOtherSaleStoreList(otherList) + } else { + setOtherSaleStoreList([]) + } + }) + } else { + if (sessionState?.storeLvl === '1') { + allList = res + favList = res.filter((row) => row.priority !== 'B') + otherList = res.filter((row) => row.firstAgentYn === 'N') + setSchSelSaleStoreList(allList) + setFavoriteStoreList(allList) + setShowSaleStoreList(allList) + setSchSelSaleStoreId(allList[0].saleStoreId) + + setOtherSaleStoreList(otherList) + + setStuffSearch({ + ...stuffSearch, + code: 'S', + schSelSaleStoreId: allList[0].saleStoreId, + }) + } else { + //201X112 그냥2차점 + //2차점인데 34들고있는애 202X217 + setSchSelSaleStoreList(res) + setFavoriteStoreList(res) + setShowSaleStoreList(res) + setSchSelSaleStoreId(res[0].saleStoreId) + otherList = res.filter((row) => row.firstAgentYn === 'N') + setOtherSaleStoreList(otherList) + + //선택한 2차점 세션으로 자동셋팅 + setOtherSaleStoreId(sessionState?.storeId) + setStuffSearch({ + ...stuffSearch, + code: 'S', + schSelSaleStoreId: otherList[0].saleStoreId, + }) + } + } } }) } }, [sessionState]) - //초기화 눌렀을 때 자동완성도.. - const handleClear = () => { + //초기화 눌렀을 때 1차판매점 자동완성도.. + const handleClear1 = () => { if (ref.current) { ref.current.clearValue() } } + const handleClear2 = () => { + if (ref2.current) { + ref2.current.clearValue() + } + } + //자동완성 인풋 const onInputChange = (key) => { if (key !== '') { setShowSaleStoreList(schSelSaleStoreList) + setOtherSaleStoreList([]) } else { setShowSaleStoreList(favoriteStoreList) } @@ -172,15 +274,47 @@ export default function StuffSearchCondition() { //판매대리점 자동완성 변경 const onSelectionChange = (key) => { if (isObjectNotEmpty(key)) { + setOtherSaleStoreId('') setSchSelSaleStoreId(key.saleStoreId) - setStuffSearch({ - ...stuffSearch, - code: 'S', - schSelSaleStoreId: key.saleStoreId, + stuffSearch.schSelSaleStoreId = key.saleStoreId + //T01아닌 1차점은 본인으로 디폴트셋팅이고 수정할수없어서 여기안옴 + //고른 1차점의 saleStoreId로 2차점 API호출하기 + let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${sessionState?.userId}` + let otherList + get({ url: url }).then((res) => { + if (!isEmptyArray(res)) { + res.map((row) => { + row.value = row.saleStoreId + row.label = row.saleStoreName + }) + + otherList = res + setOtherSaleStoreList(otherList) + } else { + setOtherSaleStoreList([]) + } }) } else { + //X누름 setSchSelSaleStoreId('') - setStuffSearch({ ...stuffSearch, schSelSaleStoreId: '' }) + stuffSearch.schSelSaleStoreId = '' + + //2차점 판매점목록비우기 + setOtherSaleStoreList([]) + } + } + + //2차점 자동완성 변경 + const onSelectionChange2 = (key) => { + if (isObjectNotEmpty(key)) { + setOtherSaleStoreId(key.saleStoreId) + stuffSearch.schOtherSelSaleStoreId = key.saleStoreId + } else { + //X누르면 검색조건에 1차점으로 셋팅 + setOtherSaleStoreId('') + setSchSelSaleStoreId(schSelSaleStoreId) + stuffSearch.schOtherSelSaleStoreId = '' + stuffSearch.schSelSaleStoreId = schSelSaleStoreId } } @@ -235,6 +369,8 @@ export default function StuffSearchCondition() { + + @@ -283,6 +419,21 @@ export default function StuffSearchCondition() { />
    + {getMessage('stuff.search.schDispCompanyName')} + +
    + { + setDispCompanyName(dispCompanyNameRef.current.value) + }} + onKeyUp={handleByOnKeyUp} + /> +
    + {getMessage('stuff.search.schObjectName')} @@ -300,63 +451,6 @@ export default function StuffSearchCondition() { /> - {getMessage('stuff.search.schDispCompanyName')} - -
    - { - setDispCompanyName(dispCompanyNameRef.current.value) - }} - onKeyUp={handleByOnKeyUp} - /> -
    - - {getMessage('stuff.search.schSelSaleStoreId')} - -
    - {schSelSaleStoreList?.length > 0 && ( - x.saleStoreName} + getOptionValue={(x) => x.saleStoreId} + value={showSaleStoreList.filter(function (option) { + if (stuffSearch?.code === 'S' && schSelSaleStoreId === '') { + return false + } else if (stuffSearch?.code === 'S' && schSelSaleStoreId !== '') { + return option.saleStoreId === schSelSaleStoreId + } else if (stuffSearch?.code === 'E' && schSelSaleStoreId !== '') { + return option.saleStoreId === schSelSaleStoreId + } else { + if (stuffSearch?.schSelSaleStoreId !== '') { + return option.saleStoreId === stuffSearch.schSelSaleStoreId + } else { + return false + } + } + })} + isDisabled={sessionState?.storeLvl !== '1' ? true : sessionState?.storeId !== 'T01' ? true : false} + isClearable={true} + /> + )} + {sessionState?.storeId !== 'T01' && sessionState?.storeLvl === '1' && ( + x.saleStoreName} + getOptionValue={(x) => x.saleStoreId} + value={showSaleStoreList.filter(function (option) { + if (stuffSearch?.code === 'S' && schSelSaleStoreId === '') { + return false + } else if (stuffSearch?.code === 'S' && schSelSaleStoreId !== '') { + return option.saleStoreId === schSelSaleStoreId + } else if (stuffSearch?.code === 'E' && schSelSaleStoreId !== '') { + return option.saleStoreId === schSelSaleStoreId + } else { + if (stuffSearch?.schSelSaleStoreId !== '') { + return option.saleStoreId === stuffSearch.schSelSaleStoreId + } else { + return false + } + } + })} + isDisabled={true} + isClearable={false} + /> + )} +
    +
    + onChangeFiles(e)} /> +
    +
    +

    Drag file here

    +
      + {uploadFiles.length > 0 && + uploadFiles.map((file) => ( +
    • + + {file.data.name} + +
    • + ))} +
    +
    + + ) +} diff --git a/src/components/floor-plan/FloorPlan.jsx b/src/components/floor-plan/FloorPlan.jsx index 5639b93f..4baf3eb0 100644 --- a/src/components/floor-plan/FloorPlan.jsx +++ b/src/components/floor-plan/FloorPlan.jsx @@ -26,10 +26,6 @@ export default function FloorPlan({ children }) { fetchSettings() }, [objectNo]) - useEffect(() => { - setMenuNumber(1) - }, []) - return ( <>
    From d077b6b50d9d75f8b4c200049c3a57c53fe3faf4 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 31 Oct 2024 15:17:03 +0900 Subject: [PATCH 06/20] fix: Add custom dropzone event --- .../estimate/EstimateFileUploader.jsx | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/components/estimate/EstimateFileUploader.jsx b/src/components/estimate/EstimateFileUploader.jsx index a9bf0f33..c2bccb22 100644 --- a/src/components/estimate/EstimateFileUploader.jsx +++ b/src/components/estimate/EstimateFileUploader.jsx @@ -33,6 +33,31 @@ export default function EstimateFileUploader({ uploadFiles, setUploadFiles }) { setUploadFiles(uploadFiles.filter((file) => file.id !== id)) } + const handleDrop = (e) => { + e.preventDefault() + e.stopPropagation() + const fileList = [] + Array.from(e.dataTransfer.files).forEach((file) => { + fileList.push({ data: file, id: uuidv4() }) + }) + setUploadFiles([...uploadFiles, ...fileList]) + } + + const handleDragOver = (e) => { + e.preventDefault() + e.stopPropagation() + } + + const handleDragEnd = (e) => { + e.preventDefault() + e.stopPropagation() + } + + const handleDragLeave = (e) => { + e.preventDefault() + e.stopPropagation() + } + return (
    @@ -41,7 +66,14 @@ export default function EstimateFileUploader({ uploadFiles, setUploadFiles }) { onChangeFiles(e)} />
    -
    +
    handleDrop(e)} + onDragOver={(e) => handleDragOver(e)} + onDragEnd={(e) => handleDragEnd(e)} + onDragLeave={(e) => handleDragLeave(e)} + >

    Drag file here

      {uploadFiles.length > 0 && From d7316560b38dfa18336f134bda04ca69ed6cdb16 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 31 Oct 2024 17:57:06 +0900 Subject: [PATCH 07/20] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=ED=98=84=ED=99=A9=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=ED=99=94=EB=A9=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/main/MainContents.jsx | 4 +- src/components/management/Stuff.jsx | 64 +++++++++++++--- .../management/StuffSearchCondition.jsx | 75 ++++++++++++------- 3 files changed, 104 insertions(+), 39 deletions(-) diff --git a/src/components/main/MainContents.jsx b/src/components/main/MainContents.jsx index 9490a868..77df845a 100644 --- a/src/components/main/MainContents.jsx +++ b/src/components/main/MainContents.jsx @@ -15,7 +15,7 @@ export default function MainContents() { const { getMessage } = useMessage() const router = useRouter() const globalLocaleState = useRecoilValue(globalLocaleStore) - const { promiseGet, get } = useAxios(globalLocaleState) + const { promiseGet } = useAxios(globalLocaleState) const sessionState = useRecoilValue(sessionStore) @@ -118,7 +118,7 @@ export default function MainContents() { key={row.objectNo} className="recently-item" onClick={() => { - if (row.objectNo.substring(0, 1) === 'R') { + if (row.tempFlg === '0') { router.push(`/management/stuff/detail?objectNo=${row.objectNo.toString()}`) } else { router.push(`/management/stuff/tempdetail?objectNo=${row.objectNo.toString()}`) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index d9c6022e..7fabc8b9 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -1,12 +1,11 @@ 'use client' -import React, { useEffect, useState, useRef } from 'react' +import { useEffect, useState, useRef, useContext } from 'react' import { useRouter, usePathname } from 'next/navigation' -import { Button } from '@nextui-org/react' import { useAxios } from '@/hooks/useAxios' import { useMessage } from '@/hooks/useMessage' import StuffQGrid from './StuffQGrid' -import { useRecoilValue, useRecoilState } from 'recoil' +import { useRecoilValue, useRecoilState, useSetRecoilState } from 'recoil' import { stuffSearchState } from '@/store/stuffAtom' import { queryStringFormatter, isEmptyArray } from '@/util/common-utils' import dayjs from 'dayjs' @@ -17,10 +16,12 @@ import KO from '@/locales/ko.json' import JA from '@/locales/ja.json' import QPagination from '../common/pagination/QPagination' import { sessionStore } from '@/store/commonAtom' +import { SessionContext } from '@/app/SessionProvider' export default function Stuff() { const sessionState = useRecoilValue(sessionStore) - const [appMessageState, setAppMessageState] = useRecoilState(appMessageStore) + const { session } = useContext(SessionContext) + const setAppMessageState = useSetRecoilState(appMessageStore) const stuffSearchParams = useRecoilValue(stuffSearchState) const [stuffSearch, setStuffSearch] = useRecoilState(stuffSearchState) const { getMessage } = useMessage() @@ -224,11 +225,31 @@ export default function Stuff() { // 진입시 그리드 데이터 조회 useEffect(() => { - if (isObjectNotEmpty(sessionState)) { - //물건 메뉴 눌러서 최초 진입 sessionState + // if (isObjectNotEmpty(sessionState)) { + if (isObjectNotEmpty(session)) { + //물건 메뉴 눌러서 최초 진입 if (stuffSearchParams?.code === 'S') { + // const params = { + // saleStoreId: sessionState?.storeId, + // schObjectNo: stuffSearchParams?.schObjectNo, + // schAddress: stuffSearchParams?.schAddress, + // schObjectName: stuffSearchParams?.schObjectName, + // schSaleStoreName: stuffSearchParams?.schSaleStoreName, + // schReceiveUser: stuffSearchParams?.schReceiveUser, + // schDispCompanyName: stuffSearchParams?.schDispCompanyName, + // schDateType: stuffSearchParams.schDateType, + // schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), + // schToDt: dayjs(new Date()).format('YYYY-MM-DD'), + // startRow: (pageNo - 1) * pageSize + 1, + // endRow: pageNo * pageSize, + // schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId + // ? stuffSearchParams.schOtherSelSaleStoreId + // : stuffSearchParams.schSelSaleStoreId, + // schSortType: stuffSearchParams.schSortType, + // } + const params = { - saleStoreId: sessionState?.storeId, + saleStoreId: session?.storeId, schObjectNo: stuffSearchParams?.schObjectNo, schAddress: stuffSearchParams?.schAddress, schObjectName: stuffSearchParams?.schObjectName, @@ -260,8 +281,26 @@ export default function Stuff() { fetchData() } else if (stuffSearchParams?.code === 'M') { //메인화면에서 진입 + // const params = { + // saleStoreId: sessionState?.storeId, + // schObjectNo: stuffSearchParams.schObjectNo, + // schAddress: 'dfdfdfdfdf', + // schObjectName: '', + // schSaleStoreName: '', + // schReceiveUser: '', + // schDispCompanyName: '', + // schDateType: 'U', + // schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), + // schToDt: dayjs(new Date()).format('YYYY-MM-DD'), + // startRow: (pageNo - 1) * pageSize + 1, + // endRow: pageNo * pageSize, + // schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId + // ? stuffSearchParams.schOtherSelSaleStoreId + // : stuffSearchParams.schSelSaleStoreId, + // schSortType: 'R', + // } const params = { - saleStoreId: sessionState?.storeId, + saleStoreId: session?.storeId, schObjectNo: stuffSearchParams.schObjectNo, schAddress: 'dfdfdfdfdf', schObjectName: '', @@ -309,7 +348,8 @@ export default function Stuff() { //조회를 눌렀을때 async function fetchData() { - const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` + // const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` + const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` await get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) @@ -341,7 +381,8 @@ export default function Stuff() { }) setPageNo(1) - const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` + // const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` + const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) @@ -373,7 +414,8 @@ export default function Stuff() { }) setPageNo(1) - const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` + // const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` + const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 62e6a9f2..127329cb 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -1,8 +1,8 @@ 'use client' -import React, { useEffect, useRef, useState } from 'react' +import { useEffect, useRef, useState, useContext } from 'react' import { useAxios } from '@/hooks/useAxios' -import { useRecoilState, useRecoilValue, useResetRecoilState } from 'recoil' +import { useRecoilState, useRecoilValue, useResetRecoilState, useSetRecoilState } from 'recoil' import { appMessageStore, globalLocaleStore } from '@/store/localeAtom' import Select from 'react-select' import KO from '@/locales/ko.json' @@ -15,10 +15,13 @@ import SingleDatePicker from '../common/datepicker/SingleDatePicker' import { sessionStore } from '@/store/commonAtom' import { useMessage } from '@/hooks/useMessage' import { isObjectNotEmpty } from '@/util/common-utils' -import { searchState } from '@/store/boardAtom' + +import { SessionContext } from '@/app/SessionProvider' + export default function StuffSearchCondition() { + const { session } = useContext(SessionContext) const sessionState = useRecoilValue(sessionStore) - const [appMessageState, setAppMessageState] = useRecoilState(appMessageStore) + const setAppMessageState = useSetRecoilState(appMessageStore) const globalLocaleState = useRecoilValue(globalLocaleStore) const { getMessage } = useMessage() const ref = useRef() @@ -128,7 +131,8 @@ export default function StuffSearchCondition() { setDateType('U') setStartDate(dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD')) setEndDate(dayjs(new Date()).format('YYYY-MM-DD')) - if (sessionState?.storeId === 'T01') { + // if (sessionState?.storeId === 'T01') { + if (session?.storeId === 'T01') { setSchSelSaleStoreId('') handleClear1() //판매대리점선택 자동완성 클리어 resetStuffRecoil() @@ -152,18 +156,24 @@ export default function StuffSearchCondition() { } useEffect(() => { - if (isObjectNotEmpty(sessionState)) { + // if (isObjectNotEmpty(sessionState)) { + if (isObjectNotEmpty(session)) { // storeId가 T01 이거나 storeLvl이 1차점일때만 판매대리점 선택 활성화 let url - if (sessionState?.storeId === 'T01') { + // if (sessionState?.storeId === 'T01') { + if (session?.storeId === 'T01') { //T01일떄 - url = `/api/object/saleStore/${sessionState?.storeId}/firstList?userId=${sessionState?.userId}` + // url = `/api/object/saleStore/${sessionState?.storeId}/firstList?userId=${sessionState?.userId}` + url = `/api/object/saleStore/${session?.storeId}/firstList?userId=${session?.userId}` } else { - if (sessionState.storeLvl === '1') { + // if (sessionState.storeLvl === '1') { + if (session.storeLvl === '1') { //T01아닌 1차점일때 - url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` + // url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` + url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` } else { - url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` + // url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` + url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` } } @@ -177,22 +187,26 @@ export default function StuffSearchCondition() { let allList let favList let otherList - if (sessionState?.storeId === 'T01') { + // if (sessionState?.storeId === 'T01') { + if (session?.storeId === 'T01') { allList = res allList.sort((a, b) => (a.saleStoreId !== 'T01') - (b.saleStoreId !== 'T01') || a.saleStoreId - b.saleStoreId) favList = res.filter((row) => row.saleStoreId === 'T01' || row.priority !== 'B') setSchSelSaleStoreList(allList) setFavoriteStoreList(favList) setShowSaleStoreList(favList) - setSchSelSaleStoreId(sessionState?.storeId) + // setSchSelSaleStoreId(sessionState?.storeId) + setSchSelSaleStoreId(session?.storeId) setStuffSearch({ ...stuffSearch, code: 'S', - schSelSaleStoreId: sessionState?.storeId, + // schSelSaleStoreId: sessionState?.storeId, + schSelSaleStoreId: session?.storeId, }) - //T01일때 2차 판매점 호출하기 - url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=0&userId=${sessionState?.userId}` + //T01일때 2차 판매점 호출하기 디폴트로 1차점을 본인으로 셋팅해서 세션storeId사용 + // url = `/api/object/saleStore/${sessionState?.storeId}/list?firstFlg=0&userId=${sessionState?.userId}` + url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=0&userId=${session?.userId}` get({ url: url }).then((res) => { if (!isEmptyArray(res)) { @@ -208,7 +222,8 @@ export default function StuffSearchCondition() { } }) } else { - if (sessionState?.storeLvl === '1') { + // if (sessionState?.storeLvl === '1') { + if (session?.storeLvl === '1') { allList = res favList = res.filter((row) => row.priority !== 'B') otherList = res.filter((row) => row.firstAgentYn === 'N') @@ -235,7 +250,8 @@ export default function StuffSearchCondition() { setOtherSaleStoreList(otherList) //선택한 2차점 세션으로 자동셋팅 - setOtherSaleStoreId(sessionState?.storeId) + // setOtherSaleStoreId(sessionState?.storeId) + setOtherSaleStoreId(session?.storeId) setStuffSearch({ ...stuffSearch, code: 'S', @@ -246,7 +262,8 @@ export default function StuffSearchCondition() { } }) } - }, [sessionState]) + // }, [sessionState]) + }, [session]) //초기화 눌렀을 때 1차판매점 자동완성도.. const handleClear1 = () => { @@ -279,7 +296,8 @@ export default function StuffSearchCondition() { stuffSearch.schSelSaleStoreId = key.saleStoreId //T01아닌 1차점은 본인으로 디폴트셋팅이고 수정할수없어서 여기안옴 //고른 1차점의 saleStoreId로 2차점 API호출하기 - let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${sessionState?.userId}` + // let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${sessionState?.userId}` + let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${session?.userId}` let otherList get({ url: url }).then((res) => { if (!isEmptyArray(res)) { @@ -470,7 +488,8 @@ export default function StuffSearchCondition() {
      - {sessionState?.storeId === 'T01' && ( + {/* {sessionState?.storeId === 'T01' && ( */} + {session?.storeId === 'T01' && ( )} - {sessionState?.storeId !== 'T01' && sessionState?.storeLvl !== '1' && ( + {/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl !== '1' && ( */} + {session?.storeId !== 'T01' && session?.storeLvl !== '1' && ( x.saleStoreName} + getOptionValue={(x) => x.saleStoreId} + // isClearable={sessionState?.storeLvl === '1' ? true : false} + isClearable={session?.storeLvl === '1' ? true : false} + // isDisabled={sessionState?.storeLvl !== '1' ? true : false} + isDisabled={session?.storeLvl !== '1' ? true : false} + value={saleStoreList.filter(function (option) { + // console.log('showSaleStoreList:::::', option.saleStoreId) + return option.saleStoreId === selOptions + })} + > +
      +
      + +
      + + )} + + {/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl === '1' && ( */} + {session?.storeId !== 'T01' && session?.storeLvl === '1' && ( + <> + 신규 T01아닌 1차점 +
      + +
      +
      + +
      + + )} + {/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl !== '1' && ( */} + {session?.storeId !== 'T01' && session?.storeLvl !== '1' && ( + <> + 신규 로그인이2차점 +
      + +
      +
      + +
      + + )} + + {/* {(sessionState?.storeId === 'T01' && ( <>
      - )} + )} */}
      @@ -1432,8 +1672,10 @@ export default function StuffDetail() { onChange={onSelectionChange2} getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} - isDisabled={sessionState?.storeLvl === '1' && form.watch('saleStoreId') != '' ? false : true} - isClearable={sessionState?.storeLvl === '1' ? true : false} + // isDisabled={session?.storeLvl === '1' && form.watch('saleStoreId') != '' ? false : true} + isDisabled={session?.storeLvl === '1' && form.watch('saleStoreId') != '' && otherSaleStoreList.length > 1 ? false : true} + // isClearable={sessionState?.storeLvl === '1' ? true : false} + isClearable={session?.storeLvl === '1' ? true : false} value={otherSaleStoreList.filter(function (option) { return option.saleStoreId === otherSelOptions })} @@ -1688,7 +1930,7 @@ export default function StuffDetail() {
      {/* {detailData?.tempFlg === '1' && form.watch('planReqNo') ? ( */} - {objectNo.substring(0, 1) === 'T' && form.watch('planReqNo') ? ( + {detailData?.tempFlg === '1' && form.watch('planReqNo') ? (
    {/* {detailData?.tempFlg === '0' ? ( */} - {objectNo.substring(0, 1) !== 'T' ? ( + {detailData?.tempFlg === '0' ? ( <> {/* 진짜R 플랜시작 */}
    From 7e598bcc13661c446b3ae67770ec7d599142d2c8 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 1 Nov 2024 09:53:45 +0900 Subject: [PATCH 10/20] =?UTF-8?q?=EC=9E=84=EC=8B=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 187 +++--------------- .../management/StuffSearchCondition.jsx | 2 +- .../management/popup/PlanRequestPop.jsx | 12 +- 3 files changed, 39 insertions(+), 162 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 740bf38e..dc0ce981 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -247,7 +247,6 @@ export default function StuffDetail() { } } - console.log('buttonStyle:::', buttonStyle, params.value) return ( <>
    @@ -323,18 +322,12 @@ export default function StuffDetail() { let favList // if (sessionState?.storeId === 'T01') { if (session?.storeId === 'T01') { - console.log('신규T01::::::::::::::::::::::::::::::::::::') - // url = `/api/object/saleStore/${sessionState?.storeId}/list?userId=${sessionState?.userId}` url = `/api/object/saleStore/${session?.storeId}/firstList?userId=${session?.userId}` } else { - // url = `/api/object/saleStore/${sessionState?.storeId}/list` if (session.storeLvl === '1') { - console.log('로그인이1차:::::::') - //url = `/api/object/saleStore/${session?.storeId}/list` url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${sessionState?.userId}` } else { - console.log('로그인이2차:::') - url = `` + url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=1&userId=${session?.userId}` } } @@ -386,61 +379,26 @@ export default function StuffDetail() { setOtherSaleStoreList(otherList) } else { - console.log('1차점아님:::::::::', res) + //10X22, 201X112,202X217 + firstList = res.filter((row) => row.firstAgentYn === 'Y') + setSaleStoreList(firstList) + setFavoriteStoreList(firstList) + setShowSaleStoreList(firstList) + setSelOptions(firstList[0].saleStoreId) + + form.setValue('saleStoreId', firstList[0].saleStoreId) + form.setValue('saleStoreLevel', firstList[0].saleStoreLevel) + + otherList = res.filter((row) => row.firstAgentYn === 'N') + setOtherSaleStoreList(otherList) + //2차 판매점명/ID는 본인을 셀렉트 + setOtherSelOptions(session?.storeId) + form.setValue('otherSaleStoreId', session?.storeId) + form.setValue('otherSaleStoreLevel', session?.storeLvl) } } } }) - - // get({ url: url }).then((res) => { - // if (!isEmptyArray(res)) { - // const firstList = res.filter((row) => row.saleStoreLevel === '1') - // let favList - // // if (sessionState?.storeId === 'T01') { - // if (session?.storeId === 'T01') { - // firstList.sort((a, b) => (a.saleStoreId !== 'T01') - (b.saleStoreId !== 'T01') || a.saleStoreId - b.saleStoreId) - // favList = firstList.filter((row) => row.saleStoreId === 'T01' || row.priority !== 'B') - // setSaleStoreList(firstList) - // setFavoriteStoreList(favList) - // setShowSaleStoreList(favList) - // } else { - // //1차점 셀렉트박스 - // setSaleStoreList(firstList) - // } - // const otherList = res.filter((row) => row.saleStoreLevel !== '1') - // let filterOtherList - // // if (sessionState?.storeId === 'T01') { - // if (session?.storeId === 'T01') { - // filterOtherList = otherList.filter((row) => row.firstAgentId === 'T01') - - // setOriginOtherSaleStoreList(filterOtherList) - // setOtherSaleStoreList(filterOtherList) - // } else { - // //T01 아니고 2차점 판매점 셀렉트박스 - // setOriginOtherSaleStoreList(otherList) - // setOtherSaleStoreList(otherList) - // } - - // // if (sessionState?.storeLvl === '1') { - // if (session?.storeLvl === '1') { - // // setSelOptions(sessionState?.storeId) - // setSelOptions(session?.storeId) - // // form.setValue('saleStoreId', sessionState?.storeId) - // form.setValue('saleStoreId', session?.storeId) - // // form.setValue('saleStoreLevel', sessionState?.storeLvl) - // form.setValue('saleStoreLevel', session?.storeLvl) - // } else { - // setSelOptions(firstList[0].saleStoreId) - // // setOtherSelOptions(sessionState?.storeId) - // setOtherSelOptions(session?.storeId) - // form.setValue('saleStoreId', firstList[0].saleStoreId) - // // form.setValue('otherSaleStoreId', sessionState?.storeId) - // form.setValue('otherSaleStoreId', session?.storeId) - // // form.setValue('otherSaleStoreLevel', sessionState?.storeLvl) - // form.setValue('otherSaleStoreLevel', session?.storeLvl) - // } - // } - // }) } // }, [objectNo, sessionState]) }, [objectNo, session]) @@ -659,6 +617,7 @@ export default function StuffDetail() { if (editMode === 'NEW') { if (planReqNo !== '') { + // console.log('삭제됩니다1111111111111') if (confirm(getMessage('stuff.detail.confirm.message1'))) { delFlg = true } else { @@ -668,6 +627,7 @@ export default function StuffDetail() { } else { // EDIT if (planReqNo !== null && planReqNo !== '') { + // console.log('삭제됩니다2222222222222') if (confirm(getMessage('stuff.detail.confirm.message1'))) { delFlg = true } else { @@ -680,6 +640,8 @@ export default function StuffDetail() { if (objectNo) { tempObjectNo = objectNo.substring(0, 1) } + + // console.log('설계의뢰있을때 1차점 변경 ::::::::::tempObjectNo:::::::', tempObjectNo, planReqNo, delFlg) if (tempObjectNo === 'T') { if (planReqNo) { if (delFlg) { @@ -692,7 +654,7 @@ export default function StuffDetail() { setSelOptions(key.saleStoreId) //선택한 1차점 정보로 2차점 list 추리기 //長府工産株式会社 大阪支社 - console.log('여기도?????????????????????') + console.log('111111??????111???????????????') // let newOtherSaleStoreList = originOtherSaleStoreList.filter((row) => row.firstAgentId === key.saleStoreId) // setOtherSaleStoreList(newOtherSaleStoreList) } else { @@ -716,12 +678,9 @@ export default function StuffDetail() { form.setValue('saleStoreName', key.saleStoreName) form.setValue('saleStoreLevel', key.saleStoreLevel) //선택한 1차점 정보로 2차점 조회하기 - //長府工産株式会社 大阪支社 - console.log('바꿔조ㅜㅝ............', key.saleStoreId) let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${session?.userId}` let otherList get({ url: url }).then((res) => { - console.log('고른1차점으로 2차점목록조회결과;:::', res) if (!isEmptyArray(res)) { res.map((row) => { row.value = row.saleStoreId @@ -729,7 +688,6 @@ export default function StuffDetail() { }) otherList = res - console.log('otherList::::::::', otherList) setOtherSaleStoreList(otherList) setOtherSelOptions('') form.setValue('otherSaleStoreId', '') @@ -766,7 +724,7 @@ export default function StuffDetail() { setSelOptions(key.saleStoreId) //선택한 1차점 정보로 2차점 list 추리기 //長府工産株式会社 大阪支社 - console.log('여기도용') + console.log('3333333333333') // let newOtherSaleStoreList = originOtherSaleStoreList.filter((row) => row.firstAgentId === key.saleStoreId) // setOtherSaleStoreList(newOtherSaleStoreList) } else { @@ -818,6 +776,7 @@ export default function StuffDetail() { if (objectNo) { tempObjectNo = objectNo.substring(0, 1) } + if (tempObjectNo === 'T') { if (planReqNo) { if (delFlg) { @@ -1306,16 +1265,7 @@ export default function StuffDetail() { // params.saleStoreLevel = sessionState.storeLvl params.saleStoreLevel = session.storeLvl } - //수직적설량, 설치높이 0인지 체크 - // let snow = params.verticalSnowCover - // let height = params.installHeight - // if (snow === '0') { - // return alert(getMessage('stuff.detail.save.valierror1')) - // } - // if (height === '0') { - // return alert(getMessage('stuff.detail.save.valierror2')) - // } await promisePost({ url: '/api/object/save-object', data: params }).then((res) => { if (res.status === 201) { alert(getMessage('stuff.detail.tempSave.message1')) @@ -1389,7 +1339,7 @@ export default function StuffDetail() { )) || null}
    -
    @@ -1491,12 +1441,9 @@ export default function StuffDetail() { onChange={onSelectionChange} getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} - // isClearable={sessionState?.storeLvl === '1' ? true : false} - isClearable={session?.storeLvl === '1' ? true : false} - // isDisabled={sessionState?.storeLvl !== '1' ? true : false} + isClearable={true} isDisabled={session?.storeLvl !== '1' ? true : false} value={saleStoreList.filter(function (option) { - // console.log('showSaleStoreList:::::', option.saleStoreId) return option.saleStoreId === selOptions })} > @@ -1516,7 +1463,6 @@ export default function StuffDetail() { {/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl === '1' && ( */} {session?.storeId !== 'T01' && session?.storeLvl === '1' && ( <> - 신규 T01아닌 1차점
    x.saleStoreName} - getOptionValue={(x) => x.saleStoreId} - // isClearable={sessionState?.storeLvl === '1' ? true : false} - isClearable={session?.storeLvl === '1' ? true : false} - // isDisabled={sessionState?.storeLvl !== '1' ? true : false} - isDisabled={session?.storeLvl !== '1' ? true : false} - value={saleStoreList.filter(function (option) { - return option.saleStoreId === selOptions - })} - > -
    -
    - -
    - - )} - - {/* {(sessionState?.storeId === 'T01' && ( <>
    x.saleStoreName} - getOptionValue={(x) => x.saleStoreId} - isClearable={sessionState?.storeLvl === '1' ? true : false} - isDisabled={sessionState?.storeLvl !== '1' ? true : false} - value={saleStoreList.filter(function (option) { - return option.saleStoreId === selOptions - })} - > -
    -
    - -
    - - )} */} + )}
    @@ -1672,10 +1551,8 @@ export default function StuffDetail() { onChange={onSelectionChange2} getOptionLabel={(x) => x.saleStoreName} getOptionValue={(x) => x.saleStoreId} - // isDisabled={session?.storeLvl === '1' && form.watch('saleStoreId') != '' ? false : true} - isDisabled={session?.storeLvl === '1' && form.watch('saleStoreId') != '' && otherSaleStoreList.length > 1 ? false : true} - // isClearable={sessionState?.storeLvl === '1' ? true : false} - isClearable={session?.storeLvl === '1' ? true : false} + isDisabled={otherSaleStoreList.length > 1 ? false : true} + isClearable={true} value={otherSaleStoreList.filter(function (option) { return option.saleStoreId === otherSelOptions })} diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 127329cb..7da382f9 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -240,7 +240,7 @@ export default function StuffSearchCondition() { schSelSaleStoreId: allList[0].saleStoreId, }) } else { - //201X112 그냥2차점 + //10X22, 201X112 그냥2차점 //2차점인데 34들고있는애 202X217 setSchSelSaleStoreList(res) setFavoriteStoreList(res) diff --git a/src/components/management/popup/PlanRequestPop.jsx b/src/components/management/popup/PlanRequestPop.jsx index bbe0f6c9..bec3c223 100644 --- a/src/components/management/popup/PlanRequestPop.jsx +++ b/src/components/management/popup/PlanRequestPop.jsx @@ -87,10 +87,10 @@ export default function PlanRequestPop(props) { const onSubmit = (page, type) => { //2차점 테스트 201X112 const params = { - // saleStoreId: 'T100', - // saleStoreLevel: '1', - saleStoreId: props?.otherSaleStoreId ? props.otherSaleStoreId : props.saleStoreId, - saleStoreLevel: props?.otherSaleStoreLevel ? props.otherSaleStoreLevel : props.saleStoreLevel, + saleStoreId: 'T100', + saleStoreLevel: '1', + // saleStoreId: props?.otherSaleStoreId ? props.otherSaleStoreId : props.saleStoreId, + // saleStoreLevel: props?.otherSaleStoreLevel ? props.otherSaleStoreLevel : props.saleStoreLevel, schPlanReqNo: schPlanReqNo, schTitle: schTitle, schAddress: schAddress, @@ -98,8 +98,8 @@ export default function PlanRequestPop(props) { schPlanReqName: schPlanReqName, schPlanStatCd: schPlanStatCd, schDateGbn: schDateGbn, - schStartDt: dayjs(startDate).format('YYYY-MM-DD'), - schEndDt: dayjs(endDate).format('YYYY-MM-DD'), + // schStartDt: dayjs(startDate).format('YYYY-MM-DD'), + // schEndDt: dayjs(endDate).format('YYYY-MM-DD'), startRow: type === 'S' ? (1 - 1) * pageSize + 1 : (page - 1) * pageSize + 1, endRow: type === 'S' ? 1 * pageSize : page * pageSize, } From c0cf7c4f9bbd5507c55fc569826efe640cc2e5ab Mon Sep 17 00:00:00 2001 From: minsik Date: Fri, 1 Nov 2024 10:02:17 +0900 Subject: [PATCH 11/20] =?UTF-8?q?contextmenu=20list=20recoil=20default=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasFrame.jsx | 5 ++--- src/store/contextMenu.js | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index 2eec41a5..b0881b6e 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -8,8 +8,7 @@ import { useCanvas } from '@/hooks/useCanvas' import { useEvent } from '@/hooks/useEvent' import { usePlan } from '@/hooks/usePlan' import { useContextMenu } from '@/hooks/useContextMenu' -import { currentMenuState, currentObjectState } from '@/store/canvasAtom' -import { useCanvasEvent } from '@/hooks/useCanvasEvent' +import { currentMenuState } from '@/store/canvasAtom' import QContextMenu from '@/components/common/context-menu/QContextMenu' import { useCanvasConfigInitialize } from '@/hooks/common/useCanvasConfigInitialize' import { MENU } from '@/common/common' @@ -59,7 +58,7 @@ export default function CanvasFrame() { - {contextMenu.map((menus, index) => ( + {contextMenu?.map((menus, index) => (
      {menus.map((menu) => (
    • handleClick(e, menu)}> diff --git a/src/store/contextMenu.js b/src/store/contextMenu.js index b97fea65..2687df60 100644 --- a/src/store/contextMenu.js +++ b/src/store/contextMenu.js @@ -12,6 +12,6 @@ export const contextMenuState = atom({ export const contextMenuListState = atom({ key: 'contextMenuListState', - default: null, + default: [[]], dangerouslyAllowMutability: true, }) From 57fbcea3a109dfb8f78ad58164c0a8bf374f8f8c Mon Sep 17 00:00:00 2001 From: "hyojun.choi" Date: Fri, 1 Nov 2024 10:47:35 +0900 Subject: [PATCH 12/20] =?UTF-8?q?=EB=B3=B4=EC=A1=B0=EC=84=A0=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1=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/useAuxiliaryDrawing.js | 38 ++++++++++++++++++---- src/util/qpolygon-utils.js | 5 +-- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/src/hooks/roofcover/useAuxiliaryDrawing.js b/src/hooks/roofcover/useAuxiliaryDrawing.js index ba631080..956bcf8f 100644 --- a/src/hooks/roofcover/useAuxiliaryDrawing.js +++ b/src/hooks/roofcover/useAuxiliaryDrawing.js @@ -22,6 +22,7 @@ import { useSwal } from '@/hooks/useSwal' import { booleanPointInPolygon } from '@turf/turf' import { usePopup } from '@/hooks/usePopup' import { calculateAngle } from '@/util/qpolygon-utils' +import { QPolygon } from '@/components/fabric/QPolygon' // 보조선 작성 export function useAuxiliaryDrawing(id) { @@ -742,15 +743,38 @@ export function useAuxiliaryDrawing(id) { } const roofBases = canvas.getObjects().filter((obj) => obj.name === 'roofBase') - const innerLines = [...lineHistory.current] + + //lineHistory.current에 있는 선들 중 startPoint와 endPoint가 겹치는 line은 제거 + // 겹치는 선 하나는 canvas에서 제거한다. + + const tempLines = [...lineHistory.current] + lineHistory.current = [] + tempLines.forEach((line) => { + if ( + lineHistory.current.some( + (history) => + JSON.stringify(history.startPoint) === JSON.stringify(line.startPoint) && + JSON.stringify(history.endPoint) === JSON.stringify(line.endPoint), + ) + ) { + canvas.remove(line) + return + } + + lineHistory.current.push(line) + }) + + const innerLines = lineHistory.current roofBases.forEach((roofBase) => { + const tempPolygonPoints = [...roofBase.points].map((obj) => { + return { x: Math.round(obj.x), y: Math.round(obj.y) } + }) const roofInnerLines = innerLines.filter((line) => { - const turfPolygon = polygonToTurfPolygon(roofBase) - - // innerLines의 두 점이 모두 polygon 안에 있는지 확인 - const inPolygon1 = booleanPointInPolygon([line.x1, line.y1], turfPolygon) - const inPolygon2 = booleanPointInPolygon([line.x2, line.y2], turfPolygon) + const inPolygon1 = + tempPolygonPoints.some((point) => point.x === line.x1 && point.y === line.y1) || roofBase.inPolygon({ x: line.x1, y: line.y1 }) + const inPolygon2 = + tempPolygonPoints.some((point) => point.x === line.x2 && point.y === line.y2) || roofBase.inPolygon({ x: line.x2, y: line.y2 }) if (inPolygon1 && inPolygon2) { line.attributes = { ...line.attributes, roofId: roofBase.id } @@ -759,6 +783,8 @@ export function useAuxiliaryDrawing(id) { }) roofBase.innerLines = [...roofInnerLines] + + canvas.renderAll() }) closePopup(id) diff --git a/src/util/qpolygon-utils.js b/src/util/qpolygon-utils.js index 7ca7fb79..01140300 100644 --- a/src/util/qpolygon-utils.js +++ b/src/util/qpolygon-utils.js @@ -1034,9 +1034,10 @@ export const splitPolygonWithLines = (polygon) => { const routes = [] // 시작점은 시작 hip라인의 출발점 - const startPoint = point + const startPoint = { x: Math.round(point.x), y: Math.round(point.y) } // 도착점은 마지막 hip라인의 끝나는 점 - const endPoint = polygon.points[(index + 1) % polygon.points.length] + let endPoint = polygon.points[(index + 1) % polygon.points.length] + endPoint = { x: Math.round(endPoint.x), y: Math.round(endPoint.y) } const startLine = allLines.find((line) => line.startPoint.x === startPoint.x && line.startPoint.y === startPoint.y) const endLine = allLines.find((line) => line.startPoint.x === endPoint.x && line.startPoint.y === endPoint.y) From a63edd0249e98dc5bc8d94445fc74c6e8fba18fc Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 1 Nov 2024 10:47:55 +0900 Subject: [PATCH 13/20] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=ED=98=84=ED=99=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 50 +++++++++++++------ .../management/popup/PlanRequestPop.jsx | 12 ++--- 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index dc0ce981..49fc92f8 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -420,7 +420,7 @@ export default function StuffDetail() { useEffect(() => { if (isObjectNotEmpty(detailData)) { - console.log('상세데이타세팅:::::', detailData) + // console.log('상세데이타세팅:::::', detailData) // 도도부현API get({ url: '/api/object/prefecture/list' }).then((res) => { if (!isEmptyArray(res)) { @@ -459,6 +459,11 @@ export default function StuffDetail() { setFavoriteStoreList(favList) setShowSaleStoreList(favList) + form.setValue('saleStoreId', firstList[0].saleStoreId) + form.setValue('saleStoreName', firstList[0].saleStoreName) + form.setValue('saleStoreLevel', firstList[0].saleStoreLevel) + setSelOptions(firstList[0].saleStoreId) + //상세데이터의 1차점 아이디로 2차점 목록 조회하기 // url = `/api/object/saleStore/${detailData?.saleStoreId}/list?firstFlg=0&userId=${sessionState?.userId}` url = `/api/object/saleStore/${detailData?.saleStoreId}/list?firstFlg=0&userId=${session?.userId}` @@ -617,7 +622,6 @@ export default function StuffDetail() { if (editMode === 'NEW') { if (planReqNo !== '') { - // console.log('삭제됩니다1111111111111') if (confirm(getMessage('stuff.detail.confirm.message1'))) { delFlg = true } else { @@ -627,7 +631,6 @@ export default function StuffDetail() { } else { // EDIT if (planReqNo !== null && planReqNo !== '') { - // console.log('삭제됩니다2222222222222') if (confirm(getMessage('stuff.detail.confirm.message1'))) { delFlg = true } else { @@ -641,7 +644,6 @@ export default function StuffDetail() { tempObjectNo = objectNo.substring(0, 1) } - // console.log('설계의뢰있을때 1차점 변경 ::::::::::tempObjectNo:::::::', tempObjectNo, planReqNo, delFlg) if (tempObjectNo === 'T') { if (planReqNo) { if (delFlg) { @@ -652,11 +654,21 @@ export default function StuffDetail() { form.setValue('saleStoreName', key.saleStoreName) form.setValue('saleStoreLevel', key.saleStoreLevel) setSelOptions(key.saleStoreId) - //선택한 1차점 정보로 2차점 list 추리기 - //長府工産株式会社 大阪支社 - console.log('111111??????111???????????????') - // let newOtherSaleStoreList = originOtherSaleStoreList.filter((row) => row.firstAgentId === key.saleStoreId) - // setOtherSaleStoreList(newOtherSaleStoreList) + let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${session?.userId}` + let otherList + get({ url: url }).then((res) => { + if (!isEmptyArray(res)) { + res.map((row) => { + row.value = row.saleStoreId + row.label = row.saleStoreName + }) + + otherList = res + setOtherSaleStoreList(otherList) + } else { + setOtherSaleStoreList([]) + } + }) } else { //X누름 setSelOptions('') @@ -722,11 +734,21 @@ export default function StuffDetail() { form.setValue('saleStoreName', key.saleStoreName) form.setValue('saleStoreLevel', key.saleStoreLevel) setSelOptions(key.saleStoreId) - //선택한 1차점 정보로 2차점 list 추리기 - //長府工産株式会社 大阪支社 - console.log('3333333333333') - // let newOtherSaleStoreList = originOtherSaleStoreList.filter((row) => row.firstAgentId === key.saleStoreId) - // setOtherSaleStoreList(newOtherSaleStoreList) + let url = `/api/object/saleStore/${key.saleStoreId}/list?firstFlg=0&userId=${session?.userId}` + let otherList + get({ url: url }).then((res) => { + if (!isEmptyArray(res)) { + res.map((row) => { + row.value = row.saleStoreId + row.label = row.saleStoreName + }) + + otherList = res + setOtherSaleStoreList(otherList) + } else { + setOtherSaleStoreList([]) + } + }) } else { //X누름 setSelOptions('') diff --git a/src/components/management/popup/PlanRequestPop.jsx b/src/components/management/popup/PlanRequestPop.jsx index bec3c223..bbe0f6c9 100644 --- a/src/components/management/popup/PlanRequestPop.jsx +++ b/src/components/management/popup/PlanRequestPop.jsx @@ -87,10 +87,10 @@ export default function PlanRequestPop(props) { const onSubmit = (page, type) => { //2차점 테스트 201X112 const params = { - saleStoreId: 'T100', - saleStoreLevel: '1', - // saleStoreId: props?.otherSaleStoreId ? props.otherSaleStoreId : props.saleStoreId, - // saleStoreLevel: props?.otherSaleStoreLevel ? props.otherSaleStoreLevel : props.saleStoreLevel, + // saleStoreId: 'T100', + // saleStoreLevel: '1', + saleStoreId: props?.otherSaleStoreId ? props.otherSaleStoreId : props.saleStoreId, + saleStoreLevel: props?.otherSaleStoreLevel ? props.otherSaleStoreLevel : props.saleStoreLevel, schPlanReqNo: schPlanReqNo, schTitle: schTitle, schAddress: schAddress, @@ -98,8 +98,8 @@ export default function PlanRequestPop(props) { schPlanReqName: schPlanReqName, schPlanStatCd: schPlanStatCd, schDateGbn: schDateGbn, - // schStartDt: dayjs(startDate).format('YYYY-MM-DD'), - // schEndDt: dayjs(endDate).format('YYYY-MM-DD'), + schStartDt: dayjs(startDate).format('YYYY-MM-DD'), + schEndDt: dayjs(endDate).format('YYYY-MM-DD'), startRow: type === 'S' ? (1 - 1) * pageSize + 1 : (page - 1) * pageSize + 1, endRow: type === 'S' ? 1 * pageSize : page * pageSize, } From 1b399160d368b8a2dd18dbfa84c089272df3b88f Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 1 Nov 2024 10:50:20 +0900 Subject: [PATCH 14/20] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffSubHeader.jsx | 2 +- src/locales/ja.json | 1 + src/locales/ko.json | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/management/StuffSubHeader.jsx b/src/components/management/StuffSubHeader.jsx index 12a51394..9c7fef64 100644 --- a/src/components/management/StuffSubHeader.jsx +++ b/src/components/management/StuffSubHeader.jsx @@ -88,7 +88,7 @@ export default function StuffSubHeader({ type }) {
    • - {getMessage('plan.menu.plan.drawing')} + {getMessage('stuff.temp.subTitle2')}
    diff --git a/src/locales/ja.json b/src/locales/ja.json index aed7d34d..a1850300 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -586,6 +586,7 @@ "stuff.addressPopup.btn2": "住所適用", "stuff.planReqPopup.title": "設計依頼のインポート", "stuff.temp.subTitle": "商品情報", + "stuff.temp.subTitle2": "作図", "stuff.detail.header.message1": "存在しないものです。", "stuff.detail.header.message2": "商品番号がコピーされました。", "stuff.detail.header.message3": "存在しないものです。", diff --git a/src/locales/ko.json b/src/locales/ko.json index 9d550aa0..a6de574e 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -592,6 +592,7 @@ "stuff.addressPopup.btn2": "주소적용", "stuff.planReqPopup.title": "설계의뢰 불러오기", "stuff.temp.subTitle": "물건정보", + "stuff.temp.subTitle2": "도면작성", "stuff.detail.header.message1": "존재하지 않는 물건입니다.", "stuff.detail.header.message2": "물건번호가 복사되었습니다.", "stuff.detail.header.message3": "물건번호 복사에 실패했습니다.", From 6099faab3f61d296da3adc389028696f702dc9f9 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 1 Nov 2024 14:02:39 +0900 Subject: [PATCH 15/20] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EB=AA=A9=EB=A1=9D?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/Stuff.jsx | 82 ++++--------------- .../management/StuffSearchCondition.jsx | 40 ++++----- 2 files changed, 36 insertions(+), 86 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index 7fabc8b9..05f62c28 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -225,31 +225,10 @@ export default function Stuff() { // 진입시 그리드 데이터 조회 useEffect(() => { - // if (isObjectNotEmpty(sessionState)) { if (isObjectNotEmpty(session)) { - //물건 메뉴 눌러서 최초 진입 if (stuffSearchParams?.code === 'S') { - // const params = { - // saleStoreId: sessionState?.storeId, - // schObjectNo: stuffSearchParams?.schObjectNo, - // schAddress: stuffSearchParams?.schAddress, - // schObjectName: stuffSearchParams?.schObjectName, - // schSaleStoreName: stuffSearchParams?.schSaleStoreName, - // schReceiveUser: stuffSearchParams?.schReceiveUser, - // schDispCompanyName: stuffSearchParams?.schDispCompanyName, - // schDateType: stuffSearchParams.schDateType, - // schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), - // schToDt: dayjs(new Date()).format('YYYY-MM-DD'), - // startRow: (pageNo - 1) * pageSize + 1, - // endRow: pageNo * pageSize, - // schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId - // ? stuffSearchParams.schOtherSelSaleStoreId - // : stuffSearchParams.schSelSaleStoreId, - // schSortType: stuffSearchParams.schSortType, - // } - const params = { - saleStoreId: session?.storeId, + saleStoreId: stuffSearchParams.schSelSaleStoreId, schObjectNo: stuffSearchParams?.schObjectNo, schAddress: stuffSearchParams?.schAddress, schObjectName: stuffSearchParams?.schObjectName, @@ -278,31 +257,15 @@ export default function Stuff() { } }) } - fetchData() + if (stuffSearchParams?.schSelSaleStoreId !== '') { + fetchData() + } } else if (stuffSearchParams?.code === 'M') { //메인화면에서 진입 - // const params = { - // saleStoreId: sessionState?.storeId, - // schObjectNo: stuffSearchParams.schObjectNo, - // schAddress: 'dfdfdfdfdf', - // schObjectName: '', - // schSaleStoreName: '', - // schReceiveUser: '', - // schDispCompanyName: '', - // schDateType: 'U', - // schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), - // schToDt: dayjs(new Date()).format('YYYY-MM-DD'), - // startRow: (pageNo - 1) * pageSize + 1, - // endRow: pageNo * pageSize, - // schSelSaleStoreId: stuffSearchParams?.schOtherSelSaleStoreId - // ? stuffSearchParams.schOtherSelSaleStoreId - // : stuffSearchParams.schSelSaleStoreId, - // schSortType: 'R', - // } const params = { saleStoreId: session?.storeId, schObjectNo: stuffSearchParams.schObjectNo, - schAddress: 'dfdfdfdfdf', + schAddress: '', schObjectName: '', schSaleStoreName: '', schReceiveUser: '', @@ -320,23 +283,9 @@ export default function Stuff() { setStuffSearch({ ...params, }) - - // async function fetchData() { - // const apiUrl = `/api/object/list?${queryStringFormatter(params)}` - // await get({ - // url: apiUrl, - // }).then((res) => { - // if (!isEmptyArray(res)) { - // setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) - // setTotalCount(res[0].totCnt) - // } - // }) - // } - // fetchData() } } - // }, [pageNo, sessionState, stuffSearchParams]) - }, [pageNo, stuffSearchParams]) + }, [pageNo, session, stuffSearchParams]) useEffect(() => { if (stuffSearchParams?.code === 'E') { @@ -348,8 +297,10 @@ export default function Stuff() { //조회를 눌렀을때 async function fetchData() { - // const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` - const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` + let saleStoreId + saleStoreId = stuffSearchParams?.schSelSaleStoreId ? stuffSearchParams.schSelSaleStoreId : session?.storeId + // const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` + const apiUrl = `/api/object/list?saleStoreId=${saleStoreId}&${queryStringFormatter(stuffSearchParams)}` await get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) @@ -375,14 +326,15 @@ export default function Stuff() { setPageSize(e.target.value) setStuffSearch({ ...stuffSearchParams, - // code: 'P', startRow: startRow, endRow: 1 * e.target.value, }) setPageNo(1) - // const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` - const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` + let saleStoreId + saleStoreId = stuffSearchParams?.schSelSaleStoreId ? stuffSearchParams.schSelSaleStoreId : session?.storeId + // const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` + const apiUrl = `/api/object/list?saleStoreId=${saleStoreId}&${queryStringFormatter(stuffSearchParams)}` get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) @@ -414,8 +366,10 @@ export default function Stuff() { }) setPageNo(1) - // const apiUrl = `/api/object/list?saleStoreId=${sessionState?.storeId}&${queryStringFormatter(stuffSearchParams)}` - const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` + let saleStoreId + saleStoreId = stuffSearchParams?.schSelSaleStoreId ? stuffSearchParams.schSelSaleStoreId : session?.storeId + // const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` + const apiUrl = `/api/object/list?saleStoreId=${saleStoreId}&${queryStringFormatter(stuffSearchParams)}` get({ url: apiUrl }).then((res) => { if (!isEmptyArray(res)) { setGridProps({ ...gridProps, gridData: res, count: res[0].totCnt }) diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index 7da382f9..659ab696 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -77,14 +77,14 @@ export default function StuffSearchCondition() { if (stuffSearch.code === 'S') { setStuffSearch({ - schObjectNo: objectNo ? objectNo : stuffSearch?.schObjectNo, - schSaleStoreName: stuffSearch?.schSaleStoreName ? stuffSearch?.schSaleStoreName : saleStoreName, - schAddress: address ? address : stuffSearch?.schAddress, - schObjectName: objectName ? objectName : stuffSearch?.schObjectName, - schDispCompanyName: dispCompanyName ? dispCompanyName : stuffSearch?.schDispCompanyName, + schObjectNo: objectNo ? objectNo : stuffSearch.schObjectNo, + schSaleStoreName: saleStoreName ? saleStoreName : '', + schAddress: address ? address : '', + schObjectName: objectName ? objectName : '', + schDispCompanyName: dispCompanyName ? dispCompanyName : '', schSelSaleStoreId: stuffSearch?.schOtherSelSaleStoreId ? stuffSearch.schOtherSelSaleStoreId : stuffSearch.schSelSaleStoreId, - schReceiveUser: receiveUser ? receiveUser : stuffSearch?.schReceiveUser, - schDateType: stuffSearch?.schDateType ? stuffSearch.schDateType : dateType, + schReceiveUser: receiveUser ? receiveUser : '', + schDateType: dateType, schFromDt: dayjs(startDate).format('YYYY-MM-DD'), schToDt: dayjs(endDate).format('YYYY-MM-DD'), code: 'E', @@ -352,6 +352,7 @@ export default function StuffSearchCondition() { // 엔터 이벤트 const handleByOnKeyUp = (e) => { if (e.key === 'Enter') { + stuffSearch.code = 'E' onSubmit() } } @@ -399,7 +400,7 @@ export default function StuffSearchCondition() { type="text" ref={objectNoRef} className="input-light" - defaultValue={stuffSearch.code === 'E' || stuffSearch.code === 'M' ? stuffSearch?.schObjectNo : objectNo} + defaultValue={stuffSearch?.schObjectNo ? stuffSearch.schObjectNo : objectNo} onChange={(e) => { setObjectNo(objectNoRef.current.value) }} @@ -414,7 +415,7 @@ export default function StuffSearchCondition() { type="text" ref={saleStoreNameRef} className="input-light" - defaultValue={stuffSearch.code === 'E' ? stuffSearch?.schSaleStoreName : saleStoreName} + defaultValue={stuffSearch?.schSaleStoreName ? stuffSearch.schSaleStoreName : saleStoreName} onChange={(e) => { setSaleStoreName(saleStoreNameRef.current.value) }} @@ -429,7 +430,7 @@ export default function StuffSearchCondition() { type="text" ref={addressRef} className="input-light" - defaultValue={stuffSearch.code === 'E' ? stuffSearch?.schAddress : address} + defaultValue={stuffSearch?.schAddress ? stuffSearch.schAddress : address} onChange={(e) => { setAddress(addressRef.current.value) }} @@ -444,7 +445,7 @@ export default function StuffSearchCondition() { type="text" ref={dispCompanyNameRef} className="input-light" - defaultValue={stuffSearch.code === 'E' ? stuffSearch?.schDispCompanyName : dispCompanyName} + defaultValue={stuffSearch?.schDispCompanyName ? stuffSearch.schDispCompanyName : dispCompanyName} onChange={(e) => { setDispCompanyName(dispCompanyNameRef.current.value) }} @@ -461,7 +462,7 @@ export default function StuffSearchCondition() { type="text" ref={objectNameRef} className="input-light" - defaultValue={stuffSearch.code === 'E' ? stuffSearch?.schObjectName : objectName} + defaultValue={stuffSearch?.schObjectName ? stuffSearch.schObjectName : objectName} onChange={(e) => { setobjectName(objectNameRef.current.value) }} @@ -476,7 +477,7 @@ export default function StuffSearchCondition() { type="text" className="input-light" ref={receiveUserRef} - defaultValue={stuffSearch.code === 'E' ? stuffSearch?.schReceiveUser : receiveUser} + defaultValue={stuffSearch?.schReceiveUser ? stuffSearch.schReceiveUser : receiveUser} onChange={(e) => { setReceiveUser(receiveUserRef.current.value) }} @@ -488,7 +489,6 @@ export default function StuffSearchCondition() {
    - {/* {sessionState?.storeId === 'T01' && ( */} {session?.storeId === 'T01' && ( )} - {/* {sessionState?.storeId !== 'T01' && sessionState?.storeLvl !== '1' && ( */} {session?.storeId !== 'T01' && session?.storeLvl !== '1' && ( + mm
    - + mm
    @@ -41,11 +60,11 @@ export default function SizeSetting(props) {
    - + mm
    - + mm
    @@ -60,7 +79,9 @@ export default function SizeSetting(props) {
    - +
    diff --git a/src/components/floor-plan/modal/object/type/TriangleDormer.jsx b/src/components/floor-plan/modal/object/type/TriangleDormer.jsx index f2a8a1f0..34a87e44 100644 --- a/src/components/floor-plan/modal/object/type/TriangleDormer.jsx +++ b/src/components/floor-plan/modal/object/type/TriangleDormer.jsx @@ -38,7 +38,7 @@ const TriangleDormer = forwardRef((props, refs) => {
    - +
    mm
    diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index 0e187b1e..356c100e 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -547,7 +547,7 @@ export function useCommonUtils() { initEvent() obj.setCoords() updateGroupObjectCoords(obj, originLeft, originTop) - // canvas?.renderAll() + canvas?.renderAll() }) } } @@ -585,6 +585,10 @@ export function useCommonUtils() { editable: false, id: uuidv4(), //복사된 객체라 새로 따준다 }) + + //객체가 그룹일 경우에는 그룹 아이디를 따로 넣어준다 + if (clonedObj.type === 'group') clonedObj.set({ groupId: uuidv4() }) + initEvent() }) } @@ -748,7 +752,6 @@ export function useCommonUtils() { } else { // 다른 객체의 경우 left, top 절대 좌표 설정 obj.set({ - ...obj, left: obj.left, top: obj.top, }) diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index c9b4cd3b..c55841c6 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -43,8 +43,12 @@ export function useObjectBatch({ isHidden, setIsHidden }) { // 클릭한 위치에 있는 객체 찾기 const clickedObject = objects.find((obj) => { + console.log(obj) + if (obj.type === 'QPolygon') { - return obj.inPolygon({ x: pointer.x, y: pointer.y }) + const polygon = pointsToTurfPolygon(obj.getCurrentPoints()) + const turfPointer = turf.point([pointer.x, pointer.y]) + return turf.booleanPointInPolygon(turfPointer, polygon) } else { return obj.containsPoint(pointer) } @@ -403,7 +407,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { }) //오프셋이 있을땐 같이 도머로 만든다 const leftTriangle = new QPolygon(splitedTriangle[0], { - fill: 'transparent', + fill: 'white', stroke: 'black', strokeWidth: 1, selectable: true, @@ -422,7 +426,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { }) const rightTriangle = new QPolygon(splitedTriangle[1], { - fill: 'transparent', + fill: 'white', stroke: 'black', strokeWidth: 1, selectable: true, @@ -450,7 +454,33 @@ export function useObjectBatch({ isHidden, setIsHidden }) { drawDirectionArrow(leftTriangle) drawDirectionArrow(rightTriangle) - const objectGroup = new fabric.Group([leftTriangle, rightTriangle], { + let offsetPolygon + + if (offsetRef > 0) { + canvas?.remove(dormer) + + offsetPolygon = new QPolygon(triangleToPolygon(dormer), { + selectable: true, + lockMovementX: true, // X 축 이동 잠금 + lockMovementY: true, // Y 축 이동 잠금 + lockRotation: true, // 회전 잠금 + viewLengthText: true, + name: 'triangleDormerOffset', + id: id, + fill: 'rgba(255, 255, 255, 0.6)', + stroke: 'black', + strokeWidth: 1, + originX: 'center', + originY: 'center', + fontSize: lengthTextFont.fontSize.value, + fontStyle: lengthTextFont.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', + fontWeight: lengthTextFont.fontWeight.value, + }) + } + + const groupPolygon = offsetPolygon ? [leftTriangle, rightTriangle, offsetPolygon] : [leftTriangle, rightTriangle] + + const objectGroup = new fabric.Group(groupPolygon, { subTargetCheck: true, name: dormerName, id: id, @@ -796,10 +826,102 @@ export function useObjectBatch({ isHidden, setIsHidden }) { return [leftPoints, rightPoints] } + const reSizeObject = (side, target, width, height) => { + console.log('reSizeTarget', target) + + target.getObjects().forEach((obj) => { + console.log('obj', obj.type) + }) + + const objectWidth = target.width + const objectHeight = target.height + const changeWidth = (width / 10 / objectWidth).toFixed(2) + const changeHeight = (height / 10 / objectHeight).toFixed(2) + let sideX = 'left' + let sideY = 'top' + + //그룹 중심점 변경 + if (side === 2) { + sideX = 'right' + sideY = 'top' + } else if (side === 3) { + sideX = 'left' + sideY = 'bottom' + } else if (side === 4) { + sideX = 'right' + sideY = 'bottom' + } + + //변경 전 좌표 + const newCoords = target.getPointByOrigin(sideX, sideY) + + target.set({ + ...target, + originX: sideX, + originY: sideY, + left: newCoords.x, + top: newCoords.y, + }) + + target.setCoords() + canvas?.renderAll() //변경 좌표를 한번 적용 + + target.scaleX = changeWidth === 0 ? 1 : changeWidth + target.scaleY = changeHeight === 0 ? 1 : changeHeight + + //크기 변경후 좌표를 재 적용 + const changedCoords = target.getPointByOrigin('center', 'center') + + target.set({ + ...target, + originX: 'center', + originY: 'center', + left: changedCoords.x, + top: changedCoords.y, + }) + + if (target.name === 'roof') { + //얘는 일단 도머에 적용함 + target._objects.forEach((obj) => { + setSurfaceShapePattern(obj) + }) + } + // target.setCoords() + canvas.renderAll() + + // reGroupObject(target) + } + + const reGroupObject = (groupObj) => { + groupObj._restoreObjectsState() //이건 실행만 되도 그룹이 변경됨 + const reGroupObjects = [] + + groupObj._objects.forEach((obj) => { + const newObj = new QPolygon(obj.getCurrentPoints(), { + ...obj, + points: obj.getCurrentPoints(), + scaleX: 1, + scaleY: 1, + }) + reGroupObjects.push(newObj) + canvas.remove(obj) + }) + + const reGroup = new fabric.Group(reGroupObjects, { + subTargetCheck: true, + name: groupObj.name, + id: groupObj.id, + groupYn: true, + }) + canvas?.add(reGroup) + canvas?.remove(groupObj) + } + return { applyOpeningAndShadow, applyDormers, splitDormerTriangle, splitDormerPentagon, + reSizeObject, } } diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index 3fd1bb0e..f8dc92b5 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -273,16 +273,19 @@ export function useContextMenu() { id: 'dormerRemove', shortcut: ['d', 'D'], name: `${getMessage('contextmenu.remove')}(D)`, + fn: () => deleteObject(), }, { id: 'dormerMove', shortcut: ['m', 'M'], name: `${getMessage('contextmenu.move')}(M)`, + fn: () => moveObject(), }, { id: 'dormerCopy', shortcut: ['c', 'C'], name: `${getMessage('contextmenu.copy')}(C)`, + fn: () => copyObject(), }, { id: 'roofMaterialEdit', @@ -451,7 +454,7 @@ export function useContextMenu() { ], ]) break - case 'dimensionLine': + case 'dimensionGroup': setContextMenu([ [ { diff --git a/src/hooks/usePlan.js b/src/hooks/usePlan.js index 897c8a54..bddebc63 100644 --- a/src/hooks/usePlan.js +++ b/src/hooks/usePlan.js @@ -55,40 +55,40 @@ export function usePlan() { /** * 현재 캔버스에 그려진 데이터를 추출 */ - const currentCanvasData = () => { + const currentCanvasData = (mode = '') => { removeMouseLines() - const groups = canvas.getObjects().filter((obj) => obj.type === 'group') + if (mode === 'save') { + const groups = canvas.getObjects().filter((obj) => obj.type === 'group') - console.log('groups', groups) - - if (groups.length > 0) { - groups.forEach((group) => { - canvas?.remove(group) - canvas?.renderAll() - const restore = group._restoreObjectsState() //그룹 좌표 복구 - - //그룹시 좌표가 틀어지는 이슈 - restore._objects.forEach((obj) => { - obj.set({ - ...obj, - groupYn: true, - groupName: group.name, - groupId: group.id, - }) - - //디렉션이 있는 경우에만 - if (group.lineDirection) { - obj.set({ - lineDirection: group.lineDirection, - }) - } - - canvas?.add(obj) - obj.setCoords() + if (groups.length > 0) { + groups.forEach((group) => { + canvas?.remove(group) canvas?.renderAll() + const restore = group._restoreObjectsState() //그룹 좌표 복구 + + //그룹시 좌표가 틀어지는 이슈 + restore._objects.forEach((obj) => { + obj.set({ + ...obj, + groupYn: true, + groupName: group.name, + groupId: group.id, + }) + + //디렉션이 있는 경우에만 + if (group.lineDirection) { + obj.set({ + lineDirection: group.lineDirection, + }) + } + + canvas?.add(obj) + obj.setCoords() + canvas?.renderAll() + }) }) - }) + } } return addCanvas() @@ -172,7 +172,7 @@ export function usePlan() { * 페이지 내 캔버스를 저장 */ const saveCanvas = async (userId) => { - const canvasStatus = currentCanvasData() + const canvasStatus = currentCanvasData('save') initCanvasPlans.some((plan) => plan.id === currentCanvasPlan.id) ? await putCanvasStatus(canvasStatus) : await postCanvasStatus(userId, canvasStatus) From 223bf2dddf631c93ad9b43f1c9bd9172b728842d Mon Sep 17 00:00:00 2001 From: yjnoh Date: Fri, 1 Nov 2024 17:46:58 +0900 Subject: [PATCH 17/20] =?UTF-8?q?=EC=98=A4=EA=B0=81=ED=98=95=20=EB=8F=84?= =?UTF-8?q?=EB=A8=B8=20=ED=81=AC=EA=B8=B0=EB=B3=80=EA=B2=BD,=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../floor-plan/modal/object/SizeSetting.jsx | 4 +- .../modal/object/type/PentagonDormer.jsx | 4 +- src/hooks/common/useCommonUtils.js | 5 +- src/hooks/object/useObjectBatch.js | 72 +++++++++++++++++-- src/hooks/useContextMenu.js | 5 +- src/hooks/usePolygon.js | 6 ++ 6 files changed, 82 insertions(+), 14 deletions(-) diff --git a/src/components/floor-plan/modal/object/SizeSetting.jsx b/src/components/floor-plan/modal/object/SizeSetting.jsx index af239258..1b20b853 100644 --- a/src/components/floor-plan/modal/object/SizeSetting.jsx +++ b/src/components/floor-plan/modal/object/SizeSetting.jsx @@ -15,7 +15,7 @@ export default function SizeSetting(props) { const { id, pos = contextPopupPosition, target } = props const { getMessage } = useMessage() const { closePopup } = usePopup() - const { reSizeObject } = useObjectBatch() + const { reSizeObjectBatch } = useObjectBatch({}) const widthRef = useRef(null) const heightRef = useRef(null) @@ -30,7 +30,7 @@ export default function SizeSetting(props) { const width = widthRef.current.value const height = heightRef.current.value - reSizeObject(settingTarget, target, width, height) + reSizeObjectBatch(settingTarget, target, width, height) } return ( diff --git a/src/components/floor-plan/modal/object/type/PentagonDormer.jsx b/src/components/floor-plan/modal/object/type/PentagonDormer.jsx index 73f9c5d8..c67a08fc 100644 --- a/src/components/floor-plan/modal/object/type/PentagonDormer.jsx +++ b/src/components/floor-plan/modal/object/type/PentagonDormer.jsx @@ -38,7 +38,7 @@ const PentagonDormer = forwardRef((props, refs) => {
    - +
    mm
    @@ -60,7 +60,7 @@ const PentagonDormer = forwardRef((props, refs) => {
    - +
    mm
    diff --git a/src/hooks/common/useCommonUtils.js b/src/hooks/common/useCommonUtils.js index 356c100e..2902e0c3 100644 --- a/src/hooks/common/useCommonUtils.js +++ b/src/hooks/common/useCommonUtils.js @@ -20,7 +20,6 @@ export function useCommonUtils() { const dimensionLineTextFont = useRecoilValue(fontSelector('dimensionLineText')) const commonTextFont = useRecoilValue(fontSelector('commonText')) const [commonUtils, setCommonUtilsState] = useRecoilState(commonUtilsState) - const { addPopup } = usePopup() useEffect(() => { @@ -749,12 +748,14 @@ export function useCommonUtils() { left: originObjLeft, top: originObjTop, }) + obj.fire('modified') } else { // 다른 객체의 경우 left, top 절대 좌표 설정 obj.set({ left: obj.left, top: obj.top, }) + obj.fire('modified') } obj.setCoords() // 좌표 반영 }) @@ -777,12 +778,14 @@ export function useCommonUtils() { left: originObjLeft, top: originObjTop, }) + obj.fire('modified') } else { targetObj.set({ ...targetObj, left: targetObj.left, top: targetObj.top, }) + obj.fire('modified') } targetObj.setCoords() } diff --git a/src/hooks/object/useObjectBatch.js b/src/hooks/object/useObjectBatch.js index c55841c6..df9c64ba 100644 --- a/src/hooks/object/useObjectBatch.js +++ b/src/hooks/object/useObjectBatch.js @@ -43,8 +43,6 @@ export function useObjectBatch({ isHidden, setIsHidden }) { // 클릭한 위치에 있는 객체 찾기 const clickedObject = objects.find((obj) => { - console.log(obj) - if (obj.type === 'QPolygon') { const polygon = pointsToTurfPolygon(obj.getCurrentPoints()) const turfPointer = turf.point([pointer.x, pointer.y]) @@ -451,6 +449,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { setSurfaceShapePattern(leftTriangle) setSurfaceShapePattern(rightTriangle) //방향 + drawDirectionArrow(leftTriangle) drawDirectionArrow(rightTriangle) @@ -654,8 +653,8 @@ export function useObjectBatch({ isHidden, setIsHidden }) { pitch: pitch, }) - canvas?.add(leftPentagon) - canvas?.add(rightPentagon) + // canvas?.add(leftPentagon) + // canvas?.add(rightPentagon) //패턴 setSurfaceShapePattern(leftPentagon) @@ -664,6 +663,39 @@ export function useObjectBatch({ isHidden, setIsHidden }) { drawDirectionArrow(leftPentagon) drawDirectionArrow(rightPentagon) + let offsetPolygon + + if (offsetRef > 0) { + canvas?.remove(dormer) + + offsetPolygon = new QPolygon(dormer.points, { + selectable: true, + lockMovementX: true, // X 축 이동 잠금 + lockMovementY: true, // Y 축 이동 잠금 + lockRotation: true, // 회전 잠금 + viewLengthText: true, + name: 'pentagonDormerOffset', + id: id, + fill: 'rgba(255, 255, 255, 0.6)', + stroke: 'black', + strokeWidth: 1, + originX: 'center', + originY: 'center', + fontSize: lengthTextFont.fontSize.value, + fontStyle: lengthTextFont.fontWeight.value.toLowerCase().includes('italic') ? 'italic' : 'normal', + fontWeight: lengthTextFont.fontWeight.value, + }) + } + + const groupPolygon = offsetPolygon ? [leftPentagon, rightPentagon, offsetPolygon] : [leftPentagon, rightPentagon] + + const objectGroup = new fabric.Group(groupPolygon, { + subTargetCheck: true, + name: dormerName, + id: id, + }) + canvas?.add(objectGroup) + isDown = false initEvent() @@ -826,7 +858,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { return [leftPoints, rightPoints] } - const reSizeObject = (side, target, width, height) => { + const reSizeObjectBatch = (side, target, width, height) => { console.log('reSizeTarget', target) target.getObjects().forEach((obj) => { @@ -889,7 +921,7 @@ export function useObjectBatch({ isHidden, setIsHidden }) { // target.setCoords() canvas.renderAll() - // reGroupObject(target) + reGroupObject(target) } const reGroupObject = (groupObj) => { @@ -905,6 +937,10 @@ export function useObjectBatch({ isHidden, setIsHidden }) { }) reGroupObjects.push(newObj) canvas.remove(obj) + + if (obj.direction) { + drawDirectionArrow(obj) + } }) const reGroup = new fabric.Group(reGroupObjects, { @@ -917,11 +953,33 @@ export function useObjectBatch({ isHidden, setIsHidden }) { canvas?.remove(groupObj) } + const moveObjectBatch = () => { + const obj = canvas.getActiveObject() + + if (obj) { + obj.set({ + lockMovementX: false, + lockMovementY: false, + }) + + addCanvasMouseEventListener('mouse:up', (e) => { + obj.set({ + lockMovementX: true, + lockMovementY: true, + }) + initEvent() + obj.setCoords() + reGroupObject(obj) + }) + } + } + return { applyOpeningAndShadow, applyDormers, splitDormerTriangle, splitDormerPentagon, - reSizeObject, + reSizeObjectBatch, + moveObjectBatch, } } diff --git a/src/hooks/useContextMenu.js b/src/hooks/useContextMenu.js index f8dc92b5..79eacd4c 100644 --- a/src/hooks/useContextMenu.js +++ b/src/hooks/useContextMenu.js @@ -21,7 +21,6 @@ import LinePropertySetting from '@/components/floor-plan/modal/lineProperty/Line import FlowDirectionSetting from '@/components/floor-plan/modal/flowDirection/FlowDirectionSetting' import { useCommonUtils } from './common/useCommonUtils' -import { useObjectBatch } from './object/useObjectBatch' import { useMessage } from '@/hooks/useMessage' import { useCanvasEvent } from '@/hooks/useCanvasEvent' import { contextMenuListState, contextMenuState } from '@/store/contextMenu' @@ -33,6 +32,7 @@ import ColumnInsert from '@/components/floor-plan/modal/module/column/ColumnInse import RowRemove from '@/components/floor-plan/modal/module/row/RowRemove' import RowInsert from '@/components/floor-plan/modal/module/row/RowInsert' import CircuitNumberEdit from '@/components/floor-plan/modal/module/CircuitNumberEdit' +import { useObjectBatch } from '@/hooks/object/useObjectBatch' export function useContextMenu() { const currentMenu = useRecoilValue(currentMenuState) // 현재 메뉴 @@ -49,6 +49,7 @@ export function useContextMenu() { const [cell, setCell] = useState(null) const [column, setColumn] = useState(null) const { handleZoomClear } = useCanvasEvent() + const { moveObjectBatch } = useObjectBatch({}) const currentMenuSetting = () => { switch (currentMenu) { @@ -279,7 +280,7 @@ export function useContextMenu() { id: 'dormerMove', shortcut: ['m', 'M'], name: `${getMessage('contextmenu.move')}(M)`, - fn: () => moveObject(), + fn: () => moveObjectBatch(), }, { id: 'dormerCopy', diff --git a/src/hooks/usePolygon.js b/src/hooks/usePolygon.js index c147e2fe..5a7d3062 100644 --- a/src/hooks/usePolygon.js +++ b/src/hooks/usePolygon.js @@ -113,6 +113,12 @@ export const usePolygon = () => { return } + //동일 아이디가 있으면 일단 지우고 다시 그린다 + const existArrow = polygon.canvas.getObjects().filter((obj) => obj.name === 'arrow' && obj.parentId === polygon.id) + if (existArrow.length > 0) { + polygon.canvas.remove(...existArrow) + } + polygon.canvas .getObjects() .filter((obj) => obj.name === 'flowText' && obj.parent === polygon.arrow) From 88ffb2c4ee40720f87521e5e96f64f5e434183c2 Mon Sep 17 00:00:00 2001 From: basssy Date: Fri, 1 Nov 2024 18:11:05 +0900 Subject: [PATCH 18/20] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=20=EC=88=98=EC=A0=95,=20=20canvasMenu=EC=97=90=20?= =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=9D=B8=EA=B2=BD=EC=9A=B0=20?= =?UTF-8?q?=EB=B2=84=ED=8A=BC=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/floor-plan/CanvasMenu.jsx | 2 +- src/components/management/StuffSubHeader.jsx | 11 ++++++++--- src/locales/ja.json | 13 +++++++------ src/locales/ko.json | 13 +++++++------ 4 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 63f1840d..6ac20787 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -220,7 +220,7 @@ export default function CanvasMenu(props) {