물건정보 신규등록&수정화면

This commit is contained in:
basssy 2024-10-23 11:01:04 +09:00
parent 5d8bd03e0c
commit d6fc1134c1
4 changed files with 371 additions and 236 deletions

View File

@ -674,18 +674,26 @@ export default function StuffDetail() {
// //
const onDelete = () => { const onDelete = () => {
//http://localhost:8080/api/object/R201TES01240910023
// console.log('::::::::', objectNo) // console.log('::::::::', objectNo)
alert('사양확정일이 있으면 삭제 불가') // console.log('detailData:::::::::', detailData)
const specificationConfirmDate = detailData.specificationConfirmDate
if (specificationConfirmDate != null) {
alert(getMessage('stuff.detail.delete.message1'))
} else {
if (confirm(getMessage('common.message.data.delete'))) { if (confirm(getMessage('common.message.data.delete'))) {
let testobj = '10' del({ url: `/api/object/${objectNo}` }).then((res) => {
console.log('삭제결과:::::::', res)
del({ url: `/api/object/${testobj}` }).then((res) => {
console.log('삭제 결과:::', res)
router.push('/management/stuff') router.push('/management/stuff')
}) })
} }
} }
}
//
const handleKeyUp = (e) => {
let input = e.target
input.value = input.value.replace(/[^0-9]/g, '')
}
return ( return (
<> <>
@ -707,8 +715,18 @@ export default function StuffDetail() {
<th>{getMessage('stuff.detail.planReqNo')}</th> <th>{getMessage('stuff.detail.planReqNo')}</th>
<td> <td>
<div className="flx-box"> <div className="flx-box">
<div className="input-wrap mr5" style={{ width: '200px' }}> <div className="product-input-wrap mr5">
<input type="text" className="input-light" readOnly value={form.watch('planReqNo')} /> <input type="text" className="product-input" readOnly value={form.watch('planReqNo')} />
{(form.watch('planReqNo') !== '' && (
<button
type="button"
className="product-delete"
onClick={() => {
form.setValue('planReqNo', '')
}}
></button>
)) ||
null}
</div> </div>
<Button className="btn-origin grey" onClick={onSearchDesignRequestPopOpen}> <Button className="btn-origin grey" onClick={onSearchDesignRequestPopOpen}>
{getMessage('stuff.planReqPopup.title')} {getMessage('stuff.planReqPopup.title')}
@ -976,7 +994,13 @@ export default function StuffDetail() {
<td> <td>
<div className="flx-box"> <div className="flx-box">
<div className="input-wrap mr10" style={{ width: '200px' }}> <div className="input-wrap mr10" style={{ width: '200px' }}>
<input type="text" className="input-light" value={form.watch('verticalSnowCover')} {...register('verticalSnowCover')} /> <input
type="text"
className="input-light"
onKeyUp={handleKeyUp}
value={form.watch('verticalSnowCover')}
{...register('verticalSnowCover')}
/>
</div> </div>
<span className="mr10">cm</span> <span className="mr10">cm</span>
<div className="d-check-box light"> <div className="d-check-box light">
@ -1015,7 +1039,13 @@ export default function StuffDetail() {
<td> <td>
<div className="flx-box"> <div className="flx-box">
<div className="input-wrap mr10" style={{ width: '200px' }}> <div className="input-wrap mr10" style={{ width: '200px' }}>
<input type="text" className="input-light" value={form.watch('installHeight')} {...register('installHeight')} /> <input
type="text"
className="input-light"
onKeyUp={handleKeyUp}
value={form.watch('installHeight')}
{...register('installHeight')}
/>
</div> </div>
<span>m</span> <span>m</span>
</div> </div>
@ -1047,19 +1077,19 @@ export default function StuffDetail() {
</tbody> </tbody>
</table> </table>
</div> </div>
<div className="sub-table-footer"> <div className="sub-right-footer">
{!isFormValid ? ( {!isFormValid ? (
<Button className="btn-origin grey mr5" onClick={onTempSave}> <Button className="btn-origin grey mr5" onClick={onTempSave}>
New화면 임시저장 New화면 {getMessage('stuff.detail.btn.tempSave')}
</Button> </Button>
) : ( ) : (
<Button type="submit" className="btn-origin navy mr5"> <Button type="submit" className="btn-origin navy mr5">
NEW화면 저장 NEW화면 {getMessage('stuff.detail.btn.save')}
</Button> </Button>
)} )}
<Link href="/management/stuff" scroll={false}> <Link href="/management/stuff" scroll={false}>
<button type="button" className="btn-origin grey"> <button type="button" className="btn-origin grey">
NEW화면 물건목록이동 NEW화면 {getMessage('stuff.detail.btn.moveList')}
</button> </button>
</Link> </Link>
</div> </div>
@ -1072,6 +1102,7 @@ export default function StuffDetail() {
<div className="promise-gudie"> <div className="promise-gudie">
<span className="important">*</span> {getMessage('stuff.detail.required')} <span className="important">*</span> {getMessage('stuff.detail.required')}
</div> </div>
<div className="infomation-wrap">
<div className="infomation-table"> <div className="infomation-table">
<table> <table>
<colgroup> <colgroup>
@ -1083,8 +1114,17 @@ export default function StuffDetail() {
<th>{getMessage('stuff.detail.planReqNo')}</th> <th>{getMessage('stuff.detail.planReqNo')}</th>
<td> <td>
<div className="flx-box"> <div className="flx-box">
<div className="input-wrap mr5" style={{ width: '200px' }}> <div className="product-input-wrap mr5">
<input type="text" className="input-light" readOnly value={form.watch('planReqNo')} /> <input type="text" className="product-input" readOnly value={form.watch('planReqNo')} />
{objectNo.substring(0, 1) === 'T' && form.watch('planReqNo') !== '' ? (
<button
type="button"
className="product-delete"
onClick={() => {
form.setValue('planReqNo', '')
}}
></button>
) : null}
</div> </div>
{objectNo.substring(0, 1) === 'T' ? ( {objectNo.substring(0, 1) === 'T' ? (
<> <>
@ -1195,7 +1235,13 @@ export default function StuffDetail() {
/> />
</div> </div>
<div className="input-wrap" style={{ width: '216px' }}> <div className="input-wrap" style={{ width: '216px' }}>
<input type="text" className="input-light" value={form.watch('saleStoreId')} {...form.register('saleStoreId')} readOnly /> <input
type="text"
className="input-light"
value={form.watch('saleStoreId')}
{...form.register('saleStoreId')}
readOnly
/>
</div> </div>
</div> </div>
</td> </td>
@ -1262,39 +1308,75 @@ export default function StuffDetail() {
</table> </table>
</div> </div>
</div> </div>
</form>
{objectNo.substring(0, 1) === 'R' ? ( {objectNo.substring(0, 1) === 'R' ? (
<> <>
{/* 진짜R 플랜시작 */}
<div className="table-box-title-wrap">
<div className="title-wrap">
<h3>{getMessage('stuff.detail.planList.title')}</h3>
<ul className="info-wrap">
<li>
{getMessage('stuff.detail.planList.cnt')}
<span className="red">플랜갯수</span>
</li>
</ul>
</div>
</div>
<div className="information-help-wrap">
<div className="information-help-tit-wrap">
<div className="help-tit-icon"></div>
<div className="help-tit">{getMessage('stuff.detail.planList.help')}</div>
</div>
<div className="information-help-guide">
<span>{getMessage('stuff.detail.planList.guide1')}</span>
<span>{getMessage('stuff.detail.planList.guide2')}</span>
<span>{getMessage('stuff.detail.planList.guide3')}</span>
</div>
</div>
<div className="information-grid">
<div className="q-grid no-cols">
그리드영역
<div className="pagination-wrap">페이징영역</div>
</div>
</div>
{/* 진짜R 플랜끝 */}
<div className="sub-right-footer">
<Link href="/management/stuff"> <Link href="/management/stuff">
<button type="button" className="btn-origin grey mr5"> <button type="button" className="btn-origin grey mr5">
R상세:물건목록 R상세: {getMessage('stuff.detail.btn.moveList')}
</button> </button>
</Link> </Link>
<Button type="submit" className="btn-origin navy mr5"> <Button type="submit" className="btn-origin navy mr5">
R상세:저장 R상세:{getMessage('stuff.detail.btn.save')}
</Button> </Button>
<Button type="submit" className="btn-origin navy" onClick={onDelete}> <Button type="button" className="btn-origin grey" onClick={onDelete}>
R상세:물건삭제 {getMessage('stuff.detail.btn.delete')}
</Button> </Button>
</div>
</> </>
) : ( ) : (
<> <>
<div className="sub-right-footer">
{!isFormValid ? ( {!isFormValid ? (
<Button type="submit" className="btn-origin navy mr5" onClick={onTempSave}> <Button type="submit" className="btn-origin grey mr5" onClick={onTempSave}>
TEMP상세:임시저장 TEMP상세:{getMessage('stuff.detail.btn.tempSave')}
</Button> </Button>
) : ( ) : (
<Button type="submit" className="btn-origin navy mr5"> <Button type="submit" className="btn-origin navy mr5">
TEMP상세:저장 TEMP상세:{getMessage('stuff.detail.btn.save')}
</Button> </Button>
)} )}
<Link href="/management/stuff"> <Link href="/management/stuff">
<button type="button" className="btn-origin grey"> <button type="button" className="btn-origin grey">
T상세:물건목록 TEMP상세:{getMessage('stuff.detail.btn.moveList')}
</button> </button>
</Link> </Link>
</div>
</> </>
)} )}
</div>
</form>
</> </>
)} )}
{showAddressButtonValid && <FindAddressPop setShowAddressButtonValid={setShowAddressButtonValid} zipInfo={setZipInfo} />} {showAddressButtonValid && <FindAddressPop setShowAddressButtonValid={setShowAddressButtonValid} zipInfo={setZipInfo} />}

View File

@ -5,7 +5,10 @@ import { useAxios } from '@/hooks/useAxios'
import { useRouter, useSearchParams } from 'next/navigation' import { useRouter, useSearchParams } from 'next/navigation'
import { globalLocaleStore } from '@/store/localeAtom' import { globalLocaleStore } from '@/store/localeAtom'
import { useRecoilValue } from 'recoil' import { useRecoilValue } from 'recoil'
import { useMessage } from '@/hooks/useMessage'
export default function StuffHeader() { export default function StuffHeader() {
const { getMessage } = useMessage()
const router = useRouter() const router = useRouter()
const searchParams = useSearchParams() const searchParams = useSearchParams()
const objectNo = searchParams.get('objectNo') //url set const objectNo = searchParams.get('objectNo') //url set
@ -15,35 +18,49 @@ export default function StuffHeader() {
useEffect(() => { useEffect(() => {
get({ url: `/api/object/${objectNo}/detail` }).then((res) => { get({ url: `/api/object/${objectNo}/detail` }).then((res) => {
//console.log('res::', res)
if (res != null && res != '') { if (res != null && res != '') {
console.log('헤더상세::::::::::', res)
setHeaderData(res) setHeaderData(res)
} else { } else {
alert('삭제된 물건입니다') alert(getMessage('stuff.detail.header.message1'))
router.push('/management/stuff') router.push('/management/stuff')
} }
}) })
}, [objectNo]) }, [objectNo])
//
const copyObjectNo = async (objectNo) => {
await navigator.clipboard.writeText(objectNo)
alert(getMessage('stuff.detail.header.message2'))
try {
} catch (error) {
alert(getMessage('stuff.detail.header.message3'))
}
}
return ( return (
<div className="infomation-box-wrap"> <div className="infomation-box-wrap">
<div className="sub-table-box"> <div className="sub-table-box">
<div className="info-title">물건번호</div> <div className="info-title">{getMessage('stuff.detail.header.objectNo')}</div>
<div className="info-inner"> <div className="info-inner">
{headerData.objectNo} <button className="copy-ico"></button> {headerData.objectNo}{' '}
<button
className="copy-ico"
onClick={() => {
copyObjectNo(headerData.objectNo)
}}
></button>
</div> </div>
</div> </div>
<div className="sub-table-box"> <div className="sub-table-box">
<div className="info-title">사양확정일</div> <div className="info-title">{getMessage('stuff.detail.header.specificationConfirmDate')}</div>
<div className="info-inner">{headerData.specificationConfirmDate}</div> <div className="info-inner">{headerData.specificationConfirmDate}</div>
</div> </div>
<div className="sub-table-box"> <div className="sub-table-box">
<div className="info-title">갱신일시</div> <div className="info-title">{getMessage('stuff.detail.header.lastEditDatetime')}</div>
<div className="info-inner">{headerData.lastEditDatetime}</div> <div className="info-inner">{headerData.lastEditDatetime}</div>
</div> </div>
<div className="sub-table-box"> <div className="sub-table-box">
<div className="info-title">등록일</div> <div className="info-title">{getMessage('stuff.detail.header.createDatetime')}</div>
<div className="info-inner">{headerData.createDatetime}</div> <div className="info-inner">{headerData.createDatetime}</div>
</div> </div>
</div> </div>

View File

@ -468,6 +468,13 @@
"stuff.addressPopup.btn2": "住所適用", "stuff.addressPopup.btn2": "住所適用",
"stuff.planReqPopup.title": "設計依頼のインポート", "stuff.planReqPopup.title": "設計依頼のインポート",
"stuff.temp.subTitle": "商品情報", "stuff.temp.subTitle": "商品情報",
"stuff.detail.header.message1": "存在しないものです。",
"stuff.detail.header.message2": "商品番号がコピーされました。",
"stuff.detail.header.message3": "存在しないものです。",
"stuff.detail.header.objectNo": "商品番号のコピーに失敗しました。",
"stuff.detail.header.specificationConfirmDate": "仕様拡張日",
"stuff.detail.header.lastEditDatetime": "更新日時",
"stuff.detail.header.createDatetime": "登録日",
"stuff.detail.required": "必須入力項目", "stuff.detail.required": "必須入力項目",
"stuff.detail.planReqNo": "設計依頼No.", "stuff.detail.planReqNo": "設計依頼No.",
"stuff.detail.dispCompanyName": "担当者", "stuff.detail.dispCompanyName": "担当者",
@ -497,6 +504,17 @@
"stuff.detail.tooltip.saleStoreId": "販売代理店または販売代理店IDを1文字以上入力してください", "stuff.detail.tooltip.saleStoreId": "販売代理店または販売代理店IDを1文字以上入力してください",
"stuff.detail.tempSave.message1": "一時保存されました。商品番号を取得するには、必須項目をすべて入力してください。", "stuff.detail.tempSave.message1": "一時保存されました。商品番号を取得するには、必須項目をすべて入力してください。",
"stuff.detail.confirm.message1": "販売店情報を変更すると、設計依頼文書番号が削除されます。変更しますか?", "stuff.detail.confirm.message1": "販売店情報を変更すると、設計依頼文書番号が削除されます。変更しますか?",
"stuff.detail.delete.message1": "仕様が確定したものは削除できません。",
"stuff.detail.planList.title": "プランリスト",
"stuff.detail.planList.cnt": "全体",
"stuff.detail.planList.help": "ヘルプ",
"stuff.detail.planList.guide1": "1.発注は同一品番基準1件のみ可能です。",
"stuff.detail.planList.guide2": "2.[Excelダウンロード]は見積書、図面、シミュレーション結果をExcelファイルで一度にダウンロードします。",
"stuff.detail.planList.guide3": "3. プラン情報をダブルクリックすると図面作成画面に移動します。",
"stuff.detail.btn.delete": "物の削除",
"stuff.detail.btn.moveList": "商品リスト",
"stuff.detail.btn.save": "保存",
"stuff.detail.btn.tempSave": "一時保存",
"stuff.planReqPopup.popTitle": "設計依頼検索", "stuff.planReqPopup.popTitle": "設計依頼検索",
"stuff.planReqPopup.btn1": "検索", "stuff.planReqPopup.btn1": "検索",
"stuff.planReqPopup.btn2": "初期化", "stuff.planReqPopup.btn2": "初期化",

View File

@ -473,6 +473,13 @@
"stuff.addressPopup.btn2": "주소적용", "stuff.addressPopup.btn2": "주소적용",
"stuff.planReqPopup.title": "설계의뢰 불러오기", "stuff.planReqPopup.title": "설계의뢰 불러오기",
"stuff.temp.subTitle": "물건정보", "stuff.temp.subTitle": "물건정보",
"stuff.detail.header.message1": "존재하지 않는 물건입니다.",
"stuff.detail.header.message2": "물건번호가 복사되었습니다.",
"stuff.detail.header.message3": "물건번호 복사에 실패했습니다.",
"stuff.detail.header.objectNo": "물건번호",
"stuff.detail.header.specificationConfirmDate": "사양확장일",
"stuff.detail.header.lastEditDatetime": "갱신일시",
"stuff.detail.header.createDatetime": "등록일",
"stuff.detail.required": "필수 입력항목", "stuff.detail.required": "필수 입력항목",
"stuff.detail.planReqNo": "설계의뢰No.", "stuff.detail.planReqNo": "설계의뢰No.",
"stuff.detail.dispCompanyName": "담당자", "stuff.detail.dispCompanyName": "담당자",
@ -502,6 +509,17 @@
"stuff.detail.tooltip.saleStoreId": "판매대리점 또는 판매대리점ID를 1자 이상 입력하세요", "stuff.detail.tooltip.saleStoreId": "판매대리점 또는 판매대리점ID를 1자 이상 입력하세요",
"stuff.detail.tempSave.message1": "임시저장 되었습니다. 물건번호를 획득하려면 필수 항목을 모두 입력해 주십시오.", "stuff.detail.tempSave.message1": "임시저장 되었습니다. 물건번호를 획득하려면 필수 항목을 모두 입력해 주십시오.",
"stuff.detail.confirm.message1": "판매점 정보를 변경하면, 설계의뢰 문서번호가 삭제됩니다. 변경하시겠습니까?", "stuff.detail.confirm.message1": "판매점 정보를 변경하면, 설계의뢰 문서번호가 삭제됩니다. 변경하시겠습니까?",
"stuff.detail.delete.message1": "사양이 확정된 물건은 삭제할 수 없습니다.",
"stuff.detail.planList.title": "플랜리스트",
"stuff.detail.planList.cnt": "전체",
"stuff.detail.planList.help": "도움말",
"stuff.detail.planList.guide1": "1.발주는 동일 물건번호 기준 1건만 가능합니다.",
"stuff.detail.planList.guide2": "2.[Excel 다운로드]는 견적서, 도면, 시뮬레이션 결과를 엑셀파일로 한번에 다운로드 합니다.",
"stuff.detail.planList.guide3": "3.플랜정보를 더블 클릭하면 도면작성 화면으로 이동합니다.",
"stuff.detail.btn.delete": "물건삭제",
"stuff.detail.btn.moveList": "물건목록",
"stuff.detail.btn.save": "저장",
"stuff.detail.btn.tempSave": "임시저장",
"stuff.planReqPopup.popTitle": "설계 요청 검색", "stuff.planReqPopup.popTitle": "설계 요청 검색",
"stuff.planReqPopup.btn1": "검색", "stuff.planReqPopup.btn1": "검색",
"stuff.planReqPopup.btn2": "초기화", "stuff.planReqPopup.btn2": "초기화",