fix: correct layout interface and enhance user session management

This commit is contained in:
Dayoung 2025-05-12 10:21:01 +09:00
parent c06a96bc1b
commit da0d77724d
12 changed files with 40 additions and 38 deletions

View File

@ -27,7 +27,7 @@ export async function POST(request: Request) {
const session = await getIronSession<SessionData>(cookieStore, sessionOptions) const session = await getIronSession<SessionData>(cookieStore, sessionOptions)
console.log('start session edit!') console.log('start session edit!')
session.userNm = user.username! session.userNm = user.username!
// session.email = user.email! session.email = user.email!
session.isLoggedIn = true session.isLoggedIn = true
console.log('end session edit!') console.log('end session edit!')
await session.save() await session.save()

View File

@ -18,7 +18,7 @@ interface RootLayoutProps {
header: ReactNode header: ReactNode
footer: ReactNode footer: ReactNode
floatBtn: ReactNode floatBtn: ReactNode
} }6
export default async function RootLayout({ children, header, footer, floatBtn }: RootLayoutProps): Promise<ReactNode> { export default async function RootLayout({ children, header, footer, floatBtn }: RootLayoutProps): Promise<ReactNode> {
return ( return (

View File

@ -3,7 +3,6 @@
import { useSurveySaleTabState } from '@/store/surveySaleTabState' import { useSurveySaleTabState } from '@/store/surveySaleTabState'
import { usePathname, useRouter, useSearchParams, useParams } from 'next/navigation' import { usePathname, useRouter, useSearchParams, useParams } from 'next/navigation'
import { useEffect } from 'react' import { useEffect } from 'react'
import { usePopupController } from '@/store/popupController'
export default function NavTab() { export default function NavTab() {
const router = useRouter() const router = useRouter()
@ -11,6 +10,7 @@ export default function NavTab() {
const searchParams = useSearchParams() const searchParams = useSearchParams()
const id = searchParams.get('id') const id = searchParams.get('id')
const isTemp = searchParams.get('isTemp')
const params = useParams() const params = useParams()
const detailId = params.id const detailId = params.id
@ -40,6 +40,10 @@ export default function NavTab() {
const handleRoofInfoClick = () => { const handleRoofInfoClick = () => {
if (id) { if (id) {
if (isTemp === 'true') {
alert('基本情報が一時保存された状態です。')
return
}
router.push(`/survey-sale/roof-info?id=${id}`) router.push(`/survey-sale/roof-info?id=${id}`)
return return
} }
@ -48,8 +52,7 @@ export default function NavTab() {
return return
} }
if (pathname === '/survey-sale/basic-info') { if (pathname === '/survey-sale/basic-info') {
// TODO: 팝업 추가 alert('基本情報を先に保存してください。')
alert('Save essential information first')
return null return null
} }
} }

View File

@ -16,12 +16,12 @@ export default function DataTable() {
const tab = searchParams.get('tab') const tab = searchParams.get('tab')
const { surveyDetail, isLoadingSurveyDetail } = useServey(Number(id)) const { surveyDetail, isLoadingSurveyDetail } = useServey(Number(id))
const [isTemporary, setIsTemporary] = useState(false) const [isTemporary, setIsTemporary] = useState(true)
const { setBasicInfoSelected, setRoofInfoSelected } = useSurveySaleTabState() const { setBasicInfoSelected, setRoofInfoSelected } = useSurveySaleTabState()
useEffect(() => { useEffect(() => {
if (!surveyDetail?.representative || !surveyDetail?.store || !surveyDetail?.construction_point) { if (surveyDetail?.representative && surveyDetail?.store && surveyDetail?.construction_point) {
setIsTemporary(true) setIsTemporary(false)
} }
if (tab === 'roof-info') { if (tab === 'roof-info') {
setRoofInfoSelected() setRoofInfoSelected()
@ -66,8 +66,9 @@ export default function DataTable() {
<td> <td>
{surveyDetail?.submission_status && surveyDetail?.submission_date ? ( {surveyDetail?.submission_status && surveyDetail?.submission_date ? (
<> <>
{/* TODO: 제출한 판매점 ID 추가 필요 */}
<div>{new Date(surveyDetail.submission_date).toLocaleString()}</div> <div>{new Date(surveyDetail.submission_date).toLocaleString()}</div>
<div> ID </div> <div> ID...</div>
</> </>
) : ( ) : (
'-' '-'

View File

@ -2,29 +2,29 @@
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
import { useServey } from '@/hooks/useSurvey' import { useServey } from '@/hooks/useSurvey'
export default function DetailButton({ isTemporary, surveyId }: { isTemporary: boolean, surveyId: number }) { export default function DetailButton({ isTemporary, surveyId }: { isTemporary: boolean; surveyId: number }) {
const router = useRouter() const router = useRouter()
const { submitSurvey, deleteSurvey } = useServey(surveyId) const { submitSurvey, deleteSurvey } = useServey(surveyId)
const handleSubmit = async () => { const handleSubmit = async () => {
if (isTemporary) { if (isTemporary) {
alert('SAVE FIRST') alert('一時保存されたデータは提出できません。')
return return
} }
if (confirm('submit?')) { if (confirm('提出しますか??')) {
if (surveyId) { if (surveyId) {
// TODO: 제출 페이지 추가 // TODO: 제출 페이지 추가
alert('SUBMIT POPUP') alert('SUBMIT POPUP!!!!!!!!!!!')
await submitSurvey() await submitSurvey()
} }
} }
} }
const handleUpdate = () => { const handleUpdate = () => {
router.push(`/survey-sale/basic-info?id=${surveyId}`) router.push(`/survey-sale/basic-info?id=${surveyId}&isTemp=${isTemporary}`)
} }
const handleDelete = async () => { const handleDelete = async () => {
if (confirm('delete?')) { if (confirm('削除しますか?')) {
if (surveyId) { if (surveyId) {
await deleteSurvey() await deleteSurvey()
router.push('/survey-sale') router.push('/survey-sale')

View File

@ -7,6 +7,7 @@ import { useState, useEffect } from 'react'
import { useSurveySaleTabState } from '@/store/surveySaleTabState' import { useSurveySaleTabState } from '@/store/surveySaleTabState'
import { usePopupController } from '@/store/popupController' import { usePopupController } from '@/store/popupController'
import { useAddressStore } from '@/store/addressStore' import { useAddressStore } from '@/store/addressStore'
import { useSessionStore } from '@/store/session'
const defaultBasicInfoForm: SurveyBasicRequest = { const defaultBasicInfoForm: SurveyBasicRequest = {
representative: '', representative: '',
@ -78,16 +79,17 @@ export default function BasicForm() {
const handleSave = async (isTemporary: boolean) => { const handleSave = async (isTemporary: boolean) => {
if (id) { if (id) {
updateSurvey(basicInfoData) updateSurvey(basicInfoData)
alert('保存しました。')
router.push(`/survey-sale/${id}?tab=basic-info`) router.push(`/survey-sale/${id}?tab=basic-info`)
} }
if (isTemporary) { if (isTemporary) {
const saveId = await createSurvey(basicInfoData) const saveId = await createSurvey(basicInfoData)
alert('save success temporary id: ' + saveId) alert('一時保存されました。')
router.push(`/survey-sale/${saveId}?tab=basic-info`) router.push(`/survey-sale/${saveId}?tab=basic-info`)
} else { } else {
if (validateSurvey(basicInfoData)) { if (validateSurvey(basicInfoData)) {
const saveId = await createSurvey(basicInfoData) const saveId = await createSurvey(basicInfoData)
alert('save success id: ' + saveId) alert('保存しました。 登録番号: ' + saveId)
router.push(`/survey-sale/${saveId}?tab=basic-info`) router.push(`/survey-sale/${saveId}?tab=basic-info`)
} }
} }
@ -109,7 +111,6 @@ export default function BasicForm() {
id="representative" id="representative"
value={basicInfoData.representative} value={basicInfoData.representative}
onChange={(e) => handleChange('representative', e.target.value)} onChange={(e) => handleChange('representative', e.target.value)}
required
/> />
</div> </div>
<div className="data-input-form-bx"> <div className="data-input-form-bx">
@ -120,7 +121,6 @@ export default function BasicForm() {
id="store" id="store"
value={basicInfoData.store ?? ''} value={basicInfoData.store ?? ''}
onChange={(e) => handleChange('store', e.target.value)} onChange={(e) => handleChange('store', e.target.value)}
required
/> />
</div> </div>
<div className="data-input-form-bx"> <div className="data-input-form-bx">
@ -131,7 +131,6 @@ export default function BasicForm() {
id="construction_point" id="construction_point"
value={basicInfoData.construction_point ?? ''} value={basicInfoData.construction_point ?? ''}
onChange={(e) => handleChange('construction_point', e.target.value)} onChange={(e) => handleChange('construction_point', e.target.value)}
required
/> />
</div> </div>
</div> </div>

View File

@ -73,8 +73,8 @@ export default function RoofInfoForm() {
const handleNumberInput = (key: keyof SurveyDetailRequest, value: number | string) => { const handleNumberInput = (key: keyof SurveyDetailRequest, value: number | string) => {
if (key === 'roof_slope' || key === 'open_field_plate_thickness') { if (key === 'roof_slope' || key === 'open_field_plate_thickness') {
const stringValue = value.toString() const stringValue = value.toString()
if (stringValue.length > 4) { if (stringValue.length > 5) {
alert('over db size') alert('保存できるサイズを超えました。')
return return
} }
if (stringValue.includes('.')) { if (stringValue.includes('.')) {
@ -118,17 +118,18 @@ export default function RoofInfoForm() {
surveyId: Number(id), surveyId: Number(id),
surveyDetail: updatedBasicInfoData, surveyDetail: updatedBasicInfoData,
}) })
alert('調査物件を保存しました。')
} catch (error) { } catch (error) {
alert(error)
throw new Error('failed to create survey detail: ' + error) throw new Error('failed to create survey detail: ' + error)
} }
alert('created successfully')
router.push(`/survey-sale`) router.push(`/survey-sale`)
} else { } else {
alert(emptyField + ' is required') alert(emptyField + ' は必須項目です。')
focusOnInput(emptyField) focusOnInput(emptyField)
} }
} else { } else {
alert('save essential information first') alert('基本情報を作成した後、屋根情報を作成することができます。')
} }
} }
const focusOnInput = (field: string) => { const focusOnInput = (field: string) => {

View File

@ -215,16 +215,10 @@ export default function SelectBoxForm({
name={column} name={column}
id={column} id={column}
onChange={handleSelectChange} onChange={handleSelectChange}
value={ value={detailInfoData[column] ? detailInfoData[column] : detailInfoData[`${column}_etc`] ? 'etc' : ''}
detailInfoData[column]
? detailInfoData[column]
: detailInfoData[`${column}_etc`]
? 'etc'
: ''
}
> >
<option value="" hidden> <option value="" hidden>
</option> </option>
{selectBoxOptions[column].map((option) => ( {selectBoxOptions[column].map((option) => (
<option key={option.id} value={option.id}> <option key={option.id} value={option.id}>

View File

@ -2,10 +2,11 @@
import LoadMoreButton from '@/components/LoadMoreButton' import LoadMoreButton from '@/components/LoadMoreButton'
import { useServey } from '@/hooks/useSurvey' import { useServey } from '@/hooks/useSurvey'
import { useEffect, useState, useRef } from 'react' import { useEffect, useState } from 'react'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
import SearchForm from './SearchForm' import SearchForm from './SearchForm'
import { useSurveyFilterStore } from '@/store/surveyFilterStore' import { useSurveyFilterStore } from '@/store/surveyFilterStore'
import { useSessionStore } from '@/store/session'
export default function ListTable() { export default function ListTable() {
const router = useRouter() const router = useRouter()
@ -15,6 +16,9 @@ export default function ListTable() {
const [heldSurveyList, setHeldSurveyList] = useState<typeof surveyList>([]) const [heldSurveyList, setHeldSurveyList] = useState<typeof surveyList>([])
const [hasMore, setHasMore] = useState(false) const [hasMore, setHasMore] = useState(false)
const { session } = useSessionStore()
console.log('session:: ', session)
useEffect(() => { useEffect(() => {
if (surveyList && surveyList.length > 0) { if (surveyList && surveyList.length > 0) {
if (offset === 0) { if (offset === 0) {

View File

@ -1,7 +1,6 @@
'use client' 'use client'
import { useRouter } from 'next/navigation' import { useRouter } from 'next/navigation'
export default function Main() { export default function Main() {
const router = useRouter() const router = useRouter()

View File

@ -60,6 +60,7 @@ export const SEARCH_OPTIONS_PARTNERS = [
}, },
] ]
export type MEMBER_TYPE = 'hwj' | 'order' | 'musubi' | 'partner'
export type SEARCH_OPTIONS_ENUM = (typeof SEARCH_OPTIONS)[number]['id'] export type SEARCH_OPTIONS_ENUM = (typeof SEARCH_OPTIONS)[number]['id']
export type SEARCH_OPTIONS_PARTNERS_ENUM = (typeof SEARCH_OPTIONS_PARTNERS)[number]['id'] export type SEARCH_OPTIONS_PARTNERS_ENUM = (typeof SEARCH_OPTIONS_PARTNERS)[number]['id']
export type SORT_OPTIONS_ENUM = 'created' | 'updated' export type SORT_OPTIONS_ENUM = 'created' | 'updated'

View File

@ -9,11 +9,11 @@ export interface SessionData {
storeId: null storeId: null
userId: null userId: null
category: null category: null
userNm: null userNm: null | string
userNmKana: null userNmKana: null | string
telNo: null telNo: null
fax: null fax: null
email: null email: null | string
lastEditUser: null lastEditUser: null
storeGubun: null storeGubun: null
pwCurr: null pwCurr: null