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 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 * @param params
@ -128,6 +155,8 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
break break
case 'T01': case 'T01':
where.AND.push(filterTempData(params))
break
case 'User': case 'User':
// 모든 매물 조회 가능 (추가 조건 없음) // 모든 매물 조회 가능 (추가 조건 없음)
break break
@ -219,7 +248,7 @@ export async function PUT(request: Request) {
} }
} }
export async function POST(request: Request) { export async function POST(request: Request) {
try { try {
const body = await request.json() const body = await request.json()
console.log('body:: ', body) console.log('body:: ', body)
@ -232,9 +261,9 @@ export async function POST(request: Request) {
data: { data: {
...convertToSnakeCase(basicInfo), ...convertToSnakeCase(basicInfo),
DETAIL_INFO: { DETAIL_INFO: {
create: convertToSnakeCase(detailInfo) create: convertToSnakeCase(detailInfo),
} },
} },
}) })
console.log('result:: ', result) console.log('result:: ', result)
return NextResponse.json(result) return NextResponse.json(result)

View File

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

View File

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

View File

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