diff --git a/src/components/management/Stuff.jsx b/src/components/management/Stuff.jsx index e26b11a3..f8467027 100644 --- a/src/components/management/Stuff.jsx +++ b/src/components/management/Stuff.jsx @@ -4,8 +4,8 @@ import React, { useEffect, useState, useRef } 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 { useI18n } from '@/locales/client' import { useRecoilValue } from 'recoil' import { stuffSearchState } from '@/store/stuffAtom' import { queryStringFormatter } from '@/util/common-utils' @@ -15,10 +15,11 @@ dayjs.extend(isLeapYear) export default function Stuff() { const stuffSearchParams = useRecoilValue(stuffSearchState) - + const { getMessage } = useMessage() + const [curPage, setCurPage] = useState(1) //현재 페이지 번호 + const [size, setSize] = useState(100) //페이지 당 게시물 수 const { get, del } = useAxios() const gridRef = useRef() - const lang = useI18n() const [gridCount, setGridCount] = useState(0) const [selectedRowData, setSelectedRowData] = useState([]) @@ -47,7 +48,7 @@ export default function Stuff() { gridColumns: [ { field: 'lastEditDatetime', - headerName: lang('stuff.gridHeader.lastEditDatetime'), + headerName: getMessage('stuff.gridHeader.lastEditDatetime'), headerCheckboxSelection: true, headerCheckboxSelectionCurrentPageOnly: true, //페이징시 현재 페이지만 체크되도록 checkboxSelection: true, @@ -73,7 +74,7 @@ export default function Stuff() { }, { field: 'objectNo', - headerName: lang('stuff.gridHeader.objectNo'), + headerName: getMessage('stuff.gridHeader.objectNo'), // headerClass: 'centered', //_test.scss에 추가 테스트 cellRenderer: function (params) { if (params.data.objectNo) { @@ -100,22 +101,22 @@ export default function Stuff() { }, { field: 'planTotCnt', - headerName: lang('stuff.gridHeader.planTotCnt'), + headerName: getMessage('stuff.gridHeader.planTotCnt'), cellStyle: { textAlign: 'right' }, }, - { field: 'objectName', headerName: lang('stuff.gridHeader.objectName'), cellStyle: { textAlign: 'left' } }, + { field: 'objectName', headerName: getMessage('stuff.gridHeader.objectName'), cellStyle: { textAlign: 'left' } }, { field: 'saleStoreId', - headerName: lang('stuff.gridHeader.saleStoreId'), + headerName: getMessage('stuff.gridHeader.saleStoreId'), cellStyle: { textAlign: 'left' }, }, - { field: 'saleStoreName', headerName: lang('stuff.gridHeader.saleStoreName'), cellStyle: { textAlign: 'left' } }, - { field: 'address', headerName: lang('stuff.gridHeader.address'), cellStyle: { textAlign: 'left' } }, - { field: 'dispCompanyName', headerName: lang('stuff.gridHeader.dispCompanyName'), cellStyle: { textAlign: 'left' } }, - { field: 'receiveUser', headerName: lang('stuff.gridHeader.receiveUser'), cellStyle: { textAlign: 'left' } }, + { field: 'saleStoreName', headerName: getMessage('stuff.gridHeader.saleStoreName'), cellStyle: { textAlign: 'left' } }, + { field: 'address', headerName: getMessage('stuff.gridHeader.address'), cellStyle: { textAlign: 'left' } }, + { field: 'dispCompanyName', headerName: getMessage('stuff.gridHeader.dispCompanyName'), cellStyle: { textAlign: 'left' } }, + { field: 'receiveUser', headerName: getMessage('stuff.gridHeader.receiveUser'), cellStyle: { textAlign: 'left' } }, { field: 'specDate', - headerName: lang('stuff.gridHeader.specDate'), + headerName: getMessage('stuff.gridHeader.specDate'), valueFormatter: function (params) { if (params.value) { return dayjs(params?.value).format('YYYY.MM.DD') @@ -127,7 +128,7 @@ export default function Stuff() { }, { field: 'createDatetime', - headerName: lang('stuff.gridHeader.createDatetime'), + headerName: getMessage('stuff.gridHeader.createDatetime'), valueFormatter: function (params) { if (params.value) { return dayjs(params?.value).format('YYYY.MM.DD') @@ -264,12 +265,30 @@ export default function Stuff() { schDateType: 'U', schFromDt: dayjs(new Date()).add(-1, 'year').format('YYYY-MM-DD'), schToDt: dayjs(new Date()).format('YYYY-MM-DD'), + startRow: (curPage - 1) * size + 1, + endRow: curPage * size, } async function fetchData() { console.log('화면진입:::::::::::::', params) + console.log('현재페이지::::::', curPage) + console.log('페이지당 게시물수::::::', size) + + //api에 넘길값 startRow, endRow + // let startRow + // let endRow + // startRow = (curPage - 1) * size + 1 + // endRow = curPage * size + // console.log('startrow::', startRow) + // console.log('endRow::', endRow) + + // let curPage + // let totalpage + // let totalCount + // let size + // let pageCount + const apiUrl = `/api/object/v1.0/object?saleStoreId=201TES01&${queryStringFormatter(params)}` - // console.log('apiUrl::', apiUrl) await get({ url: apiUrl, diff --git a/src/components/management/StuffDetail.jsx b/src/components/management/StuffDetail.jsx index 2f39b066..ed15d729 100644 --- a/src/components/management/StuffDetail.jsx +++ b/src/components/management/StuffDetail.jsx @@ -2,14 +2,46 @@ import React, { useState, useEffect } from 'react' import { useRouter, useSearchParams } from 'next/navigation' -import { Input, RadioGroup, Radio, Button, Autocomplete, AutocompleteItem, Select, SelectItem, Checkbox, Textarea } from '@nextui-org/react' +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 dayjs from 'dayjs' +import { useForm } from 'react-hook-form' export default function StuffDetail() { const router = useRouter() const searchParams = useSearchParams() + + //form + const formInitValue = { + // 물건번호 T...(임시) R...(진짜) + dispCompanyName: '', //담당자 + objectStatusId: '0', //물건구분(신축:0 기축 : 1) + objectName: '', //물건명 + objectNameOmit: '', //경칭선택 + objectNameKana: '', //물건명 후리가나 + saleStoreId: '', //판매점ID + saleStoreName: '', //판매점명 + zipNo: '', //우편번호 + prefId: '', //도도부현 + address: '', //주소 + powerSimArea: '', //발전량시뮬레이션지역 + windSpeed: '', //기준풍속 + snowCover: '', //수직적설량 + coldAreaChk: false, //한랭지대책시행 + surfaceType: '', //면조도구분(Ⅲ・Ⅳ / Ⅱ) + saltAreaChk: false, //염해지역용아이템사용 + installHeight: '', //설치높이 + powerConTerms: '', //계약조건 + remark: '', //메모 + tempFlag: 'T', //임시저장(1) 저장(0) + } + const { register, setValue, getValues, handleSubmit, resetField, control, watch } = useForm({ + defaultValues: formInitValue, + }) + + const form = { register, setValue, getValues, handleSubmit, resetField, control, watch } + const [receiveUser, setReceiveUser] = useState('') //담당자 const [name2, setName2] = useState('') //물건명 const [name3, setName3] = useState('') //물건명후리가나 @@ -25,7 +57,7 @@ export default function StuffDetail() { const [isFormValid, setIsFormValid] = useState(false) //임시저장, 진짜저장 버튼 컨트롤 const [testSelOption, setTestSelOption] = useState([]) // 테스트용 const [autoSelectValue, setAutoSelectValue] = useState('') //판매점명 자동완성 - const [buttonValid, setButtonValid] = useState(true) //주소검색 활성화 컨트롤 + const [buttonValid, setButtonValid] = useState(false) //주소검색 활성화 컨트롤 const [isSelected, setIsSelected] = useState(false) //한랭지대첵 체크박스 const [isSelected2, setIsSelected2] = useState(false) //염해지역용아이템사용 체크박스 const [gubun2, setGubun2] = useState('1') //면조도구분 라디오 @@ -33,47 +65,50 @@ export default function StuffDetail() { const [memo, setMemo] = useState('') //메모 const objectNo = searchParams.get('objectNo') //url에서 물건번호 꺼내서 바로 set - const [address1, setAddress1] = useState('') //우편API리턴 도도부현명 - const [address2, setAddress2] = useState('') //우편API리턴 시구정촌명 - const [address3, setAddress3] = useState('') //우편API리턴 마을 지역명 - const [prefcode, setPrefCode] = useState(1) //우편API prefcode + // const [address1, setAddress1] = useState('') //우편API리턴 도도부현명 + // const [address2, setAddress2] = useState('') //우편API리턴 시구정촌명 + // const [address3, setAddress3] = useState('') //우편API리턴 마을 지역명 + // const [prefCode, setPrefCode] = useState(1) //우편API prefcode const [editMode, setEditMode] = useState('NEW') const [detailData, setDetailData] = useState({}) useEffect(() => { // console.log('상세화면진입:::::::::', searchParams.get('objectNo')) - // console.log('물건번호::::', objectNo) + console.log('물건번호::::', objectNo) if (objectNo) { - console.log('상세::') + // console.log('상세::', objectNo) setEditMode('EDIT') - //http://localhost:8080/api/object/v1.0/object/R201TES01240906007/1 + if (objectNo.substring(0, 1) === 'R') { + setIsFormValid(true) + } //일단 플랜번호 무조건 1로 //API 호출 get({ url: `/api/object/v1.0/object/${objectNo}/1` }).then((res) => { if (res != null) { // console.log('res:::::::', res) setDetailData(res) - //setTestSelOption(res) } }) - } else { - console.log('신규:::') } }, [objectNo]) useEffect(() => { - validateForm() + // validateForm() }, [receiveUser, name2, name3, gubun, sel, autoSelectValue, zipCode, sel2, sel3, name5, sel4]) // 우편번호 숫자만 체크 - const textTypeHandler = (e) => { - //\D 숫자가 아닌것(특수문자포함)과 매치, [^0-9]와 동일 - if (!e.target.value.match(/\D/g)) { - setZipCode(e.target.value) + const _zipNo = watch('zipNo') + useEffect(() => { + console.log('실시간이니:::::', _zipNo) + if (_zipNo !== '' && _zipNo.length === 7 && !_zipNo.match(/\D/g)) { + console.log('벨리통과했군') + setButtonValid(true) + } else { + setButtonValid(false) } - } + }, [_zipNo]) // 수직적설량 숫자만 const textTypeHandler2 = (e) => { @@ -127,28 +162,29 @@ export default function StuffDetail() { errors.name5 = '수직적설량 is required.' } - // console.log('errors::', errors) + console.log('errors::', errors) setErrors(errors) setIsFormValid(Object.keys(errors).length === 0) } // 우편번호 API const onSearchPostNumber = () => { - if (!zipCode) { - return alert('우편번호 입력해') - } const params = { - zipcode: zipCode, + 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) + 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: '', //도도부현 + // address: '', //주소 + form.setValue('prefId', res.results[0].prefcode) + form.setValue('address', res.results[0].address2 + res.results[0].address3) } else { alert('등록된 우편번호에서 주소를 찾을 수 없습니다. 다시 입력해주세요.') } @@ -174,10 +210,90 @@ export default function StuffDetail() { console.log('e:::::::', e.target.value) } + //필수값 다 입력했을때 + const onValid = (data) => { + console.log('data::::::', data) + const formData = form.getValues() + //console.log('formData::::', formData) + const _dispCompanyName = watch('dispCompanyName') + const _objectStatusId = watch('objectStatusId') + const _objectNameOmit = watch('objectNameOmit') + const _zipno = watch('zipno') + console.log(_dispCompanyName) + console.log(_objectStatusId) + console.log(_objectNameOmit) + console.log(_zipno) + } + + //필수값 안넣었을때 + const onInvalid = (errors) => { + console.log('실패', errors) + } + return ( <> - {(editMode === 'NEW' &&
신규:::::::::::
) ||
상세:::::::::::
} -
+ {(editMode === 'NEW' && ( +
+
+
(*필수 입력항목)
+
+ + +
+
+ + + + + + +
+ +
+
+
+ + +
+
+ +
+
+ +
+
+ + + + *우편번호 7자리를 입력한 후, 주소검색 버튼을 클릭해 주십시오 +
+
+ + + +
+
+ +
+ )) ||
상세:::::::::::
} + + {/*
물건번호 {objectNo} @@ -200,36 +316,9 @@ export default function StuffDetail() { 등록일
-
-
(*필수 입력항목)
-
- 담당자* - setReceiveUser(e.target.value)} /> -
-
- 물건구분/물건명 * - { - setGubun(e.target.value) - }} - /> - - { - setGubun(e.target.value) - }} - /> - +
*/} + {/*
(*필수 입력항목)
+
setName2(e.target.value)} />
@@ -244,8 +333,8 @@ export default function StuffDetail() { 물건명 후리가나 setName3(e.target.value)} />
- -
+
*/} + {/*
판매점명 /ID *
{option.name}}
-
-
+
*/} + {/*
우편번호* *우편번호 7자리를 입력한 후, 주소검색 버튼을 클릭해 주십시오 -
-
+
*/} + {/*
도도부현 / 주소* - {/* */} -
-
+
*/} + {/*
발전량시뮬레이션지역* - - {/* */} + */} ) } diff --git a/src/components/management/StuffQGrid.jsx b/src/components/management/StuffQGrid.jsx index 8139991b..4fd6c42d 100644 --- a/src/components/management/StuffQGrid.jsx +++ b/src/components/management/StuffQGrid.jsx @@ -82,6 +82,7 @@ export default function StuffQGrid(props) { }, []) const onGridReady = useCallback((event) => { + // console.log('event:::', event) // 헤더 사이즈 조정 컬럼에 width값으로 계산 event.api.sizeColumnsToFit() }, []) diff --git a/src/locales/ja.json b/src/locales/ja.json index 146bb78a..31dfae1b 100644 --- a/src/locales/ja.json +++ b/src/locales/ja.json @@ -86,5 +86,16 @@ "common.message.backToG3": "Back to G3処理実行しますか?", "common.message.writeToConfirm": "作成解除を実行しますか?", "common.message.password.init.success": "パスワード [{0}] に初期化されました。", - "common.message.no.edit.save": "この文書は変更できません。" + "common.message.no.edit.save": "この文書は変更できません。", + "stuff.gridHeader.lastEditDatetime": "갱신일시", + "stuff.gridHeader.objectNo": "물건번호", + "stuff.gridHeader.planTotCnt": "플랜 수", + "stuff.gridHeader.objectName": "물건명", + "stuff.gridHeader.saleStoreId": "대리점ID", + "stuff.gridHeader.saleStoreName": "대리점명", + "stuff.gridHeader.address": "물건주소", + "stuff.gridHeader.dispCompanyName": "견적처", + "stuff.gridHeader.receiveUser": "담당자", + "stuff.gridHeader.specDate": "사양확인", + "stuff.gridHeader.createDatetime": "등록일" } diff --git a/src/locales/ko.json b/src/locales/ko.json index 04b14c9f..3b40df01 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -86,5 +86,16 @@ "common.message.backToG3": "Back to G3 처리를 실행하시겠습니까?", "common.message.writeToConfirm": "작성 해제를 실행하시겠습니까?", "common.message.password.init.success": "비밀번호 [{0}]로 초기화 되었습니다.", - "common.message.no.edit.save": "This document cannot be changed." + "common.message.no.edit.save": "This document cannot be changed.", + "stuff.gridHeader.lastEditDatetime": "갱신일시", + "stuff.gridHeader.objectNo": "물건번호", + "stuff.gridHeader.planTotCnt": "플랜 수", + "stuff.gridHeader.objectName": "물건명", + "stuff.gridHeader.saleStoreId": "대리점ID", + "stuff.gridHeader.saleStoreName": "대리점명", + "stuff.gridHeader.address": "물건주소", + "stuff.gridHeader.dispCompanyName": "견적처", + "stuff.gridHeader.receiveUser": "담당자", + "stuff.gridHeader.specDate": "사양확인", + "stuff.gridHeader.createDatetime": "등록일" }