feat: Implement Separate temporary save data logic

This commit is contained in:
Dayoung 2025-05-21 10:19:38 +09:00
parent 7ae297f3b6
commit 67d587acf5
4 changed files with 56 additions and 21 deletions

View File

@ -77,6 +77,33 @@ const createKeywordSearchCondition = (keyword: string, searchOption: string): Wh
return where
}
const filterTempData = (data: any) => {
const requiredFields = [
'INSTALLATION_SYSTEM',
'CONSTRUCTION_YEAR',
'RAFTER_SIZE',
'RAFTER_PITCH',
'RAFTER_PITH_ETC',
'WATERPROOF_MATERIAL',
'INSULATION_PRESENCE',
'STRUCTURE_ORDER',
]
const where: WhereCondition = { AND: [] }
// 각 필드에 대해 OR 조건을 만들고, 전체를 AND로 묶음
where.AND.push(
...requiredFields.map((field: string) => ({
OR: [
{ [field]: { not: null } },
{ [`${field}_ETC`]: { not: null } }
]
}))
)
return where
}
/**
*
* @param params
@ -128,6 +155,8 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
break
case 'T01':
where.AND.push(filterTempData(params))
break
case 'User':
// 모든 매물 조회 가능 (추가 조건 없음)
break
@ -219,7 +248,7 @@ export async function PUT(request: Request) {
}
}
export async function POST(request: Request) {
export async function POST(request: Request) {
try {
const body = await request.json()
console.log('body:: ', body)
@ -232,9 +261,9 @@ export async function POST(request: Request) {
data: {
...convertToSnakeCase(basicInfo),
DETAIL_INFO: {
create: convertToSnakeCase(detailInfo)
}
}
create: convertToSnakeCase(detailInfo),
},
},
})
console.log('result:: ', result)
return NextResponse.json(result)

View File

@ -10,6 +10,7 @@ export default function ButtonForm(props: {
mode: Mode
setMode: (mode: Mode) => void
data: { basic: SurveyBasicRequest; roof: SurveyDetailRequest }
isTemporarySave: boolean
}) {
// 라우터
const router = useRouter()
@ -23,7 +24,6 @@ export default function ButtonForm(props: {
const routeId = params.id
// ------------------------------------------------------------
const [isSubmitProcess, setIsSubmitProcess] = useState(false)
const [saveData, setSaveData] = useState({
...props.data.basic,
detailInfo: props.data.roof,
@ -55,12 +55,14 @@ export default function ButtonForm(props: {
const { deleteSurvey, submitSurvey, updateSurvey } = useServey(Number(id))
const { validateSurveyDetail, createSurvey } = useServey()
const handleSave = (isTemporary: boolean, isSubmitProcess?: boolean) => {
const handleSave = (isTemporary: boolean, isSubmitProcess = false) => {
const emptyField = validateSurveyDetail(props.data.roof)
const hasEmptyField = emptyField?.trim() !== ''
if (isTemporary) {
tempSaveProcess()
hasEmptyField ? tempSaveProcess() : saveProcess(emptyField, false)
} else {
saveProcess(emptyField, isSubmitProcess ?? false)
saveProcess(emptyField, isSubmitProcess)
}
}
@ -135,6 +137,10 @@ export default function ButtonForm(props: {
}
const handleSubmit = async () => {
if (props.isTemporarySave) {
alert('一時保存されたデータは提出できません。')
return
}
window.neoConfirm('提出しますか?', async () => {
if (Number(routeId)) {
submitProcess()

View File

@ -4,7 +4,6 @@ import { useServey } from '@/hooks/useSurvey'
import { useParams, useSearchParams } from 'next/navigation'
import { useEffect, useState } from 'react'
import DetailForm from './DetailForm'
import type { SurveyBasicInfo } from '@/types/Survey'
export default function DataTable() {
const params = useParams()
@ -14,19 +13,22 @@ export default function DataTable() {
const isTemp = searchParams.get('isTemporary')
const { surveyDetail, isLoadingSurveyDetail } = useServey(Number(id))
const [isTemporary, setIsTemporary] = useState(isTemp === 'true')
const [isTemporarySave, setIsTemporarySave] = useState(isTemp === 'true')
const { validateSurveyDetail } = useServey(Number(id))
useEffect(() => {
if (surveyDetail?.detailInfo) {
const validate = validateSurveyDetail(surveyDetail.detailInfo)
console.log('validate:: ', validate)
if (validate.trim() !== '') {
setIsTemporary(false)
setIsTemporarySave(true)
}
}
}, [surveyDetail])
console.log('isTemporarySave:: ', isTemporarySave)
if (isLoadingSurveyDetail) {
return <div>Loading...</div>
}
@ -42,7 +44,7 @@ export default function DataTable() {
<tbody>
<tr>
<th></th>
{isTemporary ? (
{isTemporarySave ? (
<td>
<span className="text-red-500"></span>
</td>
@ -83,7 +85,7 @@ export default function DataTable() {
</tbody>
</table>
</div>
<DetailForm />
<DetailForm isTemporarySave={isTemporarySave} />
</>
)
}

View File

@ -60,13 +60,14 @@ const basicInfoForm: SurveyBasicRequest = {
submissionDate: null,
}
export default function DetailForm() {
export default function DetailForm(props: { isTemporarySave: boolean }) {
const { isTemporarySave } = props
const idParam = useSearchParams().get('id')
const routeId = useParams().id
const id = idParam ?? routeId
const { surveyDetail } = useServey(Number(id))
const { surveyDetail, validateSurveyDetail } = useServey(Number(id))
const [mode, setMode] = useState<Mode>(idParam ? 'EDIT' : routeId ? 'READ' : 'CREATE')
const [basicInfoData, setBasicInfoData] = useState<SurveyBasicRequest>(basicInfoForm)
@ -79,21 +80,18 @@ export default function DetailForm() {
if (detailInfo) {
const { id, uptDt, regDt, basicInfoId, ...rest } = detailInfo
setRoofInfoData(rest)
if (validateSurveyDetail(rest).trim() !== '') {
}
}
}
}, [surveyDetail])
// console.log('mode:: ', mode)
// console.log('surveyDetail:: ', surveyDetail)
// console.log('basicInfoData:: ', basicInfoData)
console.log('roofInfoData:: ', roofInfoData)
const data = {
basic: basicInfoData,
roof: roofInfoData,
}
const buttonFormProps = { mode, setMode, data }
const buttonFormProps = { mode, setMode, data, isTemporarySave }
return (
<>