feat: add spinning when create/update/delete survey & fix rules for displaying store, contructionPoint input

This commit is contained in:
Dayoung 2025-05-30 13:58:41 +09:00
parent 5cc1cc9247
commit 799b0025c4
5 changed files with 92 additions and 50 deletions

View File

@ -90,9 +90,9 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
// MUSUBI (시공권한 X) 같은 판매점에서 작성한 제출/제출되지 않은 매물 // MUSUBI (시공권한 X) 같은 판매점에서 작성한 제출/제출되지 않은 매물
AND: [ AND: [
{ STORE_ID: { equals: params.store } }, { STORE_ID: { equals: params.store } },
{ // {
OR: [{ CONSTRUCTION_POINT: { equals: null } }, { CONSTRUCTION_POINT: { equals: '' } }], // OR: [{ CONSTRUCTION_POINT: { equals: null } }, { CONSTRUCTION_POINT: { equals: '' } }],
}, // },
], ],
}, },
{ {
@ -109,10 +109,10 @@ const createMemberRoleCondition = (params: SearchParams): WhereCondition => {
case 'Builder': // MUSUBI (시공권한 O) case 'Builder': // MUSUBI (시공권한 O)
case 'Partner': // PARTNER case 'Partner': // PARTNER
// 시공점이 있고 STORE_ID가 시공ID와 같은 매물 // 시공점이 있고 STORE_ID 가 시공ID와 같은 매물
where.AND?.push({ where.AND?.push({
CONSTRUCTION_POINT: { not: null }, // CONSTRUCTION_POINT: { not: null },
STORE_ID: { equals: params.builderNo }, CONSTRUCTION_POINT: { equals: params.builderNo },
}) })
break break

View File

@ -35,13 +35,28 @@ export default function SurveySaleSubmitPopup() {
const { getCommCode } = useCommCode() const { getCommCode } = useCommCode()
const { surveyDetail } = useSurvey(Number(routeId)) const { surveyDetail } = useSurvey(Number(routeId))
const [submitData, setSubmitData] = useState<SubmitFormData>({
saleBase: null,
store: '',
sender: session?.email ?? '',
receiver: [],
reference: null,
title: '[HANASYS現地調査] 調査物件が提出.',
contents: '',
})
const [commCodeList, setCommCodeList] = useState<CommCode[]>([]) const [commCodeList, setCommCodeList] = useState<CommCode[]>([])
useEffect(() => { useEffect(() => {
if (session?.isLoggedIn && session?.role === 'Admin') { if (!session?.isLoggedIn) return
if (session?.role === 'Admin') {
getCommCode('SALES_OFFICE_CD').then((codes) => { getCommCode('SALES_OFFICE_CD').then((codes) => {
setCommCodeList(codes) setCommCodeList(codes)
}) })
} }
setSubmitData({
...submitData,
sender: session?.email ?? '',
})
}, [session]) }, [session])
const FORM_FIELDS: FormField[] = [ const FORM_FIELDS: FormField[] = [
@ -54,16 +69,6 @@ export default function SurveySaleSubmitPopup() {
{ id: 'contents', name: '内容', required: false }, { id: 'contents', name: '内容', required: false },
] ]
const [submitData, setSubmitData] = useState<SubmitFormData>({
saleBase: null,
store: '',
sender: session?.email ?? '',
receiver: [],
reference: null,
title: '[HANASYS現地調査] 調査物件が提出.',
contents: '',
})
const { submitSurvey, isSubmittingSurvey } = useSurvey(Number(routeId)) const { submitSurvey, isSubmittingSurvey } = useSurvey(Number(routeId))
const handleInputChange = (field: keyof SubmitFormData, value: string) => { const handleInputChange = (field: keyof SubmitFormData, value: string) => {
@ -108,6 +113,7 @@ export default function SurveySaleSubmitPopup() {
}) })
.finally(() => { .finally(() => {
setIsShow(false) setIsShow(false)
submitSurvey({ targetId: submitData.store })
popupController.setSurveySaleSubmitPopup(false) popupController.setSurveySaleSubmitPopup(false)
}) })
}) })

View File

@ -29,7 +29,7 @@ export default function BasicForm(props: { basicInfo: SurveyBasicRequest; setBas
representative: session.userNm ?? '', representative: session.userNm ?? '',
representativeId: session.userId ?? null, representativeId: session.userId ?? null,
store: session.role === 'Partner' ? null : session.storeNm ?? null, store: session.role === 'Partner' ? null : session.storeNm ?? null,
storeId: session.role === 'Partner' || session.role === 'Builder' ? session.builderNo : session.storeId ?? null, storeId: session.role === 'Partner' ? session.builderNo : session.storeId ?? null,
constructionPoint: session.builderNo ?? null, constructionPoint: session.builderNo ?? null,
}) })
} }
@ -67,29 +67,15 @@ export default function BasicForm(props: { basicInfo: SurveyBasicRequest; setBas
onChange={(e) => setBasicInfo({ ...basicInfo, representative: e.target.value })} onChange={(e) => setBasicInfo({ ...basicInfo, representative: e.target.value })}
/> />
</div> </div>
{(session?.role === 'Builder' || session?.role?.includes('Admin')) && ( {mode === 'READ' || session?.role === 'Builder' ? (
<div className="data-input-form-bx"> <>
<div className="data-input-form-tit"></div> {storeInput(basicInfo, setBasicInfo, mode)}
<input {builderInput(basicInfo, setBasicInfo, mode)}
type="text" </>
className="input-frame" ) : session?.role === 'Partner' ? (
readOnly <>{builderInput(basicInfo, setBasicInfo, mode)}</>
value={basicInfo?.store ?? ''} ) : (
onChange={(e) => setBasicInfo({ ...basicInfo, store: e.target.value })} <>{storeInput(basicInfo, setBasicInfo, mode)}</>
/>
</div>
)}
{(session?.role === 'Builder' || session?.role === 'Partner') && (
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input
type="text"
className="input-frame"
readOnly
value={basicInfo?.constructionPoint ?? ''}
onChange={(e) => setBasicInfo({ ...basicInfo, constructionPoint: e.target.value })}
/>
</div>
)} )}
</div> </div>
</div> </div>
@ -169,3 +155,33 @@ export default function BasicForm(props: { basicInfo: SurveyBasicRequest; setBas
</> </>
) )
} }
const storeInput = (basicInfo: SurveyBasicRequest, setBasicInfo: (basicInfo: SurveyBasicRequest) => void, mode: Mode) => {
return (
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input
type="text"
className="input-frame"
readOnly
value={basicInfo?.store ?? ''}
onChange={(e) => setBasicInfo({ ...basicInfo, store: e.target.value })}
/>
</div>
)
}
const builderInput = (basicInfo: SurveyBasicRequest, setBasicInfo: (basicInfo: SurveyBasicRequest) => void, mode: Mode) => {
return (
<div className="data-input-form-bx">
<div className="data-input-form-tit"></div>
<input
type="text"
className="input-frame"
readOnly
value={basicInfo?.constructionPoint ?? ''}
onChange={(e) => setBasicInfo({ ...basicInfo, constructionPoint: e.target.value })}
/>
</div>
)
}

View File

@ -6,6 +6,7 @@ import { useEffect, useState } from 'react'
import { useParams, useRouter, useSearchParams } from 'next/navigation' import { useParams, useRouter, useSearchParams } from 'next/navigation'
import { requiredFields, useSurvey } from '@/hooks/useSurvey' import { requiredFields, useSurvey } from '@/hooks/useSurvey'
import { usePopupController } from '@/store/popupController' import { usePopupController } from '@/store/popupController'
import { useSpinnerStore } from '@/store/spinnerStore'
export default function ButtonForm(props: { export default function ButtonForm(props: {
mode: Mode mode: Mode
@ -29,6 +30,8 @@ export default function ButtonForm(props: {
...props.data.basic, ...props.data.basic,
detailInfo: props.data.roof, detailInfo: props.data.roof,
}) })
const { setIsShow } = useSpinnerStore()
// -------------------------------------------------------------- // --------------------------------------------------------------
// 권한 // 권한
@ -75,7 +78,16 @@ export default function ButtonForm(props: {
const { deleteSurvey, updateSurvey, isDeletingSurvey, isUpdatingSurvey } = useSurvey(Number(id)) const { deleteSurvey, updateSurvey, isDeletingSurvey, isUpdatingSurvey } = useSurvey(Number(id))
const { validateSurveyDetail, createSurvey, isCreatingSurvey } = useSurvey() const { validateSurveyDetail, createSurvey, isCreatingSurvey } = useSurvey()
const handleSave = (isTemporary: boolean, isSubmitProcess = false) => { useEffect(() => {
if (isCreatingSurvey || isUpdatingSurvey || isDeletingSurvey) {
setIsShow(true)
}
if (!isCreatingSurvey && !isUpdatingSurvey && !isDeletingSurvey) {
setIsShow(false)
}
}, [isCreatingSurvey, isUpdatingSurvey, isDeletingSurvey])
const handleSave = (isTemporary: boolean, isSubmitProcess: boolean) => {
const emptyField = validateSurveyDetail(props.data.roof) const emptyField = validateSurveyDetail(props.data.roof)
const hasEmptyField = emptyField?.trim() !== '' const hasEmptyField = emptyField?.trim() !== ''
@ -89,14 +101,18 @@ export default function ButtonForm(props: {
const tempSaveProcess = async () => { const tempSaveProcess = async () => {
if (idParam) { if (idParam) {
await updateSurvey({ survey: saveData, isTemporary: true }) await updateSurvey({ survey: saveData, isTemporary: true })
router.push(`/survey-sale/${idParam}`) if (!isUpdatingSurvey) {
router.push(`/survey-sale/${idParam}`)
}
} else { } else {
const updatedData = { const updatedData = {
...saveData, ...saveData,
srlNo: '一時保存', srlNo: '一時保存',
} }
const id = await createSurvey(updatedData) const id = await createSurvey(updatedData)
router.push(`/survey-sale/${id}`) if (!isCreatingSurvey) {
router.push(`/survey-sale/${id}`)
}
} }
alert('一時保存されました。') alert('一時保存されました。')
} }
@ -112,10 +128,14 @@ export default function ButtonForm(props: {
if (emptyField?.trim() === '') { if (emptyField?.trim() === '') {
if (idParam) { if (idParam) {
await updateSurvey({ survey: saveData, isTemporary: false, storeId: session.storeId ?? '' }) await updateSurvey({ survey: saveData, isTemporary: false, storeId: session.storeId ?? '' })
router.push(`/survey-sale/${idParam}`) if (!isUpdatingSurvey) {
router.push(`/survey-sale/${idParam}`)
}
} else { } else {
const id = await createSurvey(saveData) const id = await createSurvey(saveData)
router.push(`/survey-sale/${id}`) if (!isCreatingSurvey) {
router.push(`/survey-sale/${id}`)
}
} }
if (isSubmitProcess) { if (isSubmitProcess) {
if (!isCreatingSurvey && !isUpdatingSurvey) { if (!isCreatingSurvey && !isUpdatingSurvey) {
@ -196,9 +216,9 @@ export default function ButtonForm(props: {
<div className="sale-form-btn-wrap"> <div className="sale-form-btn-wrap">
<div className="btn-flex-wrap"> <div className="btn-flex-wrap">
<ListButton /> <ListButton />
<TempButton setMode={setMode} handleSave={handleSave} /> <TempButton setMode={setMode} handleSave={() => handleSave(true, false)} />
<SaveButton handleSave={handleSave} /> <SaveButton handleSave={() => handleSave(false, false)} />
{session?.role !== 'T01' && <SubmitButton handleSubmit={handleSubmit} />} {session?.role === 'T01' || props.data.basic.submissionStatus ? <></> : <SubmitButton handleSubmit={handleSubmit} />}
</div> </div>
</div> </div>
)} )}

View File

@ -20,7 +20,7 @@ export default function DataTable() {
const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id)) const { surveyDetail, isLoadingSurveyDetail } = useSurvey(Number(id))
if (isLoadingSurveyDetail) { if (isLoadingSurveyDetail) {
return <div>Loading...</div> return <></>
} }
return ( return (