From 408d7fb04be1a64e30dd1539c3968a61238c2fa0 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 09:35:08 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 72 ++++++++++++++++--- .../estimate/useEstimateController.js | 12 ++-- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index c4faccba..77b9cd43 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -18,6 +18,7 @@ import Select, { components } from 'react-select' import { convertNumberToPriceDecimal } from '@/util/common-utils' import ProductFeaturesPop from './popup/ProductFeaturesPop' export default function Estimate({ params }) { + const [itemChangeYn, setItemChangeYn] = useState(false) const { session } = useContext(SessionContext) const [objectNo, setObjectNo] = useState('') //물건번호 const [planNo, setPlanNo] = useState('') //플랜번호 @@ -268,17 +269,45 @@ export default function Estimate({ params }) { // 아이템 자동완성 검색시 const onChangeDisplayItem = (itemId, dispOrder) => { - console.log('아이템 자동완성:::::::', dispOrder) const param = { itemId: itemId, } const apiUrl = `/api/display-item/item-detail?${queryStringFormatter(param)}` + let updateList = [] + let updates = {} get({ url: apiUrl }).then((res) => { - console.log('제품상세 결과::::::::', res) + console.log('아이템상세정보:::::::', res) + updates.objectNo = objectNo + updates.planNo = planNo + updates.itemId = res.itemId + updates.itemNo = '' //예정 + updates.itemName = res.itemName + updates.itemChangeFlg = '1' //무조건1 + updates.fileUploadFlg = res.fileUploadFlg + updates.unit = res.unit + updates.unitPrice = res.salePrice //unitPrice도 salePrice로 + updates.moduleFlg = res.moduleFlg + updates.pkgMaterialFlg = res.pkgMaterialFlg + updates.pnowW = res.pnowW + updates.salePrice = res.salePrice + updates.specification = res.specification + updates.unit = res.unit + updates.specialNoteCd = res.spnAttrCds + updates.itemGroup = res.itemGroup + + updateList = state.itemList.map((item) => { + if (item.dispOrder === dispOrder) { + return { ...item, ...updates } + } else { + return item + } + }) + setState({ + itemList: updateList, + }) + + setItemChangeYn(true) }) - // setState({ - // itemList: [{ itemNo: '123123123123' }], - // }) } //제품 삭제 @@ -302,8 +331,19 @@ export default function Estimate({ params }) { }) setSelection(new Set()) + setItemChangeYn(true) } + useEffect(() => { + if (itemChangeYn) { + // console.log('아이템에 뭔가 변화가 일어났어', itemChangeYn) + // console.log('아이템상태가져오기::::::::::', state.itemList) + } + + //다시 false로 돌리기 여기서할지 가격정보 변경하는거 끝나고할지.. + setItemChangeYn(false) + }, [itemChangeYn]) + return (
@@ -844,8 +884,6 @@ export default function Estimate({ params }) { isClearable={true} isDisabled={false} value={displayItemList.filter(function (option) { - // console.log('옵션값???', option.itemId) - // console.log('골랐을때 여기오지???', item.itemId) return option.itemId === item.itemId })} /> @@ -877,14 +915,30 @@ export default function Estimate({ params }) {
- + { + //onChangeDisplayItem참고 + console.log('수량변경::::::::', e.target.value) + }} + />
{item.unit}
- + { + //onChangeDisplayItem참고 + console.log('단가변경:::::::', e.target.value) + }} + />
{/*
OPEN아이콘 처리 diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 06f3d4b4..8d2d8dc9 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -29,8 +29,8 @@ const defaultEstimateData = { } // Helper functions -const updateItemInList = (itemList, itemId, updates) => { - return itemList.map((item) => (item.itemId === itemId ? { ...item, ...updates } : item)) +const updateItemInList = (itemList, dispOrder, updates) => { + return itemList.map((item) => (item.dispOrder === dispOrder ? { ...item, ...updates } : item)) } export const useEstimateController = (planNo) => { @@ -69,9 +69,9 @@ export const useEstimateController = (planNo) => { } } - const updateItem = (itemId, updates) => { + const updateItem = (dispOrder, updates) => { setState({ - itemList: updateItemInList(state.itemList, itemId, updates), + itemList: updateItemInList(state.itemList, dispOrder, updates), }) } @@ -85,8 +85,8 @@ export const useEstimateController = (planNo) => { planNo: planNo, dispOrder: newItemDispOrder.toString(), itemId: '', //제품번호 - itemNo: '', //형명 - itemName: '', + itemNo: '', + itemName: '', //형명 amount: '', //수량 unitPrice: '0', unit: '', //단위 From cda5b1c1dd67a5ed12beb7cbd18a9dbb17b62bcc Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 11:23:33 +0900 Subject: [PATCH 2/9] =?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 | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index b7b0d8d7..3dc9a2f4 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -218,10 +218,6 @@ export default function Stuff() { stuffSearchParams.endRow = 1 * pageSize stuffSearchParams.schSortType = defaultSortType setPageNo(1) - setStuffSearch({ - ...stuffSearch, - code: 'FINISH', - }) async function fetchData() { const apiUrl = `/api/object/list?saleStoreId=${session?.storeId}&${queryStringFormatter(stuffSearchParams)}` @@ -239,6 +235,25 @@ export default function Stuff() { fetchData() } else if (stuffSearchParams?.code === 'C') { resetStuffRecoil() + } else if (stuffSearchParams?.code === 'FINISH') { + stuffSearchParams.startRow = 1 + stuffSearchParams.endRow = 1 * pageSize + stuffSearchParams.schSortType = defaultSortType + setPageNo(1) + async function fetchData() { + 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 }) + setTotalCount(res[0].totCnt) + } else { + setGridProps({ ...gridProps, gridData: [], count: 0 }) + setTotalCount(0) + } + }) + } + + fetchData() } }, [stuffSearchParams]) From c3f03d86c2e664622805067f9362faa80a852302 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 11:27:40 +0900 Subject: [PATCH 3/9] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 32 ++++++----- src/components/management/StuffHeader.jsx | 2 +- .../estimate/useEstimateController.js | 55 +++++++++++++++---- src/locales/ja.json | 2 +- src/locales/ko.json | 2 +- 5 files changed, 64 insertions(+), 29 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 77b9cd43..4861e75c 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -55,7 +55,7 @@ export default function Estimate({ params }) { const objectRecoil = useRecoilValue(floorPlanObjectState) //견적서 상세데이터 - const { state, setState, addItem } = useEstimateController(params.pid) + const { state, setState, addItem, handleEstimateFileDownload } = useEstimateController(params.pid) //견적특이사항 List const [specialNoteList, setSpecialNoteList] = useState([]) @@ -170,7 +170,6 @@ export default function Estimate({ params }) { objectNo: objectNo, no: no, } - await promisePost({ url: 'api/file/fileDelete', data: delParams }).then((res) => { if (res.status === 204) { setOriginFiles(originFiles.filter((file) => file.objectNo === objectNo && file.no !== no)) @@ -181,13 +180,6 @@ export default function Estimate({ params }) { }) } - //아이템 목록 - // useEffect(() => { - // if (isNotEmptyArray(state.itemList)) { - // setItemList(state.itemList) - // } - // }, [state?.itemList]) - //가격표시 option 최초세팅 useEffect(() => { if (state.estimateType !== '') { @@ -267,7 +259,7 @@ export default function Estimate({ params }) { setSelection(newSelection) } - // 아이템 자동완성 검색시 + // 아이템 자동완성 검색시 아이템 변경 const onChangeDisplayItem = (itemId, dispOrder) => { const param = { itemId: itemId, @@ -282,7 +274,8 @@ export default function Estimate({ params }) { updates.itemId = res.itemId updates.itemNo = '' //예정 updates.itemName = res.itemName - updates.itemChangeFlg = '1' //무조건1 + updates.itemChangeFlg = '1' //무조건 1 + updates.partAdd = '1' //무조건1 NEW updates.fileUploadFlg = res.fileUploadFlg updates.unit = res.unit updates.unitPrice = res.salePrice //unitPrice도 salePrice로 @@ -294,6 +287,7 @@ export default function Estimate({ params }) { updates.unit = res.unit updates.specialNoteCd = res.spnAttrCds updates.itemGroup = res.itemGroup + updates.delFlg = '0' // 삭제플래그 0 updateList = state.itemList.map((item) => { if (item.dispOrder === dispOrder) { @@ -619,9 +613,16 @@ export default function Estimate({ params }) { originFiles.map((originFile) => { return (
  • - + handleEstimateFileDownload(originFile)}> {originFile.faileName} - +
  • ) @@ -888,7 +889,8 @@ export default function Estimate({ params }) { })} />
    - {item?.itemChangeFlg === '1' && ( + {/* {item?.itemChangeFlg === '1' && ( */} + {item?.partAdd === '1' && (
    @@ -921,6 +923,7 @@ export default function Estimate({ params }) { defaultValue={convertNumberToPriceDecimal(item?.amount)} onChange={(e) => { //onChangeDisplayItem참고 + //itemChangeFlg = 1, partAdd = 0 셋팅 console.log('수량변경::::::::', e.target.value) }} /> @@ -936,6 +939,7 @@ export default function Estimate({ params }) { value={convertNumberToPriceDecimal(item?.salePrice)} onChange={(e) => { //onChangeDisplayItem참고 + //itemChangeFlg, partAdd 받아온 그대로 console.log('단가변경:::::::', e.target.value) }} /> diff --git a/src/components/management/StuffHeader.jsx b/src/components/management/StuffHeader.jsx index d7e3246d..581163b6 100644 --- a/src/components/management/StuffHeader.jsx +++ b/src/components/management/StuffHeader.jsx @@ -22,7 +22,7 @@ export default function StuffHeader() { if (res != null && res != '') { setHeaderData(res) } else { - alert(getMessage('stuff.detail.header.message1')) + alert(getMessage('stuff.detail.header.notExistObjectNo')) router.push('/management/stuff') } }) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 8d2d8dc9..68252e95 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -93,6 +93,8 @@ export const useEstimateController = (planNo) => { salePrice: '0', //단가 saleTotPrice: '0', //금액(부가세별도) itemChangeFlg: '1', //추가시 체인지플래그 1로 + partAdd: '1', //NEW 체인지 플래그 + delFlg: '0', //삭제 플래그 0 삭제하면 1 }, ], }) @@ -102,34 +104,62 @@ export const useEstimateController = (planNo) => { setEstimateData({ ...state, userId: session.userId, sapSalesStoreCd: session.custCd }) }, [state]) + // 첨부파일 다운로드 + const handleEstimateFileDownload = async (originFile) => { + const options = { responseType: 'blob' } + + console.log('첨부파일 다운로드 호출:::::::', originFile) + + await promisePost({ url: `/api/file/fileDownload`, data: originFile, option: options }) + .then((resultData) => { + if (resultData) { + const blob = new Blob([resultData.data], { type: resultData.headers['content-type'] || 'application/octet-stream' }) + const fileUrl = window.URL.createObjectURL(blob) + const link = document.createElement('a') + + link.href = fileUrl + link.download = file.srcFileNm + document.body.appendChild(link) + link.click() + link.remove() + window.URL.revokeObjectURL(fileUrl) + } + }) + .catch((error) => { + alert('File does not exist.') + }) + } + //견적서 저장 const handleEstimateSubmit = async () => { //0. 필수체크 let flag = true console.log('::담긴 estimateData:::', estimateData) - + // console.log('첨부파일:::::', estimateData.fileList) + //첨부파일을 첨부안했는데 //아이템 fileUploadFlg가1(첨부파일 필수)이 1개라도 있는데 후일 자료 제출(fileFlg) 체크안했으면(0) alert 저장안돼 - if (estimateData.itemList.length > 1) { - estimateData.itemList.map((row) => { - if (row.fileUploadFlg === '1') { - if (estimateData.fileFlg === '0') { - alert(getMessage('estimate.detail.save.requiredMsg')) - flag = false + if (estimateData.fileList.length < 1) { + if (estimateData.itemList.length > 1) { + estimateData.itemList.map((row) => { + if (row.fileUploadFlg === '1') { + if (estimateData.fileFlg === '0') { + alert(getMessage('estimate.detail.save.requiredMsg')) + flag = false + } } - } - }) + }) + } } + if (flag) { //1. 첨부파일 저장 const formData = new FormData() + console.log('첨부파일:!!!', estimateData.fileList) formData.append('file', estimateData.fileList) formData.append('objectNo', estimateData.objectNo) formData.append('planNo', estimateData.planNo) formData.append('category', '10') formData.append('userId', estimateData.userId) - // for (const value of formData.values()) { - // console.log('formData::', value) - // } await post({ url: '/api/file/fileUpload', data: formData }) @@ -162,5 +192,6 @@ export const useEstimateController = (planNo) => { addItem, handleEstimateSubmit, fetchSetting, + handleEstimateFileDownload, } } diff --git a/src/locales/ja.json b/src/locales/ja.json index 97d3f599..f849816e 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -616,7 +616,7 @@ "stuff.planReqPopup.title": "設計依頼のインポート", "stuff.temp.subTitle": "商品情報", "stuff.temp.subTitle2": "作図", - "stuff.detail.header.message1": "存在しないものです。", + "stuff.detail.header.notExistObjectNo": "存在しないものです。", "stuff.detail.header.message2": "商品番号がコピーされました。", "stuff.detail.header.message3": "存在しないものです。", "stuff.detail.header.objectNo": "商品番号のコピーに失敗しました。", diff --git a/src/locales/ko.json b/src/locales/ko.json index 2d42a11c..e22241bc 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -626,7 +626,7 @@ "stuff.planReqPopup.title": "설계의뢰 불러오기", "stuff.temp.subTitle": "물건정보", "stuff.temp.subTitle2": "도면작성", - "stuff.detail.header.message1": "존재하지 않는 물건입니다.", + "stuff.detail.header.notExistObjectNo": "존재하지 않는 물건입니다.", "stuff.detail.header.message2": "물건번호가 복사되었습니다.", "stuff.detail.header.message3": "물건번호 복사에 실패했습니다.", "stuff.detail.header.objectNo": "물건번호", From 045aa23af167d45e59ae5f09be1b889339bd7378 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 11:51:17 +0900 Subject: [PATCH 4/9] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=B2=A8?= =?UTF-8?q?=EB=B6=80=ED=8C=8C=EC=9D=BC=20=EB=8B=A4=EC=9A=B4=EB=A1=9C?= =?UTF-8?q?=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/floorPlan/estimate/useEstimateController.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/hooks/floorPlan/estimate/useEstimateController.js b/src/hooks/floorPlan/estimate/useEstimateController.js index 68252e95..4330a208 100644 --- a/src/hooks/floorPlan/estimate/useEstimateController.js +++ b/src/hooks/floorPlan/estimate/useEstimateController.js @@ -108,8 +108,6 @@ export const useEstimateController = (planNo) => { const handleEstimateFileDownload = async (originFile) => { const options = { responseType: 'blob' } - console.log('첨부파일 다운로드 호출:::::::', originFile) - await promisePost({ url: `/api/file/fileDownload`, data: originFile, option: options }) .then((resultData) => { if (resultData) { @@ -118,7 +116,7 @@ export const useEstimateController = (planNo) => { const link = document.createElement('a') link.href = fileUrl - link.download = file.srcFileNm + link.download = originFile.faileName document.body.appendChild(link) link.click() link.remove() @@ -126,6 +124,7 @@ export const useEstimateController = (planNo) => { } }) .catch((error) => { + console.log('::FileDownLoad Error::', error) alert('File does not exist.') }) } From 38cb4005b2c727940f26ec2e4cebd341b36bb725 Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 12:08:21 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=EA=B2=AC=EC=A0=81=EC=84=9C=20=EC=83=81?= =?UTF-8?q?=EC=84=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/Estimate.jsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/components/estimate/Estimate.jsx b/src/components/estimate/Estimate.jsx index 4861e75c..1030962c 100644 --- a/src/components/estimate/Estimate.jsx +++ b/src/components/estimate/Estimate.jsx @@ -272,7 +272,7 @@ export default function Estimate({ params }) { updates.objectNo = objectNo updates.planNo = planNo updates.itemId = res.itemId - updates.itemNo = '' //예정 + updates.itemNo = res.itemNo updates.itemName = res.itemName updates.itemChangeFlg = '1' //무조건 1 updates.partAdd = '1' //무조건1 NEW @@ -316,6 +316,7 @@ export default function Estimate({ params }) { }) }) + // 필터안하고 플래그로 관리하는거로 변경하기 const result = state.itemList.filter((item) => { return !tempList.some((other) => other.dispOrder === item.dispOrder) }) @@ -879,7 +880,11 @@ export default function Estimate({ params }) { classNamePrefix="custom" placeholder="Select" options={displayItemList} - onChange={(e) => onChangeDisplayItem(e.itemId, item.dispOrder)} + onChange={(e) => { + if (isObjectNotEmpty(e)) { + onChangeDisplayItem(e.itemId, item.dispOrder) + } + }} getOptionLabel={(x) => x.itemName} getOptionValue={(x) => x.itemId} isClearable={true} @@ -889,8 +894,8 @@ export default function Estimate({ params }) { })} />
    - {/* {item?.itemChangeFlg === '1' && ( */} - {item?.partAdd === '1' && ( + {/* {item?.partAdd === '1' && ( */} + {item?.itemChangeFlg === '1' && (
    From 0d122ecdbd4c323d1c2ed4a16ce29cdb5ea276cd Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 12:29:27 +0900 Subject: [PATCH 6/9] =?UTF-8?q?=EB=A9=94=EC=9D=B8=20api=202=EB=B2=88=20?= =?UTF-8?q?=ED=98=B8=EC=B6=9C=ED=98=84=EC=83=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/main/MainContents.jsx | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/components/main/MainContents.jsx b/src/components/main/MainContents.jsx index 77df845a..d2b3cc90 100644 --- a/src/components/main/MainContents.jsx +++ b/src/components/main/MainContents.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import { useEffect, useState, useContext } from 'react' import ProductItem from './ProductItem' import { useMessage } from '@/hooks/useMessage' import Image from 'next/image' @@ -8,17 +8,16 @@ import { useRecoilValue } from 'recoil' import { useRouter } from 'next/navigation' import { globalLocaleStore } from '@/store/localeAtom' import { queryStringFormatter } from '@/util/common-utils' -import { sessionStore } from '@/store/commonAtom' import MainSkeleton from '../ui/MainSkeleton' +import { SessionContext } from '@/app/SessionProvider' export default function MainContents() { + const { session } = useContext(SessionContext) const { getMessage } = useMessage() const router = useRouter() const globalLocaleState = useRecoilValue(globalLocaleStore) const { promiseGet } = useAxios(globalLocaleState) - const sessionState = useRecoilValue(sessionStore) - //최근 물건 const [objectList, setObjectList] = useState([]) @@ -36,12 +35,12 @@ export default function MainContents() { fetchObjectList() fetchNoticeList() fetchFaqList() - }, [sessionState]) + }, []) //최근 갱신 물건목록 / Sales Contact info 정보 const fetchObjectList = async () => { try { - const apiUrl = `/api/main-page/object/${sessionState?.storeId}/list` + const apiUrl = `/api/main-page/object/${session?.storeId}/list` await promiseGet({ url: apiUrl, }).then((res) => { From b88cecf6079b2dc806eeae29e18e1514021711f0 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 14 Nov 2024 13:35:40 +0900 Subject: [PATCH 7/9] feat: Add ManagementProvider --- src/app/management/ManagementProvider.js | 19 +++++++++++++++++++ src/app/management/layout.js | 7 +++++++ 2 files changed, 26 insertions(+) create mode 100644 src/app/management/ManagementProvider.js create mode 100644 src/app/management/layout.js diff --git a/src/app/management/ManagementProvider.js b/src/app/management/ManagementProvider.js new file mode 100644 index 00000000..9252d5f1 --- /dev/null +++ b/src/app/management/ManagementProvider.js @@ -0,0 +1,19 @@ +'ues client' + +import { createContext, useEffect, useState } from 'react' + +export const ManagementContext = createContext({ + managementState: {}, +}) + +const ManagementProvider = ({ children }) => { + const [managementState, setManagementState] = useState({}) + + useEffect(() => { + console.log('🚀 ~ managementState:', managementState) + }, [managementState]) + + return {children} +} + +export default ManagementProvider diff --git a/src/app/management/layout.js b/src/app/management/layout.js new file mode 100644 index 00000000..b0e031c7 --- /dev/null +++ b/src/app/management/layout.js @@ -0,0 +1,7 @@ +'use client' + +import ManagementProvider from './ManagementProvider' + +export default function ManagementLayout({ children }) { + return {children} +} From 7c048db6e40811c2799f610a30d4a5810fbddb43 Mon Sep 17 00:00:00 2001 From: yoosangwook Date: Thu, 14 Nov 2024 13:39:54 +0900 Subject: [PATCH 8/9] =?UTF-8?q?fix:=20provider=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/management/ManagementProvider.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/management/ManagementProvider.js b/src/app/management/ManagementProvider.js index 9252d5f1..197b30c0 100644 --- a/src/app/management/ManagementProvider.js +++ b/src/app/management/ManagementProvider.js @@ -4,6 +4,7 @@ import { createContext, useEffect, useState } from 'react' export const ManagementContext = createContext({ managementState: {}, + setManagementState: () => {}, }) const ManagementProvider = ({ children }) => { From 75a3cf3f73784faab4df9aa6846941fcf390a18d Mon Sep 17 00:00:00 2001 From: basssy Date: Thu, 14 Nov 2024 14:18:21 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=EB=AC=BC=EA=B1=B4=EC=83=81=EC=84=B8=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=EA=B0=84=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EA=B3=B5=EC=9C=A0=20=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/management/StuffDetail.jsx | 118 +++++++++--------- src/components/management/StuffHeader.jsx | 43 ++----- .../management/StuffSearchCondition.jsx | 4 - src/locales/ja.json | 4 +- src/locales/ko.json | 4 +- 5 files changed, 77 insertions(+), 96 deletions(-) diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 93328de3..6378aeec 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -18,6 +18,7 @@ import WindSelectPop from './popup/WindSelectPop' import { useCommonCode } from '@/hooks/common/useCommonCode' import StuffPlanQGrid from './StuffPlanQGrid' import { floorPlanObjectState } from '@/store/floorPlanObjectAtom' +import { ManagementContext } from '@/app/management/ManagementProvider' export default function StuffDetail() { const setFloorPlanObjectNo = useSetRecoilState(floorPlanObjectState) //견적서 화면용 물건번호리코일 @@ -96,7 +97,7 @@ export default function StuffDetail() { const objectNo = searchParams.get('objectNo') //url에서 물건번호 꺼내서 바로 set const [editMode, setEditMode] = useState('NEW') - const [detailData, setDetailData] = useState({}) + const { managementState, setManagementState } = useContext(ManagementContext) const [planGridProps, setPlanGridProps] = useState({ planGridData: [], @@ -289,9 +290,9 @@ export default function StuffDetail() { promiseGet({ url: `/api/object/${objectNo}/detail` }).then((res) => { if (res.status === 200) { if (res.data != null) { - setDetailData(res.data) + setManagementState(res.data) } else { - setDetailData({}) + setManagementState({}) } if (isNotEmptyArray(res.data.planList)) { setPlanGridProps({ ...planGridProps, planGridData: res.data.planList }) @@ -299,7 +300,7 @@ export default function StuffDetail() { setPlanGridProps({ ...planGridProps, planGridData: [] }) } } else { - setDetailData({}) + setManagementState({}) setPlanGridProps({ ...planGridProps, planGridData: [] }) } }) @@ -415,7 +416,7 @@ export default function StuffDetail() { }, [commonCode]) useEffect(() => { - if (isObjectNotEmpty(detailData)) { + if (isObjectNotEmpty(managementState)) { // 도도부현API get({ url: '/api/object/prefecture/list' }).then((res) => { if (!isEmptyArray(res)) { @@ -449,18 +450,17 @@ export default function StuffDetail() { setFavoriteStoreList(favList) setShowSaleStoreList(favList) - if (detailData.firstAgentId != null) { - form.setValue('saleStoreId', detailData.firstAgentId) - setSelOptions(detailData.firstAgentId) + if (managementState.firstAgentId != null) { + form.setValue('saleStoreId', managementState.firstAgentId) + setSelOptions(managementState.firstAgentId) } else { - form.setValue('saleStoreId', detailData.saleStoreId) - setSelOptions(detailData.saleStoreId) + form.setValue('saleStoreId', managementState.saleStoreId) + setSelOptions(managementState.saleStoreId) } //상세데이터의 1차점 아이디로 2차점 목록 조회하기 - let data = detailData?.firstAgentId ? detailData.firstAgentId : detailData.saleStoreId - // url = `/api/object/saleStore/${session?.storeId}/list?firstFlg=0&userId=${session?.userId}` + let data = managementState?.firstAgentId ? managementState.firstAgentId : managementState.saleStoreId url = `/api/object/saleStore/${data}/list?firstFlg=0&userId=${session?.userId}` get({ url: url }).then((res) => { @@ -502,74 +502,74 @@ export default function StuffDetail() { //상세데이터가 1차점이면 1차점에 세팅 //상세데이터가 2차점이면 2차점에 세팅하고 세션으로 1차점 세팅 - if (detailData.saleStoreLevel === '1') { - setSelOptions(detailData.saleStoreId) - form.setValue('saleStoreId', detailData.saleStoreId) - form.setValue('saleStoreLevel', detailData.saleStoreLevel) + if (managementState.saleStoreLevel === '1') { + setSelOptions(managementState.saleStoreId) + form.setValue('saleStoreId', managementState.saleStoreId) + form.setValue('saleStoreLevel', managementState.saleStoreLevel) } else { - setOtherSelOptions(detailData.saleStoreId) - form.setValue('otherSaleStoreId', detailData.saleStoreId) - form.setValue('otherSaleStoreLevel', detailData.saleStoreLevel) + setOtherSelOptions(managementState.saleStoreId) + form.setValue('otherSaleStoreId', managementState.saleStoreId) + form.setValue('otherSaleStoreLevel', managementState.saleStoreLevel) form.setValue('saleStoreLevel', '1') } //설계의뢰No. - form.setValue('planReqNo', detailData.planReqNo) + form.setValue('planReqNo', managementState.planReqNo) //담당자 - form.setValue('receiveUser', detailData.receiveUser) + form.setValue('receiveUser', managementState.receiveUser) //물건구분objectStatusId - setSelectObjectStatusId(detailData.objectStatusId) - form.setValue('objectStatusId', detailData.objectStatusId) + setSelectObjectStatusId(managementState.objectStatusId) + form.setValue('objectStatusId', managementState.objectStatusId) //물건명 - form.setValue('objectName', detailData.objectName) + form.setValue('objectName', managementState.objectName) //경칭코드 - setSelHonorificCode(detailData.objectNameOmit) - form.setValue('objectNameOmit', detailData.objectNameOmit) + setSelHonorificCode(managementState.objectNameOmit) + form.setValue('objectNameOmit', managementState.objectNameOmit) //물건명 후리가나 - form.setValue('objectNameKana', detailData.objectNameKana) + form.setValue('objectNameKana', managementState.objectNameKana) //우편번호 - form.setValue('zipNo', detailData.zipNo) + form.setValue('zipNo', managementState.zipNo) //도도부현 / 주소 - setPrefValue(detailData.prefId) - form.setValue('prefId', detailData.prefId) - form.setValue('prefName', detailData.prefName) - form.setValue('address', detailData.address) + setPrefValue(managementState.prefId) + form.setValue('prefId', managementState.prefId) + form.setValue('prefName', managementState.prefName) + form.setValue('address', managementState.address) //발전시뮬 - form.setValue('areaId', detailData.areaId) + form.setValue('areaId', managementState.areaId) //기준풍속 - form.setValue('standardWindSpeedId', detailData.standardWindSpeedId) + form.setValue('standardWindSpeedId', managementState.standardWindSpeedId) //수직적설량 - form.setValue('verticalSnowCover', detailData.verticalSnowCover) + form.setValue('verticalSnowCover', managementState.verticalSnowCover) //한랭지대책시행 coldRegionFlg 1이면 true - form.setValue('coldRegionFlg', detailData.coldRegionFlg === '1' ? true : false) + form.setValue('coldRegionFlg', managementState.coldRegionFlg === '1' ? true : false) //면조도구분 surfaceType null로 내려오면 셋팅 안하고 저장할때 필수값 체크하도록 // form.setValue('surfaceType', 'Ⅱ') // form.setValue('surfaceType', 'Ⅲ・Ⅳ') - form.setValue('surfaceType', detailData.surfaceType) + form.setValue('surfaceType', managementState.surfaceType) //염해지역용아이템사용 saltAreaFlg 1이면 true - form.setValue('saltAreaFlg', detailData.saltAreaFlg === '1' ? true : false) + form.setValue('saltAreaFlg', managementState.saltAreaFlg === '1' ? true : false) //설치높이 - form.setValue('installHeight', detailData.installHeight) + form.setValue('installHeight', managementState.installHeight) //계약조건 null로 내려오면 0으로 디폴트셋팅 - if (detailData.conType === null) { + if (managementState.conType === null) { form.setValue('conType', '0') } else { - form.setValue('conType', detailData.conType) + form.setValue('conType', managementState.conType) } //메모 - form.setValue('remarks', detailData.remarks) + form.setValue('remarks', managementState.remarks) }) } - }, [detailData, session]) + }, [managementState, session]) //경칭선택 변경 이벤트 const onChangeHonorificCode = (key) => { @@ -1189,9 +1189,9 @@ export default function StuffDetail() { return alert(getMessage('stuff.detail.save.valierror2')) } - let detail_sort = Object.keys(detailData) + let detail_sort = Object.keys(managementState) .sort() - .reduce((obj, key) => ((obj[key] = detailData[key]), obj), {}) + .reduce((obj, key) => ((obj[key] = managementState[key]), obj), {}) let params_sort = Object.keys(params) .sort() .reduce((obj, key) => ((obj[key] = params[key]), obj), {}) @@ -1313,7 +1313,7 @@ export default function StuffDetail() { // 물건삭제 const onDelete = () => { - const specificationConfirmDate = detailData.specificationConfirmDate + const specificationConfirmDate = managementState.specificationConfirmDate if (specificationConfirmDate != null) { alert(getMessage('stuff.detail.delete.message1')) } else { @@ -1860,8 +1860,7 @@ export default function StuffDetail() {
    - {/* {detailData?.tempFlg === '1' && form.watch('planReqNo') ? ( */} - {detailData?.tempFlg === '1' && form.watch('planReqNo') ? ( + {managementState?.tempFlg === '1' && form.watch('planReqNo') ? ( ) : null}
    - {detailData?.tempFlg === '1' ? ( + {managementState?.tempFlg === '1' ? ( <>
    - {/* {detailData?.tempFlg === '0' ? ( */} - {detailData?.tempFlg === '0' ? ( + {managementState?.tempFlg === '0' ? ( <> {/* 진짜R 플랜시작 */}
    @@ -2355,7 +2359,7 @@ export default function StuffDetail() {
    • {getMessage('stuff.detail.planList.cnt')} - {detailData.planList?.length} + {managementState.planList?.length}
    diff --git a/src/components/management/StuffHeader.jsx b/src/components/management/StuffHeader.jsx index 581163b6..f32c971c 100644 --- a/src/components/management/StuffHeader.jsx +++ b/src/components/management/StuffHeader.jsx @@ -1,40 +1,21 @@ 'use client' -import React, { useState, useEffect } from 'react' -import { useAxios } from '@/hooks/useAxios' -import { useRouter, useSearchParams } from 'next/navigation' -import { globalLocaleStore } from '@/store/localeAtom' -import { useRecoilValue } from 'recoil' +import { useContext } from 'react' import { useMessage } from '@/hooks/useMessage' import dayjs from 'dayjs' - +import { ManagementContext } from '@/app/management/ManagementProvider' export default function StuffHeader() { const { getMessage } = useMessage() - const router = useRouter() - const searchParams = useSearchParams() - const objectNo = searchParams.get('objectNo') //url에서 물건번호 꺼내서 바로 set - const globalLocaleState = useRecoilValue(globalLocaleStore) - const { get } = useAxios(globalLocaleState) - const [headerData, setHeaderData] = useState({}) - useEffect(() => { - get({ url: `/api/object/${objectNo}/detail` }).then((res) => { - if (res != null && res != '') { - setHeaderData(res) - } else { - alert(getMessage('stuff.detail.header.notExistObjectNo')) - router.push('/management/stuff') - } - }) - }, [objectNo]) + const { managementState } = useContext(ManagementContext) //물건번호 복사 const copyObjectNo = async (objectNo) => { await navigator.clipboard.writeText(objectNo) - alert(getMessage('stuff.detail.header.message2')) + alert(getMessage('stuff.detail.header.successCopy')) try { } catch (error) { - alert(getMessage('stuff.detail.header.message3')) + alert(getMessage('stuff.detail.header.failCopy')) } } @@ -43,31 +24,31 @@ export default function StuffHeader() {
    {getMessage('stuff.detail.header.objectNo')}
    - {headerData.objectNo}{' '} + {managementState?.objectNo}{' '}
    {getMessage('stuff.detail.header.specificationConfirmDate')}
    -
    {headerData.specificationConfirmDate}
    +
    {managementState?.specificationConfirmDate}
    {getMessage('stuff.detail.header.lastEditDatetime')}
    - {headerData?.lastEditDatetime ? `${dayjs(headerData.lastEditDatetime).format('YYYY.MM.DD HH:mm:ss')}` : ''}{' '} - {headerData?.lastEditUserName ? `(${headerData.lastEditUserName})` : null} + {managementState?.lastEditDatetime ? `${dayjs(managementState.lastEditDatetime).format('YYYY.MM.DD HH:mm:ss')}` : ''}{' '} + {managementState?.lastEditUserName ? `(${managementState.lastEditUserName})` : null}
    {getMessage('stuff.detail.header.createDatetime')}
    - {headerData?.createDatetime ? `${dayjs(headerData.lastEditDatetime).format('YYYY.MM.DD')}` : ''}{' '} - {headerData?.createUserName ? `(${headerData.createUserName})` : null} + {managementState?.createDatetime ? `${dayjs(managementState.lastEditDatetime).format('YYYY.MM.DD')}` : ''}{' '} + {managementState?.createUserName ? `(${managementState.createUserName})` : null}
    diff --git a/src/components/management/StuffSearchCondition.jsx b/src/components/management/StuffSearchCondition.jsx index f82d83f3..6a16695a 100644 --- a/src/components/management/StuffSearchCondition.jsx +++ b/src/components/management/StuffSearchCondition.jsx @@ -223,10 +223,6 @@ export default function StuffSearchCondition() { } }) } - // setStuffSearch({ - // ...stuffSearch, - // code: 'S', - // }) } else { if (session?.storeLvl === '1') { allList = res diff --git a/src/locales/ja.json b/src/locales/ja.json index f849816e..fad3e4df 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -617,8 +617,8 @@ "stuff.temp.subTitle": "商品情報", "stuff.temp.subTitle2": "作図", "stuff.detail.header.notExistObjectNo": "存在しないものです。", - "stuff.detail.header.message2": "商品番号がコピーされました。", - "stuff.detail.header.message3": "存在しないものです。", + "stuff.detail.header.successCopy": "商品番号がコピーされました。", + "stuff.detail.header.failCopy": "存在しないものです。", "stuff.detail.header.objectNo": "商品番号のコピーに失敗しました。", "stuff.detail.header.specificationConfirmDate": "仕様拡張日", "stuff.detail.header.lastEditDatetime": "更新日時", diff --git a/src/locales/ko.json b/src/locales/ko.json index e22241bc..1220279b 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -627,8 +627,8 @@ "stuff.temp.subTitle": "물건정보", "stuff.temp.subTitle2": "도면작성", "stuff.detail.header.notExistObjectNo": "존재하지 않는 물건입니다.", - "stuff.detail.header.message2": "물건번호가 복사되었습니다.", - "stuff.detail.header.message3": "물건번호 복사에 실패했습니다.", + "stuff.detail.header.successCopy": "물건번호가 복사되었습니다.", + "stuff.detail.header.failCopy": "물건번호 복사에 실패했습니다.", "stuff.detail.header.objectNo": "물건번호", "stuff.detail.header.specificationConfirmDate": "사양확장일", "stuff.detail.header.lastEditDatetime": "갱신일시",