diff --git a/.env.development b/.env.development index f8aa1483..468efc67 100644 --- a/.env.development +++ b/.env.development @@ -2,6 +2,7 @@ NEXT_PUBLIC_TEST="테스트변수입니다. development" NEXT_PUBLIC_API_SERVER_PATH="http://1.248.227.176:38080" # NEXT_PUBLIC_API_SERVER_PATH="http://localhost:8080" +# NEXT_PUBLIC_API_SERVER_PATH="http://172.30.1.60:8080" DATABASE_URL="sqlserver://mssql.devgrr.kr:1433;database=qcast;user=qcast;password=Qwertqaz12345;trustServerCertificate=true" diff --git a/Nextjs 14 컴포넌트에 대해서....pdf b/docs/Nextjs 14 컴포넌트에 대해서....pdf similarity index 100% rename from Nextjs 14 컴포넌트에 대해서....pdf rename to docs/Nextjs 14 컴포넌트에 대해서....pdf diff --git a/Qcast coding convention.pdf b/docs/Qcast coding convention.pdf similarity index 100% rename from Qcast coding convention.pdf rename to docs/Qcast coding convention.pdf diff --git a/Qcast development guilde.pdf b/docs/Qcast development guilde.pdf similarity index 100% rename from Qcast development guilde.pdf rename to docs/Qcast development guilde.pdf diff --git a/docs/메세지 처리 가이드.pdf b/docs/메세지 처리 가이드.pdf new file mode 100644 index 00000000..b6f316e1 Binary files /dev/null and b/docs/메세지 처리 가이드.pdf differ diff --git a/public/static/images/canvas/arr_btn_ico_white.svg b/public/static/images/canvas/arr_btn_ico_white.svg new file mode 100644 index 00000000..31e04787 --- /dev/null +++ b/public/static/images/canvas/arr_btn_ico_white.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/static/images/canvas/ico-flx01.svg b/public/static/images/canvas/ico-flx01.svg new file mode 100644 index 00000000..84185ff6 --- /dev/null +++ b/public/static/images/canvas/ico-flx01.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/static/images/canvas/ico-flx02.svg b/public/static/images/canvas/ico-flx02.svg new file mode 100644 index 00000000..400d9732 --- /dev/null +++ b/public/static/images/canvas/ico-flx02.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/static/images/canvas/ico-flx03.svg b/public/static/images/canvas/ico-flx03.svg new file mode 100644 index 00000000..44c2eeae --- /dev/null +++ b/public/static/images/canvas/ico-flx03.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/static/images/canvas/ico-flx04.svg b/public/static/images/canvas/ico-flx04.svg new file mode 100644 index 00000000..ae584b35 --- /dev/null +++ b/public/static/images/canvas/ico-flx04.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/static/images/main/main_background.png b/public/static/images/main/main_background.png new file mode 100644 index 00000000..95b83229 Binary files /dev/null and b/public/static/images/main/main_background.png differ diff --git a/src/app/[locale]/layout.js b/src/app/[locale]/layout.js index 334cfbb3..018f1ef5 100644 --- a/src/app/[locale]/layout.js +++ b/src/app/[locale]/layout.js @@ -1,13 +1,34 @@ 'use client' -import { useCurrentLocale } from '@/locales/client' +import { useEffect } from 'react' +import { useRecoilState, useRecoilValue } from 'recoil' +import { appMessageStore, globalLocaleStore } from '@/store/localeAtom' import { LocaleProvider } from './LocaleProvider' +import { useCurrentLocale } from '@/locales/client' import ServerError from './error' import { ErrorBoundary } from 'next/dist/client/components/error-boundary' import '@/styles/common.scss' +import KO from '@/locales/ko.json' +import JA from '@/locales/ja.json' + export default function LocaleLayout({ children }) { const locale = useCurrentLocale() + const globalLocale = useRecoilValue(globalLocaleStore) + const [appMessageState, setAppMessageState] = useRecoilState(appMessageStore) + + useEffect(() => { + console.log(globalLocale) + console.log(sessionStorage.getItem('hi')) + console.log(Object.keys(appMessageState).length) + // if (Object.keys(appMessageState).length === 0) { + if (globalLocale === 'ko') { + setAppMessageState(KO) + } else { + setAppMessageState(JA) + } + // } + }, [globalLocale]) return ( <> diff --git a/src/common/common.js b/src/common/common.js index d4c22570..aaba3f45 100644 --- a/src/common/common.js +++ b/src/common/common.js @@ -1,3 +1,24 @@ +export const STEP = { + INITIAL_CANVAS_SETTING: 'initialCanvasSetting', // 배치면 초기설정 + ROOF_COVERING: { + EXTERIOR_WALL_LINE: 'exteriorWallLine', // 외벽선 그리기 + ROOF_SHAPE_SETTINGS: 'roofShapeSettings', // 지붕형상 설정 + ROOF_SHAPE_EDITING: 'roofShapeEditing', // 지붕형상 편집 + HELP_LINE_DRAWING: 'helpLineDrawing', // 보조선 그리기 + }, // 지붕덮개 + BATCH_CANVAS: { + BATCH_DRAWING: 'batchDrawing', // 배치면 그리기 + SURFACE_SHAPE_BATCH: 'surfaceShapeBatch', // 면형상 배치 + OBJECT_BATCH: 'objectBatch', // 오브젝트 배치 + }, // 배치면 + MODULE_CIRCUIT_SETTING: { + BASIC_SETTING: 'basicSetting', // 기본설정 + CIRCUIT_TRESTLE_SETTING: 'circuitTrestleSetting', // 회로가대설정 + }, // 모듈회로구성 + ESTIMATE: 'estimate', // todo 견적서 + POWER_GENERATION_SIMULATION: 'powerGenerationSimulation', // todo 발전 시뮬레이션 +} + export const Mode = { DRAW_LINE: 'drawLine', // 기준선 긋기모드` EDIT: 'edit', diff --git a/src/components/InitSettingsModal.jsx b/src/components/InitSettingsModal.jsx index 5a6aad64..58f0163f 100644 --- a/src/components/InitSettingsModal.jsx +++ b/src/components/InitSettingsModal.jsx @@ -9,8 +9,7 @@ import { useAxios } from '@/hooks/useAxios' import { get, post } from '@/lib/Axios' export default function InitSettingsModal(props) { - const [objectNo, setObjectNo] = useState('test123240909002') // 후에 삭제 필요 - const [lastRoofSeq, setLastRoofSeq] = useState(0) // 마지막 roofSeq를 추적 + const [objectNo, setObjectNo] = useState('test123240909003') // 후에 삭제 필요 const [open, setOpen] = useRecoilState(modalState) const [canvasSetting, setCanvasSetting] = useRecoilState(canvasSettingState) const [roofMaterials, setRoofMaterials] = useState([]) @@ -18,7 +17,7 @@ export default function InitSettingsModal(props) { roofDrawingSet: '1', roofSizeSet: '1', roofAngleSet: 'slope', - roofs: [], + roofs: [{ roofSeq: '1', roofType: '3', roofWidth: '200', roofHeight: '200', roofGap: '0', roofLayout: 'parallel' }], }) const modelProps = { @@ -49,7 +48,8 @@ export default function InitSettingsModal(props) { }) const roofsArray = res.some((item) => !item.roofSeq) - ? null //지붕재 추가 정보가 없다면 roofsArray를 null 처리하여 지붕재 추가 정보가 보이지 않게 한다. + ? //최초 지붕재 추가 정보의 경우 roofsArray를 초기화 설정 + [{ roofSeq: '1', roofType: '3', roofWidth: '200', roofHeight: '200', roofGap: '0', roofLayout: 'parallel' }] : res.map((item) => ({ roofSeq: String(item.roofSeq), roofType: String(item.roofType), @@ -69,14 +69,6 @@ export default function InitSettingsModal(props) { // 데이터 설정 setBasicSettings({ ...patternData }) - - // 초기 roofSeq 값을 업데이트 - if (roofsArray == null) { - //roofs(지붕재추가) 값이 없으면 lastRoofSeq는 1 설정 - setLastRoofSeq(1) - } else { - setLastRoofSeq(roofsArray.length + 1) - } }) if (!(Object.keys(canvasSetting).length === 0 && canvasSetting.constructor === Object)) { @@ -90,41 +82,8 @@ export default function InitSettingsModal(props) { setBasicSettings(newBasicSetting) } - //배열 추가 함수 - const addRoofSetting = () => { - if (basicSetting.roofs != null && basicSetting.roofs.length === 4) { - alert('지붕재는 최대 4종까지 선택할 수 있습니다.') - return - } - - //roofs가 null인 경우 배열 생성 - if (basicSetting.roofs == null) { - basicSetting.roofs = [] - } - - //기본값 - const newRoofSettings = { - //roofSeq: basicSetting.roofs.length + 1, - roofSeq: lastRoofSeq, // 마지막 roofSeq를 1 증가 - roofType: '3', - roofWidth: '200', - roofHeight: '200', - roofGap: '0', - roofLayout: 'parallel', - } - - setBasicSettings((prevState) => ({ - ...prevState, - roofs: [...prevState.roofs, newRoofSettings], - })) - - setLastRoofSeq(newRoofSettings.roofSeq + 1) // roofSeq 값을 업데이트 - } - //배열 값 변경 함수 const handleRoofSettings = (id, event) => { - console.log(id) - // 기본 세팅에서 roofs 배열을 복사 const updatedRoofs = [...basicSetting.roofs] @@ -144,13 +103,6 @@ export default function InitSettingsModal(props) { roofs: updatedRoofs, })) } - - // const roof = basicSetting.roofs.map((roof, i) => (id === roof.roofSeq ? { ...roof, [event.target.name]: event.target.value } : roof)) - - // setBasicSettings((prevState) => ({ - // ...prevState, - // roofs: [...roof], - // })) } //저장 @@ -176,17 +128,6 @@ export default function InitSettingsModal(props) { //await handleSelect() } - // 삭제버튼 클릭시 해당 요소 id를 targetId로 전달받음 - const onRemove = async (targetId) => { - console.log(targetId) - - setBasicSettings((prevState) => ({ - ...prevState, - roofs: prevState.roofs.filter((roof) => roof.roofSeq !== targetId), - })) - // setBasicSettings({ ...newRoofSettings }) // 삭제한 데이터 배열을 setData()에 상태를 변화시킴 - } - return ( <>
@@ -236,15 +177,7 @@ export default function InitSettingsModal(props) {
- -
지붕재 추가(단위 : mm)
-
- - ※ 지붕재는 최대 4종까지 선택할 수 있습니다. -
- + {/* Roofs Array Rendering */} {basicSetting.roofs && basicSetting.roofs.map((roof, index) => { @@ -257,7 +190,7 @@ export default function InitSettingsModal(props) { name="roofType" onChange={(e) => handleRoofSettings(roof.roofSeq, e)} items={roofMaterials} - defaultSelectedKeys={roof.roofType ? roof.roofType : ''} + defaultSelectedKeys={roof.roofType ? [roof.roofType] : []} selectedKeys={roof.roofType} value={roof.roofType} > @@ -309,16 +242,6 @@ export default function InitSettingsModal(props) { 계단식 -
- -
) })} diff --git a/src/components/Playground.jsx b/src/components/Playground.jsx index da470ab3..f0a71e44 100644 --- a/src/components/Playground.jsx +++ b/src/components/Playground.jsx @@ -119,7 +119,7 @@ export default function Playground() {

Sass 테스트입니다.

-
{getMessage('hi')}
+
test']) }}>

React ColorPicker

diff --git a/src/components/auth/Login.jsx b/src/components/auth/Login.jsx index 5772ab79..44d163a0 100644 --- a/src/components/auth/Login.jsx +++ b/src/components/auth/Login.jsx @@ -5,39 +5,73 @@ import { setSession } from '@/lib/authActions' import { redirect } from 'next/navigation' import { useMessage } from '@/hooks/useMessage' -import { Button } from '@nextui-org/react' +import { Button, Switch } from '@nextui-org/react' import { useRecoilState } from 'recoil' +import { globalLocaleStore } from '@/store/localeAtom' import { modalContent, modalState } from '@/store/modalAtom' +import { useState } from 'react' export default function Login(props) { const { currentLocale } = props const { getMessage } = useMessage() + const [globalLocaleState, setGlbalLocaleState] = useRecoilState(globalLocaleStore) + const [isSelected, setIsSelected] = useState(globalLocaleState === 'ko' ? true : false) + + const handleSelected = () => { + if (isSelected) { + setGlbalLocaleState('ja') + } else { + setGlbalLocaleState('ko') + } + + setIsSelected(!isSelected) + } // login process const loginProcess = async (formData) => { const param = { - langCd: currentLocale, + // langCd: currentLocale + langCd: globalLocaleState, lastEditUser: formData.get('id'), loginId: formData.get('id'), pwd: formData.get('password'), } - await post({ url: '/api/login/v1.0/login', data: param }).then((res) => { - if (res) { - if (res.result.resultCode == 'S') { - // console.log('res.data', res.data) - // 비밀번호 초기화가 필요한 경우 - // if (res.data.pwdInitYn != 'Y') { - // alert('비밀번호 초기화가 필요한 경우') - // } else { - setSession(res.data) - redirect('/') - // } - } else { - alert(res.result.resultMsg) - } - } + // await post({ url: '/api/login/v1.0/login', data: param }).then((res) => { + // if (res) { + // if (res.result.resultCode == 'S') { + // // console.log('res.data', res.data) + // // 비밀번호 초기화가 필요한 경우 + // // if (res.data.pwdInitYn != 'Y') { + // // alert('비밀번호 초기화가 필요한 경우') + // // } else { + // setSession(res.data) + // redirect('/') + // // } + // } else { + // alert(res.result.resultMsg) + // } + // } + // }) + + // 임시 로그인 처리 + setSession({ + userId: 'NEW016610', + saleStoreId: null, + name: null, + mail: null, + tel: null, + storeId: 'TEMP02', + userNm: 'ㅇㅇ6610', + userNmKana: '신규사용자 16610', + category: '인상6610', + telNo: '336610', + fax: null, + email: 't10t@naver.com', + pwdInitYn: 'N', }) + redirect('/') + // 임시 로그인 처리 끝 } // 비밀번호 초기화 관련 @@ -174,6 +208,12 @@ export default function Login(props) { {getMessage('login.init_password.btn')}

+ +
+ + {isSelected ? 'Current Locale: KO' : 'Current Locale: JA'} + +
diff --git a/src/components/common/context-menu/QContextMenu.jsx b/src/components/common/context-menu/QContextMenu.jsx index 4658ef6f..bf8ef23c 100644 --- a/src/components/common/context-menu/QContextMenu.jsx +++ b/src/components/common/context-menu/QContextMenu.jsx @@ -14,7 +14,7 @@ export default function QContextMenu(props) { if (activeObject) { if (activeObject.initOptions) { //이건 바뀔 가능성이 있음 - if (activeObject.initOptions.name.indexOf('guide') > -1) { + if (activeObject.initOptions?.name?.indexOf('guide') > -1) { contextType = 'surface' //면형상 } } diff --git a/src/components/floor-plan/CanvasFrame.jsx b/src/components/floor-plan/CanvasFrame.jsx index 5923888f..f9bee2a4 100644 --- a/src/components/floor-plan/CanvasFrame.jsx +++ b/src/components/floor-plan/CanvasFrame.jsx @@ -1,7 +1,15 @@ -export default function CanvasFrame () { - return( -
- -
- ) -} \ No newline at end of file +import { useCanvas } from '@/hooks/useCanvas' +import { useRef } from 'react' +import { useEvent } from '@/hooks/useEvent' + +export default function CanvasFrame() { + const canvasRef = useRef(null) + useCanvas('canvas') + useEvent() + + return ( +
+ +
+ ) +} diff --git a/src/components/floor-plan/CanvasMenu.jsx b/src/components/floor-plan/CanvasMenu.jsx index 4533747a..cf5ada46 100644 --- a/src/components/floor-plan/CanvasMenu.jsx +++ b/src/components/floor-plan/CanvasMenu.jsx @@ -1,11 +1,16 @@ 'use client' import { useState } from 'react' import MenuDepth01 from './MenuDepth01' +import { useRecoilState } from 'recoil' +import { modalState } from '@/store/modalAtom' import QSelectBox from '@/components/common/select/QSelectBox' +import { useMessage } from '@/hooks/useMessage' -export default function CanvasMenu({ setModalOpen }) { +export default function CanvasMenu() { + const [modalOption, setModalOption] = useRecoilState(modalState) //modal 열림닫힘 state const [menuNumber, setMenuNumber] = useState(null) const [vertical, setVertical] = useState(true) + const { getMessage } = useMessage() const SelectOption = [{ name: '瓦53A' }, { name: '瓦53A' }] const onClickNav = (number) => { setMenuNumber(number) @@ -14,83 +19,127 @@ export default function CanvasMenu({ setModalOpen }) { } } return ( -
+
  • onClickNav(0)}>
  • onClickNav(1)}>
  • onClickNav(2)}>
  • onClickNav(3)}>
  • onClickNav(4)}>
  • onClickNav(5)}>
  • onClickNav(6)}>
-
- - - -
-
- 垂直水平モード - -
-
- -
-
- - - -
-
- - 100% - -
-
- - - -
+ {menuNumber !== 6 && menuNumber !== 5 && ( + <> +
+ + + +
+
+ {getMessage('plan.mode.vertical.horizontal')} + +
+
+ +
+
+ + + +
+
+ + 100% + +
+
+ + + +
+ + )} + + {menuNumber === 5 && ( + <> +
+ + + + +
+ + )} + {menuNumber === 6 && ( + <> +
+ + +
+ + )}
-
- {menuNumber === 0 && } - {menuNumber === 1 && } +
{menuNumber === 2 && } {menuNumber === 3 && } {menuNumber === 4 && } - {menuNumber === 5 && } - {menuNumber === 6 && }
) diff --git a/src/components/floor-plan/FloorPlan.jsx b/src/components/floor-plan/FloorPlan.jsx index fecffea7..e7fe4225 100644 --- a/src/components/floor-plan/FloorPlan.jsx +++ b/src/components/floor-plan/FloorPlan.jsx @@ -1,9 +1,10 @@ 'use client' import CanvasMenu from '@/components/floor-plan/CanvasMenu' -import CanvasLayout from '@/components/floor-plan/CanvasLayout' import SettingModal01 from '@/components/floor-plan/modal/settoing01/SettingModal01' import { useState } from 'react' +import CanvasLayout from '@/components/floor-plan/CanvasLayout' +import '@/styles/contents.scss' export default function FloorPlan() { const [modalOpen, setModalOpen] = useState('option') diff --git a/src/components/floor-plan/MenuDepth01.jsx b/src/components/floor-plan/MenuDepth01.jsx index 90ba4e60..ce4bd6a4 100644 --- a/src/components/floor-plan/MenuDepth01.jsx +++ b/src/components/floor-plan/MenuDepth01.jsx @@ -1,8 +1,10 @@ 'use client' import { ToggleonMouse } from '@/components/header/Header' +import { useMessage } from '@/hooks/useMessage' export default function MenuDepth01() { + const { getMessage } = useMessage() return (
    @@ -30,7 +32,7 @@ export default function MenuDepth01() {
  • ToggleonMouse(e, 'add', 'ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'ul')}> - +
  • ToggleonMouse(e, 'add', 'ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'ul')}> diff --git a/src/components/floor-plan/modal/settoing01/FirstOption.jsx b/src/components/floor-plan/modal/settoing01/FirstOption.jsx index e91f81ab..cddab6c0 100644 --- a/src/components/floor-plan/modal/settoing01/FirstOption.jsx +++ b/src/components/floor-plan/modal/settoing01/FirstOption.jsx @@ -1,9 +1,11 @@ import { useRecoilState } from 'recoil' import { settingModalFirstOptionsState } from '@/store/settingAtom' +import { useMessage } from '@/hooks/useMessage' export default function FirstOption() { const [settingsModalOptions, setSettingModalOptions] = useRecoilState(settingModalFirstOptionsState) const { option1, option2 } = settingsModalOptions + const { getMessage } = useMessage() const onClickOption = (option) => { option.selected = !option.selected @@ -13,23 +15,23 @@ export default function FirstOption() { return ( <>
    -

    ※図面に表示する項目をクリックすると適用されます。

    +

    {getMessage('modal.canvas.setting.first.option.info')}

    {settingsModalOptions?.option1?.map((item) => ( ))}
    -

    画面表示

    +

    {getMessage('modal.canvas.setting.first.option.display')}

    {settingsModalOptions?.option2?.map((item) => ( ))}
    diff --git a/src/components/floor-plan/modal/settoing01/SettingModal01.jsx b/src/components/floor-plan/modal/settoing01/SettingModal01.jsx index 5a79c795..6c9969d2 100644 --- a/src/components/floor-plan/modal/settoing01/SettingModal01.jsx +++ b/src/components/floor-plan/modal/settoing01/SettingModal01.jsx @@ -4,6 +4,7 @@ import { useState } from 'react' import FirstOption from './FirstOption' import WithDraggable from '@/components/common/draggable/withDraggable' import SecondOption from '@/components/floor-plan/modal/settoing01/SecondOption' +import { useMessage } from '@/hooks/useMessage' export default function SettingModal01({ modalOpen, setModalOpen }) { const [buttonAct, setButtonAct] = useState(1) @@ -15,12 +16,13 @@ export default function SettingModal01({ modalOpen, setModalOpen }) { setClose(false) }, 180) } + const { getMessage } = useMessage() return (
    -

    Canvas設定

    +

    {getMessage('modal.canvas.setting')}

    @@ -28,11 +30,11 @@ export default function SettingModal01({ modalOpen, setModalOpen }) {
    {buttonAct === 1 && } diff --git a/src/components/header/Header.jsx b/src/components/header/Header.jsx index 028ef6ed..f81a0ca7 100644 --- a/src/components/header/Header.jsx +++ b/src/components/header/Header.jsx @@ -2,6 +2,7 @@ import Link from 'next/link' import QSelectBox from '@/components/common/select/QSelectBox' import { usePathname } from 'next/navigation' +import { useMessage } from '@/hooks/useMessage' export const ToggleonMouse = (e, act, target) => { const listWrap = e.target.closest(target) @@ -19,6 +20,7 @@ export const ToggleonMouse = (e, act, target) => { } export default function Header() { + const { getMessage } = useMessage() const pathName = usePathname() if (pathName.includes('login') || pathName.includes('join')) { return null @@ -39,28 +41,28 @@ export default function Header() { onMouseEnter={(e) => ToggleonMouse(e, 'add', 'nav > ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'nav > ul')} > - ホームへ + {getMessage('header.menus.home')}
  • ToggleonMouse(e, 'add', 'nav > ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'nav > ul')} > - +
    • ToggleonMouse(e, 'add', 'li > ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')} > - 新規物件登録 + {getMessage('header.menus.management.stuff')}
    • ToggleonMouse(e, 'add', 'li > ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')} > - モノ/図面管理 + {getMessage('header.menus.management.plan')}
  • @@ -69,28 +71,28 @@ export default function Header() { onMouseEnter={(e) => ToggleonMouse(e, 'add', 'nav > ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'nav > ul')} > - +
    • ToggleonMouse(e, 'add', 'li > ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')} > - お知らせ + {getMessage('header.menus.community.notice')}
    • ToggleonMouse(e, 'add', 'li > ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')} > - FAQ + {getMessage('header.menus.community.faq')}
    • ToggleonMouse(e, 'add', 'li > ul')} onMouseLeave={(e) => ToggleonMouse(e, 'remove', 'li > ul')} > - 素材のダウンロード + {getMessage('header.menus.community.archive')}
    @@ -102,13 +104,13 @@ export default function Header() {
- +
- +
diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index f8467027..cf427814 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -8,7 +8,7 @@ import { useMessage } from '@/hooks/useMessage' import StuffQGrid from './StuffQGrid' import { useRecoilValue } from 'recoil' import { stuffSearchState } from '@/store/stuffAtom' -import { queryStringFormatter } from '@/util/common-utils' +import { queryStringFormatter, isEmptyArray } from '@/util/common-utils' import dayjs from 'dayjs' import isLeapYear from 'dayjs/plugin/isLeapYear' // 윤년 판단 플러그인 dayjs.extend(isLeapYear) @@ -288,13 +288,13 @@ export default function Stuff() { // let size // let pageCount - const apiUrl = `/api/object/v1.0/object?saleStoreId=201TES01&${queryStringFormatter(params)}` + const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(params)}` await get({ url: apiUrl, }).then((res) => { - if (res.length > 0) { - console.log('API결과:::::::', res) + if (!isEmptyArray(res)) { + console.log('화면진입API결과::', res) setGridProps({ ...gridProps, gridData: res, count: res.length }) setGridCount(res.length) } @@ -308,11 +308,13 @@ export default function Stuff() { if (stuffSearchParams?.code === 'E') { console.log('조회 눌럿을때 ::::::::::::::', stuffSearchParams) async function fetchData() { - const apiUrl = `/api/object/v1.0/object?saleStoreId=201TES01&${queryStringFormatter(stuffSearchParams)}` + const apiUrl = `/api/object/list?saleStoreId=201TES01&${queryStringFormatter(stuffSearchParams)}` await get({ url: apiUrl }).then((res) => { console.log('API결과:::::::', res) - setGridProps({ ...gridProps, gridData: res, count: res.length }) - setGridCount(res.length) + if (!isEmptyArray(res)) { + setGridProps({ ...gridProps, gridData: res, count: res.length }) + setGridCount(res.length) + } }) } fetchData() diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index ed15d729..0c0692c7 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -5,7 +5,7 @@ import { useRouter, useSearchParams } from 'next/navigation' import { Input, RadioGroup, Radio, Button, Autocomplete, AutocompleteItem, Select, SelectItem, Checkbox, Textarea, button } from '@nextui-org/react' import Link from 'next/link' import { get } from '@/lib/Axios' -import { queryStringFormatter } from '@/util/common-utils' +import { queryStringFormatter, isEmptyArray } from '@/util/common-utils' import dayjs from 'dayjs' import { useForm } from 'react-hook-form' export default function StuffDetail() { @@ -29,10 +29,10 @@ export default function StuffDetail() { windSpeed: '', //기준풍속 snowCover: '', //수직적설량 coldAreaChk: false, //한랭지대책시행 - surfaceType: '', //면조도구분(Ⅲ・Ⅳ / Ⅱ) + surfaceType: 'Ⅲ・Ⅳ', //면조도구분(Ⅲ・Ⅳ / Ⅱ) saltAreaChk: false, //염해지역용아이템사용 installHeight: '', //설치높이 - powerConTerms: '', //계약조건 + powerConTerms: '0', //계약조건(잉여 / 전량) remark: '', //메모 tempFlag: 'T', //임시저장(1) 저장(0) } @@ -42,6 +42,9 @@ export default function StuffDetail() { const form = { register, setValue, getValues, handleSubmit, resetField, control, watch } + const [prefCodeList, setPrefCodeList] = useState([]) //도도부현 코트 리스트 + const [prefValue, setPrefValue] = useState('') + const [receiveUser, setReceiveUser] = useState('') //담당자 const [name2, setName2] = useState('') //물건명 const [name3, setName3] = useState('') //물건명후리가나 @@ -74,18 +77,21 @@ export default function StuffDetail() { const [detailData, setDetailData] = useState({}) useEffect(() => { + get({ url: '/api/object/prefecture/list' }).then((res) => { + if (!isEmptyArray(res)) { + console.log('도도부현API 결과:::', res) + setPrefCodeList(res) + } + }) // console.log('상세화면진입:::::::::', searchParams.get('objectNo')) - console.log('물건번호::::', objectNo) + // console.log('물건번호::::', objectNo) if (objectNo) { - // console.log('상세::', objectNo) setEditMode('EDIT') if (objectNo.substring(0, 1) === 'R') { setIsFormValid(true) } - //일단 플랜번호 무조건 1로 - //API 호출 - get({ url: `/api/object/v1.0/object/${objectNo}/1` }).then((res) => { + get({ url: `/api/object/${objectNo}/detail` }).then((res) => { if (res != null) { // console.log('res:::::::', res) setDetailData(res) @@ -101,9 +107,7 @@ export default function StuffDetail() { // 우편번호 숫자만 체크 const _zipNo = watch('zipNo') useEffect(() => { - console.log('실시간이니:::::', _zipNo) if (_zipNo !== '' && _zipNo.length === 7 && !_zipNo.match(/\D/g)) { - console.log('벨리통과했군') setButtonValid(true) } else { setButtonValid(false) @@ -167,26 +171,29 @@ export default function StuffDetail() { setIsFormValid(Object.keys(errors).length === 0) } - // 우편번호 API + // 주소검색 API const onSearchPostNumber = () => { const params = { zipcode: _zipNo, } get({ url: `https://zipcloud.ibsnet.co.jp/api/search?${queryStringFormatter(params)}` }).then((res) => { - console.log('우편API RES::::::::', res) //7830060 if (res.status === 200) { - if (res.results?.length > 0) { - // setAddress1(res.results[0].address1) - // setAddress2(res.results[0].address2) - // setAddress3(res.results[0].address3) - // setPrefCode(res.results[0].prefcode) - // prefId: '', //도도부현 + console.log('res.results::', res.results) + if (res.results != null) { + console.log('res.results::', res.results) + // prefId: '', //도도부현 // address: '', //주소 + console.log('prefcode::', res.results[0].prefcode) + console.log('address::', res.results[0].address2 + res.results[0].address3) + setPrefValue(res.results[0].prefcode) form.setValue('prefId', res.results[0].prefcode) form.setValue('address', res.results[0].address2 + res.results[0].address3) } else { alert('등록된 우편번호에서 주소를 찾을 수 없습니다. 다시 입력해주세요.') + form.setValue('prefId', '') + form.setValue('address', '') + setPrefValue('') } } else { alert(res.message) @@ -218,11 +225,18 @@ export default function StuffDetail() { const _dispCompanyName = watch('dispCompanyName') const _objectStatusId = watch('objectStatusId') const _objectNameOmit = watch('objectNameOmit') - const _zipno = watch('zipno') + const _zipNo = watch('zipNo') + const _prefId = watch('prefId') + const _address = watch('address') + const _coldAreaChk = watch('coldAreaChk') console.log(_dispCompanyName) console.log(_objectStatusId) console.log(_objectNameOmit) - console.log(_zipno) + console.log(_zipNo) + console.log(_prefId) + console.log('prefValue::', prefValue) + console.log(_address) + console.log('_coldAreaChk::', _coldAreaChk) } //필수값 안넣었을때 @@ -285,11 +299,87 @@ export default function StuffDetail() {
+
+ {prefCodeList?.length > 0 && ( + + )} +
+
+ +
+
+ +
+
+ + {' '} + cm + { + form.setValue('coldAreaChk', e) + }} + {...form.register('coldAreaChk')} + > + 한랭지대책시행 + +
+
+ + + + + + { + form.setValue('saltAreaChk', e) + }} + > + 염해지역용아이템사용 + +
+
+ +
+
+ + + + + +
+
+ +